<?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/32/">
		<title>Blog for Harold &amp;quot;LabRat&amp;quot; Brown 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-07-20T06:56:28+00:00</dc:date>
		<items>
			<rdf:Seq>
				<rdf:li rdf:resource="http://www.garagegames.com/blogs/32/13563"/>
				<rdf:li rdf:resource="http://www.garagegames.com/blogs/32/10202"/>
				<rdf:li rdf:resource="http://www.garagegames.com/blogs/32/8818"/>
				<rdf:li rdf:resource="http://www.garagegames.com/blogs/32/8095"/>
				<rdf:li rdf:resource="http://www.garagegames.com/blogs/32/6365"/>
				<rdf:li rdf:resource="http://www.garagegames.com/blogs/32/2528"/>
				<rdf:li rdf:resource="http://www.garagegames.com/blogs/32/2492"/>
				<rdf:li rdf:resource="http://www.garagegames.com/blogs/32/2427"/>
				<rdf:li rdf:resource="http://www.garagegames.com/blogs/32/2414"/>
				<rdf:li rdf:resource="http://www.garagegames.com/blogs/32/1404"/>
			</rdf:Seq>
		</items>
	</channel>
	<item rdf:about="http://www.garagegames.com/blogs/32/13563">
		<dc:format>text/html</dc:format>
		<dc:date>2007-09-14T16:08:30+00:00</dc:date>
		<dc:creator>Harold &amp;quot;LabRat&amp;quot; Brown</dc:creator>
		<title>It's been over a year already....</title>
		<link>http://www.garagegames.com/blogs/32/13563</link>
		<description>Wow... time flies&lt;br&gt;&lt;br&gt;It's been over a year since my last blog post.. and almost a year since I've done much of anything with Torque :/&lt;br&gt;&lt;br&gt;I really think I need to get back into it.. but some things just never work out in regards to having the time and the motivation to work on it at the same time.&lt;br&gt;&lt;br&gt;In the mean time I've been occupying time in Second Life... and I've found it interesting... some of the things they allow would be nice to see in Torque.  Customizeable mesh, animations and clothing are one of their big selling points... as well as the ability to build and script pretty much anything in-game.</description>
	</item>
	<item rdf:about="http://www.garagegames.com/blogs/32/10202">
		<dc:format>text/html</dc:format>
		<dc:date>2006-04-06T08:02:55+00:00</dc:date>
		<dc:creator>Harold &amp;quot;LabRat&amp;quot; Brown</dc:creator>
		<title>An interesting question....</title>
		<link>http://www.garagegames.com/blogs/32/10202</link>
		<description>Recently (well within the last week or so) I received an E-Mail asking me for help with TCPObject and using it to send information to a webserver via an HTTP POST command.  Many of you might be saying right now &amp;quot;But TorqueScript has the HTTPObject for that&amp;quot;.  Well yes it does.. and I've never really liked it for various reasons... perhapse because I like to have a bit more control....&lt;br&gt;&lt;br&gt;Pulling out some of my old code (The origional Marble Blast score logging mod) I double checked some code and HTTP references.  And came to the conclusion that it just wasn't up to snuff (BTW samples of this code can be found in the forums for TGE owners)&lt;br&gt;&lt;br&gt;The biggest issue being... well I had no URLEncode function other then a couple String Replaces that did not meet the HTTP spec.  So I did some searching and found a URL encoding function for Visual Basic.. did some re-writing and voila.. I had a torquescript based URL encoder.... well almost as it was missing a couple functions.  The first being... TorqueScript has no function to return the ASCII value of a character.  The second being.. there is no decimal to HEX conversion.&lt;br&gt;&lt;br&gt;Code for the Decimal to Hex was quite easy to come by... &lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;div class='codeblock'&gt;&lt;pre&gt;function dec2hex(%val)&lt;br&gt;{&lt;br&gt;	// Converts a decimal number into a 2 digit HEX number&lt;br&gt;	%digits =&amp;quot;0123456789ABCDEF&amp;quot;;	//HEX digit table&lt;br&gt;	&lt;br&gt;	// To get the first number we divide by 16 and then round down, using &lt;br&gt;	// that number as a lookup into our HEX table.&lt;br&gt;	%firstDigit = getSubStr(%digits,mFloor(%val/16),1);&lt;br&gt;	&lt;br&gt;	// To get the second number we do a MOD 16 and using that number as a&lt;br&gt;	// lookup into our HEX table.&lt;br&gt;	%secDigit = getSubStr(%digits,%val % 16,1);&lt;br&gt;	&lt;br&gt;	// return our two digit HEX number&lt;br&gt;	return %firstDigit @ %secDigit;&lt;br&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;Getting the ASCII value of a character was a bit trickier as I wanted this to remain compleatly TorqueScript based solution.&lt;br&gt;&lt;br&gt;Remembering that TorqueScript is string based I threw out the first 32 digits and start the lookup table with the SPACE character.&lt;br&gt;Finding our character position in the table, we then add 32 to get our ASCII value.  Works quite well for the purpose needed.&lt;br&gt;&lt;br&gt;I later added a hack to put \t, \n and \r (escape codes do count as one character in TorqueScript) at the 127-&amp;gt;129 ASCII positions.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;div class='codeblock'&gt;&lt;pre&gt;function chrValue(%chr)&lt;br&gt;{&lt;br&gt;	// So we don't have to do any C++ changes we approximate the function&lt;br&gt;	// to return ASCII Values for a character.  This ignores the first 31 &lt;br&gt;	// characters and the last 128.&lt;br&gt;	&lt;br&gt;	// Setup our Character Table.  Starting with ASCII character 32 (SPACE)&lt;br&gt;	%charTable = &amp;quot; !\&amp;quot;#$%&amp;amp;'()*+,-./0123456789:;&amp;lt;=&amp;gt;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_'abcdefghijklmnopqrstuvwxyz{|}~\t\n\r&amp;quot;;&lt;br&gt;	&lt;br&gt;	//Find the position in the string for the Character we are looking for the value of&lt;br&gt;	%value = strpos(%charTable,%chr);&lt;br&gt;&lt;br&gt;	// Add 32 to the value to get the true ASCII value&lt;br&gt;	%value = %value + 32;&lt;br&gt;	&lt;br&gt;	//HACK:  Encode TAB, New Line and Carriage Return&lt;br&gt;	&lt;br&gt;	if (%value &amp;gt;= 127)&lt;br&gt;	{&lt;br&gt;			if(%value == 127)&lt;br&gt;				%value = 9;&lt;br&gt;			if(%value == 128)&lt;br&gt;				%value = 10;&lt;br&gt;			if(%value == 129)&lt;br&gt;				%value = 13;&lt;br&gt;	}&lt;br&gt;	&lt;br&gt;	//return the value of the character&lt;br&gt;	return %value;&lt;br&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;After this we were ready to put in our URLEncode function:&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;div class='codeblock'&gt;&lt;pre&gt;function URLEncode(%rawString)&lt;br&gt;{&lt;br&gt;	// Encode strings to be HTTP safe for URL use	&lt;br&gt;	&lt;br&gt;	// Table of characters that are valid in an HTTP URL&lt;br&gt;  %validChars = &amp;quot;1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz:/.?=_-$(){}~&amp;amp;&amp;quot;;&lt;br&gt;&lt;br&gt;&lt;br&gt;	// If the string we are encoding has text... start encoding&lt;br&gt;	if (strlen(%rawString) &amp;gt; 0)&lt;br&gt;	{&lt;br&gt;		// Loop through each character in the string&lt;br&gt;		for(%i=0;%i&amp;lt;strlen(%rawString);%i++)&lt;br&gt;		{&lt;br&gt;			// Grab the character at our current index location&lt;br&gt;			%chrTemp = getSubStr(%rawString,%i,1);&lt;br&gt;&lt;br&gt;			//  If the character is not valid for an HTTP URL... Encode it 		  &lt;br&gt; 		  if (strstr(%validChars,%chrTemp) == -1)&lt;br&gt; 		  {&lt;br&gt; 		  	//Get the HEX value for the character&lt;br&gt; 		  	%chrTemp = dec2hex(chrValue(%chrTemp));&lt;br&gt; 		  	&lt;br&gt; 		  	// Is it a space?  Change it to a &amp;quot;+&amp;quot; symbol&lt;br&gt; 		  	if (%chrTemp $= &amp;quot;20&amp;quot;)&lt;br&gt; 		  	{&lt;br&gt; 		  		%chrTemp = &amp;quot;+&amp;quot;;&lt;br&gt; 		  	}&lt;br&gt; 		  	else&lt;br&gt; 		  	{&lt;br&gt; 		  			// It's not a space, prepend the HEX value with a % &lt;br&gt; 		  			%chrTemp = &amp;quot;%&amp;quot; @ %chrTemp;&lt;br&gt; 		  	}	  	&lt;br&gt; 		  }&lt;br&gt; 		  // Build our encoded string&lt;br&gt;			%encodeString = %encodeString @ %chrTemp;&lt;br&gt;		}&lt;br&gt;	}&lt;br&gt;	// Return the encoded string value&lt;br&gt;	return %encodeString;&lt;br&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;Then we just needed a test script to send data to the webserver.  I opted to go with a &amp;quot;File Upload&amp;quot; script.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;div class='codeblock'&gt;&lt;pre&gt;function sendData(%file)&lt;br&gt;{&lt;br&gt;	%obj = new TCPObject(TCPObj);	&lt;br&gt;	%obj.filename = %file;&lt;br&gt;	%obj.connect(&amp;quot;www.domain.com:80&amp;quot;);&lt;br&gt;}	&lt;br&gt;&lt;br&gt;function TCPObj::onDNSResolved(%this)&lt;br&gt;{&lt;br&gt;}&lt;br&gt;&lt;br&gt;function TCPObj::onDNSFailed(%this)&lt;br&gt;{&lt;br&gt;}&lt;br&gt;&lt;br&gt;function TCPObj::onConnected(%this)&lt;br&gt;{&lt;br&gt;   %filename= %this.filename;&lt;br&gt;   %file = new FileObject();&lt;br&gt;   if(%file.openForRead(%filename))&lt;br&gt;   {&lt;br&gt;   	%text = %file.readLine();&lt;br&gt;      while(!%file.isEOF())&lt;br&gt;      {&lt;br&gt;        %text = %text @ &amp;quot;\r\n&amp;quot; @ %file.readLine();&lt;br&gt;      }&lt;br&gt;   }&lt;br&gt;   %file.delete();&lt;br&gt;   &lt;br&gt;	%data=&amp;quot;filename=&amp;quot; @ filename(%filename) @ &amp;quot;&amp;amp;fileContent=&amp;quot; @ %text;&lt;br&gt;	%data = URLEncode(%data);&lt;br&gt;	%httpCmd=&amp;quot;POST /gg/upload.php HTTP/1.1\nHost: www.domain.com:80\nUser-Agent: Torque/1.0 \nAccept: */*\nContent-Length: &amp;quot;@ strlen(%data) @&amp;quot;\nContent-Type: application/x-www-form-urlencoded; charset=UTF-8\n\n&amp;quot; @ %data;&lt;br&gt;&lt;br&gt;	echo(%httpCmd);&lt;br&gt;	%this.send(%httpCmd @ &amp;quot; \r\n&amp;quot;);&lt;br&gt;}&lt;br&gt;&lt;br&gt;function TCPObj::onConnectFailed(%this)&lt;br&gt;{&lt;br&gt;}&lt;br&gt;&lt;br&gt;function TCPObj::onDisconnect(%this)&lt;br&gt;{&lt;br&gt;	%this.delete();&lt;br&gt;}&lt;br&gt;&lt;br&gt;function TCPObj::onLine(%this, %line)&lt;br&gt;{&lt;br&gt;	if(firstword(%line) $= &amp;quot;RETURN:&amp;quot;)&lt;br&gt;	{&lt;br&gt;		echo(restwords(%line));&lt;br&gt;		%this.disconnect();&lt;br&gt;	}&lt;br&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;And of course on the server side I had the following small php file:&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;div class='codeblock'&gt;&lt;pre&gt;&amp;lt;HTML&amp;gt;&lt;br&gt;&amp;lt;HEAD&amp;gt;&lt;br&gt;&amp;lt;/HEAD&amp;gt;&lt;br&gt;&amp;lt;BODY&amp;gt;&lt;br&gt;&amp;lt;? 		&lt;br&gt;    $filename=stripslashes($filename); &lt;br&gt;    $fileContent=stripslashes($fileContent); &lt;br&gt;&lt;br&gt;    $fd = fopen($filename, 'w'); &lt;br&gt;    fwrite($fd,stripslashes($fileContent).&amp;quot;\r\n&amp;quot;); &lt;br&gt;    fclose ($fd);&lt;br&gt;&lt;br&gt;    echo(&amp;quot;RETURN: Upload Successful\r\n&amp;quot;);&lt;br&gt;?&amp;gt; &lt;br&gt;&amp;lt;/BODY&amp;gt;&amp;lt;/HTML&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;Overall this was a fun excercise for me... something I should probably have done 3 years ago.  Yes I am aware that I should have used POST VARS in my PHP.. but as it was a simple test I didn't spend alot of time on the PHP code to make it pretty.&lt;br&gt;&lt;br&gt;&lt;br&gt;NOTE:  I will not guarantee the code I have posted is 100% correct.  I worked on this in several locations and errors may have crept into the code that I pasted here (missing semi-colons, quites, etc... or extras of any of the above)</description>
	</item>
	<item rdf:about="http://www.garagegames.com/blogs/32/8818">
		<dc:format>text/html</dc:format>
		<dc:date>2005-09-28T19:14:54+00:00</dc:date>
		<dc:creator>Harold &amp;quot;LabRat&amp;quot; Brown</dc:creator>
		<title>Wednesday Sep 28 19:14</title>
		<link>http://www.garagegames.com/blogs/32/8818</link>
		<description>Another year, another IGC&lt;br /&gt;&lt;br /&gt;Well, it looks like another year has gone by and it is time again for IGC.  Yet again I have not had time to work on anything to show off at IGC, but unlike the past two years.  This year I will be attending.&lt;br&gt;&lt;br&gt;I will be arriving in Eugene on October 5th at just about midnight, and will be staying at the Best Value Inn.</description>
	</item>
	<item rdf:about="http://www.garagegames.com/blogs/32/8095">
		<dc:format>text/html</dc:format>
		<dc:date>2005-06-21T04:43:46+00:00</dc:date>
		<dc:creator>Harold &amp;quot;LabRat&amp;quot; Brown</dc:creator>
		<title>Tuesday Jun 21 4:43</title>
		<link>http://www.garagegames.com/blogs/32/8095</link>
		<description>Sometimes life just throws you a curveball&lt;br /&gt;&lt;br /&gt;I've been pretty quiet lately due to &amp;quot;life&amp;quot; among other things the bank I work for just went through a merger so I was busy writing software to convert the internet banking accounts / history over to our system, and code to handle some custom products that we grandfathered in for those customers.  On top of that we were given 2 months to find a new place to live and move (long story... don't really care to get into the details).&lt;br&gt;&lt;br&gt;So here we are, finally moved but 50% of our stuff is still in boxes.  To top it off my main systems primary HD died the week after our move and I lost alot of code.  So I've not been having what you would call a stellar year.  Things I look forward to is getting all of my bills paid of in about a year or 1 1/2 years so I can move out of this money sink of a state.&lt;br&gt;&lt;br&gt;After all that depressing stuff... sometimes some good does come &lt;br&gt;&lt;br&gt;As of Saturday June 18, I am now a grand-father (yes that's right a grand-father)&lt;br&gt;&lt;br&gt;My wifes oldest daughter, after spending three days in the hospital delivered my grandson by C-Section 6 weeks early.  He weighd 4 pound 8 ounces and was 18.25 inches.  His name is Daveon.&lt;br&gt;&lt;br&gt;&lt;img src='http://www.mlefay.com/albums/album27/DCP_0098.sized.jpg'  alt=&quot;&quot;&gt;</description>
	</item>
	<item rdf:about="http://www.garagegames.com/blogs/32/6365">
		<dc:format>text/html</dc:format>
		<dc:date>2004-09-05T08:06:05+00:00</dc:date>
		<dc:creator>Harold &amp;quot;LabRat&amp;quot; Brown</dc:creator>
		<title>Sunday Sep 5 8:06</title>
		<link>http://www.garagegames.com/blogs/32/6365</link>
		<description>IGC, Real Life, and school.&lt;br /&gt;&lt;br /&gt;Gee... long time since I posted a .plan... then again not a whole lot going on to post about.&lt;br&gt;&lt;br&gt;In my long road to getting my degree.. I just started a class in Assembly, interesting enough it's Mainframe assembly, so not the most help for game coding.  I probably should have skipped the summer and fall school this year though, as the expense was a bit higher then I'd budgeted for (more on that later).&lt;br&gt;&lt;br&gt;In other news... my Daughter turned 4 in July, and as much as she is a little angel, she'll drive you crazy in a heartbeat (since she doesn't forget anything).  She's had a computer since before she was born... and never really spent much time on it, until we hooked her internet connection up after her birthday... now she wants to be on it all the time, Yay for &lt;a href='http://www.disney.com' target=_blank&gt;www.disney.com&lt;/a&gt; and &lt;a href='http://www.pbskids.com' target=_blank&gt;www.pbskids.com&lt;/a&gt;.   The 18th of this month (September) will also be my 5 year anniversary, which is also the opening date for the &lt;a href='http://www.norcalrenfaire.org/' target=_blank&gt;Northern California Renaissance Faire&lt;/a&gt; so I'm making plans to go there, hopefully on our anniversary.&lt;br&gt;&lt;br&gt;And that brings us to IGC..&lt;br&gt;&lt;br&gt;Looks like the best laid plans of labrat's fair just as well as those of mice and men... My monetary expenditures have exceeded my capacity to finance my trip... short story... it looks like I won't be able to make it to IGC this year... I could probably scrape together enough money for the ticket (if they aren't sold out by then), but then I'd be woefully short for money to pay for gas, and for 3-4 nights stay :(&lt;br&gt;&lt;br&gt;On the Torque front.... oh hell I've been procrastinating way too much... Maybe next .plan I'll have something torque related to post.</description>
	</item>
	<item rdf:about="http://www.garagegames.com/blogs/32/2528">
		<dc:format>text/html</dc:format>
		<dc:date>2002-04-12T10:31:31+00:00</dc:date>
		<dc:creator>Harold &amp;quot;LabRat&amp;quot; Brown</dc:creator>
		<title>Friday Apr 12 10:31</title>
		<link>http://www.garagegames.com/blogs/32/2528</link>
		<description>I haven't forgotten about the vehicle code.. I just couldn't get in the mood to work on packinging it up nice and neat.&lt;br&gt;&lt;br&gt;Instead I've been playing some DAoC (Dark Age of Camelot) since they added a new dungeon.  Along with getting a headache over the CD Audio functions of Torque (there is a small issue I have with them)&lt;br&gt;&lt;br&gt;So after playing with the CD functions for a bit I present to you this CD Player console gui.&lt;br&gt;&lt;br&gt;make a file named CDPlayer.gui in your common/ui/ folder and set it to be loaded on startup.  The contents of the file should be:&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;div class='codeblock'&gt;&lt;pre&gt;//--- OBJECT WRITE BEGIN ---&lt;br&gt;   new GuiWindowCtrl(CDPlayerGui) {&lt;br&gt;      profile = &amp;quot;GuiWindowProfile&amp;quot;;&lt;br&gt;      horizSizing = &amp;quot;right&amp;quot;;&lt;br&gt;      vertSizing = &amp;quot;bottom&amp;quot;;&lt;br&gt;      position = &amp;quot;196 162&amp;quot;;&lt;br&gt;      extent = &amp;quot;245 128&amp;quot;;&lt;br&gt;      minExtent = &amp;quot;8 8&amp;quot;;&lt;br&gt;      visible = &amp;quot;1&amp;quot;;&lt;br&gt;      helpTag = &amp;quot;0&amp;quot;;&lt;br&gt;      text = &amp;quot;CD Player&amp;quot;;&lt;br&gt;      maxLength = &amp;quot;255&amp;quot;;&lt;br&gt;      resizeWidth = &amp;quot;0&amp;quot;;&lt;br&gt;      resizeHeight = &amp;quot;0&amp;quot;;&lt;br&gt;      canMove = &amp;quot;1&amp;quot;;&lt;br&gt;      canClose = &amp;quot;1&amp;quot;;&lt;br&gt;      canMinimize = &amp;quot;0&amp;quot;;&lt;br&gt;      canMaximize = &amp;quot;0&amp;quot;;&lt;br&gt;      minSize = &amp;quot;50 50&amp;quot;;&lt;br&gt;&lt;br&gt;      new GuiButtonCtrl() {&lt;br&gt;         profile = &amp;quot;GuiButtonProfile&amp;quot;;&lt;br&gt;         horizSizing = &amp;quot;right&amp;quot;;&lt;br&gt;         vertSizing = &amp;quot;bottom&amp;quot;;&lt;br&gt;         position = &amp;quot;43 57&amp;quot;;&lt;br&gt;         extent = &amp;quot;25 25&amp;quot;;&lt;br&gt;         minExtent = &amp;quot;8 8&amp;quot;;&lt;br&gt;         visible = &amp;quot;1&amp;quot;;&lt;br&gt;         command = &amp;quot;CDPlayer.Play();&amp;quot;;&lt;br&gt;         helpTag = &amp;quot;0&amp;quot;;&lt;br&gt;         text = &amp;quot;Play&amp;quot;;&lt;br&gt;         groupNum = &amp;quot;-1&amp;quot;;&lt;br&gt;         buttonType = &amp;quot;PushButton&amp;quot;;&lt;br&gt;      };&lt;br&gt;      new GuiButtonCtrl() {&lt;br&gt;         profile = &amp;quot;GuiButtonProfile&amp;quot;;&lt;br&gt;         horizSizing = &amp;quot;right&amp;quot;;&lt;br&gt;         vertSizing = &amp;quot;bottom&amp;quot;;&lt;br&gt;         position = &amp;quot;74 57&amp;quot;;&lt;br&gt;         extent = &amp;quot;25 25&amp;quot;;&lt;br&gt;         minExtent = &amp;quot;8 8&amp;quot;;&lt;br&gt;         visible = &amp;quot;1&amp;quot;;&lt;br&gt;         command = &amp;quot;CDPlayer.Stop();&amp;quot;;&lt;br&gt;         helpTag = &amp;quot;0&amp;quot;;&lt;br&gt;         text = &amp;quot;Stop&amp;quot;;&lt;br&gt;         groupNum = &amp;quot;-1&amp;quot;;&lt;br&gt;         buttonType = &amp;quot;PushButton&amp;quot;;&lt;br&gt;      };&lt;br&gt;      new GuiButtonCtrl() {&lt;br&gt;         profile = &amp;quot;GuiButtonProfile&amp;quot;;&lt;br&gt;         horizSizing = &amp;quot;right&amp;quot;;&lt;br&gt;         vertSizing = &amp;quot;bottom&amp;quot;;&lt;br&gt;         position = &amp;quot;105 57&amp;quot;;&lt;br&gt;         extent = &amp;quot;25 25&amp;quot;;&lt;br&gt;         minExtent = &amp;quot;8 8&amp;quot;;&lt;br&gt;         visible = &amp;quot;1&amp;quot;;&lt;br&gt;         command = &amp;quot;if (CDPlayer.dcurrentTrack == CDPlayer.getTrackCount()) { CDPlayer.currentTrack=-1; } CDPlayer.playTrack(CDPlayer.currentTrack++);&amp;quot;;&lt;br&gt;         helpTag = &amp;quot;0&amp;quot;;&lt;br&gt;         text = &amp;quot;&amp;gt;&amp;gt;&amp;quot;;&lt;br&gt;         groupNum = &amp;quot;-1&amp;quot;;&lt;br&gt;         buttonType = &amp;quot;PushButton&amp;quot;;&lt;br&gt;      };&lt;br&gt;      new GuiButtonCtrl() {&lt;br&gt;         profile = &amp;quot;GuiButtonProfile&amp;quot;;&lt;br&gt;         horizSizing = &amp;quot;right&amp;quot;;&lt;br&gt;         vertSizing = &amp;quot;bottom&amp;quot;;&lt;br&gt;         position = &amp;quot;12 57&amp;quot;;&lt;br&gt;         extent = &amp;quot;25 25&amp;quot;;&lt;br&gt;         minExtent = &amp;quot;8 8&amp;quot;;&lt;br&gt;         visible = &amp;quot;1&amp;quot;;&lt;br&gt;         command = &amp;quot;if (CDPlayer.currentTrack == 0) { CDPlayer.currentTrack=CDPlayer.getTrackCount(); } CDPlayer.playTrack(CDPlayer.currentTrack--);&amp;quot;;&lt;br&gt;         helpTag = &amp;quot;0&amp;quot;;&lt;br&gt;         text = &amp;quot;&amp;lt;&amp;lt;&amp;quot;;&lt;br&gt;         groupNum = &amp;quot;-1&amp;quot;;&lt;br&gt;         buttonType = &amp;quot;PushButton&amp;quot;;&lt;br&gt;      };&lt;br&gt;      new GuiPopUpMenuCtrl() {&lt;br&gt;         profile = &amp;quot;GuiPopUpMenuProfile&amp;quot;;&lt;br&gt;         horizSizing = &amp;quot;right&amp;quot;;&lt;br&gt;         vertSizing = &amp;quot;bottom&amp;quot;;&lt;br&gt;         position = &amp;quot;136 29&amp;quot;;&lt;br&gt;         extent = &amp;quot;36 19&amp;quot;;&lt;br&gt;         minExtent = &amp;quot;8 8&amp;quot;;&lt;br&gt;         visible = &amp;quot;1&amp;quot;;&lt;br&gt;         helpTag = &amp;quot;0&amp;quot;;&lt;br&gt;         text = &amp;quot;Drive&amp;quot;;&lt;br&gt;         maxLength = &amp;quot;255&amp;quot;;&lt;br&gt;         maxPopupHeight = &amp;quot;200&amp;quot;;&lt;br&gt;      };&lt;br&gt;      new GuiPopUpMenuCtrl(playMode) {&lt;br&gt;         profile = &amp;quot;GuiPopUpMenuProfile&amp;quot;;&lt;br&gt;         horizSizing = &amp;quot;right&amp;quot;;&lt;br&gt;         vertSizing = &amp;quot;bottom&amp;quot;;&lt;br&gt;         position = &amp;quot;144 58&amp;quot;;&lt;br&gt;         extent = &amp;quot;85 21&amp;quot;;&lt;br&gt;         minExtent = &amp;quot;8 8&amp;quot;;&lt;br&gt;         visible = &amp;quot;1&amp;quot;;&lt;br&gt;         variable = &amp;quot;CDPlayer.playMode&amp;quot;;&lt;br&gt;         helpTag = &amp;quot;0&amp;quot;;&lt;br&gt;         maxLength = &amp;quot;255&amp;quot;;&lt;br&gt;         maxPopupHeight = &amp;quot;200&amp;quot;;&lt;br&gt;      };&lt;br&gt;      new GuiTextCtrl() {&lt;br&gt;         profile = &amp;quot;GuiTextProfile&amp;quot;;&lt;br&gt;         horizSizing = &amp;quot;right&amp;quot;;&lt;br&gt;         vertSizing = &amp;quot;bottom&amp;quot;;&lt;br&gt;         position = &amp;quot;11 30&amp;quot;;&lt;br&gt;         extent = &amp;quot;30 18&amp;quot;;&lt;br&gt;         minExtent = &amp;quot;8 8&amp;quot;;&lt;br&gt;         visible = &amp;quot;1&amp;quot;;&lt;br&gt;         helpTag = &amp;quot;0&amp;quot;;&lt;br&gt;         text = &amp;quot;Track:&amp;quot;;&lt;br&gt;         maxLength = &amp;quot;255&amp;quot;;&lt;br&gt;      };&lt;br&gt;      new GuiTextCtrl() {&lt;br&gt;         profile = &amp;quot;GuiTextProfile&amp;quot;;&lt;br&gt;         horizSizing = &amp;quot;right&amp;quot;;&lt;br&gt;         vertSizing = &amp;quot;bottom&amp;quot;;&lt;br&gt;         position = &amp;quot;45 30&amp;quot;;&lt;br&gt;         extent = &amp;quot;8 18&amp;quot;;&lt;br&gt;         minExtent = &amp;quot;8 8&amp;quot;;&lt;br&gt;         visible = &amp;quot;1&amp;quot;;&lt;br&gt;         variable = &amp;quot;CDPlayer.dcurrentTrack&amp;quot;;&lt;br&gt;         helpTag = &amp;quot;0&amp;quot;;&lt;br&gt;         maxLength = &amp;quot;255&amp;quot;;&lt;br&gt;      };&lt;br&gt;      new GuiTextCtrl() {&lt;br&gt;         profile = &amp;quot;GuiTextProfile&amp;quot;;&lt;br&gt;         horizSizing = &amp;quot;right&amp;quot;;&lt;br&gt;         vertSizing = &amp;quot;bottom&amp;quot;;&lt;br&gt;         position = &amp;quot;57 30&amp;quot;;&lt;br&gt;         extent = &amp;quot;8 18&amp;quot;;&lt;br&gt;         minExtent = &amp;quot;8 8&amp;quot;;&lt;br&gt;         visible = &amp;quot;1&amp;quot;;&lt;br&gt;         helpTag = &amp;quot;0&amp;quot;;&lt;br&gt;         text = &amp;quot;/&amp;quot;;&lt;br&gt;         maxLength = &amp;quot;255&amp;quot;;&lt;br&gt;      };&lt;br&gt;      new GuiTextCtrl() {&lt;br&gt;         profile = &amp;quot;GuiTextProfile&amp;quot;;&lt;br&gt;         horizSizing = &amp;quot;right&amp;quot;;&lt;br&gt;         vertSizing = &amp;quot;bottom&amp;quot;;&lt;br&gt;         position = &amp;quot;69 30&amp;quot;;&lt;br&gt;         extent = &amp;quot;12 18&amp;quot;;&lt;br&gt;         minExtent = &amp;quot;8 8&amp;quot;;&lt;br&gt;         visible = &amp;quot;1&amp;quot;;&lt;br&gt;         variable = &amp;quot;CDPlayer.totalTracks&amp;quot;;&lt;br&gt;         helpTag = &amp;quot;0&amp;quot;;&lt;br&gt;         maxLength = &amp;quot;255&amp;quot;;&lt;br&gt;      };&lt;br&gt;      new GuiRadioCtrl() {&lt;br&gt;         profile = &amp;quot;GuiRadioProfile&amp;quot;;&lt;br&gt;         horizSizing = &amp;quot;right&amp;quot;;&lt;br&gt;         vertSizing = &amp;quot;bottom&amp;quot;;&lt;br&gt;         position = &amp;quot;183 28&amp;quot;;&lt;br&gt;         extent = &amp;quot;58 20&amp;quot;;&lt;br&gt;         minExtent = &amp;quot;8 8&amp;quot;;&lt;br&gt;         visible = &amp;quot;1&amp;quot;;&lt;br&gt;         variable = &amp;quot;CDPlayer.repeat&amp;quot;;&lt;br&gt;         helpTag = &amp;quot;0&amp;quot;;&lt;br&gt;         text = &amp;quot;Repeat&amp;quot;;&lt;br&gt;         groupNum = &amp;quot;-1&amp;quot;;&lt;br&gt;         buttonType = &amp;quot;RadioButton&amp;quot;;&lt;br&gt;      };&lt;br&gt;      new GuiSliderCtrl(cdvolume) {&lt;br&gt;         profile = &amp;quot;GuiSliderProfile&amp;quot;;&lt;br&gt;         horizSizing = &amp;quot;right&amp;quot;;&lt;br&gt;         vertSizing = &amp;quot;bottom&amp;quot;;&lt;br&gt;         position = &amp;quot;14 89&amp;quot;;&lt;br&gt;         extent = &amp;quot;220 31&amp;quot;;&lt;br&gt;         minExtent = &amp;quot;8 8&amp;quot;;&lt;br&gt;         visible = &amp;quot;1&amp;quot;;&lt;br&gt;         variable = &amp;quot;value&amp;quot;;&lt;br&gt;         command = &amp;quot;CDPlayer.setVolume();&amp;quot;;&lt;br&gt;         helpTag = &amp;quot;0&amp;quot;;&lt;br&gt;         range = &amp;quot;0.000000 1.000000&amp;quot;;&lt;br&gt;         ticks = &amp;quot;1000&amp;quot;;&lt;br&gt;         value = &amp;quot;0.471429&amp;quot;;&lt;br&gt;      };&lt;br&gt;   };&lt;br&gt;&lt;br&gt;//--- OBJECT WRITE END ---&lt;br&gt;playmode.add(Track,1);&lt;br&gt;playmode.add(Continuous,2);&lt;br&gt;playmode.add(Random,3);&lt;br&gt;&lt;br&gt;function playmode::onSelect(%this, %id)&lt;br&gt;{&lt;br&gt;   CDPlayer.playMode=playmode.gettextbyid(%id);&lt;br&gt;}&lt;br&gt;&lt;br&gt;function RedBookCallback(%type)&lt;br&gt;{&lt;br&gt;   if(%type $= &amp;quot;PlayFinished&amp;quot;)&lt;br&gt;      CDPlayer.playFinished();&lt;br&gt;}&lt;br&gt;&lt;br&gt;new ScriptObject(CDPlayer)&lt;br&gt;{&lt;br&gt;   class = CDAudio;&lt;br&gt;   currentTrack = 0;&lt;br&gt;   dcurrentTrack = 0;&lt;br&gt;   totalTracks = 0;&lt;br&gt;   playMode = &amp;quot;Track&amp;quot;;&lt;br&gt;   repeat = true;&lt;br&gt;   volume=0.5;&lt;br&gt;};&lt;br&gt;&lt;br&gt;redbookOpen();&lt;br&gt;redbookSetVolume(CDPlayer.volume);&lt;br&gt;&lt;br&gt;&lt;br&gt;//----&lt;br&gt;&lt;br&gt;function CDAudio::setVolume(%this)&lt;br&gt;{&lt;br&gt;	CDPlayer.volume = cdvolume.value;	&lt;br&gt;   redbookSetVolume(CDPlayer.volume);&lt;br&gt;}&lt;br&gt;&lt;br&gt;function CDAudio::playFinished(%this)&lt;br&gt;{&lt;br&gt;   if(%this.repeat == false)&lt;br&gt;      return;&lt;br&gt;&lt;br&gt;   %this.play();&lt;br&gt;}&lt;br&gt;&lt;br&gt;function CDAudio::play(%this)&lt;br&gt;{&lt;br&gt;   %numTracks = %this.getTrackCount();&lt;br&gt;   CDPlayer.totalTracks=%numTracks;&lt;br&gt;   if(%numTracks == 0)&lt;br&gt;   {&lt;br&gt;      error(redbookGetLastError());&lt;br&gt;      return;&lt;br&gt;   }&lt;br&gt;&lt;br&gt;   switch$(%this.playMode)&lt;br&gt;   {&lt;br&gt;      case &amp;quot;Track&amp;quot;:&lt;br&gt;         %this.playTrack(%this.currentTrack);&lt;br&gt;&lt;br&gt;      case &amp;quot;Continuous&amp;quot;:&lt;br&gt;         %this.currentTrack++;&lt;br&gt;         %this.dcurrentTrack++;&lt;br&gt;         if(%this.currentTrack &amp;gt;= %numTracks) {&lt;br&gt;            %this.currentTrack = 0;&lt;br&gt;            %this.dcurrentTrack = 1;&lt;br&gt;         }&lt;br&gt;         %this.playTrack(%this.currentTrack);&lt;br&gt;&lt;br&gt;      case &amp;quot;Random&amp;quot;:&lt;br&gt;         %track = mFloor(getRandom() * (%numTracks + 1));&lt;br&gt;         if(%track &amp;gt;= %numTracks)&lt;br&gt;            %track = %numTracks - 1;&lt;br&gt;         %this.playTrack(%track);&lt;br&gt;   }&lt;br&gt;}&lt;br&gt;&lt;br&gt;function CDAudio::playTrack(%this, %track)&lt;br&gt;{&lt;br&gt;   if(redbookPlay(%track) == false)&lt;br&gt;   {&lt;br&gt;      error(redbookGetLastError());&lt;br&gt;      %this.repeat = false;&lt;br&gt;      return;   &lt;br&gt;   }&lt;br&gt;   %this.currentTrack = %track;&lt;br&gt;   %this.dcurrentTrack = %track+1;&lt;br&gt;}&lt;br&gt;&lt;br&gt;function CDAudio::stop(%this)&lt;br&gt;{&lt;br&gt;   redbookStop();&lt;br&gt;}&lt;br&gt;&lt;br&gt;function CDAudio::getTrackCount(%this)&lt;br&gt;{&lt;br&gt;   return(redbookGetTrackCount());&lt;br&gt;}&lt;br&gt;&lt;br&gt;function CDAudio::togglecontrol(%this,%make){&lt;br&gt;        if(!%this.show){&lt;br&gt;                  CDPlayerGui.mouseOn = Canvas.isCursorOn();&lt;br&gt;                  if(!CDPlayerGui.mouseOn)&lt;br&gt;                        CursorOn(); &lt;br&gt;                  %this.controlhud();&lt;br&gt;                  %this.show = 1;&lt;br&gt;        }&lt;br&gt;        else {&lt;br&gt;       		%this.controlcanvas.remove(CDPlayerGUI);&lt;br&gt;                %this.show = 0;&lt;br&gt;                if(!CDPlayerGui.mouseOn)&lt;br&gt;                        CursorOff();&lt;br&gt;                canvas.repaint();&lt;br&gt;        }&lt;br&gt;}&lt;br&gt;&lt;br&gt;function CDAudio::controlhud(%this)&lt;br&gt;{&lt;br&gt;	%this.controlcanvas = Canvas.getContent();&lt;br&gt;	Canvas.getContent().add(CDPlayerGUI);&lt;br&gt;	canvas.repaint();&lt;br&gt;}&lt;br&gt;&lt;br&gt;GlobalActionMap.bindcmd(keyboard, &amp;quot;ctrl F1&amp;quot;, &amp;quot;CDPlayer.togglecontrol();&amp;quot;,&amp;quot;&amp;quot;);&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;To open the CD Player tool press Ctrl-F1, currently you can't change CD drives so your audio CD must be in the first CD Drive your system sees.</description>
	</item>
	<item rdf:about="http://www.garagegames.com/blogs/32/2492">
		<dc:format>text/html</dc:format>
		<dc:date>2002-04-05T09:31:15+00:00</dc:date>
		<dc:creator>Harold &amp;quot;LabRat&amp;quot; Brown</dc:creator>
		<title>Friday Apr 5 9:31</title>
		<link>http://www.garagegames.com/blogs/32/2492</link>
		<description>Latest news from the front:&lt;br&gt;&lt;br&gt;After someone dropped by the IRC asking about getting weapons mounted onto the vehicles in Torque I decided to give it a whirl.&lt;br&gt;&lt;br&gt;Breaking out my trusty T2 reference scripts I disected how the weapons on vehicles were working in T2 I then stripped out all the extra useless garbage and added what was left to the racing MOD, using the weapons specs from the crossbow weapon as the basis of the new vehicle weapon.&lt;br&gt;&lt;br&gt;The result was a cardboard box with wheels and a crossbow that fires ;)&lt;br&gt;&lt;br&gt;I'll work on cleaning the instructions up a bit and making sure all the code has been sanitized of T2 content.&lt;br&gt;&lt;br&gt;[update]&lt;br&gt;I found a site that had some nice models in milkshape format so I converted them over to Torque ;)&lt;br&gt;&lt;br&gt;&lt;a href='http://xu1productions.com/3dstudio/index.html' target=_blank&gt;xu1productions.com/3dstudio/index.html&lt;/a&gt;&lt;br&gt;Has some nice tutorials and a few models.&lt;br&gt;&lt;br&gt;&lt;img src='http://realmwars.feylab.com/images/newcar.jpg'  alt=&quot;&quot;&gt;</description>
	</item>
	<item rdf:about="http://www.garagegames.com/blogs/32/2427">
		<dc:format>text/html</dc:format>
		<dc:date>2002-03-28T09:21:56+00:00</dc:date>
		<dc:creator>Harold &amp;quot;LabRat&amp;quot; Brown</dc:creator>
		<title>Thursday Mar 28 9:21</title>
		<link>http://www.garagegames.com/blogs/32/2427</link>
		<description>Slight intermission from the projectile switching GUI.&lt;br /&gt;&lt;br /&gt;I stopped working on the Projectile switching GUI to test flag mounting in Realm Wars / Torque.&lt;br&gt;&lt;br&gt;The good news:&lt;br&gt;&lt;br&gt;&lt;img src='http://realmwars.feylab.com/realmwar_flag.jpg'  alt=&quot;&quot;&gt;&lt;br&gt;&lt;br&gt;It works... the bad news was that the flag I used came from T2.&lt;br&gt;&lt;br&gt;So I grabbed Milkshape 3D, fought with it for like 5 hours and finally came up with this:&lt;br&gt;&lt;br&gt;&lt;img src='http://realmwars.feylab.com/realmwar_newflag.jpg'  alt=&quot;&quot;&gt;&lt;br&gt;&lt;br&gt;It's not the pretiest Flag in the world.  But for testing and general mockup use it's better than using copyrighted work.  And this model can be distributed.&lt;br&gt;&lt;br&gt;I'll get it packaged up and made available over the next day or so.</description>
	</item>
	<item rdf:about="http://www.garagegames.com/blogs/32/2414">
		<dc:format>text/html</dc:format>
		<dc:date>2002-03-27T10:23:46+00:00</dc:date>
		<dc:creator>Harold &amp;quot;LabRat&amp;quot; Brown</dc:creator>
		<title>Wednesday Mar 27 10:23</title>
		<link>http://www.garagegames.com/blogs/32/2414</link>
		<description>I'm baaaaaaaack..  After a bit of a vacation into the world of DAoC ( &lt;a href='http://www.darkageofcamelot.com' target=_blank&gt;www.darkageofcamelot.com&lt;/a&gt; ) I have returned as the call of Realm Wars beckons.&lt;br /&gt;&lt;br /&gt;OK what have I been working on lately..&lt;br&gt;&lt;br&gt;I posted a snippit of code in reponse to a question on how to cause a projectile to blow-up after a specified time vs. requiring a collision to blow the projectile up.  You may also view this snippit at my Realm Wars site &lt;a href='http://realmwars.feylab.com/' target=_blank&gt;realmwars.feylab.com/&lt;/a&gt;&lt;br&gt;&lt;br&gt;Other then that I've been working on a projectile switching function.&lt;br&gt;&lt;br&gt;What this allows you to do is have weapons with multiple ammo/projectile-types that the player can switch between.&lt;br&gt;&lt;br&gt;I have a working function but still need to build a simple GUI interface to show what Ammo you are using and what your current inventory for that ammo is.</description>
	</item>
	<item rdf:about="http://www.garagegames.com/blogs/32/1404">
		<dc:format>text/html</dc:format>
		<dc:date>2001-09-03T07:31:31+00:00</dc:date>
		<dc:creator>Harold &amp;quot;LabRat&amp;quot; Brown</dc:creator>
		<title>Monday Sep 3 7:31</title>
		<link>http://www.garagegames.com/blogs/32/1404</link>
		<description>I don't have what you would call a &amp;quot;plan&amp;quot;.  I just move from topic to topic seeing what I can learn or help others with.&lt;br&gt;&lt;br&gt;Currently I am:&lt;br&gt;&lt;br&gt;1. Been enjoying the Northern California Renaissance Fair&lt;br&gt;2. Waiting for the new engine Revision and Demo&lt;br&gt;3. Writing a .plan&lt;br&gt;4. Beta Testing Dark Age of Camelot&lt;br&gt;5. Working on a Website with my Wife - &lt;a href='http://camelot.playersevent.com' target=_blank&gt;camelot.playersevent.com&lt;/a&gt;&lt;br&gt;6. Designing some T-Shirts &lt;a href='http://www.feylab.com' target=_blank&gt;www.feylab.com&lt;/a&gt;&lt;br&gt;7. Learning PHP.</description>
	</item>
</rdf:RDF>
