﻿<?xml version='1.0' encoding='UTF-8'?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/'><id>tag:blogger.com,1999:blog-5415721124759512601</id><updated>2008-01-17T13:32:11.762-05:00</updated><title type='text'>In the Pipe, Five By Five</title><link rel='alternate' type='text/html' href='http://www.notasenator.com/blog/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/5415721124759512601/posts/default?start-index=26&amp;max-results=25'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5415721124759512601/posts/default'/><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.notasenator.com/blog/nasblog.xml'/><author><name>Brian</name></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>42</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><published>2008-01-17T13:32:00.001-05:00</published><updated>2008-01-18T13:00:00.875-05:00</updated><title type='text'>Blog Has Moved</title><content type='html'>&lt;p&gt;Visit the &lt;a href="http://www.zero-altitude.com/fightgrav.aspx"&gt;new blog&lt;/a&gt; at &lt;a href="http://www.zero-altitude.com/"&gt;Zero-Altitude.com&lt;/a&gt;/p&gt;  </content><link rel='alternate' type='text/html' href='http://www.notasenator.com/blog/' title='Blog Has Moved'/><author><name>Brian</name></author></entry><entry><id>tag:blogger.com,1999:blog-5415721124759512601.post-8529283131791290574</id><published>2008-01-17T13:32:00.001-05:00</published><updated>2008-01-17T13:32:11.875-05:00</updated><title type='text'>Descriptive Words</title><content type='html'>&lt;p&gt;The blog will be what I can best describe as "wonky" until I get it all moved over to &lt;a href="http://www.zero-altitude.com/"&gt;Zero Altitude&lt;/a&gt;.&amp;nbsp; In the meantime, take solace in the fact that I've got tons of good music here to keep me moving until I finish putting everything up.&lt;/p&gt;  </content><link rel='alternate' type='text/html' href='http://www.notasenator.com/blog/2008/01/descriptive-words.html' title='Descriptive Words'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5415721124759512601&amp;postID=8529283131791290574' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.notasenator.com/blog/nasblog.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5415721124759512601/posts/default/8529283131791290574'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5415721124759512601/posts/default/8529283131791290574'/><author><name>Brian</name></author></entry><entry><id>tag:blogger.com,1999:blog-5415721124759512601.post-462133297233154016</id><published>2008-01-17T01:13:00.001-05:00</published><updated>2008-01-17T01:13:16.211-05:00</updated><title type='text'>Things to do while idling on the tarmac</title><content type='html'>&lt;p&gt;There probably was a pilot or two and a very friendly sounding controller at Van Nuys who saw me sitting around in a Baron 58 at LAX and abroad today on VATSIM.&amp;nbsp; What I was doing was testing the module version of Squawkbox 4, meaning the version you launch from inside of Flight Sim.&amp;nbsp; The good news is that me sitting there on the network meant that it worked.&amp;nbsp; It's a real milestone in the project for me, and while there is plenty of work to do moving forward, we are reaching a point where we can get beta testers running it, and that brings us closer to release.&lt;/p&gt; &lt;p&gt;I know Joel and I both take the development of Squawkbox very seriously.&amp;nbsp; It's quality is not representative of a company or a group or anything like that, but us personally, and I am doing everything I can to live up to the high standard he's set.&amp;nbsp; &lt;/p&gt; &lt;p&gt;Joel and I will be getting together online in the near future to talk about the plans as we continue forward towards release.&lt;/p&gt; &lt;p&gt;Recently, &lt;a href="http://blogs.msdn.com/ptaylor/default.aspx"&gt;Phil Taylor&lt;/a&gt; has been posting about &lt;a href="http://blogs.msdn.com/ptaylor/archive/2008/01/15/great-jobs-available-in-aces.aspx"&gt;some great job opportunities&lt;/a&gt; at ACES.&amp;nbsp; If any of you are programmers, I'd take a look at it.&amp;nbsp; When you meet these guys in person, you really understand their passion for creating the sim we love.&amp;nbsp; If you head over to &lt;a href="http://www.microsoft.com/careers"&gt;http://www.microsoft.com/careers&lt;/a&gt; and do a search with the term "Flight Sim" in double quotes as the keyword, you should find all of the related jobs.&lt;/p&gt; &lt;p&gt;If you want to go start your own company, GamesIndustry.biz put up a &lt;a href="http://www.gamesindustry.biz/content_page.php?aid=32132"&gt;very interesting piece&lt;/a&gt; on why it's so awesome to have a game studio in Canada.&amp;nbsp; I guess they just &lt;em&gt;give &lt;/em&gt;you money or something.&lt;/p&gt;  </content><link rel='alternate' type='text/html' href='http://www.notasenator.com/blog/2008/01/things-to-do-while-idling-on-tarmac.html' title='Things to do while idling on the tarmac'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5415721124759512601&amp;postID=462133297233154016' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.notasenator.com/blog/nasblog.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5415721124759512601/posts/default/462133297233154016'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5415721124759512601/posts/default/462133297233154016'/><author><name>Brian</name></author></entry><entry><id>tag:blogger.com,1999:blog-5415721124759512601.post-8123864466894153311</id><published>2008-01-15T11:47:00.001-05:00</published><updated>2008-01-15T11:47:27.933-05:00</updated><title type='text'>Connect Three Red Cubes to Fire Phasers</title><content type='html'>&lt;p&gt;Ok, so I've been pushing for a long time, a very long time, for someone to make a MMO where it's a bunch of people on a spaceship traveling around galaxies and doing adventure-type stuff.&amp;nbsp; Firefly/Lost In Space/MMO X3, whatever. It appeared that we might get that in the new Star Trek Online, until developer Perpetual Entertainment decided to push into the super-profitable casual market, taking STOnline with it. When screens appeared recently, it had a much softer, cartoony look to it, far from the ultra-realistic renders of early concept work. &lt;/p&gt; &lt;p&gt;It looked like a casual game. &lt;br&gt;&lt;/p&gt; &lt;p&gt;Now, just the other day, I was promoting the concept of Puzzle Pirates in Space to Will, and in hindsight, I realize this is exactly what it was becoming. &lt;br&gt;&lt;/p&gt; &lt;p&gt;So it gives me some relief today to read the news the Perpetual, or P2 or whatever it's called now &lt;a href="http://www.warcry.com/articles/view/breakingnews/2802-Breaking-News-P2-Out-As-Star-Trek-Online-Developer"&gt;has been pulled from the development of Star Trek Online&lt;/a&gt;, and an unnamed developer will be taking over, and more than likely, starting over. This probably means it will be years before we see an actual game out of this, leaving the Firefly MMO that FOX is making as the nearest hope. And let's face it, it's not going to be good at all.&lt;/p&gt; &lt;p&gt;Here's what we were told it would look like originally during "Look Development":&lt;/p&gt; &lt;p&gt;&lt;img src="http://www.kill-more-people.de/images/games/star_trek/StarTrekOnline_scr1.jpg"&gt; &lt;/p&gt; &lt;p&gt;&lt;img src="http://www.joystiq.com/media/2006/02/STO_final_02.jpg"&gt; &lt;/p&gt; &lt;p&gt;&lt;img src="http://www.3dhead.co.uk/images/sto6.jpg"&gt; &lt;/p&gt; &lt;p&gt;&lt;a href="http://www.startrekonline.com/images/IntScreen.jpg"&gt;Click here&lt;/a&gt; for the big version of what they made it look like.&lt;/p&gt; &lt;p&gt;&lt;img src="http://www.startrekonline.com/images/IntScreen_th.jpg"&gt; &lt;/p&gt; &lt;p&gt;All of that development and look, all of those hardcore trek fans designing layouts of ship interiors and getting &lt;a href="http://en.wikipedia.org/wiki/Michael_Okuda"&gt;Mike Friggin' Okuda&lt;/a&gt; as a consultant on the panel design and it just feels like somewhere along the way, the business end of things said "Think WoW in space!" and that's where it went.&lt;/p&gt; &lt;p&gt;I expressed some sympathy earlier because those guys really seemed to be hardcore about this, but I'm glad I'm the powers that be at Perpetual were not allowed to take the game in the direction they were going, and I hope the new parties responsible will try to succeed in the original vision of the game.&lt;/p&gt; &lt;p&gt;Or dammit, I'm just going to have to do it myself.&lt;/p&gt;  </content><link rel='alternate' type='text/html' href='http://www.notasenator.com/blog/2008/01/connect-three-red-cubes-to-fire-phasers.html' title='Connect Three Red Cubes to Fire Phasers'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5415721124759512601&amp;postID=8123864466894153311' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.notasenator.com/blog/nasblog.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5415721124759512601/posts/default/8123864466894153311'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5415721124759512601/posts/default/8123864466894153311'/><author><name>Brian</name></author></entry><entry><id>tag:blogger.com,1999:blog-5415721124759512601.post-883446357081154205</id><published>2008-01-14T16:51:00.001-05:00</published><updated>2008-01-14T16:51:25.718-05:00</updated><title type='text'>What Is Happening?</title><content type='html'>&lt;p&gt;It turns out, I'm very busy.&lt;/p&gt; &lt;p&gt;I am going to be making a status update to Joel and the VATSIM guys on the progress of SB4, but thanks to some job-hunt stuff that came up today, that probably won't happen until tomorrow.&lt;/p&gt; &lt;p&gt;I'm building TrackerX into my new website, and it hopefully shouldn't take all that long to transfer over.&amp;nbsp; I'd like to explore Silverlight and Live maps as a good alternative to my straight Javascript/Google Maps implementation now, but we'll have to see how much time that will cost me. &lt;/p&gt; &lt;p&gt;The website is proceeding slowly, since I don't have as much time to work on it, but I do have the blog up for the most part over there.&amp;nbsp; You can view that &lt;a href="http://www.zero-altitude.com/fightgrav.aspx"&gt;here&lt;/a&gt;.&amp;nbsp; I'll be putting up new content as it becomes stable in my testbed.&amp;nbsp; If you run into any troubles with it, let me know.&amp;nbsp; It should be noted that permalinks to the posts, comment page links, and any links from blogger still come to the NotASenator.com page.&amp;nbsp; I'll be fixing that as I migrate from blogger to my own solution.&lt;/p&gt; &lt;p&gt;The video tutorial was well-received and I look forward to making more.&amp;nbsp; It's actually a bit easier for me, and I feel that it offers a better direct explanation of the things I would want to explain.&lt;/p&gt; &lt;p&gt;Hitting the gym tonight, it's been rough on my body to get back into my routine.&amp;nbsp; We'll all know in a day or two whether I was able to take it easy or not.&lt;/p&gt;  </content><link rel='alternate' type='text/html' href='http://www.notasenator.com/blog/2008/01/what-is-happening.html' title='What Is Happening?'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5415721124759512601&amp;postID=883446357081154205' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.notasenator.com/blog/nasblog.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5415721124759512601/posts/default/883446357081154205'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5415721124759512601/posts/default/883446357081154205'/><author><name>Brian</name></author></entry><entry><id>tag:blogger.com,1999:blog-5415721124759512601.post-7550443562365909579</id><published>2008-01-12T22:43:00.001-05:00</published><updated>2008-01-12T23:01:41.945-05:00</updated><title type='text'>Menus and Modules, a Video Tutorial</title><content type='html'>&lt;p&gt;I've put together something of a "test case", creating a video capture of my desktop activity while I create and explain a simple SimConnect application to place menus and text into FSX.&lt;/p&gt; &lt;p&gt;The sound quality is terrible, and that's something I'm getting some professional advice about fixing, however, except for some pops, I don't think it's too unbearable.&lt;/p&gt; &lt;p&gt;Feel free to download the file &lt;a href="http://www.notasenator.com/media/video/tutorials/menu_driven_module_csharp_01.wmv"&gt;here&lt;/a&gt; (right click and save as, approx. 64MB) or simply watch the smaller version embedded below:&lt;/p&gt; &lt;OBJECT ID="MediaPlayer" WIDTH="800" HEIGHT="600" CLASSID="CLSID:22D6F312-B0F6-11D0-94AB-0080C74C7E95" STANDBY="Loading Windows Media Player components..." TYPE="application/x-oleobject"&gt; &lt;PARAM NAME="FileName" VALUE="http://www.notasenator.com/media/video/tutorials/menu_driven_module_csharp_01.wmv"&gt; &lt;PARAM name="autostart" VALUE="false"&gt; &lt;PARAM name="ShowControls" VALUE="true"&gt; &lt;param name="ShowStatusBar" value="false"&gt; &lt;PARAM name="ShowDisplay" VALUE="false"&gt; &lt;EMBED TYPE="application/x-mplayer2" SRC="http://www.notasenator.com/media/video/tutorials/menu_driven_module_csharp_01.wmv" NAME="MediaPlayer" WIDTH="640" HEIGHT="480" ShowControls="1" ShowStatusBar="0" ShowDisplay="0" autostart="0"&gt; &lt;/EMBED&gt; &lt;/OBJECT&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;This is my first go at something like this, please leave questions and comments for me.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;UPDATE: &lt;/strong&gt;I wanted to mention that &lt;a href="http://jcboliveira.name/"&gt;José Oliveira&lt;/a&gt; gets the credit for this simpler method of not showing the window.&amp;nbsp; Thanks, JC.&lt;/p&gt;  </content><link rel='alternate' type='text/html' href='http://www.notasenator.com/blog/2008/01/menus-and-modules-video-tutorial.html' title='Menus and Modules, a Video Tutorial'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5415721124759512601&amp;postID=7550443562365909579' title='3 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.notasenator.com/blog/nasblog.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5415721124759512601/posts/default/7550443562365909579'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5415721124759512601/posts/default/7550443562365909579'/><author><name>Brian</name></author></entry><entry><id>tag:blogger.com,1999:blog-5415721124759512601.post-5455348339076105880</id><published>2008-01-11T21:49:00.001-05:00</published><updated>2008-01-11T21:49:50.496-05:00</updated><title type='text'>The Oldest Review Possible</title><content type='html'>&lt;p&gt;I'm working like mad on SB4 and the new website, but I did take a little time to go to a game night at a friend's house.&amp;nbsp; While Call of Duty 4 on the 360 gave us some high-paced next-gen competitive play, we soon pulled out Ghost Recon Advanced Warfighter and played four player co-op split screen.&amp;nbsp; Realistically, the old GRAW should not be out-doing the award winning brand-new C0D4, but there was a decision along the way to make co-op over Live only.&amp;nbsp; This meant that the four of us sitting in a room with one TV could only shoot each other and do nothing else.&lt;/p&gt; &lt;p&gt;GRAW, on the other hand, had us wandering though crazy levels hunting down tangos &lt;em&gt;together&lt;/em&gt;, the tension and excitement was shared and that can't be topped by shiny graphics.&lt;/p&gt; &lt;p&gt;So the discussion became "hey, they made a new one, you know".&amp;nbsp; We are talking about getting GRAW2 for increased Tango-Downing, and with that in mind, here is the five star Gamespy review from that game:&lt;/p&gt; &lt;p&gt;&lt;a title="http://xbox360.gamespy.com/xbox-360/tom-clancys-ghost-recon-advanced-warfighter-2/771436p1.html" href="http://xbox360.gamespy.com/xbox-360/tom-clancys-ghost-recon-advanced-warfighter-2/771436p1.html"&gt;http://xbox360.gamespy.com/xbox-360/tom-clancys-ghost-recon-advanced-warfighter-2/771436p1.html&lt;/a&gt;&lt;/p&gt;  </content><link rel='alternate' type='text/html' href='http://www.notasenator.com/blog/2008/01/oldest-review-possible.html' title='The Oldest Review Possible'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5415721124759512601&amp;postID=5455348339076105880' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.notasenator.com/blog/nasblog.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5415721124759512601/posts/default/5455348339076105880'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5415721124759512601/posts/default/5455348339076105880'/><author><name>Brian</name></author></entry><entry><id>tag:blogger.com,1999:blog-5415721124759512601.post-7029029872940244142</id><published>2008-01-09T13:57:00.000-05:00</published><updated>2008-01-09T13:59:23.021-05:00</updated><title type='text'>New Host Inbound</title><content type='html'>I rewrote my WoW chat program in ASP.NET to demo on the web, but found that Dreamhost doesn't support ASP at all. &lt;br /&gt;&lt;br /&gt;So I'm looking at other opportunities, perhaps &lt;a href="http://www.reliablesite.net/v3/index.asp"&gt;Reliable Web Hosting&lt;/a&gt; since they are cheap, look good and I like their website.&lt;br /&gt;&lt;br /&gt;Anyone here using a host that supports ASP.NET 3.5?</content><link rel='alternate' type='text/html' href='http://www.notasenator.com/blog/2008/01/new-host-inbound.html' title='New Host Inbound'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5415721124759512601&amp;postID=7029029872940244142' title='1 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.notasenator.com/blog/nasblog.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5415721124759512601/posts/default/7029029872940244142'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5415721124759512601/posts/default/7029029872940244142'/><author><name>Brian</name></author></entry><entry><id>tag:blogger.com,1999:blog-5415721124759512601.post-5963032028857197897</id><published>2008-01-07T23:57:00.000-05:00</published><updated>2008-01-07T23:58:15.021-05:00</updated><title type='text'>Watch this space</title><content type='html'>Feeling a little under the weather but I will have this post up tomorrow morning.&lt;br /&gt;&lt;br /&gt;Sorry for the delay</content><link rel='alternate' type='text/html' href='http://www.notasenator.com/blog/2008/01/watch-this-space.html' title='Watch this space'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5415721124759512601&amp;postID=5963032028857197897' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.notasenator.com/blog/nasblog.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5415721124759512601/posts/default/5963032028857197897'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5415721124759512601/posts/default/5963032028857197897'/><author><name>Brian</name></author></entry><entry><id>tag:blogger.com,1999:blog-5415721124759512601.post-7167336838962714894</id><published>2008-01-06T13:02:00.001-05:00</published><updated>2008-01-06T13:02:31.031-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='WoW'/><title type='text'>WoW Chat Project Part 2</title><content type='html'>&lt;p&gt;So let's jump right in.&amp;nbsp; We've got the program starting and running fine, and setting the proper channel.&amp;nbsp; Now we have to handle the event that fires when the user presses "Enter".&amp;nbsp; We want to write the text of the entry window to the chat window, clear the entry window and set the channel back.&lt;/p&gt; &lt;p&gt;To get us started, we want to add an event handler to the Form1 constructor:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public &lt;/span&gt;Form1()&lt;br /&gt;{&lt;br /&gt;    InitializeComponent();&lt;br /&gt;&lt;br /&gt;    rChatEntry.KeyDown += &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;KeyEventHandler&lt;/span&gt;(chatEnterPressed);&lt;/pre&gt;&lt;pre class="code"&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;I covered event handlers in the SimConnect tutorials, but the whole handler/delegate concept is pretty simple.&amp;nbsp; When something happens in specified control (in this case, that's the chat entry window, &lt;em&gt;rChatEntry&lt;/em&gt;) it fires off an event.&amp;nbsp; Since we've registered an event handler, the event has a delegate, which is simply a function that runs when the event gets fired.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;So now we need &lt;em&gt;chatEnterPressed.&lt;/em&gt;&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;private void &lt;/span&gt;chatEnterPressed(&lt;span style="color: blue"&gt;object &lt;/span&gt;sender, &lt;span style="color: #2b91af"&gt;KeyEventArgs &lt;/span&gt;e)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: green"&gt;// check to see if Enter was pressed&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: blue"&gt;if &lt;/span&gt;(e.KeyValue == 13)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: blue"&gt;if &lt;/span&gt;(rChatEntry.Text.Length != lineStart)&lt;br /&gt;        {&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        e.Handled = &lt;span style="color: blue"&gt;true&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;This is essentially just the frame, we'll get to the guts of the function in a second.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;font face="Georgia"&gt;An event handler function like this has parameters for the &lt;em&gt;sender&lt;/em&gt; which is simply whatever control or object sent the event.&amp;nbsp; The variable &lt;em&gt;e &lt;/em&gt;represents whatever arguments got sent along with the event, in this case, it's info about the keypress.&amp;nbsp;&amp;nbsp; For example, we are testing here for a specific key value, 13, which is the Enter button.&amp;nbsp; &lt;/font&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Then we throw in a little validation to make sure the length of our total string (channel name + user input) is not the same as our &lt;em&gt;lineStart &lt;/em&gt;value.&amp;nbsp; You may recall, &lt;em&gt;lineStart &lt;/em&gt;is our "real" starting position, meaning how far along the chat entry text string where user input starts.&amp;nbsp; So if the values are the same, there's been no user input.&amp;nbsp; We don't want to send empty lines to the chat, so we have that check in there.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The last little bit is &lt;em&gt;e.Handled = true.&amp;nbsp;&amp;nbsp; &lt;/em&gt;When we get an event like a keypress, the event handler's delegate gets called, but there is still a default handling of the keypress.&amp;nbsp;&amp;nbsp; In the case of the textbox like we are dealing with it's just a new line, but we don't want that.&amp;nbsp; We want to go back to the start of the first line.&amp;nbsp; So we say that the event is "Handled" so that any other event handlers don't touch it.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Now for the guts:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;if &lt;/span&gt;(lineStart != rChatEntry.Text.Length)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: green"&gt;// add the line to the chat window&lt;br /&gt;    &lt;/span&gt;rChatWindow.SelectedRtf = rChatEntry.Rtf;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: green"&gt;// clear the text entry&lt;br /&gt;    &lt;/span&gt;rChatEntry.Select(0, rChatEntry.Text.Length);&lt;br /&gt;    rChatEntry.SelectionProtected = &lt;span style="color: blue"&gt;false&lt;/span&gt;;&lt;br /&gt;    rChatEntry.Text = System.&lt;span style="color: #2b91af"&gt;String&lt;/span&gt;.Empty;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: green"&gt;// Set the channel back&lt;br /&gt;    &lt;/span&gt;chatSetChannel(selectedChannel, selectedColor);&lt;br /&gt;    &lt;br /&gt;    &lt;span style="color: green"&gt;// Scroll to the proper point&lt;br /&gt;    &lt;/span&gt;rChatWindow.ScrollToCaret();&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;em&gt;rChatWindow.SelectedRtf&lt;/em&gt;&amp;nbsp; is the spot in the chat window where our cursor/caret/pointer whatever you want to call it is.&amp;nbsp; We've used the &lt;em&gt;Text&lt;/em&gt; property to get the contents of textboxs, but with Rich Text, we can copy the formatting over as well.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Then we select everything in the chat window, set it to unprotected, and empty the string out.&amp;nbsp; Now we should have a blank chat entry field, and the line of chat is in the chat window.&amp;nbsp;&amp;nbsp; &lt;/p&gt;&lt;br /&gt;&lt;p&gt;Back to our handy helper function to set the Channel name in the entry box.&amp;nbsp; The last little bit is a textbox function that scrolls the window (if necessary) to the position of the caret.&amp;nbsp; In this case, what it means is that if the text in the window gets long enough to cause a vertical scroll bar to appear, the window scrolls down to show whatever new line is added.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh6.google.com/brian.gefrich/R4EXs_N5-KI/AAAAAAAAACI/HF09o019gOI/autochannel4%5B2%5D?imgmax=800"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="294" alt="autochannel4" src="http://lh3.google.com/brian.gefrich/R4EXtPN5-LI/AAAAAAAAACQ/XO8lAI2vQ_w/autochannel4_thumb?imgmax=800" width="628" border="0"&gt;&lt;/a&gt; &lt;/p&gt;&lt;br /&gt;&lt;p&gt;Looks like that is working fine.&amp;nbsp; &lt;/p&gt;&lt;br /&gt;&lt;p&gt;Now for the real point of this all, the channel switching.&amp;nbsp; &lt;/p&gt;&lt;br /&gt;&lt;p&gt;The real simple way to assign an event handler for the TextChanged property is just going into the designer view and double clicking on our chat entry bar.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;It should create the function for you.&amp;nbsp; I renamed the generated function to &lt;em&gt;chatTextChanged&lt;/em&gt; to fit with everything else.&amp;nbsp; There are some good tools in here for renaming or refactoring.&amp;nbsp; By clicking on the little red underline that appears or by pressing Shift-Alt-F10, you get the rename dialog, and can select to rename the function.&amp;nbsp; This is important because there's an event handler auto-generated that assigns the new function as a delegate.&amp;nbsp; If we change the name of the function without updating the event handler through the rename dialog, we end up with errors and general not-working-ness.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;This event will fire whenever there's a change to the text in the entry window.&amp;nbsp; We'll then check to see if the text is two characters longer than our&lt;em&gt; lineStart&lt;/em&gt; value, for the "/g" or whatever we need.&amp;nbsp; If so, the next step is to select just those two characters, set it to lower case for matching purposes and match it to a list of possible solutions.&amp;nbsp; If it doesn't match any of them, just deselect it all.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The rest is simple, because we've already got a helper function to set the channel.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;So here's our code to do it.&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;private void &lt;/span&gt;chatTextChanged(&lt;span style="color: blue"&gt;object &lt;/span&gt;sender, &lt;span style="color: #2b91af"&gt;EventArgs &lt;/span&gt;e)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: green"&gt;// test if the first two characters are /something.  If there are more than two characters, skip it&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: blue"&gt;if &lt;/span&gt;(rChatEntry.Text.Length == lineStart + 2)&lt;br /&gt;    {&lt;br /&gt;        &lt;br /&gt;        &lt;span style="color: green"&gt;// use a switch to test for our cases&lt;br /&gt;        &lt;/span&gt;rChatEntry.Select(rChatEntry.Text.Length - 2, rChatEntry.Text.Length);&lt;br /&gt;        &lt;br /&gt;        &lt;span style="color: blue"&gt;switch &lt;/span&gt;(rChatEntry.SelectedText.ToLower())&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: blue"&gt;case &lt;/span&gt;&lt;span style="color: #a31515"&gt;"/g"&lt;/span&gt;:&lt;br /&gt;                &lt;span style="color: green"&gt;// Switch to guild chat&lt;br /&gt;                &lt;/span&gt;chatSetChannel(&lt;span style="color: #a31515"&gt;"Guild"&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;Color&lt;/span&gt;.Green);&lt;br /&gt;                &lt;span style="color: blue"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: blue"&gt;case &lt;/span&gt;&lt;span style="color: #a31515"&gt;"/1"&lt;/span&gt;:&lt;br /&gt;                &lt;span style="color: green"&gt;// Switch to general chat&lt;br /&gt;                &lt;/span&gt;chatSetChannel(&lt;span style="color: #a31515"&gt;"General"&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;Color&lt;/span&gt;.Black);&lt;br /&gt;                &lt;span style="color: blue"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: blue"&gt;case &lt;/span&gt;&lt;span style="color: #a31515"&gt;"/2"&lt;/span&gt;:&lt;br /&gt;                &lt;span style="color: green"&gt;// Switch to trade channel&lt;br /&gt;                &lt;/span&gt;chatSetChannel(&lt;span style="color: #a31515"&gt;"Trade"&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;Color&lt;/span&gt;.Orange);&lt;br /&gt;                &lt;span style="color: blue"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: blue"&gt;case &lt;/span&gt;&lt;span style="color: #a31515"&gt;"/s"&lt;/span&gt;:&lt;br /&gt;                &lt;span style="color: green"&gt;// switch back to local "saying"&lt;br /&gt;                &lt;/span&gt;chatSetChannel(&lt;span style="color: #a31515"&gt;"Say"&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;Color&lt;/span&gt;.Red);&lt;br /&gt;                &lt;span style="color: blue"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: blue"&gt;default&lt;/span&gt;:&lt;br /&gt;                &lt;span style="color: green"&gt;// deselect all&lt;br /&gt;                &lt;/span&gt;rChatEntry.Select(rChatEntry.Text.Length, rChatEntry.Text.Length);&lt;br /&gt;                &lt;span style="color: blue"&gt;break&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Walking through it, we have the test to check if we only have two user-inputted characters, selecting those two characters, and then a &lt;strong&gt;switch&lt;/strong&gt; statement to test for the various slash commands we are looking for.&amp;nbsp; Notice in the &lt;strong&gt;switch&lt;/strong&gt; line that we use the &lt;strong&gt;ToLower&lt;/strong&gt; method so that "/G" comes out the same as "/g".&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Then for each case, we set the channel using our helper program, and if it doesn't match anything, we deselect our selection.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh4.google.com/brian.gefrich/R4EXtfN5-MI/AAAAAAAAACY/Iin7CbW-XUg/autochannel5%5B2%5D?imgmax=800"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="294" alt="autochannel5" src="http://lh5.google.com/brian.gefrich/R4EXtvN5-NI/AAAAAAAAACg/waB9vibVCgM/autochannel5_thumb?imgmax=800" width="628" border="0"&gt;&lt;/a&gt; &lt;/p&gt;&lt;br /&gt;&lt;p&gt;Looks like it works fine.&amp;nbsp; I added in functions for the context menu items and a little mouse click handler that keeps the user from changing our position in the chat window.&amp;nbsp; Otherwise, it could be possible to insert chat lines in the middle of other lines.&amp;nbsp; &lt;/p&gt;&lt;br /&gt;&lt;p&gt;Here's the code as I have it:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System;&lt;br /&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Collections.Generic;&lt;br /&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System.ComponentModel;&lt;br /&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Data;&lt;br /&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Drawing;&lt;br /&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Linq;&lt;br /&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Text;&lt;br /&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Windows.Forms;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;namespace &lt;/span&gt;AutoChatChannels&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: blue"&gt;public partial class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Form1 &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;Form&lt;br /&gt;    &lt;/span&gt;{&lt;br /&gt;        &lt;span style="color: green"&gt;// The currently selected channel&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: blue"&gt;private string &lt;/span&gt;selectedChannel = &lt;span style="color: #a31515"&gt;"General"&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: blue"&gt;private &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Color &lt;/span&gt;selectedColor = &lt;span style="color: #2b91af"&gt;Color&lt;/span&gt;.Black;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: green"&gt;// Since we are appending a channel name to the beginning of the line, we need to keep our own count&lt;br /&gt;        // where the "real" line (i.e. the user input) starts&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: blue"&gt;private int &lt;/span&gt;lineStart = 0;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: blue"&gt;public &lt;/span&gt;Form1()&lt;br /&gt;        {&lt;br /&gt;            InitializeComponent();&lt;br /&gt;&lt;br /&gt;            rChatEntry.KeyDown += &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;KeyEventHandler&lt;/span&gt;(chatEnterPressed);&lt;br /&gt;            rChatWindow.MouseDown += &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MouseEventHandler&lt;/span&gt;(rChatWindow_MouseClick);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: blue"&gt;void &lt;/span&gt;rChatWindow_MouseClick(&lt;span style="color: blue"&gt;object &lt;/span&gt;sender, &lt;span style="color: #2b91af"&gt;MouseEventArgs &lt;/span&gt;e)&lt;br /&gt;        {&lt;br /&gt;&lt;br /&gt;            rChatWindow.Select(rChatWindow.Text.Length, rChatWindow.Text.Length);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: blue"&gt;private void &lt;/span&gt;Form1_Load(&lt;span style="color: blue"&gt;object &lt;/span&gt;sender, &lt;span style="color: #2b91af"&gt;EventArgs &lt;/span&gt;e)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: green"&gt;// Get datetime of entry into the channel&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: blue"&gt;string &lt;/span&gt;currentDate = &lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt;.Now.ToString();&lt;br /&gt;            &lt;span style="color: green"&gt;// Write out the join message&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: blue"&gt;string &lt;/span&gt;entryText = &lt;span style="color: #a31515"&gt;"You have joined the General Chat Channel at "&lt;/span&gt;+currentDate+System.&lt;span style="color: #2b91af"&gt;Environment&lt;/span&gt;.NewLine;&lt;br /&gt;            &lt;span style="color: green"&gt;// Add the text to the chat window&lt;br /&gt;            &lt;/span&gt;rChatWindow.Text += entryText;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: green"&gt;// Now we have to select the text to make formatting changes to it.&lt;br /&gt;            &lt;/span&gt;rChatWindow.Select(lineStart, entryText.Length);&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: green"&gt;// make the text blue and bold&lt;br /&gt;            &lt;/span&gt;rChatWindow.SelectionColor = &lt;span style="color: #2b91af"&gt;Color&lt;/span&gt;.Blue;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: green"&gt;// Now make sure nothing is selected&lt;br /&gt;            &lt;/span&gt;rChatWindow.Select(rChatWindow.Text.Length, rChatWindow.Text.Length);&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: green"&gt;// Enter that in our text entry box&lt;br /&gt;            &lt;/span&gt;chatSetChannel(selectedChannel, selectedColor);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: blue"&gt;private void &lt;/span&gt;chatTextChanged(&lt;span style="color: blue"&gt;object &lt;/span&gt;sender, &lt;span style="color: #2b91af"&gt;EventArgs &lt;/span&gt;e)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: green"&gt;// test if the first two characters are /something.  If there are more than two characters, skip it&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: blue"&gt;if &lt;/span&gt;(rChatEntry.Text.Length == lineStart + 2)&lt;br /&gt;            {&lt;br /&gt;                &lt;br /&gt;                &lt;span style="color: green"&gt;// use a switch to test for our cases&lt;br /&gt;                &lt;/span&gt;rChatEntry.Select(rChatEntry.Text.Length - 2, rChatEntry.Text.Length);&lt;br /&gt;                &lt;br /&gt;                &lt;span style="color: blue"&gt;switch &lt;/span&gt;(rChatEntry.SelectedText.ToLower())&lt;br /&gt;                {&lt;br /&gt;                    &lt;span style="color: blue"&gt;case &lt;/span&gt;&lt;span style="color: #a31515"&gt;"/g"&lt;/span&gt;:&lt;br /&gt;                        &lt;span style="color: green"&gt;// Switch to guild chat&lt;br /&gt;                        &lt;/span&gt;chatSetChannel(&lt;span style="color: #a31515"&gt;"Guild"&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;Color&lt;/span&gt;.Green);&lt;br /&gt;                        &lt;span style="color: blue"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;                    &lt;span style="color: blue"&gt;case &lt;/span&gt;&lt;span style="color: #a31515"&gt;"/1"&lt;/span&gt;:&lt;br /&gt;                        &lt;span style="color: green"&gt;// Switch to general chat&lt;br /&gt;                        &lt;/span&gt;chatSetChannel(&lt;span style="color: #a31515"&gt;"General"&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;Color&lt;/span&gt;.Black);&lt;br /&gt;                        &lt;span style="color: blue"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;                    &lt;span style="color: blue"&gt;case &lt;/span&gt;&lt;span style="color: #a31515"&gt;"/2"&lt;/span&gt;:&lt;br /&gt;                        &lt;span style="color: green"&gt;// Switch to trade channel&lt;br /&gt;                        &lt;/span&gt;chatSetChannel(&lt;span style="color: #a31515"&gt;"Trade"&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;Color&lt;/span&gt;.Orange);&lt;br /&gt;                        &lt;span style="color: blue"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;                    &lt;span style="color: blue"&gt;case &lt;/span&gt;&lt;span style="color: #a31515"&gt;"/s"&lt;/span&gt;:&lt;br /&gt;                        &lt;span style="color: green"&gt;// switch back to local "saying"&lt;br /&gt;                        &lt;/span&gt;chatSetChannel(&lt;span style="color: #a31515"&gt;"Say"&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;Color&lt;/span&gt;.Red);&lt;br /&gt;                        &lt;span style="color: blue"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;                    &lt;span style="color: blue"&gt;default&lt;/span&gt;:&lt;br /&gt;                        &lt;span style="color: green"&gt;// deselect all&lt;br /&gt;                        &lt;/span&gt;rChatEntry.Select(rChatEntry.Text.Length, rChatEntry.Text.Length);&lt;br /&gt;                        &lt;span style="color: blue"&gt;break&lt;/span&gt;;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: blue"&gt;private void &lt;/span&gt;chatSetChannel(&lt;span style="color: blue"&gt;string &lt;/span&gt;channelName, &lt;span style="color: #2b91af"&gt;Color &lt;/span&gt;channelColor)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: green"&gt;// Select everything&lt;br /&gt;            &lt;/span&gt;rChatEntry.Select(0, rChatEntry.Text.Length);&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: green"&gt;// Unprotect everything first&lt;br /&gt;            &lt;/span&gt;rChatEntry.SelectionProtected = &lt;span style="color: blue"&gt;false&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: green"&gt;// Set channel name&lt;br /&gt;            &lt;/span&gt;rChatEntry.Text = &lt;span style="color: #a31515"&gt;"&amp;lt;" &lt;/span&gt;+ channelName + &lt;span style="color: #a31515"&gt;"&amp;gt; "&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: green"&gt;// Select the text again&lt;br /&gt;            &lt;/span&gt;rChatEntry.Select(0, rChatEntry.Text.Length);&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: green"&gt;// Set the color&lt;br /&gt;            &lt;/span&gt;rChatEntry.SelectionColor = channelColor;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: green"&gt;// Set the current text as protected&lt;br /&gt;            &lt;/span&gt;rChatEntry.SelectionProtected = &lt;span style="color: blue"&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: green"&gt;// Clear the selection to the end of the channel name&lt;br /&gt;            &lt;/span&gt;rChatEntry.Select(rChatEntry.Text.Length, rChatEntry.Text.Length);&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: green"&gt;// set our "real" start of line position&lt;br /&gt;            &lt;/span&gt;lineStart = rChatEntry.Text.Length;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: green"&gt;// set our color&lt;br /&gt;            &lt;/span&gt;rChatEntry.ForeColor = channelColor;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: green"&gt;// Selected Channel/Color&lt;br /&gt;            &lt;/span&gt;selectedChannel = channelName;&lt;br /&gt;            selectedColor = channelColor;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: blue"&gt;private void &lt;/span&gt;chatEnterPressed(&lt;span style="color: blue"&gt;object &lt;/span&gt;sender, &lt;span style="color: #2b91af"&gt;KeyEventArgs &lt;/span&gt;e)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: green"&gt;// check to see if Enter was pressed&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: blue"&gt;if &lt;/span&gt;(e.KeyValue == 13)&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: blue"&gt;if &lt;/span&gt;(lineStart != rChatEntry.Text.Length)&lt;br /&gt;                {&lt;br /&gt;                    &lt;span style="color: green"&gt;// add the line to the chat window&lt;br /&gt;                    &lt;/span&gt;rChatWindow.SelectedRtf = rChatEntry.Rtf;&lt;br /&gt;&lt;br /&gt;                    &lt;span style="color: green"&gt;// clear the text entry&lt;br /&gt;                    &lt;/span&gt;rChatEntry.Select(0, rChatEntry.Text.Length);&lt;br /&gt;                    rChatEntry.SelectionProtected = &lt;span style="color: blue"&gt;false&lt;/span&gt;;&lt;br /&gt;                    rChatEntry.Text = System.&lt;span style="color: #2b91af"&gt;String&lt;/span&gt;.Empty;&lt;br /&gt;&lt;br /&gt;                    &lt;span style="color: green"&gt;// Set the channel back&lt;br /&gt;                    &lt;/span&gt;chatSetChannel(selectedChannel, selectedColor);&lt;br /&gt;                    &lt;br /&gt;                    &lt;span style="color: green"&gt;// Scroll to the proper point&lt;br /&gt;                    &lt;/span&gt;rChatWindow.ScrollToCaret();&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                e.Handled = &lt;span style="color: blue"&gt;true&lt;/span&gt;;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: blue"&gt;private void &lt;/span&gt;menuitemGeneralChannel_Click(&lt;span style="color: blue"&gt;object &lt;/span&gt;sender, &lt;span style="color: #2b91af"&gt;EventArgs &lt;/span&gt;e)&lt;br /&gt;        {&lt;br /&gt;            chatSetChannel(&lt;span style="color: #a31515"&gt;"General"&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;Color&lt;/span&gt;.Black);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: blue"&gt;private void &lt;/span&gt;menuitemTradeChannel_Click(&lt;span style="color: blue"&gt;object &lt;/span&gt;sender, &lt;span style="color: #2b91af"&gt;EventArgs &lt;/span&gt;e)&lt;br /&gt;        {&lt;br /&gt;            chatSetChannel(&lt;span style="color: #a31515"&gt;"Trade"&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;Color&lt;/span&gt;.Orange);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: blue"&gt;private void &lt;/span&gt;menuitemGuildChannel_Click(&lt;span style="color: blue"&gt;object &lt;/span&gt;sender, &lt;span style="color: #2b91af"&gt;EventArgs &lt;/span&gt;e)&lt;br /&gt;        {&lt;br /&gt;            chatSetChannel(&lt;span style="color: #a31515"&gt;"Guild"&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;Color&lt;/span&gt;.Green);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Pretty simple little process all in all, I'd like to build off of it down the road, maybe incorporate it into something.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Please feel free to drop any questions in there for me.&lt;/p&gt;  </content><link rel='alternate' type='text/html' href='http://www.notasenator.com/blog/2008/01/wow-chat-project-part-2.html' title='WoW Chat Project Part 2'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5415721124759512601&amp;postID=7167336838962714894' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.notasenator.com/blog/nasblog.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5415721124759512601/posts/default/7167336838962714894'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5415721124759512601/posts/default/7167336838962714894'/><author><name>Brian</name></author></entry><entry><id>tag:blogger.com,1999:blog-5415721124759512601.post-2613771904450708210</id><published>2008-01-05T02:39:00.001-05:00</published><updated>2008-01-05T02:44:57.240-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio 2008'/><title type='text'>WoWing a Small Chat Project</title><content type='html'>&lt;p&gt;One of the goals of the new programming focus this year was to try a variety of small projects,&amp;nbsp; small exercises to stimulate the brain and increase my programming agility.&amp;nbsp; There's no shortage of things to try, so I consider this a warm-up of sorts.&lt;/p&gt; &lt;p&gt;If any of you have played &lt;a href="http://www.worldofwarcraft.com"&gt;World of Warcraft&lt;/a&gt;, you'll get the idea pretty quickly, for everyone else, in WoW, there is a chat box that allows you to talk to everyone else in the game world.&amp;nbsp; To make this as efficient as possible (theoretically), the chat is split into channels.&amp;nbsp; You can use a menu to select what channel you are talking to, or just type "slash commands" which is a forward slash (/) followed by a letter or number to indicate the channel you want.&amp;nbsp; When you do this, the slash command gets replaced with the name of the channel.&amp;nbsp;&amp;nbsp; The goal of this project is to emulate that.&lt;/p&gt; &lt;p&gt;I figure that this project presents a few challenges.&amp;nbsp; First off, finding the most effective way of detecting the entry of a slash command.&amp;nbsp; Once we get the channel name in there, it's part of the text string, so we want to have a way of pushing what we consider the "start" of the entered text.&amp;nbsp; Once we get lines of chat added, we want the chat window to keep our place when new lines are added.&amp;nbsp; So we've got a few things to tackle.&lt;/p&gt; &lt;p&gt;Stage One: Planning -&lt;/p&gt; &lt;p&gt;The way I figure, the best way to go about this is to have a pair of &lt;strong&gt;richTextBoxes&lt;/strong&gt; (which can do the necessary formatting easily), one for the chat entry, one for the chat window displaying the already entered lines of text.&amp;nbsp; There would also be a &lt;strong&gt;menu&lt;/strong&gt; detached from the top of the window that will be the alternate method of changing channels.&lt;/p&gt; &lt;p&gt;Here's the naming conventions I use:&lt;/p&gt; &lt;p&gt;Chat Entry window - &lt;em&gt;rChatEntry&lt;/em&gt;&lt;br&gt;Chat display window - &lt;em&gt;rChatWindow&lt;/em&gt;&lt;br&gt;Channel Selection window - &lt;em&gt;menuChannelSelector&lt;/em&gt;&lt;/p&gt; &lt;p&gt;And here's what it looks like in designer:&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh4.google.com/brian.gefrich/R380K_N5-EI/AAAAAAAAABU/h6Ec-0ClThM/autochannel110?imgmax=800"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="294" alt="autochannel1" src="http://lh5.google.com/brian.gefrich/R380LPN5-FI/AAAAAAAAABg/c4YE16VESjw/autochannel1_thumb8?imgmax=800" width="628" border="0"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Not the most complicated design ever.&amp;nbsp; The "Channel ---&amp;gt;" part is the Menu, don't feel that you need to add it yet.&lt;/p&gt; &lt;p&gt;A few things to note:&lt;/p&gt; &lt;p&gt;- &lt;strong&gt;both&lt;/strong&gt; text boxes are multiline = true, the bottom window (&lt;em&gt;rChatWindow&lt;/em&gt;) is read-only and scrollbars = vertical.&amp;nbsp;&amp;nbsp; &lt;em&gt;rChatEntry&lt;/em&gt; has it's tab index set to 0 (zero) so that's the first thing that gets input focus on loading.&lt;br&gt;- I toyed with disabling &lt;em&gt;rChatWindow&lt;/em&gt; completely, but learned quickly that then you couldn't scroll back up.&amp;nbsp; This ended up presenting it's own issues later on.&lt;br&gt;- I'm using Visual Studio 2008 Professional on Vista Home Premium, Aero turned off for that little bit of extra juice, just in case your view looks different.&amp;nbsp; Oh, and big one, I believe this is built for .NET 3.5.&lt;/p&gt; &lt;p&gt;I'll get to the context menu later.&lt;/p&gt; &lt;p&gt;Continuing the planning, let's lay out the structure of what's going to be happening here:&lt;/p&gt; &lt;p&gt;We're basically working completely off of events here, so we have a few functions to handle these events:&lt;br&gt;- &lt;em&gt;chatTextChanged,&lt;/em&gt;&amp;nbsp; called whenever a change is made to the text of &lt;em&gt;rChatEntry.&lt;/em&gt;&amp;nbsp; Previously, this could be handled by detecting a keypress, but this is the preferred way of going about it.&amp;nbsp; This function will see if we've entered a slash command and handle it properly.&lt;br&gt;- &lt;em&gt;chatEnterPressed, &lt;/em&gt;called whenever you hit the enter key on your keyboard.&amp;nbsp; While our chat entry line will wrap if you go past the end of the line, we want "enter" keypresses to send the line to the chat window.&lt;/p&gt; &lt;p&gt;In addition to this, we'll have some initial stuff happening on the loading of Form1 (I left the default name there) and a helper function called &lt;em&gt;chatSetChannel&lt;/em&gt; that does the repetitive work of changing the channel.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;So, let's get started.&lt;/p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public &lt;/span&gt;Form1()&lt;br /&gt;{&lt;br /&gt;    InitializeComponent();&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;In our Form1 constructor, we've got some stuff to add later, but for now we are fine.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Right above that, let's get some of the needed variables in there:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: green"&gt;// The currently selected channel&lt;br /&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;private string &lt;/span&gt;selectedChannel = &lt;span style="color: #a31515"&gt;"General"&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: blue"&gt;private &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Color &lt;/span&gt;selectedColor = &lt;span style="color: #2b91af"&gt;Color&lt;/span&gt;.Black;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;These are to keep track of what channel we are on and what color is associated with it.&amp;nbsp; Thanks to .NET, we don't have to do much with the colors, there are plenty predefined.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Now, when the form loads, we want to put a message in the chat window that we've joined the General channel at this date and time, and get our entry box set up on the correct channel.&amp;nbsp; I like doing this in the OnLoad event, because it keeps it clean and separated from the constructor and it also makes sure everything is actually set and loaded before I go screwing around with it.&amp;nbsp; I don't really think that would be a problem, but I do it anyways.&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;private void &lt;/span&gt;Form1_Load(&lt;span style="color: blue"&gt;object &lt;/span&gt;sender, &lt;span style="color: #2b91af"&gt;EventArgs &lt;/span&gt;e)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: green"&gt;// Get datetime of entry into the channel&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: blue"&gt;string &lt;/span&gt;currentDate = &lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt;.Now.ToString();&lt;br /&gt;    &lt;span style="color: green"&gt;// Write out the join message&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: blue"&gt;string &lt;/span&gt;entryText = &lt;span style="color: #a31515"&gt;"You have joined the General Chat Channel at "&lt;/span&gt;+currentDate+System.&lt;span style="color: #2b91af"&gt;Environment&lt;/span&gt;.NewLine;&lt;br /&gt;    &lt;span style="color: green"&gt;// Add the text to the chat window&lt;br /&gt;    &lt;/span&gt;rChatWindow.Text += entryText;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;In this first part, we're using .NET to get the current time, slapping it in a string and putting it in the chat window.&amp;nbsp; Piece of cake.&amp;nbsp; Run the code to give it a try and we should see this:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh6.google.com/brian.gefrich/R380LfN5-GI/AAAAAAAAABo/XRXHgeGwWgs/autochannel2%5B4%5D?imgmax=800"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="294" alt="autochannel2" src="http://lh3.google.com/brian.gefrich/R380LvN5-HI/AAAAAAAAABw/S_NGSSwQ1bg/autochannel2_thumb%5B2%5D?imgmax=800" width="628" border="0"&gt;&lt;/a&gt; &lt;/p&gt;&lt;br /&gt;&lt;p&gt;Outstanding.&amp;nbsp; There is, however, a reason why we used richTextBoxes instead of just normal textboxes, and that's formatting.&amp;nbsp; Programmatically, it works almost the same as it does through a UI.&amp;nbsp; You select the text you want to edit and apply the formatting to that selection. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;In our case, we want to select the text and make it blue.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Right after that last bit of code:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: green"&gt;// Now we have to select the text to make formatting changes to it.&lt;br /&gt;&lt;/span&gt;rChatWindow.Select(0, entryText.Length);&lt;br /&gt;&lt;br /&gt;&lt;span style="color: green"&gt;// make the text blue and bold&lt;br /&gt;&lt;/span&gt;rChatWindow.SelectionColor = &lt;span style="color: #2b91af"&gt;Color&lt;/span&gt;.Blue;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;The &lt;em&gt;Select&lt;/em&gt; method on a &lt;em&gt;richTextBox&lt;/em&gt; sets the range of text to be selected, in this case, from 0 (the beginning) to the end of the string.&amp;nbsp; Then we simply set the color of the selection with &lt;em&gt;SelectionColor&lt;/em&gt;.&amp;nbsp; As I said earlier, the .NET framework helps with the colors.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;If we run it now, we should probably see blue text.&amp;nbsp; What's interesting is that you could change a few things so that your input focus starts in &lt;em&gt;rChatWindow &lt;/em&gt;and you'd see that at this point, the text would actually be highlighted in the box, as if you had selected it with a mouse.&amp;nbsp; We want to take care of that, and we do so with this:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: green"&gt;// Now make sure nothing is selected&lt;br /&gt;&lt;/span&gt;rChatWindow.Select(rChatWindow.Text.Length, rChatWindow.Text.Length);&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;The syntax is &lt;em&gt;"Select (StartIndex, EndIndex)"&lt;/em&gt;&amp;nbsp; so why not make it (0,0)?&amp;nbsp; Well, the select function is more like a mouse than we even saw before, it places the caret, or flashing cursor, our position in the textbox at the point at the end of the selection.&amp;nbsp; So by using the &lt;strong&gt;Length&lt;/strong&gt; property of the textbox, we are setting the cursor to the end, so we can append more lines on to the chat window without trouble.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The other thing we want to do is set our chat entry box to represent the current channel, which starts on &lt;br&gt;"General".&amp;nbsp; It's here where we get to explore some of the issues presented to us.&amp;nbsp; Turns out, most of them are easy to solve.&amp;nbsp; A quick rundown:&amp;nbsp; The textbox shows the name of the active channel in front of whatever you type, i.e. "&amp;lt;General&amp;gt; Here is your message".&amp;nbsp; We have to insert that channel tag and make sure the user can't alter it.&amp;nbsp; In addition to that, if the user types "/g" or another slash command as the first characters in the box, we need to change that "&amp;lt;General&amp;gt;" to the new active channel and color.&amp;nbsp; &lt;/p&gt;&lt;br /&gt;&lt;p&gt;To solve the issue, we need to know what the "real" starting point of the user inputted string is.&amp;nbsp; We're going to be sticking our own text in the beginning of the string, so we need a count of how much we've added.&amp;nbsp; This will give us an index pointing to where the user's entry began.&amp;nbsp; To do this, we're going back to the top where we've declared our variables and we're going to add an integer called &lt;em&gt;lineStart.&lt;/em&gt;&amp;nbsp;&amp;nbsp; This should reasonably tell us where to start our selections when searching user input.&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: green"&gt;// The currently selected channel&lt;br /&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;private string &lt;/span&gt;selectedChannel = &lt;span style="color: #a31515"&gt;"General"&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: blue"&gt;private &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Color &lt;/span&gt;selectedColor = &lt;span style="color: #2b91af"&gt;Color&lt;/span&gt;.Black;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: green"&gt;// Since we are appending a channel name to the beginning of the line, we need to keep our own count&lt;br /&gt;// where the "real" line (i.e. the user input) starts&lt;br /&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;private int &lt;/span&gt;lineStart = 0;&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;We initialize it to zero.&amp;nbsp; Now, for the sake of completeness, we could go back into our Form1_Load and replace the "0" in our select call with &lt;em&gt;lineStart&lt;/em&gt;. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;Now that we've knocked that out, we start building our &lt;em&gt;chatSetChannel&lt;/em&gt; helper function.&amp;nbsp; We're going to be changing the channel name a few times in here, so we don't want to repeat the same code.&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;private void &lt;/span&gt;chatSetChannel(&lt;span style="color: blue"&gt;string &lt;/span&gt;channelName, &lt;span style="color: #2b91af"&gt;Color &lt;/span&gt;channelColor)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: green"&gt;// Select everything&lt;br /&gt;    &lt;/span&gt;rChatEntry.Select(0, rChatEntry.Text.Length);&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: green"&gt;// Unprotect everything first&lt;br /&gt;    &lt;/span&gt;rChatEntry.SelectionProtected = &lt;span style="color: blue"&gt;false&lt;/span&gt;;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;These first two methods get us started with some validation.&amp;nbsp; Before anything else, we select the whole text box and make it unprotected.&amp;nbsp; &lt;strong&gt;Protected&lt;/strong&gt; text can't be altered.&amp;nbsp; This is one of the benefits of &lt;strong&gt;richTextBoxes&lt;/strong&gt;, and it's how we plan on keeping the user from messing with our channel name.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The rest of this is pretty straightforward.&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: green"&gt;// Set channel name&lt;br /&gt;&lt;/span&gt;rChatEntry.Text = &lt;span style="color: #a31515"&gt;"&amp;lt;" &lt;/span&gt;+ channelName + &lt;span style="color: #a31515"&gt;"&amp;gt; "&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: green"&gt;// Select the text again&lt;br /&gt;&lt;/span&gt;rChatEntry.Select(0, rChatEntry.Text.Length);&lt;br /&gt;&lt;br /&gt;&lt;span style="color: green"&gt;// Set the color&lt;br /&gt;&lt;/span&gt;rChatEntry.SelectionColor = channelColor;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: green"&gt;// Set the current text as protected&lt;br /&gt;&lt;/span&gt;rChatEntry.SelectionProtected = &lt;span style="color: blue"&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: green"&gt;// Clear the selection to the end of the channel name&lt;br /&gt;&lt;/span&gt;rChatEntry.Select(rChatEntry.Text.Length, rChatEntry.Text.Length);&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;We format the channel name in brackets and slap it in the text box.&amp;nbsp; Now that our text is longer, we select the whole thing again, and use the &lt;strong&gt;SelectionColor&lt;/strong&gt; property to make it all whatever the channel color is.&amp;nbsp; Not very exciting, but the General channel is black, as we set at the beginning.&amp;nbsp; With this section selected, we protect it, locking it from changes.&amp;nbsp; This will protect anything entered in after the selection until we make a new selection, so we move our selection to the end, ready for user input.&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: green"&gt;// set our "real" start of line position&lt;br /&gt;&lt;/span&gt;lineStart = rChatEntry.Text.Length;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: green"&gt;// set our color&lt;br /&gt;&lt;/span&gt;rChatEntry.ForeColor = channelColor;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: green"&gt;// Selected Channel/Color&lt;br /&gt;&lt;/span&gt;selectedChannel = channelName;&lt;br /&gt;selectedColor = channelColor;&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;Now, some housekeeping, we update the &lt;em&gt;lineStart&lt;/em&gt; variable to indicate where the user input begins in &lt;em&gt;rChatEntry &lt;/em&gt;and make the foreground (which means the text, in this case) color to our channel color.&amp;nbsp; This is so whatever the user types is the same color as the channel name.&amp;nbsp; Wrapping it up, we set our channel tracking variables to the values of the current channel.&amp;nbsp; That doesn't change right now, but it will when we are actually switching channels.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;All of which will come tomorrow as it is very late right now.&amp;nbsp;&amp;nbsp;&amp;nbsp; Here's the code so far:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System;&lt;br /&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Collections.Generic;&lt;br /&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System.ComponentModel;&lt;br /&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Data;&lt;br /&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Drawing;&lt;br /&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Linq;&lt;br /&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Text;&lt;br /&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Windows.Forms;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;namespace &lt;/span&gt;AutoChatChannels&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: blue"&gt;public partial class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Form1 &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;Form&lt;br /&gt;    &lt;/span&gt;{&lt;br /&gt;        &lt;span style="color: green"&gt;// The currently selected channel&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: blue"&gt;private string &lt;/span&gt;selectedChannel = &lt;span style="color: #a31515"&gt;"General"&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: blue"&gt;private &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Color &lt;/span&gt;selectedColor = &lt;span style="color: #2b91af"&gt;Color&lt;/span&gt;.Black;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: green"&gt;// Since we are appending a channel name to the beginning of the line, we need to keep our own count&lt;br /&gt;        // where the "real" line (i.e. the user input) starts&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: blue"&gt;private int &lt;/span&gt;lineStart = 0;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: blue"&gt;public &lt;/span&gt;Form1()&lt;br /&gt;        {&lt;br /&gt;            InitializeComponent();&lt;br /&gt;        }&lt;/pre&gt;&lt;pre class="code"&gt;        &lt;span style="color: blue"&gt;private void &lt;/span&gt;Form1_Load(&lt;span style="color: blue"&gt;object &lt;/span&gt;sender, &lt;span style="color: #2b91af"&gt;EventArgs &lt;/span&gt;e)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: green"&gt;// Get datetime of entry into the channel&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: blue"&gt;string &lt;/span&gt;currentDate = &lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt;.Now.ToString();&lt;br /&gt;            &lt;span style="color: green"&gt;// Write out the join message&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: blue"&gt;string &lt;/span&gt;entryText = &lt;span style="color: #a31515"&gt;"You have joined the General Chat Channel at "&lt;/span&gt;+currentDate+System.&lt;span style="color: #2b91af"&gt;Environment&lt;/span&gt;.NewLine;&lt;br /&gt;            &lt;span style="color: green"&gt;// Add the text to the chat window&lt;br /&gt;            &lt;/span&gt;rChatWindow.Text += entryText;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: green"&gt;// Now we have to select the text to make formatting changes to it.&lt;br /&gt;            &lt;/span&gt;rChatWindow.Select(lineStart, entryText.Length);&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: green"&gt;// make the text blue and bold&lt;br /&gt;            &lt;/span&gt;rChatWindow.SelectionColor = &lt;span style="color: #2b91af"&gt;Color&lt;/span&gt;.Blue;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: green"&gt;// Now make sure nothing is selected&lt;br /&gt;            &lt;/span&gt;rChatWindow.Select(rChatWindow.Text.Length, rChatWindow.Text.Length);&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: green"&gt;// Enter that in our text entry box&lt;br /&gt;            &lt;/span&gt;chatSetChannel(selectedChannel, selectedColor);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: blue"&gt;private void &lt;/span&gt;chatSetChannel(&lt;span style="color: blue"&gt;string &lt;/span&gt;channelName, &lt;span style="color: #2b91af"&gt;Color &lt;/span&gt;channelColor)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: green"&gt;// Select everything&lt;br /&gt;            &lt;/span&gt;rChatEntry.Select(0, rChatEntry.Text.Length);&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: green"&gt;// Unprotect everything first&lt;br /&gt;            &lt;/span&gt;rChatEntry.SelectionProtected = &lt;span style="color: blue"&gt;false&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: green"&gt;// Set channel name&lt;br /&gt;            &lt;/span&gt;rChatEntry.Text = &lt;span style="color: #a31515"&gt;"&amp;lt;" &lt;/span&gt;+ channelName + &lt;span style="color: #a31515"&gt;"&amp;gt; "&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: green"&gt;// Select the text again&lt;br /&gt;            &lt;/span&gt;rChatEntry.Select(0, rChatEntry.Text.Length);&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: green"&gt;// Set the color&lt;br /&gt;            &lt;/span&gt;rChatEntry.SelectionColor = channelColor;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: green"&gt;// Set the current text as protected&lt;br /&gt;            &lt;/span&gt;rChatEntry.SelectionProtected = &lt;span style="color: blue"&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: green"&gt;// Clear the selection to the end of the channel name&lt;br /&gt;            &lt;/span&gt;rChatEntry.Select(rChatEntry.Text.Length, rChatEntry.Text.Length);&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: green"&gt;// set our "real" start of line position&lt;br /&gt;            &lt;/span&gt;lineStart = rChatEntry.Text.Length;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: green"&gt;// set our color&lt;br /&gt;            &lt;/span&gt;rChatEntry.ForeColor = channelColor;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: green"&gt;// Selected Channel/Color&lt;br /&gt;            &lt;/span&gt;selectedChannel = channelName;&lt;br /&gt;            selectedColor = channelColor;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;When I give it a shot, I get this:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh4.google.com/brian.gefrich/R380L_N5-II/AAAAAAAAAB4/xZPAP6X64Oo/autochannel3%5B2%5D?imgmax=800"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="294" alt="autochannel3" src="http://lh5.google.com/brian.gefrich/R380MPN5-JI/AAAAAAAAACA/phEC3fexe7w/autochannel3_thumb?imgmax=800" width="628" border="0"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Next I'll be making chat entry actually enter chat into the chat window and allow for the changing of colors. &lt;/p&gt;  </content><link rel='alternate' type='text/html' href='http://www.notasenator.com/blog/2008/01/wowing-small-chat-project.html' title='WoWing a Small Chat Project'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5415721124759512601&amp;postID=2613771904450708210' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.notasenator.com/blog/nasblog.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5415721124759512601/posts/default/2613771904450708210'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5415721124759512601/posts/default/2613771904450708210'/><author><name>Brian</name></author></entry><entry><id>tag:blogger.com,1999:blog-5415721124759512601.post-2794857655823953024</id><published>2008-01-04T16:11:00.000-05:00</published><updated>2008-01-04T16:21:44.375-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='code analysis'/><title type='text'>The Trouble With Excitement is...</title><content type='html'>...that we don't always double check things.  I was very happy to see Visual Studio appear in my mail the day after I was reading about the code metrics tools in 2008, and neglected to notice that these features were available in the Team Suite, while I had been sent the normal old Professional version.  As of right now, Team Suite only seems available to me as a 90-day trial, so I'll probably get that later on to give it a shot.&lt;br /&gt;&lt;br /&gt;The lesson is: when dealing with multiple product versions, always check the fine print.  As it is, VS2008 looks like a healthy and stable upgrade, so I'm looking forward to poking around in there.&lt;br /&gt;&lt;br /&gt;This doesn't count as my daily post, I've got more to talk about later on.</content><link rel='alternate' type='text/html' href='http://www.notasenator.com/blog/2008/01/trouble-with-excitement-is.html' title='The Trouble With Excitement is...'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5415721124759512601&amp;postID=2794857655823953024' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.notasenator.com/blog/nasblog.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5415721124759512601/posts/default/2794857655823953024'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5415721124759512601/posts/default/2794857655823953024'/><author><name>Brian</name></author></entry><entry><id>tag:blogger.com,1999:blog-5415721124759512601.post-8384442042621348739</id><published>2008-01-03T23:12:00.000-05:00</published><updated>2008-01-03T23:52:54.688-05:00</updated><title type='text'>One Small Step</title><content type='html'>Leanna is writing the first of many "Honey-Do" lists for me, little errands for me to run tomorrow.  Not on the list, but certainly something I'd like to accomplish tomorrow is installing Visual Studio 2008.   They sent me beta invites, put it up through the MSDN subscription and now sent it to me on DVD in the quarterly package that arrived today.  I think I owe it to them after all the trouble to install and see what all the fuss is about.&lt;br /&gt;&lt;br /&gt;One of the things I'm really excited about is code metrics.  I'm always interested, not coming from a formal training background, to see how my work ranks up.  The new code analysis tools show maintainability and complexity of code parts.  There's a good overview &lt;a href="http://blogs.msdn.com/fxcop/archive/2007/10/03/new-for-visual-studio-2008-code-metrics.aspx"&gt;here&lt;/a&gt;.  Watching a video on the Microsoft site, I'm seeing a lot of code optimization work going into it.  For example, I will from time to time have parameters in functions that I might need in testing but forget to remove in a shipped project, and Code Analysis will apparently find all of this and take care of it.&lt;br /&gt;&lt;br /&gt;We'll see how it goes.  Anyone using VS2008 already?</content><link rel='alternate' type='text/html' href='http://www.notasenator.com/blog/2008/01/one-small-step.html' title='One Small Step'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5415721124759512601&amp;postID=8384442042621348739' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.notasenator.com/blog/nasblog.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5415721124759512601/posts/default/8384442042621348739'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5415721124759512601/posts/default/8384442042621348739'/><author><name>Brian</name></author></entry><entry><id>tag:blogger.com,1999:blog-5415721124759512601.post-4643434053820437545</id><published>2008-01-02T22:53:00.000-05:00</published><updated>2008-01-02T23:55:18.718-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='squawkbox'/><category scheme='http://www.blogger.com/atom/ns#' term='FSX'/><title type='text'>Designer Jeans?</title><content type='html'>I was challenged today to make a post about designer jeans, and relate it to programming, which is somewhat daunting.&lt;br /&gt;&lt;br /&gt;I ventured into the SB forums and was a bit surprised to see the posts I found there.  I guess everyone is not as aware of the absolute volume of work put into this program and its ancillaries,  a project reaching almost 100,000 lines of code, and maintained by one man.  Daunting to take over, daunting to step into the light of expectation from the current userbase of SB3.&lt;br /&gt;&lt;br /&gt;Of course, Joel has done most of the work.  As he's mentioned before, the program is, for the most part, done.  Portions have been in testing with a beta team, and a good amount of the core development has been checked off.&lt;br /&gt;&lt;br /&gt;So what's the delay?  Well, for starters, what has been said on the forum is true.  I am coming in dark to this all.   There is an awful lot to learn, and I've been taking it all in as fast as possible.  I am in no way starting over, and the project is not getting abandoned.  For those of you who don't use SB, there are several "code trees" at work here.  There are internal (module) and external (exe) versions, both of these working on either FSUIPC or SimConnect, and the FSUIPC versions having elements for FS8 and FS9, which continue to be supported.  Most of this is done.  Let me clarify ahead of time what I mean by "done", and that is: the program elements are working in test situations.   This is not the same done as in "If it's done, why not package up what you have and release it while you keep working on new stuff?" done.  It's not there, and I don't think Joel or I would want to put that sort of statement of quality on our work anyways.&lt;br /&gt;&lt;br /&gt;So what's left is that I'm now writing the module portion for FSX, and progressing along nicely.  Once that is done, which includes loading the module at launch, establishing a connection through SimConnect, activating the menu item in the sim and handling the loading of the internal program window when you use said menu item, then there is the matter of testing all of it, which I believe Joel already has a good mechanism in place for, as well as going through the whole codebase and updating everything to the latest version specs, cleaning stuff up, some more testing, some more cleaning, packaging it up and getting it on its merry way.&lt;br /&gt;&lt;br /&gt;Really, I would have loved to have had &lt;span style="font-style: italic;"&gt;something &lt;/span&gt;for Christmas or New Years, but I had to selfishly go and get engaged.&lt;br /&gt;&lt;br /&gt;But Joel and I have talked a lot about this and I'm in it for the long-haul.  I'm very excited to see where SB and Flight Sim go after this version.&lt;br /&gt;&lt;br /&gt;So much for combining this with designer jeans.</content><link rel='alternate' type='text/html' href='http://www.notasenator.com/blog/2008/01/designer-jeans.html' title='Designer Jeans?'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5415721124759512601&amp;postID=4643434053820437545' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.notasenator.com/blog/nasblog.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5415721124759512601/posts/default/4643434053820437545'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5415721124759512601/posts/default/4643434053820437545'/><author><name>Brian</name></author></entry><entry><id>tag:blogger.com,1999:blog-5415721124759512601.post-3268243316587824522</id><published>2008-01-01T23:30:00.000-05:00</published><updated>2008-01-01T23:53:00.719-05:00</updated><title type='text'>New Years Resolutions</title><content type='html'>A few things of great importance:&lt;br /&gt;&lt;br /&gt;A few days ago, right before Christmas, I asked my girlfriend Leanna to marry me and she said yes. We haven't set a date, but I don't think I've ever been happier.&lt;br /&gt;&lt;br /&gt;Between that and the holidays, I haven't been terribly available. I have, however, been working on progressing the SB4 code. For a while, it was all about finding my way through the code.  I've moved on to working specifically on the module section of the program, that is, the part that opens internally in FSX.  It's going well so far and I hope to be able to review the progress with Joel soon.&lt;br /&gt;&lt;br /&gt;I'm not one for New Years' Resolutions, but I want to be able to look back at my progression as a programmer this year, so I'm going to try doing some coding everyday and blogging every day as well.  This should give me the propulsion to get some use out of this webspace.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Happy New Years and watch this space.</content><link rel='alternate' type='text/html' href='http://www.notasenator.com/blog/2008/01/new-years-resolutions.html' title='New Years Resolutions'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5415721124759512601&amp;postID=3268243316587824522' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.notasenator.com/blog/nasblog.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5415721124759512601/posts/default/3268243316587824522'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5415721124759512601/posts/default/3268243316587824522'/><author><name>Brian</name></author></entry><entry><id>tag:blogger.com,1999:blog-5415721124759512601.post-7667348268405400434</id><published>2007-11-12T07:54:00.000-05:00</published><updated>2007-11-12T08:07:09.874-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='squawkbox'/><category scheme='http://www.blogger.com/atom/ns#' term='VATSIM'/><category scheme='http://www.blogger.com/atom/ns#' term='flight simulator'/><title type='text'>Squawkbox</title><content type='html'>For those of you who don't know, I've come on board as a developer on the Squawkbox project.  Fellow flight sim dev Joel DeYoung has been working on SB for a while, and the app is the main method for connecting to the VATSIM network.&lt;br /&gt;&lt;br /&gt;I'm very excited about the opportunity and I look forward to posting about our progress.  Not only that, but it now gives me a good chance to get on VATSIM more and really experience that incredible online community.</content><link rel='alternate' type='text/html' href='http://www.notasenator.com/blog/2007/11/squawkbox.html' title='Squawkbox'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5415721124759512601&amp;postID=7667348268405400434' title='7 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.notasenator.com/blog/nasblog.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5415721124759512601/posts/default/7667348268405400434'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5415721124759512601/posts/default/7667348268405400434'/><author><name>Brian</name></author></entry><entry><id>tag:blogger.com,1999:blog-5415721124759512601.post-5286066491682948953</id><published>2007-10-03T07:36:00.000-04:00</published><updated>2007-10-03T07:52:20.540-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Acceleration'/><category scheme='http://www.blogger.com/atom/ns#' term='sp2'/><category scheme='http://www.blogger.com/atom/ns#' term='dx10'/><category scheme='http://www.blogger.com/atom/ns#' term='FSX'/><title type='text'>Acceleration, DX10, SP2 Info up</title><content type='html'>&lt;a href="http://blogs.msdn.com/ptaylor"&gt;Phil Taylor&lt;/a&gt; has updated his &lt;a href="http://blogs.msdn.com/ptaylor/archive/2007/10/02/acceleration-and-sp2.aspx"&gt;blog&lt;/a&gt;&lt;br /&gt;with information about what is in and what is out for the DX10 preview.  A few items of note:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The dx10 codepath is being referred to as a preview.  Phil goes into some detail about this, but most importantly, we see a definite shift in protocol towards back-compat with this update.  ACES wants to get in all the new features and performance possible, but I'm sure that's hard when they have to spend all their time figuring out why a three year old plane is all messed up in their new, more efficient pipeline.  I, for one, agree with this completely.&lt;/li&gt;&lt;li&gt;The water is gorgeous.  I'm just putting this out there so you guys with Vista and DX10 can be ready for it.  I don't have the horsepower to run anything above 2.x low on my system without taking a hit, but after SP2 comes out, running under DX10 will allow me to hit 2.x Max.&lt;/li&gt;&lt;li&gt;HDR Bloom - bloom always was a massive fps hit on pretty much everyone's systems.  Now it's an accessible feature, and it looks better.  You guys notice how they fixed the things that were already in the system instead of pumping out new things to potentially cause more problems?  In other words, instead of cloud shadows, we get a better sim.  I'm ok with that as well.&lt;/li&gt;&lt;li&gt;VC Shadows - you guys are going to love this, if you fly in the vc at all.  It adds a great level of immersion.  We saw an example of this in the train sim preview vids.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;I suppose, given that all we ever got to improve FS9 was a single incremental patch, that ACES has shown a greater attention to community needs by at least 3 times this go around.  I think that's important here.  This is a sim that keeps getting better, and not just because of the 3rd party guys this time around.&lt;br /&gt;&lt;br /&gt;Time to get ready for work, but I have some news coming up soon.</content><link rel='alternate' type='text/html' href='http://www.notasenator.com/blog/2007/10/acceleration-dx10-sp2-info-up.html' title='Acceleration, DX10, SP2 Info up'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5415721124759512601&amp;postID=5286066491682948953' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.notasenator.com/blog/nasblog.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5415721124759512601/posts/default/5286066491682948953'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5415721124759512601/posts/default/5286066491682948953'/><author><name>Brian</name></author></entry><entry><id>tag:blogger.com,1999:blog-5415721124759512601.post-5143428013353538499</id><published>2007-09-18T15:11:00.000-04:00</published><updated>2007-09-18T15:26:07.889-04:00</updated><title type='text'>Reno After-Action Part 1</title><content type='html'>&lt;strong&gt;(Written on Monday night inflight from DFW to IAD)&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://farm2.static.flickr.com/1257/1401987731_a82ae8ed70_o.jpg"&gt;&lt;img style="FLOAT: left; MARGIN: 0px 10px 10px 0px; WIDTH: 320px; CURSOR: hand" alt="" src="http://farm2.static.flickr.com/1257/1401987731_a82ae8ed70_o.jpg" border="0" /&gt;&lt;/a&gt;I'm writing this from 33,000 feet in an American Airlines Super 80, somewhere over Arkansas, I believe. Since I'll be getting into Dulles pretty late, I figure I'll hit the sack as soon as I get home. Tomorrow I'll have to return to my normal life, and I wanted to get down some words on the incredible experience of the past week. Since leaving D.C. last Tuesday, I've met amazing people, felt the rush of seeing breathtaking speed, and witnessed terrible tragedy.&lt;br /&gt;&lt;br /&gt;I am, of course, referring to the Reno Air Races. The World's Fastest Motorsport is something I wanted to see firsthand for a long, long time and I can tell you, it did not disappoint.&lt;br /&gt;&lt;br /&gt;You don’t have to look far to find someone more eloquent than I, so I will not comment on the three terrible crashes during the week. I met a number of pilots and crew members involved with the various levels of competition at Reno, and they are men and women made of more skill and determination than I have ever encountered. They fly for the pure love of what they do, and my hat comes off to anyone who puts so much on the line to accomplish something that remarkable.&lt;br /&gt;&lt;br /&gt;The races themselves are almost beyond words, but I’ll try to say something worthwhile. You really have to see it to fully understand. In the pits, you can walk amongst these fantastic machines, tuned and sculpted to stride with authority along the very razor’s edge of performance. In the Gold level of the Unlimited class, engines that cost nearly a hundred-thousand dollars are run so hard with so much unfettered force that they are practically useless after the race, and, of course, you can’t forget the fact that these machines are flown around 50 feet above the ground.&lt;br /&gt;&lt;br /&gt;But I didn’t just go out to see the races. I traveled out with members of the ACES Studio to demonstrate the new Acceleration expansion pack for FSX. I’ve defended the XPack on the AVSIM forums under the assumption that you should really wait until you see make judgments. Well, not only have I gotten a chance to spend a good deal of time with the new features myself, but I saw everyone from school kids to some of the actual racers getting into it. In the public booth near the tower, right behind the grandstands, the hourly multiplayer races went from a small focused event to one that drew a large crowd, complete with favorites and cheering. After word got around, we saw competitors showing up before the booth was even open to sign up for the day’s races. By the end of the show, you could barely get to two of our stands because of all the people watching.&lt;br /&gt;&lt;br /&gt;In the beginning, a local fan of the Flight Sim series and the Cadet Commander of the Civil Air Patrol squadron attending the races was the leader, and to be honest, I didn’t think anyone would catch him. But as more and more people became involved in the events, a group of hardcore pilots became the main competitors. Many of them were involved with crews from the race teams. Our early champ was eventually overthrown and the pursuit of even better times got underway. The level of competition was so intense that eventually we posted the top time from the developers (lead designer Paul Lange) to give them a target. Even this record was toppled in the end.&lt;br /&gt;&lt;br /&gt;A couple of days into the fray, we ran an invite only race between some of the top racers so far, against some of the Microsoft attendees. Of course, Paul was involved, and I was lucky enough to get a seat, although I finished fifth, behind the two developers and two of our top non-Microsoft racers. I blamed dust on the control stick I was using, but by that point in the races, dust was everywhere, and besides, that race was when I set my new personal best time.&lt;br /&gt;&lt;br /&gt;Long story short: The air races in the XPack are very challenging, interesting and an absolute blast to fly multiplayer. I can’t wait for the community to get a hold of it and start producing aircraft for the T6, jet, sport, formula one and biplane classes. But even more than that, I want to see what kind of races gets made. Personally, since it would never happen in reality, I want to try my hand at creating a race around the Capital area here in D.C., with a final turn running up Potomac to a home pylon at KDCA.&lt;br /&gt;&lt;br /&gt;In addition to the Reno races, I ended up with a lot of stick time on the F/A-18. I showed the bird to more than one actual Hornet pilot in the VIP lounge and they all agreed that it felt right to them. Most had some sort of avionic or system that they noticed wasn’t there, mostly related to combat systems, but they all thought they had everything they needed to fly correctly. One of the many memorable moments of week for me was having a former F/A-18 pilot tell his son about everything that was happening while I ran a carrier launch. He tried hard to walk me through the subsequent landing, but I still managed to smash a perfectly good fighter into the deck.&lt;br /&gt;&lt;br /&gt;That was one fun moment out of a thousand from the races. I really appreciated the chance to go out and show the sim I love people from aviation fans who had never flown a sim before to a biplane class pilot telling me that he was going to use the Reno missions in Acceleration for practice. Sometime tomorrow, I’ll get my photos uploaded and posted here, and I’ll start mapping out that Washington, D.C. course.&lt;br /&gt;&lt;br /&gt;- Brian</content><link rel='alternate' type='text/html' href='http://www.notasenator.com/blog/2007/09/reno-after-action-part-1.html' title='Reno After-Action Part 1'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5415721124759512601&amp;postID=5143428013353538499' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.notasenator.com/blog/nasblog.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5415721124759512601/posts/default/5143428013353538499'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5415721124759512601/posts/default/5143428013353538499'/><author><name>Brian</name></author></entry><entry><id>tag:blogger.com,1999:blog-5415721124759512601.post-6303860593847426401</id><published>2007-08-28T12:47:00.000-04:00</published><updated>2007-08-28T14:45:08.974-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='web design'/><category scheme='http://www.blogger.com/atom/ns#' term='AJAX'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><title type='text'>Riding the wave of web design</title><content type='html'>I'm currently working on my own web page, and I'm not at all displeased with the progress. People will certainly recognize that I have gathered some design cues from &lt;a href="http://www.blizzard.com/"&gt;Blizzard Entertainment&lt;/a&gt;, a company known for very energetic and rich web sites to support their games. This is a strong step away from a long attachment to minimalist designs. I've always loved the simple elegant sites that still remain perfectly usable and totally intuitive. Websites should look like you can use them to do things. Tabs and big buttons of current designs have helped, and I like the solid colored div layer designs being used these days.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;For years now, I've read CNN.com as part of my routine. While I have many news sources these days, CNN is the one I've used the longest, and have seen the evolution of their design.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;If you look back through the years using the WayBack Machine (or, in this case, the mirror at the Alexandria Library site) you can see this evolution in action:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Important Note:&lt;/strong&gt;  &lt;em&gt;I am not a design expert by any means, these are just my thoughts on things based on my own experience in web design and being a web user.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://web.petabox.bibalex.org/web/20010410213930/http://www.cnn.com/"&gt;2001&lt;/a&gt; - Mostly text on a white background, seems to be trying to stay low-bandwidth for dialup users, not many images. It seems like they are attempting to get as much info in as quickly as possible. Design is built mostly with tables.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://web.petabox.bibalex.org/web/20020222232140rn_3/www.cnn.com/?"&gt;2002&lt;/a&gt; brings us a more intense design, the logo is larger at the top, sections are defined with bright color headers, the sidebar menu has changed from a light sky blue to an eye-catching dark blue.   It's meant to be bolder and more serious.  The design is still created using tables, but with a lot more Javascript.  Interestingly, the first bit of Javascript is a CSS fix for users browsing with Netscape.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://web.petabox.bibalex.org/web/20030202184556/http://www7.cnn.com/"&gt;2003&lt;/a&gt; through &lt;a href="http://web.petabox.bibalex.org/web/20050203011940/http://www.cnn.com/"&gt;2005&lt;/a&gt; stays essentially the same, proving that sometimes a good design just works.  Gone is the placating of low-bandwidth users.  Headers, search bars, titles, all made with graphics adorning them.  The main story takes center stage, allowing browsers immediate access to "what's important right now".  While CNN, and most other news sites have always had a "headline" story, this took it to a new level on terms of real estate dedicated to one piece of information.  Very little changes over the years, the Google-powered search becomes a Yahoo-powered search and in 2005, they introduce RSS feeds to the site.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://web.petabox.bibalex.org/web/20060202021323/http://www.cnn.com/"&gt;2006&lt;/a&gt; sees the first steps towards the latest "Web 2.0" trends with embedded video, some rounded corners, etc.  There's a higher level of integration with the specialty shows on the network, blogs by anchors and other journalists, and a streaming video pay service that drops the latest content to your computer as it's happening.  While some divs sneak into the code, it's still a table based design.  But I don't consider any of that to be the big design change.  The big thing to me is that they finally broke the 800px width barrier.  Just that little change allows them so much more space to work with, finally breaking the crowded busy atmosphere of the earlier iteration.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;It wasn't until just a few months ago that CNN really hit the level of interactivity and design that I expect in "current" sites.  &lt;a href="http://www.cnn.com/"&gt;Here&lt;/a&gt; it is.  Finally, built completely out of div layers, and fully AJAXy in implementation.  Obviously, the design is different.  The big blue side bar is finally gone, turning in a seamless and almost unnoticed top menu.  Data is streamed into the site, allowing for you to see popular topics, most viewed and most emailed pages, etc.  The "main" window of the whole page, holding the summary of the headline story and the other top headlines in one place, and refreshes automatically via AJAX.  The "ticker" provides a live feed of incoming stories and updates to stories.  A "Developing Story" bar sometimes fills in between the top bar and the content, alerting you to what's occurring now.  The whole format of news delivery puts you in the moment, getting up-to-the-minute information.  It has a user-oriented methodology as well, focusing a good deal of their space on what is popular and being viewed.  &lt;br /&gt;&lt;br /&gt;What gets me the most about this design is in the stories themselves.  I was shocked to see this feature added in when this version of CNN.com was beta-testing, but they have a "Story Highlights" section at the top, like a Cliff Notes version.  The title section of the story's page, which is definitively separated from the story, has the title, then three or more little bullet points giving you the pertinent information, however generalized it may be, and directly under, has a link to the next story in that section.  They are inviting users to "skim" the news, get the basics, and move on.  While I abhor the thought and think this is where misinformation comes from, for a modern web-user, busy and not able to read EVERY story out there, it gives you a wonderful preview function to see if you want to continue down to the story below.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Long story short, you can see how the focus has shifted from getting the information up there for the lowest cost in bandwidth to making it look as good as possible and stacking features on top, to finally resting on a low-impact, high-usability web site.&lt;/p&gt;&lt;p&gt;When I think about these sites, I wonder about how I could better optimize my own design, and, of course, I wonder how I could possibly match the simple beauty and function of the Windows Live website.  Is it enough to have a really really nice menu bar across the top that does everything you need?&lt;/p&gt;</content><link rel='alternate' type='text/html' href='http://www.notasenator.com/blog/2007/08/riding-wave-of-web-design.html' title='Riding the wave of web design'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5415721124759512601&amp;postID=6303860593847426401' title='2 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.notasenator.com/blog/nasblog.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5415721124759512601/posts/default/6303860593847426401'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5415721124759512601/posts/default/6303860593847426401'/><author><name>Brian</name></author></entry><entry><id>tag:blogger.com,1999:blog-5415721124759512601.post-843786054424014920</id><published>2007-08-28T10:12:00.000-04:00</published><updated>2007-08-28T11:03:23.529-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Acceleration'/><category scheme='http://www.blogger.com/atom/ns#' term='metablogging'/><category scheme='http://www.blogger.com/atom/ns#' term='schedule'/><title type='text'>Status and Questions</title><content type='html'>It's been quiet since the last time I said it wouldn't be quiet anymore :p&lt;br /&gt;&lt;br /&gt;&lt;a href="http://junctionpoint.wordpress.com/"&gt;Warren Spector&lt;/a&gt; , one of my favorite game developers, muses at how easily his blog became a meta-blog, blogging more often on how hard it is to keep a regular blogging schedule. I'd try for sympathy, but &lt;a href="http://polypoke.spaces.live.com/"&gt;Owen&lt;/a&gt; does more than I do (and better, I should add) and still blogs like a madman.&lt;br /&gt;&lt;br /&gt;But &lt;a href="http://www.imdb.com/title/tt0209144/"&gt;routine&lt;/a&gt; is something I haven't had enough of in my life recently, and in regards to this blog, it's one of the things I'm going to be changing.&lt;br /&gt;&lt;br /&gt;To begin, a list of what I'm doing. I had considered separating my "project" and personal blogging off somewhere else, but I think it's probably better to have it all in one place. I believe it will prompt me to write here more often. These are the projects I'm currently undertaking...not really all at once, more like the list of things that I want to accomplish.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Zero-Altitude - this is my big one.  The name which I will be publishing any zany works I develop.  My friend and creative partner Will and I came up with the name to indicate the ground floor, the base level.  I've talked about it before, but the website should roll out this week&lt;/li&gt;&lt;li&gt;Continuing the &lt;a href="http://www.notasenator.com/blog/2006/12/ten-thousand-foot-view-of-simconnect.html"&gt;tutorials&lt;/a&gt;, of course&lt;/li&gt;&lt;li&gt;I'm working on a quick and dirty HL2 with a friend who is a very talented level designer.  His concept is a battle in a contemporary setting, such as an office building, where weapons are one-off and one-use.  The horror-shooter Condemned used a similar concept, with the main character pulling pieces of rebar up as weapons or things of that nature.  In this concept, every day items would be the only weapons, and they would have a one hit durability.  That is to say, once a hit is scored, the weapon is destroyed.  At the same time, weapons would have realistic effects on enemies, meaning it wouldn't take much to knock someone down.  The big draw is exploring the amazingly modular structure of the Source Engine.&lt;/li&gt;&lt;li&gt;Of course, FSX and XNA experiments.  Zero-Altitude is supposed to exist as a test bed for all sorts of experiments in game play, and XNA provides a good place to start.&lt;/li&gt;&lt;li&gt;Learning Silverlight - I have to say, from the demos, I'm impressed, and I'd love to poke around and see what makes it all tick.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;So that's it for now.   I need more coffee, and I want to read more about this massive &lt;a href="http://www.aero-news.net/news/commair.cfm?ContentBlockID=a4050f27-a16f-445d-8cd8-023bb807990b&amp;amp;Dynamic=1"&gt;737NG inspection&lt;/a&gt; happening, but work is work so back to coding I go.&lt;/p&gt;</content><link rel='alternate' type='text/html' href='http://www.notasenator.com/blog/2007/08/status-and-questions.html' title='Status and Questions'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5415721124759512601&amp;postID=843786054424014920' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.notasenator.com/blog/nasblog.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5415721124759512601/posts/default/843786054424014920'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5415721124759512601/posts/default/843786054424014920'/><author><name>Brian</name></author></entry><entry><id>tag:blogger.com,1999:blog-5415721124759512601.post-155665821782913684</id><published>2007-07-01T21:24:00.001-04:00</published><updated>2007-07-01T21:24:22.950-04:00</updated><title type='text'>A Great Honor</title><content type='html'>&lt;p&gt;We live in a world of madness :p&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;This morning, I received an email informing me that I had been named as a Microsoft MVP for Windows - PC Games.&amp;nbsp; I'm really honored.&amp;nbsp; I didn't set up this blog or get involved at AVSIM with any sort of recognition in mind.&amp;nbsp; I do think that we are looking at the future of Flight Simulator with SimConnect, and likewise, the future of independent game design with XNA.&lt;/p&gt; &lt;p&gt;That being said, I think my recent silence deserves an explanation.&amp;nbsp; I know a lot of people have been asking for me to continue my tutorials, and I will.&amp;nbsp; I've got a draft of part five almost finished here.&amp;nbsp; Unfortunately, my job situation has been less than stable, and I'm trying to ensure that I'll continue to have income flowing.&amp;nbsp; At the same time, my new web project has been getting started, and I wanted to take an opportunity to talk about that as well.&lt;/p&gt; &lt;p&gt;Zero-Altitude.com is a project founded by my long time friend William Smith and myself.&amp;nbsp;&amp;nbsp; Starting off, it will be a blog, podcast and forum challenging game designers and developers to stretch the boundries of what we create.&amp;nbsp; From there, gameplay experiments will test new concepts, and eventually melding those concepts into games, becoming Zero Altitude Studios.&lt;/p&gt; &lt;p&gt;Once again, thanks to everyone who has left comments or supported the blog, and watch for new stuff soon.&lt;/p&gt;</content><link rel='alternate' type='text/html' href='http://www.notasenator.com/blog/2007/07/great-honor.html' title='A Great Honor'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5415721124759512601&amp;postID=155665821782913684' title='1 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.notasenator.com/blog/nasblog.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5415721124759512601/posts/default/155665821782913684'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5415721124759512601/posts/default/155665821782913684'/><author><name>Brian</name></author></entry><entry><id>tag:blogger.com,1999:blog-5415721124759512601.post-283384793782352478</id><published>2007-05-17T08:15:00.000-04:00</published><updated>2007-05-17T08:22:20.854-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SimConnect'/><category scheme='http://www.blogger.com/atom/ns#' term='FSX'/><title type='text'>SP1 is Live - New SDK Features</title><content type='html'>Talking about being really late on this.&lt;br /&gt;&lt;br /&gt;Yes, you all probably know that the SP1 patch for FSX is out and can be found at FSInsider.com.   The big news in relation to this blog is that there are tons and tons of features and fixes for SimConnect such as the following:&lt;br /&gt;&lt;br /&gt;Facilities API&lt;br /&gt;This was a top-level request from the community for programmatic access to our internal data set for things like airports, navigational aids and waypoints. Full support through both the native and managed interfaces, including new samples and documentation.&lt;br /&gt;&lt;br /&gt;Modeless Dialog API&lt;br /&gt;Ability to utilize an ATC-like XUI menu to allow modeless interaction with a SimConnect client. This was the last remaining feature of SimConnect required to meet the needs of FSUIPC interaction without binary offset manipulation. Supports both native and managed interfaces, and includes ability to manipulate a subset of the text format. Documentation and samples are also provided.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;These two additions to the package integrate seamlessly with your code and add a wealth of information.  Right off the bat, the modeless dialog lets you send feedback or collect user input via ATC/ATIS menus in the sim.  I've done some work with the new APIs during beta testing, and I think they are fantastic.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Important to note that the SP1A patch on the site requires the original SDK (or a patched to SP1) version from the Deluxe edition of FSX.</content><link rel='alternate' type='text/html' href='http://www.notasenator.com/blog/2007/05/sp1-is-live-new-sdk-features.html' title='SP1 is Live - New SDK Features'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5415721124759512601&amp;postID=283384793782352478' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.notasenator.com/blog/nasblog.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5415721124759512601/posts/default/283384793782352478'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5415721124759512601/posts/default/283384793782352478'/><author><name>Brian</name></author></entry><entry><id>tag:blogger.com,1999:blog-5415721124759512601.post-8846597864081658314</id><published>2007-05-04T23:58:00.000-04:00</published><updated>2007-05-05T00:00:10.613-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='FSX'/><title type='text'>SP1 Beta 4</title><content type='html'>In case you aren't watching other blogs:&lt;br /&gt;http://blogs.msdn.com/ptaylor/archive/2007/05/04/fsx-sp1-beta4-posted.aspx&lt;br /&gt;&lt;br /&gt;Beta 4 of FSX SP1 has gone up, and testing has begun on it.  I'm hoping that we are real close now.&lt;br /&gt;&lt;br /&gt;There are some great new things happening with SimConnect that hopefully I'll get into soon.</content><link rel='alternate' type='text/html' href='http://www.notasenator.com/blog/2007/05/sp1-beta-4.html' title='SP1 Beta 4'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5415721124759512601&amp;postID=8846597864081658314' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.notasenator.com/blog/nasblog.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5415721124759512601/posts/default/8846597864081658314'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5415721124759512601/posts/default/8846597864081658314'/><author><name>Brian</name></author></entry><entry><id>tag:blogger.com,1999:blog-5415721124759512601.post-4276560115293189052</id><published>2007-04-03T10:04:00.001-04:00</published><updated>2007-04-03T10:04:06.270-04:00</updated><title type='text'>I Live For This</title><content type='html'>&lt;h4&gt;A bunch of updates, then an invitation at the end:&lt;/h4&gt; &lt;p&gt;Baseball season is upon us, and as with every year, my ability to function or the level of passion I have for anything else in life gets called into question.&lt;/p&gt; &lt;p&gt;Here's the thing...I missed the Washington Nationals opening day game on TV last night because I was too busy programming with SimConnect :p&lt;/p&gt; &lt;p&gt;So for the readers of this blog, you will probably think that my attention is in the right place.&amp;nbsp; I tend to agree.&amp;nbsp; Getting to go out to Redmond for a week only fueled the fire to make new things and push the limits.&amp;nbsp; There is a great team out there and knowing that they support what I do is a big boost for me.&amp;nbsp; In other news, without breaking any NDA's or anything, I'll just say that SP1 is going to be great.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;So back to the projects...what I'm working on/planning:&lt;/p&gt; &lt;p&gt;- I have a backlog of tutorials to clean up and post&lt;br&gt;- Revisiting XNA and FSX SimConnect integration, I think this could be huge if people start investigating it.&lt;br&gt;- Tower Controller... I've got a pretty decent prototype that allows you to sit in the tower and control AI aircraft&lt;br&gt;- I'm way behind on finishing up the TrackerX web interface.&amp;nbsp; To be honest, web programming seems a touch boring in comparison to SC or XNA :D&lt;br&gt;- My new project since visiting Seattle is trying to get a "missile" to fire from a user aircraft and track an AI plane.&amp;nbsp; Tons of crappy math in there, but I plan on explaining it, assuming I get it to work.&lt;br&gt;- I'd like to start learning gauges as well, and putting them together with SimConnect backends.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Now, on to the invitation:&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;I noticed on &lt;a href="http://polypoke.spaces.live.com/"&gt;Owen's blog&lt;/a&gt;&amp;nbsp;that the incomparable &lt;a href="http://www.projectopensky.com/"&gt;Project OpenSky&lt;/a&gt;&amp;nbsp;has released some new planes.&amp;nbsp; Owen mentions that he got his start with POSky, as well as several other AC creation notables.&amp;nbsp;&amp;nbsp;Groups like that really become proving grounds for the people who are the future of our add-on community.&lt;/p&gt; &lt;p&gt;There's a possibility that someone out there reading this is a 3D modeler, maybe you've made a few plane models; maybe you are a painter who loves to create liveries, or an air file editor.&amp;nbsp; If you have any skills that might be applied to creating aircraft for FSX, I'd love to hear from you.&amp;nbsp; I have a mountain of available time to work on Flight Sim projects now, and it's been a dream of mine to build an aircraft for the sim.&amp;nbsp; I'm certainly not locked into real-world aircraft,&amp;nbsp; it would be great to try to model a fictional plane with all those features you always thought planes should have, but can't because of technology or cost.&amp;nbsp; I'm open to military or civilian planes as well.&amp;nbsp; &lt;/p&gt; &lt;p&gt;Here's the big thing.&amp;nbsp; I want people who are new.&amp;nbsp; I want guys who are just starting to discover the creation side of our hobby, and want to push out and expand what they can do.&amp;nbsp; It's hard for one person to get rolling on their own, but as a large group, we will have an incredible resource of knowledge and experience to draw from.&amp;nbsp; &lt;/p&gt; &lt;p&gt;If you are an experienced member of the design community, don't let that stop you from contacting me.&amp;nbsp; I'll want as many contacts and advice-givers as possible as we muscle through this.&lt;/p&gt; &lt;p&gt;Drop me a comment or an email at &lt;a href="mailto:brian.gefrich@gmail.com"&gt;brian.gefrich@gmail.com&lt;/a&gt; and we can start setting out at creating some freeware aircraft that break some new boundaries.&lt;/p&gt;</content><link rel='alternate' type='text/html' href='http://www.notasenator.com/blog/2007/04/i-live-for-this.html' title='I Live For This'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5415721124759512601&amp;postID=4276560115293189052' title='1 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.notasenator.com/blog/nasblog.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5415721124759512601/posts/default/4276560115293189052'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5415721124759512601/posts/default/4276560115293189052'/><author><name>Brian</name></author></entry><entry><id>tag:blogger.com,1999:blog-5415721124759512601.post-5304197585319826891</id><published>2007-03-20T22:22:00.001-04:00</published><updated>2007-03-20T22:22:35.712-04:00</updated><title type='text'>Why it's so hard to do this blog post</title><content type='html'>&lt;p&gt;So, I've got &lt;em&gt;most&lt;/em&gt; of the next tutorial written out, and I'm trying to find some time to get it done.&amp;nbsp; It happens that I've got an interview&amp;nbsp;with a particular company out in&amp;nbsp;Seattle&amp;nbsp;next week, and I've been putting together travel plans, getting extra stuff done at work and cramming on some C# knowledge to prepare.&amp;nbsp; I'm definitely going to try to get the post up by this weekend, but no promises.&lt;/p&gt; &lt;p&gt;I'm looking into new ways to do it as well.&amp;nbsp; Right now, I write out the program (which is just adding on to what we have so that it's a continual building process) then I go back and start writing the post.&amp;nbsp; The reason this is inefficient is because I'm trying to remember the order I wrote the code in, the going back and swapping things around to make better logical sense, and then trying to make sure that I remember to include everything.&amp;nbsp; The actual writing, once I get this prepared, is more stream-of-consciousness, which is tricky because I'll ramble and have to go back to try to make things more concise and clear.&amp;nbsp; It's no good to anyone if the reader (you), doesn't understand what I'm talking about.&amp;nbsp; One of the first programming books I ever bought assumed a fair knowledge of programming standards, and therefore, the book was practically useless to me, because I only had a passing knowledge of BASIC at the time.&amp;nbsp; I remind myself often that I want this to be accessible to anyone, from the complete beginner to those guys at Microsoft that keep popping up on my WebStats page.&lt;/p&gt; &lt;p&gt;In other news, if you are a sim fan, Silent Hunter IV is coming out in the next day or two.&amp;nbsp; I'm a big fan of the series and I'm really looking forward to it.&amp;nbsp; There's always some issues to work out, but the mod community is ever diligent in making the game more and more realistic.&amp;nbsp; Which pretty much just means that I sink more often, but it's still fun.&lt;/p&gt; &lt;p&gt;So, hopefully another tutorial post this week, and&amp;nbsp;a full recap from my trip out west when I get back.&lt;/p&gt; &lt;p&gt;-Brian&lt;/p&gt;</content><link rel='alternate' type='text/html' href='http://www.notasenator.com/blog/2007/03/why-it-so-hard-to-do-this-blog-post.html' title='Why it&amp;#39;s so hard to do this blog post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5415721124759512601&amp;postID=5304197585319826891' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.notasenator.com/blog/nasblog.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5415721124759512601/posts/default/5304197585319826891'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5415721124759512601/posts/default/5304197585319826891'/><author><name>Brian</name></author></entry><entry><id>tag:blogger.com,1999:blog-5415721124759512601.post-7912616325513000573</id><published>2007-03-16T16:10:00.001-04:00</published><updated>2007-03-16T16:10:09.694-04:00</updated><title type='text'>The Trouble with AI Aircraft...</title><content type='html'>&lt;p&gt;...Is that you don't control them.&lt;/p&gt; &lt;p&gt;Sure, it makes sense.&amp;nbsp; They are &lt;em&gt;controlled&lt;/em&gt; by the AI ATC system built into FSX.&amp;nbsp; But ever since &lt;a href="http://informationmike.spaces.live.com/blog/"&gt;Mike Singer&lt;/a&gt;&amp;nbsp;posted a &lt;a href="http://informationmike.spaces.live.com/blog/cns!C767E1E33BA24175!276.entry"&gt;method to get the Control Tower into Free Flight&lt;/a&gt;, there's been a question pounding inside my head.&amp;nbsp; One of the reasons listed for why this functionality was not included in the RTM version was because you'd only be able to observe the AI traffic, and not act as the controller yourself.&amp;nbsp; It would be like the "Invisible Man Visits a Tower".&amp;nbsp;&amp;nbsp; Well, I can be a bit incorrigible at times, so my question was:&lt;/p&gt; &lt;p&gt;"Why not?"&lt;/p&gt; &lt;p&gt;Why can't we control the AI aircraft moving around an airport?&amp;nbsp; There's a few obvious reasons that come to mind when thinking about it in terms of SimConnect.&amp;nbsp; First and foremost, those planes already have a controller, so regardless of commands or other things you might assign it, there's still the chance of conflict with the AI ATC.&amp;nbsp; Secondly, there's not really a viable interface built into the system that would allow us to control the planes efficiently through the simulator.&lt;/p&gt; &lt;p&gt;So I set out to find answers to these pressing issues.&amp;nbsp; Here's what I've got so far.&lt;/p&gt; &lt;p&gt;- Within FSX, the planes created by the scheduler, your basic run of the mill AI aircraft, are what SimConnect refers to as &lt;b&gt;EnrouteATCAircraft&lt;/b&gt;&amp;nbsp;or &lt;strong&gt;ParkedATCAircraft&lt;/strong&gt;.&amp;nbsp; These aircraft have a flight plan, which is, incidentally, just a starting and ending airport.&amp;nbsp;&amp;nbsp; They are also controlled by the built-in ATC.&amp;nbsp;&amp;nbsp; Basically, consider these planes to be IFR aircraft.&amp;nbsp; There is another option, for &lt;strong&gt;NonATCAircraft&lt;/strong&gt;, which means, more or less, VFR planes.&amp;nbsp; They are not under control of the ATC.&lt;/p&gt; &lt;p&gt;So the concept is: Take all the planes in the sim, everything within the range of your current location, gather a bunch of information about them, delete them, and recreate them as non-ATC aircraft.&amp;nbsp; Then, the determination of what they do and when can be controlled by an external program (see problem #2) that will allow the user to act as an air traffic controller for the swarms of default or add-on aircraft they've got in their sim.&amp;nbsp; Pretty simple.&lt;/p&gt; &lt;p&gt;Does it work?&amp;nbsp; No, not entirely.&lt;/p&gt; &lt;p&gt;Am I close?&amp;nbsp; Absolutely.&amp;nbsp; However, I have decided to put off releasing this to the public until SP1 is released.&amp;nbsp; I'm hoping to add some more functionality, waiting to see if a bug or two might get resolved, and generally speaking, any performance increases could mean more AI planes on the screen at one time, making for a much more challenging experience. &lt;/p&gt; &lt;p&gt;The issues so far:&lt;/p&gt; &lt;p&gt;- There are a couple of little bugs that I'm working out, but those are inconsequential.&amp;nbsp; Things just don't always work as intended, and I'm smashing those out.&lt;br&gt;- There's currently not a method for separating the levels of ATC.&amp;nbsp; For example, if you are in the tower at KLAX, you control ALL of the AI aircraft within the simulation range of LAX.&amp;nbsp; You are ground, tower, clearance, approach, departure, etc.&amp;nbsp; I don't have any sort of good metric for differentiating which planes go where yet, so that will have to get filed under the "more functionality" section.&amp;nbsp; In addition, planes at nearby airports fall under your control as well.&lt;br&gt;- You have to run Windowed.&amp;nbsp; This is sort of obvious.&amp;nbsp; Right now, the program runs as an external program, and all the cool little buttons are on this separate program.&amp;nbsp; I've considered writing a gauge as a new panel for the tower, but I haven't really gotten that far into it.&amp;nbsp; So unless you run on a separate computer, you need to have it in windowed mode.&amp;nbsp; I noticed I do that anyways, since I tend to keep the charts up as well in their own window.&lt;/p&gt; &lt;p&gt;So what can you do?&lt;/p&gt; &lt;p&gt;At the moment, you can select an aircraft from the list, and do the following:&lt;br&gt;- tell it to fly a certain heading&lt;br&gt;- tell it to fly a certain speed&lt;br&gt;- tell it to fly at a certain altitude&lt;br&gt;- give permission to taxi&lt;br&gt;- give permission to take off&lt;br&gt;- order to hold short&lt;br&gt;- give permission to land&lt;br&gt;- order to continue on it's own navigation&lt;/p&gt; &lt;p&gt;The last one hands the plane back over to the built-in ATC.&amp;nbsp;&amp;nbsp; I'm working out ways to specify certain items such as runway for take off or landing, taxiways to use, "turn off next taxiway" commands after landing,&amp;nbsp; holding patterns, things of that nature.&amp;nbsp; I'm certainly interested and will entertain any suggestions.&lt;/p&gt; &lt;p&gt;This, of course, will be freeware, more than likely available here and uploaded to the AVSIM library.&amp;nbsp; I've been missing in action from this blog for a while, and I've said I was going to do some more tutorials, so I wanted to let you guys know what I've been doing with my time.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Oh, by the way, I'm doing another tutorial for tonight/tomorrow.&lt;/p&gt; &lt;p&gt;Thanks,&lt;br&gt;Brian&lt;/p&gt;</content><link rel='alternate' type='text/html' href='http://www.notasenator.com/blog/2007/03/trouble-with-ai-aircraft.html' title='The Trouble with AI Aircraft...'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5415721124759512601&amp;postID=7912616325513000573' title='2 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.notasenator.com/blog/nasblog.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5415721124759512601/posts/default/7912616325513000573'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5415721124759512601/posts/default/7912616325513000573'/><author><name>Brian</name></author></entry></feed>