<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-11458003</id><updated>2011-04-21T18:21:13.317-05:00</updated><title type='text'>kfsone's pittance</title><subtitle type='html'>We've moved! Click &lt;a href="http://kfsone.wordpress.com/"&gt;here&lt;/a&gt; to visit the new site!</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default?start-index=101&amp;max-results=100'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>231</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-11458003.post-114465113561373582</id><published>2006-04-10T01:38:00.000-05:00</published><updated>2006-04-10T01:38:55.656-05:00</updated><title type='text'>Moving to wordpress</title><content type='html'>I've moved the blog over to wordpress now. You can find the new version of the blog at&lt;br /&gt;&lt;br /&gt;&lt;a href="http://kfsone.wordpress.com/"&gt;http://kfsone.wordpress.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Please update your bookmarks or we'll be sending Doc to your house.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-114465113561373582?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114465113561373582'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114465113561373582'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/04/moving-to-wordpress.html' title='Moving to wordpress'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-114462771072897687</id><published>2006-04-09T18:44:00.000-05:00</published><updated>2006-04-09T19:08:30.776-05:00</updated><title type='text'>MxO makes me wonder</title><content type='html'>So Sony managed to buy a Matrix franchise from Warner Bros. Is it just me or is that not a score? Ok, so #2 and #3 turned out to be poop, and the game as shipped had the unfortunate luck to follow the series in storyline and decline.&lt;br /&gt;&lt;br /&gt;But there's something about this game that makes it playable, but it makes you keep thinking "if". It has the potential to have a more kick-ass social/community scene than AO, and to rival Galaxies on that mark, but it's stocked up on fancy emotes and missing all the essentials (ran out of time I guess). And my gameplay experience so far hasn't allured to any sense of a personal space in the world - no bank, no housing, etc. I'm guessing that maybe housing is implemented as constructs. That would have some sweet potential - it's the matrix, right, so in theory you could change gravity, replace the air with water, make the world upside down.&lt;br /&gt;&lt;br /&gt;If anything, MxO has room for some of the stuff that Galaxies got knocked for trying early on, because SW rules are meant to be recited along with daily prayers, while Matrix rules are &lt;i&gt;mean't to be broken&lt;/i&gt;... The "skill onion" works pretty well in MxO, because the loading and unloading of skills is part of the existing backstory.&lt;br /&gt;&lt;br /&gt;On the one hand, I find myself getting a good feeling about MxO the way you do when you start seeing a beta come together. On the other I have this growing sense that something is not right. There is some flaw just around the corner that was the reason WB were willing to sell their most precious franchise to the competition...&lt;br /&gt;&lt;br /&gt;How can I explain it... Its a sort of inconsistency in the logic behind things. It could just be a change in direction that's followed Sony's takeover. But its basic stuff that I don't think has been affected yet. I can figure why the things are done, and so far I've been successful in projecting forward towards how I can expect things to develop and how things build up, but there will be small gaps or discrepancies. But I need to figure out more of them before I can spot the pattern and figure out what crippling flaw it is that made them give you a skill to early, or choose one set of options over a more obvious and fun set of others, when they made the "obvious" choice somewhere else so it was clearly obvious...&lt;br /&gt;&lt;br /&gt;I &lt;i&gt;hope&lt;/i&gt; that MxO isn't a trophy on Sony's purchasing shelf. Making a good game out of that could be a cool project. For reloaded/rebooted, WB fully deserve SOE turning it into a WoW-thrashing success story (sorry Thunder :).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-114462771072897687?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/114462771072897687/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=114462771072897687' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114462771072897687'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114462771072897687'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/04/mxo-makes-me-wonder.html' title='MxO makes me wonder'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-114457119471359267</id><published>2006-04-09T02:51:00.000-05:00</published><updated>2006-04-09T03:26:34.766-05:00</updated><title type='text'>PS</title><content type='html'>You thought it was "struck", but if you listen carefully what Brian Johnson is actually singing is "Thunder sucks". Rot in Azeroth you swine :)&lt;br /&gt;&lt;br /&gt;Oh, I made level 10 in MxO last night. I rushed out and bought the "Hyperjump skill" only to find that it doesn't overcome any of the foibles of their crappy collision system (you can't jump over most stuff. I dunno if its the batteries going in my wireless keyboard/mouse or their input/control system(&lt;b&gt;*&lt;/b&gt;), but mostly what it does for me is make me jump a very long way up, and then land exactly where I started. I did manage to eventually make it occasionally let me jump up onto the tops of buildings, but I couldn't figure out a pattern to what I did to actually make it move forward. To be fair, I think its supposed to improve with levels, but you can't hyperjump backwards or sideways, and jumping forwards only takes you more than a few feet if it finds itself crossing particular obstacles under particular conditions. I actually hyper-jumped an entire highway, but then on another jump I appeared to be brought down because of a stray newspaper. *shrug*&lt;br /&gt;&lt;br /&gt;Damn that game is &lt;i&gt;so&lt;/i&gt; nearly-cool with glimmers of actual cool. The fights are getting kinda cool now at my level. Sadly almost the only chat I've seen has been spam from guys begging my female character to go to a club with them. FFS. And trying to give me stuff. I went afk at one point and came back to find my character killing a level 24 guy in pvp, followed instantly by another character wiping the floor with me. I guess the Matrix really can be hacked!&lt;br /&gt;&lt;br /&gt;I've never listened to AC/DC in my life. Why the hell do I know the lead singers name?&lt;br /&gt;&lt;br /&gt;&lt;i style='font-size: 8pt'&gt;&lt;b&gt;*&lt;/b&gt; A very likely candidate.&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-114457119471359267?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/114457119471359267/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=114457119471359267' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114457119471359267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114457119471359267'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/04/ps.html' title='PS'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-114456908994123606</id><published>2006-04-09T02:50:00.000-05:00</published><updated>2006-04-09T14:18:11.780-05:00</updated><title type='text'>Blog categories?</title><content type='html'>Is there a way to create post categories on blogger? Or do I need to look at switching to wordpress? I'm thinking Work, Life and WTF :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-114456908994123606?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/114456908994123606/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=114456908994123606' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114456908994123606'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114456908994123606'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/04/blog-categories.html' title='Blog categories?'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-114456891238687623</id><published>2006-04-09T00:55:00.000-05:00</published><updated>2006-04-09T02:48:32.456-05:00</updated><title type='text'>It's midnight, it's dark, I'm wearing shades and ...</title><content type='html'>I have the coding munchies. Unfortunately I've had enough beers that I can't resolve what it is I want to code. Bah.&lt;br /&gt;&lt;br /&gt;My lil' sister had her first baby today. Miles James Sibenaler. I missed the call because &lt;u title="Jaeger, Martini and Ramp"&gt;we&lt;/u&gt; were at the Imax watching &lt;a href="http://disney.go.com/disneypictures/rovingmars/"&gt;Roving Mars&lt;/a&gt;. We celebrated with dinner at &lt;a href="http://www.risckys.com/"&gt;Riscky's&lt;/a&gt; (which seems an awful lot like the Hoffbrau's that used to be near us, decorwise, but the Brisket I had was fantastic) and then beers at the &lt;a href="http://www.beerknurd.com/"&gt;Fort Worth Flying Saucer&lt;/a&gt; (all important &lt;a href="http://www.beerknurd.com/media/pdf/beerlist_3.pdf"&gt;beer menu&lt;/a&gt;). Our waitress didn't point the beer menu out till later, or I'd have gotten into it a lot more there :)&lt;br /&gt;&lt;br /&gt;Darn - I just found out that &lt;a href="http://www.cambrinus.nl/brw/MAXIMILI.HTM"&gt;Brouwhuis Maximiliaan&lt;/a&gt; closed not long after I last visited it. That sucks :(&lt;br /&gt;&lt;br /&gt;We stopped by Barnes and Noble and I was surprized to find an entire shelf of C.J Cherryh books. &lt;a href="http://www.amazon.com/gp/product/0756400597/"&gt;Downbelow station&lt;/a&gt; celebrating its 20th, and best of all, the latest of her Foreigner series was there, &lt;a href="http://www.amazon.com/gp/product/075640374X"&gt;Pretender&lt;/a&gt;. I'm fairly sure its not long since I finished &lt;a href="http://www.amazon.com/gp/product/0756403332"&gt;Destroyer&lt;/a&gt; - yeah, that my copy was only printed in Feb of this year. Wow. Cherryh sure does crank them out.&lt;br /&gt;&lt;br /&gt;Actually I find myself a little daunted at the prospect of reading it. She builds up a certain kind of fever-pitched tension or else gets called "slow moving". The result can be a bit cyclonic, in that she rushes story past you and then all the characters discuss and recap in order to bring you up to speed, all the while the clock is ticking and so by the time you know what *just* happened space aliens have attacked and blown up the other side of the planet, everyone runs to stage left, and then discusses and recaps...&lt;br /&gt;&lt;br /&gt;She's definitely capable of more and varied writing styles, this is merely the style she employs in this particular series.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/exec/obidos/search-handle-url/ref=br_ss_hs/102-0539682-6368134?platform=gurupa&amp;url=index%3Dstripbooks%3Arelevance-above%26dispatch%3Dsearch%26results-process%3Dbin&amp;field-keywords=robert+jordan"&gt;Robert Jordan&lt;/a&gt; could learn a damn thing or twenty from her.&lt;br /&gt;&lt;br /&gt;I guess tomorrow I'll finish up the STO code and clean up the mobile spawn registration process so that it can cope with the duality of orders it can be receiving. If we had some UI dev time this cycle I'd rather that we added a button that said "hey, make this MSP permanent" and despawned you out once it was placed. That'd be a hell of a lot cleaner. But we don't.&lt;br /&gt;&lt;br /&gt;I tried to warn Rick; he came into my office one night told me he was switching the way he did stuff in the UI because it was a pain to work with, and I tried to explain to him how it'd make it a total pain to work with at the far end of the complexity stick, and I did an awful job of communicating it, failed to convince him, and he did the more sensible and elegant thing.&lt;br /&gt;&lt;br /&gt;The result is a technically XML based UI, not a philosophically XML based UI; we don't define things over here and use them over there, we aren't widget based we just use widgets sometimes, and it shows in the omnipresent lack of consistent detail. Oh, the layout of the pages is similar page to page, but there is a gross inconsistency in the most important parts of our UI. E.g.: We have some things you can click on to update; most of them have an icon, some of them update when you click the icon, some of them when you click the thing with the icon, some of them will update if you click either.&lt;br /&gt;&lt;br /&gt;Whichever way you do it, any final screen element like a dialog box is going to be complex. A background, border decorations, text decoration, text, buttons, button decorations and bordering, labels, button text, tooltips, etc. Each of these has a bunch attributes and properties that have to be defined each time they are used.&lt;br /&gt;&lt;br /&gt;So lets say there are 18 components to a dialog box, with an average of 5 attributes each. You now have 90 attribute fields. Many of these fields have related values, for instance the x/y values. But unless you are writing a lot of comments, this relationship information gets lost, and comments are unreliable. And often much of the information is similar or the same, but &lt;i&gt;why&lt;/i&gt; is just as important. Lets say your entity starts with a simple color scheme. Bold white for headers, regular white for other fields. Half your entities now have "color='white' weight='bold'" and the other half "color='white'".&lt;br /&gt;&lt;br /&gt;The trouble is you've discarded some crucial content here. It turns out that you've also used "color='white'" for other, non-header/field related purposes. Now when you come to edit this page, you have to evaluate each use of "color='white'" and "weight='bold'". If you decide that headers and fields should be depicted some other way, you have all the nighmarish hell of code that doesn't believe in functions.&lt;br /&gt;&lt;br /&gt;Its one of those hideous work-saves-time conundrums. Stylesheets are a pain because when you look at the markup code, you can't tell straight away what it does on-screen. The color, font, etc, information is hidden away somewhere else. But it does mean that you keep important information. Consider:&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;caption width='800' height='40'&lt;br /&gt;         color='#ff0000' weight='bold' border='#0000ff'&amp;gt;&lt;br /&gt; City&lt;br /&gt;&amp;lt;/caption&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Can you tell me why I made any of those choices? Is this a heading for a row in a table, is it a page title, is it a section title?&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;pre&gt;&lt;br /&gt;&lt;i&gt;stylesheet:&lt;/i&gt;&lt;br /&gt;.toolbox-category-heading {&lt;br /&gt; width: &amp;lt;xsl:value-of select="toolbox-inner-width"/&gt;px;&lt;br /&gt; height: &amp;lt;xsl:value-of select="heading-level-2-height"/&gt;px;&lt;br /&gt; color: &amp;lt;xsl:value-of select="heading-level-2-color"/&gt;;&lt;br /&gt; weight: bold;&lt;br /&gt; border: &amp;lt;xsl:value-of select="heading-level-2-border"/&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;hr/&gt;&lt;br /&gt;&lt;i&gt;widget:&lt;/i&gt;&lt;br /&gt;&amp;lt;xsl:template match="toolbox-category-heading"&amp;gt;&lt;br /&gt; &amp;lt;caption style='toolbox-category-heading'&amp;gt;&lt;br /&gt;  &amp;lt;xsl:apply-templates/&amp;gt;&lt;br /&gt; &amp;lt;/caption&amp;gt;&lt;br /&gt;&amp;lt;/xsl:template&amp;gt;&lt;br /&gt;&lt;hr/&gt;&lt;br /&gt;&lt;i&gt;instantiation:&lt;/i&gt;&lt;br /&gt;&amp;lt;toolbox-category-heading&amp;gt;&lt;br /&gt; City&lt;br /&gt;&amp;lt;/toolbox-category-heading&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Apparently it was none of the above, it turns out that the width=800 was a typo, and this box is really intended to be stylized in every way like the other toolbox category headings on this page and every other.&lt;br /&gt;&lt;br /&gt;And it seems like its virtually impossible to tell how "City" is supposed to look on screen. But thats fine. What its supposed to look like isn't red, yellow, green, large, bold, italicized or anything. Its &lt;i&gt;supposed to look like a toolbox category heading&lt;/i&gt;. &lt;br /&gt;&lt;br /&gt;Styles, and widgets, are &lt;i&gt;algebra for guis&lt;/i&gt;. When you have to deal with hundreds of lines of UI code that individually describe each element, it becomes a forest of detail within which it becomes very difficult to tell what individual elements were &lt;i&gt;intended&lt;/i&gt; to look like, relative to everything else.&lt;br /&gt;&lt;br /&gt;Well, I suck, or I'd &lt;i&gt;do&lt;/i&gt; something to help the situation instead of pointing fingers. But Rick, if you're reading this, I'm trying to flame myself - not criticize you - for having failed to convert what experience I had into useful advice or better still even a single line of code... And if you hadn't gone ahead and actually done it, we'd still be using the old system and much the worse for it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-114456891238687623?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/114456891238687623/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=114456891238687623' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114456891238687623'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114456891238687623'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/04/its-midnight-its-dark-im-wearing.html' title='It&apos;s midnight, it&apos;s dark, I&apos;m wearing shades and ...'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-114446554276489679</id><published>2006-04-07T21:46:00.000-05:00</published><updated>2006-04-08T19:57:27.703-05:00</updated><title type='text'>The beta testers must be frothing at the mouth</title><content type='html'>I know you want to say it, but the NDA prevents you, so I'll say it for you :)&lt;br /&gt;&lt;br /&gt;"This kfs1, he talks it up, but his marvellous STO MSP code &lt;i&gt;doesn't f*in work&lt;/i&gt;. Hahahaha"&lt;br /&gt;&lt;br /&gt;You can spawn the STO but you can't mobile spawn from it, and you can't delete the MSP.&lt;br /&gt;&lt;br /&gt;S'not broken. It's incomplete. The cell hosts are authoritiative for state changes to a mobile spawn at the moment, with the map host being the arbitrator of these changes. Now the chat host, which used to just be notified of MSPs, has the potential to be authoritative, and I want to take the opportunity to clean it up in a way that will solve this problem cleanly *and* allow me to do ... something interesting with MSPs in the future :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-114446554276489679?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/114446554276489679/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=114446554276489679' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114446554276489679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114446554276489679'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/04/beta-testers-must-be-frothing-at-mouth.html' title='The beta testers must be frothing at the mouth'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-114444785710582307</id><published>2006-04-07T14:05:00.000-05:00</published><updated>2006-04-07T17:10:57.183-05:00</updated><title type='text'>I wish I took screenshots</title><content type='html'>Although I've put this code through a lot of hoops, and its construction is nicely compartmentalised, it has a lot of systems to interact with. Naturally going to beta with it ran into some of those stupid debug problems I was having last week, and our debug system is an application killer dammit. Despite this, Gnasche helped me pace through a couple of dumb problems -- I'd not fully understood how to use "std::set_difference" (my usually reliable &lt;a href="http://www.amazon.com/gp/product/0596005563"&gt;pocket reference&lt;/a&gt; wasn't much help with it - I should probably buy a newer edition).&lt;br /&gt;&lt;br /&gt;I wanna thank &lt;i&gt;Gnasche&lt;/i&gt; for his help yesterday putting it through its interactive hoops. It was a slow process because each iteration resulted in a crash in some debug code (I bit the bullet when I got home at 1am last night and spent two hours putting all my remaining debug lines from D-Day into a test harness - and actually every last damn one of them was a crasher; incredible. The dozens I've written since were all fine... And I don't do any "interesting" substances, if that's what you're thinking)&lt;br /&gt;&lt;br /&gt;But once the significant wrinkles were ironed out, we got to testing the minutae, and because of a discrepancy between the test-client and host builds, we could see new STOs appear but they never went away. The result was something of a graveyard of failed STO corpses. Oh yes, we'll be using this for hulks sometime this year :) I was trying to get the mobile spawn truck to transition seamlessly from a player controlled vehicle on the cell host to something entirely else. It will &lt;i&gt;eventually&lt;/i&gt; be on the cell host, but until I get another crack at some more under-the-hood work it needs to be on a host you aren't randomly transferred to/from.&lt;br /&gt;&lt;br /&gt;My overall plan is to lift this grid system, intact, from the chat host (where it is for now) to the cell host, and to import the player-driven-objects (vehicles/infantry) into this new grid system. It's significantly less efficient at major updates than the old cell host, but significantly more efficient for reads. Major updates occur, on average, once every 90 seconds per player. Each player executes tens of thousands of reads per second.&lt;br /&gt;&lt;br /&gt;Guess which one its worth investing efficiency in?&lt;br /&gt;&lt;br /&gt;With the code nearly complete, I'll probably do some comparison testing between different STL options for parts of the implementation over the weekend. For instance, the grid uses &lt;u title="Actually; ::__gnu_cxx::hash_map. I hadn't realized that GNU follow the same interpretation of 'standard' that Microsoft push."&gt;stdext::hash_map&lt;/u&gt;, but that choice was based on off-the-cuff guestimates of how different containers would perform.&lt;br /&gt;&lt;br /&gt;Each &lt;u title="Which I want to call cells, but thats what we call the cell hosts, which have nothing to do with cells of a geographical grid"&gt;node of the grid&lt;/u&gt; has its own index of active, neighboring nodes. This is where the major-update becomes inefficient, because major updates can cause a change to a whole bunch of nodes, some of which may be inactive but not timed out (to soften the blow and reduce the frequency of major updates). When a node finally expires it removes itself from the "neighborhood" lists of its neighbors.&lt;br /&gt;&lt;br /&gt;So node [370,3018] might have a neighborhood list like this [365,3018],[365,3024],[366,3014],[366,3017],[366,3019],[366,3020],[366,3022],[366,3023],[367,3013],[367,3018],[367,3021],[368,3014],[369,3018],[369,3019],[369,3023],[370,3016],[370,3018],[370,3020],[370,3023],[371,3020],[372,3018],[372,3020],[372,3022],[373,3012],[375,3013],[375,3015]. Each of those would, in turn, have [370,3018] in their list until it has been empty long enough to expire.&lt;br /&gt;&lt;br /&gt;Since these are going to be sparse, I think a hash_map will be most efficient for the global index, but for the per-node neighborhoods (which are literally just an array of pointers) I suspect either a vector or a set will be sufficient. Right now I'm using a std::set. They don't &lt;i&gt;need&lt;/i&gt; to be sorted, and since I recycle expired nodes, the vectors will magically grow to the sorts of sizes they need to be. In all likelihood they will wind up all being maxed out, but that won't be a problem. We can always buy more ram.&lt;br /&gt;&lt;br /&gt;(Joys of STL, I've actually just converted ChatGrid::_NEIGHBORHOOD from std::set to std::vector, replaced the .erase() calls with .erase(remove()) and added some asserts() to make sure that the code doesn't somehow put multiple entries in the same list)&lt;br /&gt;&lt;br /&gt;Building the neighborhood list for a newly activating node looks a bit like this:&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;pre&gt;&lt;br /&gt;{&lt;br /&gt;  for ( UINT32 xOff = -RADIUS ; xOff &lt;= _RADIUS ; ++xOff ) {&lt;br /&gt;  {&lt;br /&gt;    for ( UINT32 yOff = -RADIUS ; yOff &lt;= _RADIUS ; ++yOff ) {&lt;br /&gt;    {&lt;br /&gt;      GridKey neighborKey(myKey().x() + xOff, myKey().y() + yOff) ;&lt;br /&gt;      _GRID_INDEX::iterator neighbor = _gridIndex.find(neighborKey) ;&lt;br /&gt;&lt;br /&gt;      if ( neighbor != _gridIndex.end() )&lt;br /&gt;      {&lt;br /&gt;        // We've found an active cell at these coordinates,&lt;br /&gt;        // introduce ourselves&lt;br /&gt;        (*neighbor)-&gt;addNeighbor(this) ;&lt;br /&gt;        addNeighbor(*neighbor) ;&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Since _GRID_INDEX is currently a stdext::hash_map the lookups are &lt;i&gt;relatively&lt;/i&gt; inexpesnive. If I was using a std::map I could actually use lower_bound and upper_bound to use the underlying red black tree to do the searching for me.&lt;br /&gt;&lt;br /&gt;Most of my grid accesses are constrained by the neighborhoods, and those that use the g_gridIndex are relatively infrequent. So while I suspect using a map may lead to a slightly more efficient route, it would also be less maintainable and, like any serious optimization, far more implementation specific. For instance: There may be a significant difference between using a Y,X key pairing for the grid over an X,Y pairing if I use a map. For the hash, I just change the hashing algorithm, but for a map I have to change the &lt;u title="Although I'm talking about this as some sort of 2dimensional data structure, remember that computers only have one dimension, so that the way its stored is nothing like a grid"&gt;read functions significantly&lt;/u&gt;.&lt;br /&gt;&lt;br /&gt;Functionally, I've still got some refinement work to do, like the spammy feedback from the mobile spawn on the map host being cancelled, replaced, disabled, enabled, blah blah. But its the sort of stuff that I know I'll get done better over the weekend sitting in my comfy chair at home infront of my large LCD screen with a cooler of cherry vanilla cokes, the cat's occasional interest and the ability to work ... "&lt;a href="http://www.bbc.co.uk/dna/h2g2/A673427"&gt;au Jones&lt;/a&gt;" ... or thereabouts.&lt;br /&gt;&lt;br /&gt;I'll probably take a peek back into EQ2 this weekend, haven't played for a while. Dang, it must be a while, I can't remember what my character was. I guess the new expansion didn't agree with me or something. I'd kinda gotten into it before the new expansion. I'm having fun in MxO. The use of the Matrix-screensaver effect when transporting between hardlines is so cool, that I can &lt;i&gt;almost&lt;/i&gt; forgive how &lt;a href="http://www.kfs.org/oliver/mxo1.jpg" target="_view"&gt;hideous&lt;/a&gt; their version of it is...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-114444785710582307?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/114444785710582307/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=114444785710582307' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114444785710582307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114444785710582307'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/04/i-wish-i-took-screenshots.html' title='I wish I took screenshots'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-114435666275078933</id><published>2006-04-06T15:45:00.000-05:00</published><updated>2006-04-06T15:51:02.793-05:00</updated><title type='text'>I wub abstwaction!</title><content type='html'>Gophur decided we want a damage accumulator as well as a threshold on the STO MSPs. I made my unhappy face. Past experience tells me that, with our code base, that means registering a bunch of new variables, modifying packers, changing some teul callbacks, more mumbo jumbo terms TBD, essentially spending an entire day just to add an extra field.&lt;br /&gt;&lt;br /&gt;But nope. I went into the VehicleSTO class, added the extra variable, wrote the code to accumulate the damage, rolled out a new server onto the beta cluster and there it was.&lt;br /&gt;&lt;br /&gt;So now I'm gonna add the actual code to receive the MSP deployment when someone despawns a deployed MSP truck, if I get time I'll look at making them explode when they die and maybe copying visual damage across to them too. It all seems so easy suddenly ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-114435666275078933?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/114435666275078933/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=114435666275078933' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114435666275078933'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114435666275078933'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/04/i-wub-abstwaction.html' title='I wub abstwaction!'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-114429188683592971</id><published>2006-04-05T21:26:00.000-05:00</published><updated>2006-04-05T21:53:26.846-05:00</updated><title type='text'>STO, MxO</title><content type='html'>When you've been mired in raw C for a couple of years, its easy to forget how much easier life &lt;i&gt;can be&lt;/i&gt;. When I was adding the ability to damage STOs yesterday, I anticipated it taking at least a day. But instead it took a few minutes, and because of the way the code is thus organized (i.e. not a single monolithic function) unit testing the code is way simpler (ok, there are more tests, but since each function is more specifically tasked, easier to evaluate for functionality, and also a little easier to just visually spot mistakes).&lt;br /&gt;&lt;br /&gt;I've also been implementing a replacement for our "connection chooser" code; the old code used some fancy teulKit functionality that was never really very good. We'd be way better off if we had our own ASN, but Killer is convinced we'd be unable to justify one, that managing the routing table would be a nightmare, nobody would advertise our routes, and that it would cause asymmetrical routing that would be worse than what we currently have. I'm not sold on any of those but...&lt;br /&gt;&lt;br /&gt;The new code is also part of my plan to get rid of playgate and move patching/auth into the client itself. The new code is much cleaner, much simpler, and most importantly, it doesn't piss Rick off ;) He did seem &lt;i&gt;nearly&lt;/i&gt; impressed when I just rustled it up.&lt;br /&gt;&lt;br /&gt;I was going to use UDP for the test, but that didn't survive beta ;) (We don't use UDP for any of our current connections so I just have to wait for our network guy to turn up; I can always try 'UDF' which is our UDP with TCP Fallback protocol when it goes live). Hopefully Ramp is gonna give me what I need to add a friendly "error" dialog to the startup process to give you advice on your network connection. I know, I know, the game simply exiting without as much as a beep is far more traditional WWII, but I'd love to actually tell you stuff like "Hey, the game can't log in because you have disabled its network access".&lt;br /&gt;&lt;br /&gt;And so to MxO. I played a bit last night. Ran a few missions, had some fun. I made level 7, and the combat started to step up a little bit, it's gotten tough enough that I'm now able to see the effects of some of the options I have. I imagine it won't be long now before my first death :)&lt;br /&gt;&lt;br /&gt;I'm coming to the conclusion I like this game, but there are still odds and ends that just aren't right.&lt;br /&gt;&lt;br /&gt;They made cool use of the "Matrix screensaver" effect. When you log in the world "resolves" from Matrix code. And in principle, it's cool - it looks like &lt;a href="http://www.kfs.org/oliver/mxoani.gif" target="_view"&gt;this&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Its spoiled only by the fact that the effect that their "Matrix screensaver" effect is the worst on the planet, so that what you are greeted with on spawning is &lt;a href="http://www.kfs.org/oliver/mxo1.jpg" target="_view"&gt;this abomination&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;And when you see screenshots like &lt;a href="http://www.kfs.org/oliver/mxoc.jpg"&gt;this&lt;/a&gt;, doesn't it make you wonder why they used the &lt;i&gt;original&lt;/i&gt; wolfenstein engine to do their cutshots? Were they aiming at the gamecube market?&lt;br /&gt;&lt;br /&gt;Ah. Rant done, now I can jack in and enjoy laying down some more kungfu smackass for a while before bed :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-114429188683592971?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/114429188683592971/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=114429188683592971' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114429188683592971'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114429188683592971'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/04/sto-mxo.html' title='STO, MxO'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-114420158495239756</id><published>2006-04-04T20:11:00.000-05:00</published><updated>2006-04-04T20:46:25.003-05:00</updated><title type='text'>MMOs and movies, MxO</title><content type='html'>I'm having fun in MxO. I've not "clicked" to it, but I have fun getting my lil mmo fix for the night there. It doesn't keep me up late. I love watching the combat sequences.&lt;br /&gt;&lt;br /&gt;But, gosh, if they don't have truly sucky cut-scenes. I've seen better player-made movies &lt;i&gt;using their own engine&lt;/i&gt;. But no. They have pre-rendered cut-scenes that are awful. I can only *guess* that the lousy timing is for localization reasons (there are some long pauses, probably waiting for the verb in the German version)&lt;br /&gt;&lt;br /&gt;Now ordinarily I can abide cut-scenes. But there are exceptions, and they follow a simple trend. &lt;i&gt;SpecialFX-movie games should have great cutscenes&lt;/i&gt;. StarWars games: Gotta have great cutscenes - flunk: Dark Forces II, StarWars Galaxies original release. I whooped and cheered when I saw the NGE intro sequence. Matrix Online: GOTTA HAVE GREAT CUTSCENES. Its the freakin' Matrix. When Bobby-Matrix-Lover orders it online he's going to be watching The Matrix back to back for a week until it arrives. The cut-scene is the halfway house.&lt;br /&gt;&lt;br /&gt;But no. MxO uses the intro sequence/cutscenes to shock and appaul you and remind you what the Commodore 64 version would have looked like. I'm pretty sure that the Oracle closes by saying "At least the game won't look THIS awful".&lt;br /&gt;&lt;br /&gt;Also, I can't figure why the MxO characters can only have 3 polygons for feet? Is is to try and meet the DirectX drawcall limits? MxO does have a lot of varied customisability options, so I guess they might be struggling. But it makes all the characters look club-footed.&lt;br /&gt;&lt;br /&gt;Or are the graphics all aimed at console portability? The whole engine looks dated, chunky... I mean, really, the &lt;u title="How they look is largely a factor of our aged engine, not a lack of talent on Toto's part; I don't mean to imply that MxOs artists suck either"&gt;troopers in WWII&lt;/u&gt; look more detailed and realistic.&lt;br /&gt;&lt;br /&gt;MxO feels unfinished, e.g.: the tutorial scripting is &lt;u title="e.g. You are advised to turn on 'remote proxy' well before it gets aroudn to telling you how you might go about that or where you might find it"&gt;out of sync&lt;/u&gt; with the new combat system, my character is barely level 10 and already many of my skills are "Description: TBD", there is no "/frown" emote (or any of the 10 most obvious /emotes), it can take up to three presses of "/" to get a "/" in the chat buffer so people are forever mis-telling...&lt;br /&gt;&lt;br /&gt;NPC interactions are largely displayed as an "OK" dialog, which looks disembodied and more like a UI error or function than the NPC talking with you.&lt;br /&gt;&lt;br /&gt;It's very easy to depart the storyline, which is &lt;i&gt;very&lt;/i&gt; cool, but very uncool in that there isn't more of a safety-net incase you do it by accident (like me). As yet I've not felt "grounded" in the game world yet, although I just discovered the Mara church and establishing a mission contact with a physical presence felt ... good.&lt;br /&gt;&lt;br /&gt;Jumping is well goofy, you can't jump onto things only over them.&lt;br /&gt;&lt;br /&gt;And it feels (to me) like the servers are running in debug - with only 120ms RTT it feels a lot more like I'm playing with a 1200-1500ms RTT, which is what I would expect if the servers were overloaded or running in debug or doing a LOT of buffered IO.&lt;br /&gt;&lt;br /&gt;At first I thought they'd added a cool little touch, "deja vus" like in the films. But its just the host periodically moving you other than where your client thought it was. That helps explain why they don't let you jump on top of stuff.&lt;br /&gt;&lt;br /&gt;I've seen some bad and broken AI behavior, although some of the functionality is a little buggy -- you can't &lt;i&gt;start&lt;/i&gt; a fight if you're in "block" stance, but it doesn't always tell you. Sometimes it just says "You can't fight for unknown reasons" in a transparent box with no borders that is apparently in the top left of the screen (although you may have obscured it with UI stuff since you couldn't see it). Othertimes I've been unable to attack stuff because - well, unknown reasons ya know.&lt;br /&gt;&lt;br /&gt;They missed out on some cool stuff -- you don't appear to be able to do cool-ass wall-jumps and etc. I really hope those are skills somewhere down the line.&lt;br /&gt;&lt;br /&gt;But hey - you gotta expect some really dumb mistakes going into a game from a non-MMO team at a non-MMO company that, in under a year, &lt;i&gt;&lt;b&gt;Warner Brothers&lt;/b&gt;&lt;/i&gt; were willing to sell &lt;i&gt;&lt;b&gt;to Sony&lt;/b&gt;&lt;/i&gt;...&lt;br /&gt;&lt;br /&gt;None of the nuisances I've run into have the eye-stabbing, vomit inducing, nut-kicking ability that WWII Online has inflicted on people past and present. Maybe that just means I have low standards... But I'm enjoying MxO. &lt;i&gt;I'd enjoy it a lot more if my chick didn't have club feet&lt;/i&gt; but that's by-the-by. And if you're still on a 17 or 15in monitor, you'd probably not be bothered by the slightly retro look to the graphics engine.&lt;br /&gt;&lt;br /&gt;Spleen vented, where's that jackplug gone? Time to for some more kungfu!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-114420158495239756?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/114420158495239756/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=114420158495239756' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114420158495239756'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114420158495239756'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/04/mmos-and-movies-mxo.html' title='MMOs and movies, MxO'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-114411554872231254</id><published>2006-04-03T20:43:00.000-05:00</published><updated>2006-04-03T20:56:48.126-05:00</updated><title type='text'>Q: How often do you visit your companies website?</title><content type='html'>I just noticed that I don't have any bookmarks to &lt;a href="http://www.wwiionline.com/"&gt;wwiionline.com&lt;/a&gt; on this machine or my laptop, and it isn't even in the run or browser history for either of my machines.&lt;br /&gt;&lt;br /&gt;I can't tell if its the "&lt;a href='http://training.wwiionline.com/'&gt;green/chartreuse theme&lt;/a&gt;" or the determined effort to ensure no two links look alike.&lt;br /&gt;&lt;br /&gt;[&lt;i&gt;Edit: Probably an &lt;a href='http://hardware.slashdot.org/article.pl?sid=06/04/01/1437251'&gt;appropriate link&lt;/a&gt;&lt;/i&gt;]&lt;br /&gt;&lt;br /&gt;Well, MxO is nearly patched. Time to jack in!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-114411554872231254?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/114411554872231254/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=114411554872231254' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114411554872231254'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114411554872231254'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/04/q-how-often-do-you-visit-your.html' title='Q: How often do you visit your companies website?'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-114410385365798362</id><published>2006-04-03T16:38:00.000-05:00</published><updated>2006-04-03T17:37:33.700-05:00</updated><title type='text'>And now for something completely different</title><content type='html'>With the Corns sufficiently subdued, back to work. I ate up much of my weekend checking all my STO unit tests to make sure I wasn't missing something stupid and then actually going through the code and making sure I wasn't doing something stupid. Finally I waded into the fascinating and terrifying world of the client in the vain hope of spotting why my STO objects weren't appearing. They appeared to be going into the right place, but never quite coming out visually.&lt;br /&gt;&lt;br /&gt;See, I understand the inner workings of the client so little that when Martini tells me it's "not culling them", I think that's a good thing. Yeah, yeah, I vaguely know that he means &lt;a href="http://en.wikipedia.org/wiki/Back-face_culling"&gt;culling&lt;/a&gt; and not genocidal destruction of the objects.&lt;br /&gt;&lt;br /&gt;Well until the client can draw the things (again) I'm back to working on the server code for it. Need to attach them to mobile spawn objects on the mission host so it can notify the STO system when an MSP is deleting the attached STO, and add a mechanism for damaging an STO (since it's not really a vehicle it'll be simplistic).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-114410385365798362?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/114410385365798362/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=114410385365798362' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114410385365798362'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114410385365798362'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/04/and-now-for-something-completely.html' title='And now for something completely different'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-114404298473678507</id><published>2006-04-03T00:36:00.000-05:00</published><updated>2006-04-03T00:43:04.776-05:00</updated><title type='text'>Q: When is a patch not a patch?</title><content type='html'>&lt;a href="http://www.kfs.org/gifs/bloodyhell.png" target="_view"&gt;&lt;img src="http://www.kfs.org/gifs/bh1.jpg" align="left" /&gt;&lt;/a&gt; When its 2 bloody gigabytes!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.kfs.org/gifs/bloodyhell2.png" target="_view"&gt;&lt;img src="http://www.kfs.org/gifs/bh2.jpg" align="left" /&gt;&lt;/a&gt; And you hide your support pages in white-on-white to stop people figuring out how to download less &lt;br /&gt;Guess you won't be wanting to try MxO on a dialup connection.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-114404298473678507?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/114404298473678507/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=114404298473678507' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114404298473678507'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114404298473678507'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/04/q-when-is-patch-not-patch.html' title='Q: When is a patch not a patch?'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-114403919120184787</id><published>2006-04-02T23:25:00.000-05:00</published><updated>2006-04-02T23:42:22.503-05:00</updated><title type='text'>Oh, alright then</title><content type='html'>A few more screenshots and finally noticing that MxO is another Sony game with a major &lt;a href="http://thematrixonline.station.sony.com/news_display.vm?id=99&amp;month=current"&gt;combat overhaul&lt;/a&gt;... I've decided to give it a try in the interests of, uhm, "research". (How dare you accuse me of being a gamer?!?)&lt;br /&gt;&lt;br /&gt;Looks like I won't be jacking in tonight tho. I entered my MxO beta details on their account transition page and kept running into "We have experienced an error". I couldn't help but chuckle at the author's &lt;u title="I don't think the omission of 'unexpected' was unintentional"&gt;sense of humor&lt;/u&gt;. &lt;br /&gt;&lt;br /&gt;Why are people seriously trying to revive the &lt;a href="http://www.cornish-language.org/"&gt;Cornish language&lt;/a&gt;? It's been 300 years since people spoke it and even then a lot of it was already lost. Surely the first thing the language needs to do to be revived into today's world is ... invent or adopt a whole bunch of new words that corrupt it immediately.&lt;br /&gt;&lt;br /&gt;Anyway, speaking Cornish makes you &lt;a href="http://www.cornish-language.org/English/ViewNews.asp?view=175"&gt;pixelated&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;F**k it. &lt;i style='font-size: 36; font-weight: bold'&gt;WAR WITH CORNWALL!&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;We've got plenty more &lt;a href="http://www.zum.de/whkmla/military/16cen/cornwall1549.html"&gt;prayerbooks&lt;/a&gt; where that last lot came from. And I, for one, am not afraid to throw them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-114403919120184787?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/114403919120184787/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=114403919120184787' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114403919120184787'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114403919120184787'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/04/oh-alright-then.html' title='Oh, alright then'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-114402994555225782</id><published>2006-04-02T20:28:00.000-05:00</published><updated>2006-04-02T21:05:45.620-05:00</updated><title type='text'>A fine Sunday it is</title><content type='html'>French baguette with pastrami and &lt;u title="Yeah, me and cheese"&gt;muenster cheese&lt;/u&gt;. &lt;a href="http://www.tazo.com/"&gt;Tazo Iced Green Tea&lt;/a&gt;. The cat ungently shredding my arm. A fresh install of &lt;u title='I got tired of trying to overcome all the obstacles to getting the game and 3rd party libraries to run under the (awesome) new VS 2005 instrumentation.'&gt;Visual Studio .NET&lt;/u&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href='http://www.srh.noaa.gov/ifps/MapClick.php?CityName=Bedford&amp;state=TX&amp;site=FWD'&gt;The weather was nice&lt;/a&gt; until about 11am, which is around when I stopped trying to be asleep and got up. Then it got hot. Not &lt;u title="Today was cold by Texas standards, Lum ;)"&gt;full-on Texas hot&lt;/u&gt;, but it went up from around the mid 70s to the low 90s real quick. It's still 86f (30c) right now. Time to break out the shorts and sandals again soon, me thinks.&lt;br /&gt;&lt;br /&gt;And to pass the time? I flit between falling asleep in my chair due to the heat and the insane amount of time &lt;u title="1/10th of the time is compilation, the other 9/10ths are loading and setting up the compiler executable"&gt;Microsoft's serial compilation of a project takes&lt;/u&gt;, reading from &lt;a href="http://www.amazon.com/gp/product/0140444335"&gt;The Conquest of Gaul&lt;/a&gt;, and contemplating downloading &lt;a href="http://www.direct2drive.com/330/product/Buy-The-Matrix-Online-Download"&gt;MxO&lt;/a&gt; (&lt;a href="http://www.direct2drive.com/screenviewer.aspx?p=/images/product/screenshots/330/normal/screenshot4.jpg"&gt;this&lt;/a&gt; disuades me).&lt;br /&gt;&lt;br /&gt;Right now I'm waiting the several minutes that it usually takes for a debug build of the game to get from map to spawned. Or I was. I'm testing dropping STOs into the game world, and puzzling over why they don't appear. Apparently, &lt;a href="http://www.sourcegear.net/"&gt;SourceOffsite&lt;/a&gt; is unconvinced by my requests to "Refresh Project Tree" so I've been working with stale code. Well, it's only a Sunday.&lt;br /&gt;&lt;br /&gt;I've decided to order another Design Patterns book, because I'm not happy with my &lt;a href="http://en.wikipedia.org/wiki/Factory_object"&gt;object factory&lt;/a&gt; implementation. The client and host share the definition of a ServerTrackedObject, and several layers over that (STO_Timed, for instance). But eventually they diverge because the host/client have different needs for extending the data beyond the "mutual" level.&lt;br /&gt;&lt;br /&gt;The factory itself is just a C function that gets the object's type and then creates the neccessary child object based on the type. The only difference is that the client and server have seperate instances of this function. I'd have liked to have made it more generic since I ran into a difference in the understood size of the type field between the two sides of the connection.&lt;br /&gt;&lt;br /&gt;Code duplication is bad, didn't I mention that?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-114402994555225782?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/114402994555225782/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=114402994555225782' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114402994555225782'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114402994555225782'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/04/fine-sunday-it-is.html' title='A fine Sunday it is'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-114389651648180563</id><published>2006-04-01T06:41:00.000-06:00</published><updated>2006-04-01T07:01:56.523-06:00</updated><title type='text'>Finally</title><content type='html'>Crazy-debug-foo aside, the STO code is coming along nicely. Killer keeps telling me all the things he wants to use it for, and I personally want to see it used for atleast &lt;u title="I.e. trucks you don't have to man continually"&gt;sticky mobile spawns&lt;/u&gt;, &lt;u title="Lets forgo the usual OMG U NOOBS MISSION LEADER MOBILE SPAWN WILL BE ABUSED because there will actually like be rules"&gt;mission leader mobile spawns&lt;/u&gt; and smoke. At some point this year bouncing grenades also go into STOs.&lt;br /&gt;&lt;br /&gt;More importantly, this was my chance to write a "grid" system for the next round of update system improvements.&lt;br /&gt;&lt;br /&gt;Our old system is fairly efficient, but its also an abomination of callbacks, caveats, hacks and seemingly random numbers.&lt;br /&gt;&lt;br /&gt;One of its biggest inefficiencies is that for each player it creates a circular hash (a list of the grid-nodes around the player). When you move to a new grid, it creates a new hash, and then copies information from the old to the new.&lt;br /&gt;&lt;br /&gt;The new system is a little bolder, and written from scratch. It isn't circular, for a start, and it isn't player-centric. Instead each node hash a running hash of the populated nodes around it. Since the rate of change is far lower than the rate of reads/inspections, this helps reduce uneccessary "can I see you? do you contain anything?" queries.&lt;br /&gt;&lt;br /&gt;When a player moves from one node to another, we can very easily tell which nodes went out of range (set_difference) and schedule any objects in those grids to remove themselves from the player's lists if the player doesn't re-enter the grid within a short time. &lt;br /&gt;&lt;br /&gt;The Client side of it worked smoothly first time too, so it's pretty promising. Hopefully when we wrap it up it'll be enough to let me finish working on TOEs for 1.24, before I lay into the update system. My hope is that I can translate the STO grid system directly into the cell hosts.&lt;br /&gt;&lt;br /&gt;That in turn will free up some load on other servers and set the stage for tackling some of the big "mission" issues - like making sure you get your AARs, making it possible to change mission details (origin/target) while spawned, as well as allowing you to change which mission you are on while spawned. Gophur has some cool plans for improvements to the mission system...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-114389651648180563?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/114389651648180563/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=114389651648180563' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114389651648180563'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114389651648180563'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/04/finally.html' title='Finally'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-114385540014552428</id><published>2006-03-31T19:35:00.000-06:00</published><updated>2006-03-31T19:36:40.183-06:00</updated><title type='text'>Thpppt</title><content type='html'>So here I am, incapable of writing a single bloody debug line that works, but I can write a new login process. And it actually works first, second, third and fourth times. Then I add a debugging line, carefully, because I know today is debug-hell for me. AND IT BREAKS.&lt;br /&gt;&lt;br /&gt;GRRR.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-114385540014552428?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/114385540014552428/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=114385540014552428' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114385540014552428'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114385540014552428'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/03/thpppt.html' title='Thpppt'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-114384448031848902</id><published>2006-03-31T15:20:00.000-06:00</published><updated>2006-03-31T16:34:40.413-06:00</updated><title type='text'>*Grumble* bloody idiot</title><content type='html'>I've just done writing a fairly complex new system, I'll tell you more later. I've used some good, standard practices in writing it, and all of the functional code has worked end to end.&lt;br /&gt;&lt;br /&gt;Except:&lt;br /&gt;&lt;br /&gt;Every damn debug line, every test harness, every "#ifdef BETA_RELEASE" has crashed it.&lt;br /&gt;&lt;br /&gt;How is it that on the one hand I can write a 65 line functor that is extremely efficient in creating a transition index of STOs (those moving out of range and those moving in), and preps them for network transmission, but then I write&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;pre&gt;&lt;br /&gt;&lt;font color='blue'&gt;#if defined&lt;/font&gt;(BETA_RELEASE)&lt;br /&gt;    dbugLog(_FLI, "grid[%d,%d] sending transition") ;&lt;br /&gt;&lt;font color='blue'&gt;#endif&lt;/font&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Or worse, I seem to like typing "%g" instead of "%d" today.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-114384448031848902?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/114384448031848902/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=114384448031848902' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114384448031848902'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114384448031848902'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/03/grumble-bloody-idiot.html' title='*Grumble* bloody idiot'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-114370510671799418</id><published>2006-03-30T00:55:00.000-06:00</published><updated>2006-03-30T01:51:46.763-06:00</updated><title type='text'>Oh, Galaxies :(</title><content type='html'>There have been a number of MMOs that tried to carry out a dream and wound up being torture. Hey, that was why I gave up a perfectly good job involving scantily clad women to move to Texas and try and fix some of it...&lt;br /&gt;&lt;br /&gt;I'd recently been trawling &lt;a href="http://video.google.com/videosearch?q=the+matrix+online"&gt;Google Video&lt;/a&gt; for player movies of a games like WoW, TMO, CoH, etc; I find player movies a good way to get some insight into a game I've been burned off playing. Some of the WoW movies are excellent, but then with so many players they have a much larger net to catch talent in :)&lt;br /&gt;&lt;br /&gt;The TMO movies torment me. TMO had great potential that was totally destroyed by coder art and a lack of imagination either in the quest system or the ones in the intro. I didn't last much past seeing the "coder art" that was the flat, rectangular, icon-like, square blobs that appeared people-sized to tell you what someone was casting. *shudder*&lt;br /&gt;&lt;br /&gt;I'm pondering using my Station Pass account to give it another try after seeing a couple of movies like &lt;a href="http://video.google.com/videoplay?docid=-3549734000518400533&amp;q=the+matrix+online&amp;pl=true"&gt;this one&lt;/a&gt;, which seem to hint at some love given to the effects system. I guess movies like &lt;a href="http://video.google.com/videoplay?docid=-5016775449247629807&amp;q=the+matrix+online&amp;pl=true"&gt;this one&lt;/a&gt; are from before that. &lt;a href="http://video.google.com/videoplay?docid=-1322189993894942872&amp;q=the+matrix+online&amp;pl=true&amp;auto=true"&gt;This one&lt;/a&gt; starts out cool, but then the combat starts. I'm pretty sure that's old.&lt;br /&gt;&lt;br /&gt;I had a while in the Galaxies beta, and I said good things about it, I even mentioned in the beta forums that it was amazingly cool, how exciting it was that they were clearly going to explore all these possibilities, but were they going to have time to add enough depth to all these options. I got a Raph response along the lines that people would have the ability to change careers and paths as a way to provide them with enduring content.&lt;br /&gt;&lt;br /&gt;My take at the time was that the content didn't have the depth to be a "career". They wanted to eliminate the grind, but they only did this by limiting how far you to reach by grinding.&lt;br /&gt;&lt;br /&gt;Hot chicks use banks too, ya know. But, really, how many guys make a point of going to the bank on Friday on the chance they might meet someone (not counting Benjamin Franklin)?&lt;br /&gt;&lt;br /&gt;I think SWG some excellent game concepts. And the breadth was a great way to bring in players who might not otherwise play and open up elements of the game that couldn't exist without them. It's hard to tell whether the limited depth and content were the result of deliberate and misguided attempt to quell grinding, or the result of dozens of great ideas going in and then not having the resources to follow up. &lt;br /&gt;&lt;br /&gt;Take the dancer class, for example. A social-focus class that had no combat bearing is a great concept for drawing auxilliary streams of interest into the game. But the class didn't actually have any "gameplay". They barely had little more than some private emotes. But the class could have been a phenomenal community building element of the game in a similar fashion to the way in which resource gathering let you pull stuff into the game -- tie the dancers, doctors and spies together with a system which brings into the game things like blue prints or blue-print components for the crafting community, "rumors" or "gossip" which ties into the questing community.&lt;br /&gt;&lt;br /&gt;Going to a cantina to sit and watch a wookie rhumba for 5 minutes &lt;i&gt;because I died&lt;/i&gt; doesn't make me like dancing wookies. Going to a cantina to rest up and pick up some fresh quest leads, maybe a hot tip on a rare spawn - now that'd be atmospheric.&lt;br /&gt;&lt;br /&gt;But then the players came in and complained about the AT-ST. I was on the receiving end of AT-ST deaths aplenty. When you're a dev with thousands of screaming customers riding your back with no real lucidity, tunnel vision sets in. Doesn't matter if you're an MMO dev or not. That's why I created &lt;a href="http://web.archive.org/web/20030601170141/http://oliver.kfs.org/daoc/"&gt;this&lt;/a&gt; all those years ago when I realized the DAoC beta testers were starting to do that to Mythic.&lt;br /&gt;&lt;br /&gt;I think the SWG team found themselves overwhelmed. Dozens of parallel, distinct classes spreads your players &lt;i&gt;and their issues&lt;/i&gt; horizontally, which makes it harder to narrow your focus and start fixing stuff.&lt;br /&gt;&lt;br /&gt;It seemed the team became so pressured to start fixing things that they started taking a merely development-firefighting approach to it. AT-STs were absolutely fine as they were, but single players pulling them out of backpacks made them ludicrous. In the movies the AT-ST is always accompanied by a platoon of troopers. The "StarWars Solution", IMHO, would be to make pulling an AT-ST require a bunch of guys to get together at an imperial base, requisition the AT-ST, and then accompany it to the destination. The keyword in most of the complaints was "keep", as in "This guy at Anchorhead keeps killing everyone who pokes their head out by pulling an AT-ST out of his pack".&lt;br /&gt;&lt;br /&gt;I &lt;i&gt;really&lt;/i&gt; liked where SWG was going at the end of beta. I think many of the things that were cool about SWG at release won't make it into another MMORPG for a long time, because developing the auxilliary functionality is just as resource-consuming as trying to build the mainstream game, and since the ideas have already appeared to crash-and-burn once, investors are going to shy away from them again; the same way that Horizons trashed the future of sophisticated crafting systems.&lt;br /&gt;&lt;br /&gt;And Galaxies:NGE would make a cool game, it just sort of needs to be its own game and not a Galaxies mod. The NGE tutorial is a real blast. But they really have their work cut out for them to try and bring the rest of the game up to the same standards. I wish them the best with that. If the game was a fully-realized version of the original getup, or a fully-realized NGE experience, I'd be there having a blast :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-114370510671799418?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/114370510671799418/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=114370510671799418' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114370510671799418'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114370510671799418'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/03/oh-galaxies.html' title='Oh, Galaxies :('/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-114369461581799242</id><published>2006-03-29T21:10:00.000-06:00</published><updated>2006-03-29T22:58:39.426-06:00</updated><title type='text'>If you want to learn how to program...</title><content type='html'>There are oodles of programming languages out there, each offering the opportunity to solve different problems in different ways. But your choice of language can also affect where you will go with it. Learning "Perl" is probably not going to help you become a 3d graphics programmer, while learning Visual Basic probably won't guaranteed you a high-paying network systems developer position.&lt;br /&gt;&lt;br /&gt;Programs are typically written in a human readable language, the programming language. This code must be translated into instructions that can be executed by the CPU. Some languages, like C, use a compiler to translate the code once and write them out as machine-readable instructions. Compilation can be time consuming but execution is very efficient. Examples: C, C++.&lt;br /&gt;&lt;br /&gt;Other languages use an interpreter that translates and executes the code in a source file on the fly. These are often called "scripting" languages because it is actually the interpreter that does all of the work, and the source code is merely a script to guide it in which of the many instructions it contains in what order, etc. Examples: &lt;a href="http://www.activestate.com/"&gt;Perl&lt;/a&gt;, JavaScript.&lt;br /&gt;&lt;br /&gt;The third type of language is a mixture of the first two. A compiler translates the source into a more machine readable format, performing a lot of the security and sanity checking that can hurt performance of interpreted languages. Instead the final conversion into specific CPU instructions is performed by an interpreter. This is often called "pseduo-code" or "p-code". Examples: &lt;a href="http://www.sun.com/java/"&gt;Java&lt;/a&gt;, uLPC or Pike.&lt;br /&gt;&lt;br /&gt;Some p-code languages provide a means of compiling and running the code without saving the result to disk, like an interpreted language. Examples: &lt;a href="http://www.python.org/"&gt;Python&lt;/a&gt;, &lt;a href="http://www.lua.org/"&gt;Lua&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Generally learning to program with an interpreted language is the easiest route; you pay a price in performance for human readability and automation. Compiled languages typically require you to learn more advanced concepts.&lt;br /&gt;&lt;br /&gt;For example, in Perl, you can get a long way by knowing only that there are variables (scalars), lists of variables (arrays), and indexes of variables (hashes). In C you need to know exactly what type of thing a thing is.&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;pre&gt;Perl:&lt;br /&gt;  $message = "Hello, world";&lt;br /&gt;  $birthDay = 28;&lt;br /&gt;  $birthMonth = 6;&lt;br /&gt;  print("$message! My birthday is $birthMonth/$birthDay");&lt;br /&gt;&lt;hr/&gt;"C":&lt;br /&gt;int main(int argc, char* argv[])&lt;br /&gt;{&lt;br /&gt;  char message[] = "Hello, world";&lt;br /&gt;  int birthDay = 28;&lt;br /&gt;  int birthMonth = 6;&lt;br /&gt;  printf("%s! My birthday is %d/%d", message, birthDay, birthMonth);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The last part of choosing a language is what you want to do. The language provides a way of writing instructions, but this doesn't guarantee that you can just do any old thing. If you want to draw images on the screen, for example, the &lt;i&gt;language&lt;/i&gt; doesn't have to provide a facility to do that. Most languages provide some sort of module or library system that lets you extend the default environment with new commands or routines from someone elses code.&lt;br /&gt;&lt;br /&gt;JavaScript is an example of a language that doesn't provide extensibility; the language is inherently closed. It can't gain access to your registry or your credit card information.&lt;br /&gt;&lt;br /&gt;Perl, however, has &lt;a href="http://www.cpan.org/modules/by-category/"&gt;many modules&lt;/a&gt; for simplifying access to &lt;a href="http://www.cpan.org/modules/by-category/07_Database_Interfaces/"&gt;Databases&lt;/a&gt;. Some of these are compiled from C language and essentially become part of your Perl interpreter. Others are written in Perl and merely reduce the amount of code you must write and maintain to achieve a task.&lt;br /&gt;&lt;br /&gt;C and C++ are very "low-level" languages, as a result there is usually an interface to any system or sub-system your machine has - graphics, sound, database, internet, etc. But typically you, as programmer, have a lot more responsibility in seeing the interface is used properly.&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;pre&gt;Perl:&lt;br /&gt;use DBI ;&lt;br /&gt;$db = DBI-&gt;Connect("dbi:&lt;i&gt;mysql&lt;/i&gt;:mydb:dbname=mydb:user=dbuser:password=dbpass") ;&lt;br /&gt;if ( $db )&lt;br /&gt;{&lt;br /&gt;  $db-&gt;do("UPDATE counter SET count = count + 1") ;&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;  error("Unable to connect to database") ;&lt;br /&gt;}&lt;br /&gt;&lt;hr/&gt;Raw "C":&lt;br /&gt;#include &amp;lt;mysql.h&amp;gt;&lt;br /&gt;&lt;br /&gt;int main(int argc, char* argv[])&lt;br /&gt;{&lt;br /&gt;  MYSQL* mysql = mysql_init(NULL) ;&lt;br /&gt;  if ( mysql == NULL )&lt;br /&gt;  {&lt;br /&gt;    printf("Unable to initialize mysql\n") ;&lt;br /&gt;    exit(0) ;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  if ( mysql_real_connect(mysql, "mydb"&lt;br /&gt;                         , "dbuser", "dbpass"&lt;br /&gt;                         , "mydb", 0, NULL, 0) )&lt;br /&gt;    mysql_query(mysql, "UPDATE counter SET count = count + 1") ;&lt;br /&gt;  else&lt;br /&gt;    printf("Unable to connect to mysql database") ;&lt;br /&gt;&lt;br /&gt;  mysql_close(mysql) ;&lt;br /&gt;}&lt;br /&gt;&lt;hr/&gt;C++:&lt;br /&gt;#include "mydbQuery.h"&lt;br /&gt;#include &amp;lt;stdexcept&amp;gt;&lt;br /&gt;&lt;br /&gt;int&lt;br /&gt;main(int argc, char* argv[])&lt;br /&gt;{&lt;br /&gt;  try&lt;br /&gt;  {&lt;br /&gt;    DBConnection conn(DB_MYSQL, "mydb", "dbuser", "dbpass", "mydb") ;&lt;br /&gt;    conn.do("UPDATE counter SET count = count + 1") ;&lt;br /&gt;  }&lt;br /&gt;  catch (const std::exception&amp; e)&lt;br /&gt;  {&lt;br /&gt;    printf("Failed: %s\n", e.what()) ;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Not an entirely fair comparison: Both the Perl and C++ examples use a wrapper interface, which you can do just as easily in C.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;A big factor is finding a comfortable set of development tools. There are a great many free languages out there - Perl, Lua, Python, Java, etc... You can start spending money if you want to buy clever tools, particularly a smart editor. Apple users get their development tools from Apple for free. Microsoft users can expect to pay huge sums of money for Microsoft's tools. But, there are free options too. The GNU C Compiler ("gcc") can compiler C, C++, Java, Fortran and a few other languages, does it for free, and does it very well. But, a chunk of &lt;a href="http://www.cygwin.com/"&gt;techie knowledge can be required to get it set up&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Most programmers work with an integrated set of tools that helps them manage their files, write, compile and test their code. Usually called an &lt;u title='Integrated Development Environment'&gt;IDE&lt;/u&gt;. Microsoft offer &lt;a href="http://www.microsoft.com/visualstudio/"&gt;Visual Studio&lt;/a&gt; which is quite a well polished and rounded environment these days, lacking some of the &lt;u title='Parallel compiles of files in a single project rather than just separate projects, for example'&gt;basic comforts&lt;/u&gt; most developers are used to, but well rounded in most places. There is even a &lt;a href="http://msdn.microsoft.com/vstudio/express/default.aspx"&gt;Free version&lt;/a&gt; of the Visual Studio tools (for one year, anyway). But you can also look to companies like &lt;a href="http://www.activestate.com/"&gt;ActiveState&lt;/a&gt; and &lt;a href="http://www.metrowerks.com/"&gt;MetroWerks&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Free solutions include the excellent &lt;a href="http://www.eclipse.org/"&gt;Eclipse&lt;/a&gt; (primarily java focused) and &lt;a href="http://www.kdevelop.org/"&gt;KDevelop&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Eclipse is a good all-rounder but can be a little overwhelming for a starter.&lt;br /&gt;&lt;br /&gt;Frankly if you aren't planning a career in programming and are a Windows user, &lt;a href="http://msdn.microsoft.com/vstudio/express/vb/"&gt;Visual Basic&lt;/a&gt; can be a darn good place to learn some programming. But be warned - VB is a very high-level language that seeks to provide shelter from some of the nuances of programming. Languages like VB and Perl &lt;i&gt;can&lt;/i&gt; can teach you bad programming habbits. Snobbish programmers would suggest that learning to program with VB is akin to learning to plug your VCR into both your TV and your speakers.&lt;br /&gt;&lt;br /&gt;But personally that's just fine, akin to being able to teach your computer &lt;i&gt;useful&lt;/i&gt; tricks like fetching the newspaper :) Just be aware that the bike comes with training wheels attached before quitting your job and holding out hopes of being the next John Carmack ;)&lt;br /&gt;&lt;br /&gt;If you're currently selling burgers, though, and are thinking about becoming a programmer, take some time to figure what you want to do with your kungfu. Don't learn Java if you want to be a cutting edge games programmer, and don't learn C++ if you want to get into the mobile gaming industry.&lt;br /&gt;&lt;br /&gt;If you want to learn Java or C++ it pays to have *some* sort of project in mind before you start. And no, don't set out to write a major undertaking like WWIII Online or a competitor for Internet explorer.&lt;br /&gt;&lt;br /&gt;The first computers I programmed on didn't have GUIs, so it wasn't difficult to get upto speed. But unlike Visual Basic, learning to drive a GUI in C, C++ or Java can add a load to learning a language. So try and start with something you can get your head around that will run on the command line, or work with files, etc.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-114369461581799242?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/114369461581799242/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=114369461581799242' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114369461581799242'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114369461581799242'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/03/if-you-want-to-learn-how-to-program.html' title='If you want to learn how to program...'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-114351549438073198</id><published>2006-03-27T21:11:00.000-06:00</published><updated>2006-03-27T21:11:34.383-06:00</updated><title type='text'>Moonifornia</title><content type='html'>&lt;a href="http://antwrp.gsfc.nasa.gov/apod/ap060327.html"&gt;http://antwrp.gsfc.nasa.gov/apod/ap060327.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-114351549438073198?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/114351549438073198/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=114351549438073198' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114351549438073198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114351549438073198'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/03/moonifornia.html' title='Moonifornia'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-114351504585449831</id><published>2006-03-27T20:36:00.000-06:00</published><updated>2006-03-27T21:04:05.930-06:00</updated><title type='text'>DnD Online</title><content type='html'>I never played pen and paper D&amp;D games, so there is a large part of the appeal of DnDO that sails right past me. I find myself looking at it as the "latest" in a line of MMORPGs, and it doesn't really do anything spectacular. So far my take is that its a cool game to recreate the table top experience with -- once a week you and your buddies log in, do your thing, and then you don't play for a week.&lt;br /&gt;&lt;br /&gt;It's definitely not a solo game, and it doesn't seem to really be an MMORPG, its more like Guildwars in that sense.&lt;br /&gt;&lt;br /&gt;Graphically, very pretty, although the graphics have a strange blend of EQ2-style detail on small things like boxes and tables, while other objects and buildings look more WoW like with the tricks WoW uses so that in-game the relatively low polycount compliments the textures and makes things look more detailed than they are (but WoW screenshots look 5-8 years old).&lt;br /&gt;&lt;br /&gt;The basics of the game are cool enough, I like that combination of variables that go into combat so that you don't need zillions of hitpoints. The actual mechanics of combat are a little irksome, particularly the action-based click&amp;swing combat. There is an auto-attack system but I find it to be a pain.&lt;br /&gt;&lt;br /&gt;From the four nights I've played over the last 2-3 weeks, I've quickly realized that every other MMO has trivial stats systems compared to DnD, there are just so many attributes to roll for and against. And so little of it is self-explanatory to a non DnDer.&lt;br /&gt;&lt;br /&gt;Lots of the items I've come across I've tossed out, only to find out later that they were "cool" because of some implied attributes that weren't listed or shown anywhere. Crossbows, as a simple example, don't tell you what range they have, and otherwise they all seem pretty much the same.&lt;br /&gt;&lt;br /&gt;The dungeons themselves are pretty cool. Some of the puzzles are just freaking awesome. And the group dynamic is totally different - off goes the rogue scouting for traps, looking for monsters. I can tell that I'm only getting a meagre sampling of that at level 1; and unfortunately the rogue is almost more of an obstruction during the early levels - just quit sneaking around and lets go kill these mobs. (Although a few encounters with fire traps or guilotines slows them down a bit again ;)&lt;br /&gt;&lt;br /&gt;I'm pretty sure I've only read the text of half of my first quest. I keep meaning to, and wanting to, but something about the way its presented makes me just skip thru it - maybe its the fact that its broken into sentences rather than being a blurb that I can just read thru without interaction.&lt;br /&gt;&lt;br /&gt;The cool-factor of the dungeons more or less balances this out. But &lt;i&gt;un&lt;/i&gt;fortunately the dungeons don't have a lot of replay value because once you've been thru one, you know where everything is and how to get thru...&lt;br /&gt;&lt;br /&gt;The UI is pretty lousy. I don't like it aesthetically, and the default/initial layout is ridiculous and impractical; its very cluttered, the initial window placements seem to want to gravitate towards the center of the screen making it feel somewhat claustrophobic. The fact that you have to be "facing" stuff to hit it, in every sense. The UI doesn't look so bad on a 17in monitor but as you step up your monitor, it starts to look huge and retro (yes, I know ours does that too, consider this my gripe about *that* :)&lt;br /&gt;&lt;br /&gt;It also feels very "mousey", but not in a good way. Wanna examine an item in your inventory? You have to click on it and press z, or find the little "what you have targetted" window and click the apropriate button.&lt;br /&gt;&lt;br /&gt;In short ... I think its like an MMO Truffle. A nice treat once a week. If DnDO does a deal with Dominos/Papajohns/Pizzahut that lets you buy 3 hours of game time with a pizza, they'll probably make more game-card revenue than they do subscriptions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-114351504585449831?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/114351504585449831/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=114351504585449831' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114351504585449831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114351504585449831'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/03/dnd-online.html' title='DnD Online'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-114343375829101055</id><published>2006-03-26T22:17:00.000-06:00</published><updated>2006-03-26T22:29:18.330-06:00</updated><title type='text'>Questions</title><content type='html'>Why do Microsoft prefer the ISO C++ standard - it wouldn't have anything to do with its not being Unix-friendly by renaming all the standard functions like "open" to "_open", would it? In VS2005 Microsoft have cunningly added macros that mean you have to rethink your old portability macros...&lt;br /&gt;&lt;br /&gt;And I can't seem to figure out how to get libtool not to generate any output when I do make -ks. If GNU is Not Unix, it most definitely is about 90% bloat.&lt;br /&gt;&lt;br /&gt;Does the fact that I *like* notepad? Am I being harsh when I think Linux "notepad" clones suck because they &lt;u title='If I wanted more complexity than wordpad, I could load wordpad. Note to Knotepad in particular'&gt;never keep it simple&lt;/u&gt;?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-114343375829101055?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/114343375829101055/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=114343375829101055' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114343375829101055'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114343375829101055'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/03/questions.html' title='Questions'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-114326993786146327</id><published>2006-03-25T00:24:00.000-06:00</published><updated>2006-03-25T08:28:30.806-06:00</updated><title type='text'>The madness behind the method</title><content type='html'>&lt;i&gt;Edit: Caveat emptor; despite the length, I wrote this as a blog entry, not as an essay. I don't perceive or mean to portray myself as a "perfect" coder. If I was a perfect coder, or heck even a good rather than just fast typer, I wouldn't need no stinkin' method :). It may be possible to tell I was tired while writing this...&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;The space-semi thing is only a part of a general approach to programming, one that I might not have picked up had we not been working in Perl at the time -- most perl scripts have a significantly higher symbol density than C and C++ :)&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;pre&gt;&lt;br /&gt; last unless ($#{$ref}-&gt;{$lookup}[$index]=~s/(${last})/&amp;{$fn}("\L$1\E")/oe);&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;It travelled with me into C/C++ and other languages really as part of the approach I've evolved over the years. I can churn out code at a pretty fast rate if I dispense with all the fangled white spacing, the prissiness and the verbose naming stuff, without breaking functions up uneccessarily. &lt;i&gt;Edit: But then usually I wind up not getting much re-use out of the code or spending countless hours finding and fixing sone noncey little problem that I ought to know better than to make by now...&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Before you read the following code, slow up and turn on monitoring of your own internal dialog - watch the process of your own translation of the words infront of you.&lt;br /&gt;&lt;br /&gt;&lt;div id='code1'&gt;&lt;a href="javascript:reveal('code1')"&gt;Show Code&lt;/a&gt;&lt;div class="code" style="visibility:hidden;display:none;"&gt;&lt;pre&gt;&lt;br /&gt;  string p;&lt;br /&gt;  while(!(p=getNextInput(handle)).empty()){&lt;br /&gt;    if(p.find("verb")==p.length())continue;&lt;br /&gt;    if(p.find("section")!=p.length())break;&lt;br /&gt;    p.replace("object=","noun=");&lt;br /&gt;    string noun;&lt;br /&gt;    string verb=p.substring(p.find("=")+1,p.find("{"));&lt;br /&gt;    if(verb.length()&gt;10)continue;&lt;br /&gt;    if(p.find("{")!=p.length())noun=p.substring(p.find("{"),p.length()-1);&lt;br /&gt;    if(process(verb,noun))break;&lt;br /&gt;    index(verbs,verb);index(nouns,noun);associate(verb,noun);&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;You can probably read the code and figure what it's supposed to do. But as you may have noticed, the code didn't &lt;i&gt;magically&lt;/i&gt; explain itself to you. There was significant effort involved.&lt;br /&gt;&lt;br /&gt;When a German speaker is giving a speech at the UN, the translation would often go completely quite for a long stretch. The delegates would look over at the translator and see them starting to go blue in the face waiting for the all-important verb which, in German, is always placed like a punchline at the end of the sentence. Without it, but without which the English sentence can't start...&lt;br /&gt;&lt;br /&gt;The code did its job for the author. Some of you can probably spot some rough edges and inefficiencies. But it worked perfectly when the guy writing it wrote it. Now some time has passed and you need to use this code again. You've either slept since you wrote it or inherited someone elses code or you just need to embelish it.&lt;br /&gt;&lt;br /&gt;But it turns out the code doesn't work now. The code might "magically" reveal at least one of the potential bugs to &lt;u title='An uninitialized variable'&gt;you&lt;/u&gt;. At this stage you've got code on your hands that doesn't do the right thing, and you need to start working on it, not patching it up.&lt;br /&gt;&lt;br /&gt;The data is lines of text containing "&lt;b&gt;verb=&lt;/b&gt;something&lt;b&gt;{&lt;/b&gt;noun&lt;b&gt;}&lt;/b&gt;" for a verb and noun or just "&lt;b&gt;verb=&lt;/b&gt;something" for a verb without a noun. There may also be lines with the word "section" in them, which are supposed to be ignored.&lt;br /&gt;&lt;br /&gt;The first bug, after some investigation, turns out to be with the call to process(). You thought you knew what the code did, but actually the code is supposed to read through until it finds a verb/noun combination that aren't valid.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;process(verb,noun)&lt;/pre&gt; returns a value of zero (0) when everything is &lt;u title='Oh yes, I did indeed write that, the site hasnt been hacked...'&gt;tickety-boo&lt;/u&gt;. In C terms 0 is 'false' and anything else is 'true'. If &lt;pre&gt;process()&lt;/pre&gt; fails, it returns true. What the code &lt;i&gt;means&lt;/i&gt; is "if I cannot process(verb, noun) then stop". But that's not what it says. The compiler interprets the code as "if process(verb,noun) doesn't return 0 then stop".&lt;br /&gt;&lt;br /&gt;This approach has precedents in high places: Standard C functions like &lt;i&gt;strcmp()&lt;/i&gt; do this when they want to return dual purpose values and we just &lt;i&gt;tend&lt;/i&gt; to take advantage of the fact you can say &lt;pre&gt;if(!strcmp(input,"hello"))&lt;/pre&gt; instead of &lt;pre&gt;if(strcmp(input,"hello")==0)&lt;/pre&gt;.&lt;br /&gt;&lt;br /&gt;Lets pause for a moment. The code worked, first time round. Now it doesn't. Obviously its not the code at fault, but the data. And if you catch yourself in your zipper, that's your weiners fault then, is it?&lt;br /&gt;&lt;br /&gt;Our task thus far would have been much the easier if instead of being&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;pre&gt;&lt;br /&gt;int process(...) // Returns 0 on success, otherwise a positive value on error&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;we had&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;pre&gt;&lt;br /&gt;bool process(...) // 'true' on success, 'false' if processing failed&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Because now we can write&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;pre&gt;&lt;br /&gt;  if(!process(verb,noun))break;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Now the code says "if not [able to] process verb and noun then stop". *sniffs the air* Do you smell pixie dust?&lt;br /&gt;&lt;br /&gt;The second issue turns out to be the data's fault again. Since this code was last used you've added some "section"s to your data. In the original pass, the author was only worried about excluding "section"s, and since he didn't actually have any data after a section, he failed to notice that having a section line is terminal, never mind that you can't have a verb of "disection".&lt;br /&gt;&lt;br /&gt;It's not true for everyone, but cramming statements together in this fashion tends to encourage the mind to tokenize. In condensed code its one of the most common "trivial" coding errors.&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;pre&gt;&lt;br /&gt;    if(p.find("verb")==p.end())continue;&lt;br /&gt;    if(p.find("section")!=p.end())break;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;So what say we break this up a little, and save our brains a little tokenizing.&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;pre&gt;&lt;br /&gt;    if(p.find("verb")==p.length())&lt;br /&gt;        continue;&lt;br /&gt;&lt;br /&gt;    if(p.find("section")!=p.length())&lt;br /&gt;        break;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Without worrying about the if condition itself is, read both versions a few times starting with the "if". The result of the conditional test is in a known place. For most people this makes it a lot easier to "weight" how much of the line they need to read. Most - not everyone. Rick hates the way I can spread a few lines of code across multiple pages.&lt;br /&gt;&lt;br /&gt;It turns out that "break" is the wrong command in the above code. The original coder missed this because it had the same effect on his test data. But now you need it to be "continue" instead. With the code laid out in the two-line format, the presence of a "break" leaps out during a casual scan.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Debugging help&lt;/i&gt;: If you're looking for an erroneous continue or break operation in a busy loop, splitting the lines lets you set a debugger break-point on the continue or break instruction. Then you can run the code until the error happens and see what the context is. The single-line version on lets you set a break point before and after the condition is evaluated and the break or continue performed. You must then look at every iteration of the loop, note the context until you reach an instance where the code proceeds rather than stopping again.&lt;br /&gt;&lt;br /&gt;I said earlier that the code didn't &lt;i&gt;magically&lt;/i&gt; explain itself. There is a myth that code is self-explanatory. If you write code on the assumption that code explains code, then it never does. The trick is to make the effort of explaining the code while you write it. And most of this can be done with simple whitespace tricks. The following is valid code:&lt;br /&gt;&lt;br /&gt;A colleague once asked me to look at the following code. It was wedged into a mass of similar code, and he'd tried for nearly 30 minutes to figure out why it didn't work:&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;pre&gt;  i=initial();for(;i&lt;10;i++);if(options[i]);cancel(options[i]); &lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;He'd tried both of the following solutions, but the code still didn't work:&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;pre&gt;  int i=initial();for(;i&lt;10;i++)if(options[i]);cancel(options[i]); &lt;br /&gt;  int i=initial();for(;i&lt;10;i++){if(options[i]);cancel(options[i]);} &lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;I made the following change to the code for him, and he spotted the second problem straight away.&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;pre&gt;  int i=initial();for (;i&lt;10;i++)if (options[i])&lt;b style='color:red;'&gt;;&lt;/b&gt;cancel(options[i]); &lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;I've used whitespace to distinguish between a language keyword and a function call. "if();" and "for();" look right enough that a tired brain has less chance of spotting that they are supposed to be followed by a statement. And since ";" is a valid statement...&lt;br /&gt;&lt;br /&gt;Now if you're thinking about this, you're probably going to point out to me that I don't mention spending hours looking at this with him. And you'd be right. I spotted it pretty quickly. When he pointed to the line of code and said "this doesn't work". And I'd just had a nice cup of coffee and wasn't on a deadline with a piece of trivial code refusing to work. Just like you spotted it nice and quickly when I gave you the line of code without all the surrounding hieroglyphics, and told you in advance it didn't work :) Plus the context of this dialog would have given you some hints...&lt;br /&gt;&lt;br /&gt;The C language is descended from the "BCPL" language. Like the "B" language before it (I'm &lt;a href='http://en.wikipedia.org/wiki/BCPL'&gt;not making this stuff up&lt;/a&gt; - DMR is Ritchie of Kernigan and Ritchie) . At the time of Cs evolution disk space was at a premium. C and Unix followed the mantra of small is beautiful - hence "ls" for "list short" instead of "dir" for "directory". BYTE SAVED!&lt;br /&gt;&lt;br /&gt;So they also reduced the symbol table by trying to find compatible meanings for similar symbols. In some cases it wasn't possible to use the right character in two cases and be able to retain distinct meaning -- most of us know that "&amp;" is a symbol for "and". But in "C" it first means "&lt;a href='http://en.wikipedia.org/wiki/Logical_and'&gt;Logical And&lt;/a&gt;", which is something else entirely. One option would have been to use the word "and". But using alphabetical characters would *force* you to use whitespaces -- consider "if mandy". Is that "if m AND y" or a variable "mandy"?&lt;br /&gt;&lt;br /&gt;So C elected to use "&amp;&amp;" to mean "and". "if(m&amp;&amp;y)".&lt;br /&gt;&lt;br /&gt;But the parentheses characters were used to replace all sorts of things. Parentheses can represent mathemetical-style precedence manipulation, variable type casting, they indicate a function call and a list of parameters to it, or a function definition and the list of parameters to be accepted, or they can indicate a sub-clause consisting of a non-compound statement, an expression to evaluate or the bounds for a for loop.&lt;br /&gt;&lt;br /&gt;Don't drown every parenthesis in whitespace, but using a little white space can restore some context...&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;pre&gt;&lt;br /&gt;  if ( condition )&lt;br /&gt;  for ( starting;constraint;iteration )&lt;br /&gt;  while ( condition )&lt;br /&gt;  int i=(int) j&lt;br /&gt;  oneHundred=(4+6)*10&lt;br /&gt;  function(x,y,z)&lt;br /&gt;  if ( function(x,y,z) )&lt;br /&gt;  if ( (a==b||b==c)&amp;&amp;notHappyAbout(it) )&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Once you start introducing a little more white space, some of the above examples look frankly lopsided. My experience has been that the best policy is to lay the code out with distinct tokens separated by white space. The eyes can play tricks when you are skimming over code.&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;pre&gt;&lt;br /&gt;  if ( condition )&lt;br /&gt;  for ( starting ; constraint ; iteration )&lt;br /&gt;  while ( condition )&lt;br /&gt;  int i = (int) j&lt;br /&gt;  oneHundred = (4 + 6) * 10&lt;br /&gt;  function(x, y, z)&lt;br /&gt;  if ( function(x, y, z) )&lt;br /&gt;  if ( (a == b || b == c) &amp;&amp; notHappyAbout(it) )&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Lets take a look at a couple of these. "(4 + 6) * 10". Since the numerals and mathematical/logical symbols are largely in the same keyspace, it's easy enough to make a typo that will compile. "2*9" instead of "289". And when reviewing it can be difficult to tell what the author's intention was, even if its your own code.&lt;br /&gt;&lt;br /&gt;"while ( (p = gets(file)) == NULL )", the spacing around the other parentheses makes it easier to see where your own logical use of parentheses ends and the conditional wizardry you are performing starts. Your IDE/Editor probably points these out for you anyway, but when you develop more complex conditional constructs. COnsider: &lt;pre&gt;while ((((i*j)+p)*2+5/x))&lt;/pre&gt;. This is syntactically valid. But perhaps what you mean't was &lt;pre&gt;while ( (((i * j) + p) * 2 + 5) / x) )&lt;/pre&gt;. Paren ordering is a not infrequent source of bugs in code I've been asked to look at. A little whitespace help can do wonders.&lt;br /&gt;&lt;br /&gt;I mentioned above that splitting code into multiple lines can both scan more easily and be helpful when debugging. The more operations that occur on a line of code, the more complex it is to translate what is occuring into your own terms. Consider from the original code.&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;pre&gt;&lt;br /&gt;    string verb=p.substring(p.find("=")+1,p.find("{"));&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;There are a whole kit and kaboodle of operations occuring here, and because the author tried to cram them all into one seamless statement, he's also opened himself up to some errors.&lt;br /&gt;&lt;br /&gt;Most of you probably know where I'm going with this, and some of you are sighing in disgust that I'm about to tout splitting the thing up into multiple lines. It's long winded and uneccessary.&lt;br /&gt;&lt;br /&gt;But stay with me on this. The code hasn't actually yet checked to see if there is an "=" sign &lt;i&gt;in&lt;/i&gt; "p". So &lt;pre&gt;p.find("=")&lt;/pre&gt; might actually return an invalid value or end-of-string. But we go right ahead and add 1 to whatever it is that it returns. We have entered the land of undefined behavior.&lt;br /&gt;&lt;br /&gt;Because it is written as a function argument, the original author probably failed to think of it as a function call with all the usual perils that entails. Function arguments are comfy, cozy, well defined values, even if they are variable. Easy mistake to make.&lt;br /&gt;&lt;br /&gt;If the code had been written thusly:&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;pre&gt;&lt;br /&gt;    int equalPosition = p.find("=");&lt;br /&gt;    int bracePosition = p.find("{");&lt;br /&gt;    string verb = p.substring(equalPosition+1, bracePosition);&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;You would probably have spotted that sooner. And reading that, some of you just spotted the second bug too: The code locates the "=" and "{" signs separately, it doesn't check that the "{" comes after the equals sign.&lt;br /&gt;&lt;br /&gt;When the data was nice and perfect, the code worked. But someway down the timeline, the data became less perfect, and the code went horribly wrong.&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;pre&gt;&lt;br /&gt;    int equalPosition = p.find("=");&lt;br /&gt;    if ( equalPosition &gt;= p.length() )&lt;br /&gt;        continue;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;    int bracePosition = p.find("{", equalPosition);&lt;br /&gt;&amp;nbsp;&lt;br /&gt;    string verb = p.substring(equalPosition, bracePosition);&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Now you might choose not to use such long names; that's your call, but you can always use copy &amp; paste on long variable names to avoid replication typos.&lt;br /&gt;&lt;br /&gt;In addition, by naming your variables, you've allowed yourself the opportunity to work with the compiler to optimize your code, as well as making these values visible to yourself should you need to set a breakpoint and debug here - where you might not be able to see the arguments passed to a function unless you have the source for said function.&lt;br /&gt;&lt;br /&gt;If you look back to the original code, we end up performing find("{") several times. The compiler doesn't have a way to tell that this is a repetition. So it has to do the search multiple times, which includes all the overhead of the function call. You know that, and maybe performance isn't relevant to your application. But more importantly, by replicating the code, you either retype it multiple times and give raise to the possibility of typoing it once and getting unexpected behavior while the code "glances" like it worked the other 4 times; or you create a potential for future discontinuity where later changes/maintenance miss a call and it becomes indistinguishable from other similar uses ("what did I mean to do here?").&lt;br /&gt;&lt;br /&gt;So even if the performance penalty of multiple evaluations of an expression don't bother you, the translation and maintenance penalties should.&lt;br /&gt;&lt;br /&gt;Another caveat of this last code change. When testing for "past end of string", unlike the original code I test for greater OR equal to the length. The only valid values for equalPosition are in the range of 0 to (length - 1). Regardless of how unlikely it is under ideal conditions, I know that any value p.find returns larger than length is bad news.&lt;br /&gt;&lt;br /&gt;One of the strangest lines of code in the snippet, is, to my mind &lt;pre&gt;p.replace("object=","noun=");&lt;/pre&gt;. Having crowded the code together, the author didn't notice this line. It's redundant. At some point during his initial development he switched from "verb=... object=..." to "verb=... noun=..." to "verb=...{...}". The "object=" and "noun=" syntax are no-longer valid. But because the line didn't break anything, and because of the crowding, he just didn't notice the line until I asked him why it was there...&lt;br /&gt;&lt;br /&gt;It's not entirely uncommon. And deciding how to "chunk" your code can be somewhat religious. &lt;br /&gt;&lt;br /&gt;Well, you've been patient, so I'm going to cut to the chase. How did the code look when I'd done tinkering with it. This code dates from 2002, just around the time I was starting to do the "&amp;nbsp;;" thing but hadn't really gotten into it.&lt;br /&gt;&lt;br /&gt;&lt;div id="code2"&gt;&lt;a href="javascript:reveal('code2')"&gt;Show Code&lt;/a&gt;&lt;div style='visibility:hidden;display:none;'&gt;&lt;div class="code"&gt;&lt;pre&gt;&lt;br /&gt;  string p = "";&lt;br /&gt;  static const char* VERB_PREFIX = "verb=";&lt;br /&gt;  static const int VERB_OFFSET = sizeof(VERB_PREFIX);&lt;br /&gt;  static const int MAX_VERB_LENGTH = 10;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;  while ( fetchInput(handle, p) )&lt;br /&gt;  {&lt;br /&gt;    // Ignore lines not starting with "verb="&lt;br /&gt;    if ( p.find(VERB_PREFIX) != 0 )&lt;br /&gt;      continue;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;    string verb, noun ;&lt;br /&gt;    int nounPosn = p.find("{", VERB_OFFSET);&lt;br /&gt;&amp;nbsp;&lt;br /&gt;    if ( nounPosn &amp;lt; p.length() )&lt;br /&gt;    {&lt;br /&gt;      // Don't include the { in the verb&lt;br /&gt;      verb = p.substring(VERB_OFFSET, nounPosn - 1);&lt;br /&gt;      noun = p.substring(nounPosn + 1, p.find("}", nounPosn));&lt;br /&gt;    }&lt;br /&gt;    else&lt;br /&gt;    {&lt;br /&gt;      // No noun&lt;br /&gt;      verb = p.substring(VERB_OFFSET);&lt;br /&gt;      noun = "";&lt;br /&gt;    }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;    if ( verb.length() &gt; MAX_VERB_LENGTH )&lt;br /&gt;      continue;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;    // Stop execution on the first pair we can't process&lt;br /&gt;    if ( ! process(verb, noun) )&lt;br /&gt;      break;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;    index(verbs, verb);&lt;br /&gt;    index(nouns, noun);&lt;br /&gt;    associate(verb, noun);&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;And some of the reasoning...&lt;br /&gt;&lt;br /&gt;&lt;div class='code'&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  string p = "";&lt;br /&gt;  static const char* VERB_PREFIX = "verb=";&lt;br /&gt;  static const int VERB_OFFSET = sizeof(VERB_PREFIX);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;i style='color:green'&gt;I believe in naming constant values, and naming them generously; often the name you give a constant can help explain *why* that particular constant too.&lt;/i&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  static const int MAX_VERB_LENGTH = 10;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;i style='color:green'&gt;The original code simply said "if length &gt; 10" without explaining why. Now we know it is a constraint. &lt;/i&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  while ( fetchInput(handle, p) )&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;i style='color:green'&gt;We can create an inlined wrapped for the original fetch &amp; assign process and seperate testing for errors for testing for any input. The original code couldn't handle blank lines because the 'getNextInput' routine had started removing end-of-line characters.&lt;/i&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    // Ignore lines not starting with "verb="&lt;br /&gt;    if ( p.find(VERB_PREFIX) != 0 )&lt;br /&gt;      continue;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;i style='color:green'&gt;A comment seems apropriate here because on the left hand of the equal sign we're dealing with strings while on the right hand side we switch into numberland. 0 is really an enumeration here that means "start of string". But you could easily be expecting a pointer, or a fancy test like "!= p.begin()"&lt;/i&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;      noun = p.substring(nounPosn + 1, p.find("}", nounPosn));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;i style='color:green'&gt;I included this to demonstrate that I don't suggest all function-calls-as-arguments are evil. It so happens that if there is no "}" at the end of the noun, find will return the length of the string, which substring will take to mean "include to end of string" - behavior we want. The fact that I'm writing this paragraph tends to indicate I should probably have had a comment tho :)&lt;/i&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    if ( verb.length() &gt; MAX_VERB_LENGTH )&lt;br /&gt;      continue;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;i style='color:green'&gt;By using a named constant instead of just "10", you know why as well as what this line does now.&lt;/i&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    // Stop execution on the first pair we can't process&lt;br /&gt;    if ( ! process(verb, noun) )&lt;br /&gt;      break;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;i style='color:green'&gt;Given there was ambiguity here, indeed a bug that had to be fixed, introducing a comment ensured that if the author returned to this code under duress, he will have a guide to avoid him reverting to his previous faulty thinking ;) Plus it now says what it means: if not [able to] process verb and noun then stop.&lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Some lines have dissapeared entirely, having proven to be redundant (e.g. no code checking for "section", because if the line starts with "verb=" it can't be a section line).&lt;br /&gt;&lt;br /&gt;And finally I whittled it down to this&lt;br /&gt;&lt;br /&gt;&lt;div id="code3"&gt;&lt;a href="javascript:reveal('code3')"&gt;Show final code&lt;/a&gt;&lt;div class="code" style="visibility:hidden;display:none"&gt;&lt;pre&gt;&lt;br /&gt;  while ( fetchInput(handle, p) )&lt;br /&gt;  {&lt;br /&gt;    string verb = "";&lt;br /&gt;    string noun = "";&lt;br /&gt;&amp;nbsp;&lt;br /&gt;    if ( !getVerb(p, verb) )&lt;br /&gt;      continue;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;    getNoun(p, verb);&lt;br /&gt;&amp;nbsp;&lt;br /&gt;    if ( !process(verb, noun) )&lt;br /&gt;      break ;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;    indexAndAssociate(verb, noun) ;&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Each function is effectively a tiny, named, code fragment. Each of the functions is inlineable so that the optimized version of the code doesn't lose efficiency through function calling. But in reading and debugging the code is far better organized and more readable.&lt;br /&gt;&lt;br /&gt;The downside, from some developers perspective, is that you can end up jumping around between functions more easily. But I find that its much easier to locate an effect or operation.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In conclusion...&lt;br /&gt;&lt;br /&gt;Somewhere in my late teens I shook off the perception that "great" programs have cool bells and whistles and really sexy code. Cool programs have predictable functionality, specifically they do exactly what it says on the box, and more crucially exactly what the programmer meant for it to do.&lt;br /&gt;&lt;br /&gt;Along the way I've met some very smart people who had amazing talents for writing bug free code. And I don't mean eventually or by committee. I can name three coders I've had the privelige to work with whom, when their code doesn't work first time, would be entirely justified in starting out by checking someone *elses* code for undefined behaviors.&lt;br /&gt;&lt;br /&gt;I'm still on the path to bug-free enlightenment, but over the years I've coupled what I learned from other coders and from studying where bugs tend to crop up in code, other's and my own, as well as when they tend *not* to crop up.&lt;br /&gt;&lt;br /&gt;For all my waffle the real advice is this: Be methodical. A more verbose or laborious approach will help you to type what you mean't rather than what you were thinking at the time the keys were pressed. Weight your efforts in favor of getting it right first time because when code doesn't work it can prove hard to reverse engineer. It can take valuable time to figure out that "FFA4" is hex for -92 which is caused by mistyping "4096" as "4-96".&lt;br /&gt;&lt;br /&gt;Your programs will only ever do &lt;i&gt;exactly&lt;/i&gt; what you intend for them to if you tell them exactly how to do that. And your code will only ever &lt;i&gt;magically&lt;/i&gt; explain itself to anyone if &lt;i&gt;you&lt;/i&gt; write it that way ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-114326993786146327?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/114326993786146327/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=114326993786146327' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114326993786146327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114326993786146327'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/03/madness-behind-method.html' title='The madness behind the method'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-114323254792713733</id><published>2006-03-24T13:48:00.000-06:00</published><updated>2006-03-24T14:35:48.000-06:00</updated><title type='text'>Coding styles</title><content type='html'>So yes, I put spaces before my semicolons. Code-art blasphemy. I woulda thought so too when I was a Perl grognard creating wonders like the one-liner that took a persons first and last names, transformed them into a &lt;a href="http://www.ripe.net/"&gt;RIPE&lt;/a&gt; WHOIS person object request and fetched (via whois) the existing nic-hdl for that person, registering it if neccessary. Nested s///e abuse - wahoo! I believe it was about 237 characters long.&lt;br /&gt;&lt;br /&gt;I've done a lot of maintenance work on other people's code over the years. For &lt;a href="http://www.demon.net/"&gt;Demon&lt;/a&gt; one of my last tasks was the Y2K compliance of the MMDF code - code which largely contains header files with created dates in the 70s.&lt;br /&gt;&lt;br /&gt;I owe "space semi" to Stephen Poskitt, whom I worked with at &lt;a href="http://www.granada.com/"&gt;Granada TV&lt;/a&gt;. He basically took the "clear whitespace policy" at step further than some folks, but otherwise we had both worked to a fairly similar style already. For simplicity I adopted his style for the duration of the project, but I found that when I did, I started on-the-fly correcting a whole bunch of errors, and with the completed style, I found the code a lot easier to read when reviewing.&lt;br /&gt;&lt;br /&gt;I used to write monolithic functions with multiple statements crammed onto a line, when I was a kid. Heck, my Amiga based MUD language looked like &lt;a href="http://www.kfs.org/oliver/amul/sample/precious/Lang.Txt" target="view"&gt;this&lt;/a&gt; *cringe*.&lt;br /&gt;&lt;br /&gt;Switching to a more verbose, more methodical coding style, with all the whitespaces you can shake a stick at, was part of my conversion in my late teens to writing "good" code. I break my functions down into smaller functions so that the large and complex functions read more like bullet points, so that more code gets re-used, which means more bang for my testing buck (and minute or hour).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-114323254792713733?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/114323254792713733/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=114323254792713733' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114323254792713733'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114323254792713733'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/03/coding-styles.html' title='Coding styles'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-114322923522699912</id><published>2006-03-24T13:32:00.000-06:00</published><updated>2006-03-24T13:40:35.266-06:00</updated><title type='text'>!</title><content type='html'>int main(int f, int ing[])&lt;br /&gt;{&lt;br /&gt;    f%~ing [ (0|0) ? 0^0 : 0x0 ] ; { !!!!!!1 ; }&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-114322923522699912?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/114322923522699912/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=114322923522699912' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114322923522699912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114322923522699912'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/03/blog-post_24.html' title='!'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-114321697948160981</id><published>2006-03-24T10:16:00.000-06:00</published><updated>2006-03-24T10:16:19.556-06:00</updated><title type='text'>; ; ; ; ; !</title><content type='html'>; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-114321697948160981?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/114321697948160981/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=114321697948160981' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114321697948160981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114321697948160981'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/03/blog-post.html' title='; ; ; ; ; !'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-114315482051198731</id><published>2006-03-23T16:10:00.000-06:00</published><updated>2006-03-24T13:46:44.030-06:00</updated><title type='text'>Server Tracked Objects</title><content type='html'>Well, STOs themselves aren't complicated. Standard stuff really. I've got a little class hierachy: base, transport and implementation. The abstraction means that Rick/Martini get to stay a step or two away from the evil that is teulKit, but I don't have to write a new set of callback routines for each and every STO. It probably costs a little efficiency, but I've bought plenty of that :) And I've added plentiful hooks for monitoring these things.&lt;br /&gt;&lt;br /&gt;First up will likely be smoke and mobile spawns. What's that face for? Smoke is a good test of some fundamentals, lets us make smoke work somewhat better, and I hope eventually lets us add &lt;u title="I can see Gophur shaking his head furiously: that'd mean adding smoke emitters to all the tank models - BAH"&gt;smoke to tanks&lt;/u&gt;. We want to increase the number of mobile spawns significantly, so we want to let you despawn your deployed MSP truck and have it replaced with an &lt;u title="Which will look like the truck you just despawned; yes it will be killable; yes there will be rules to stop them lasting forever; no you can't move it once its there"&gt;MSP object&lt;/u&gt;.&lt;br /&gt;&lt;br /&gt;And once both those are working, they have natural follow-ons. As I've been writing the &lt;u title="STO_Oriented, STO_Timed, STO_Fired"&gt;transport classes&lt;/u&gt; it's been cool seeing how close the code is to what we need for a whole bunch of stuff.&lt;br /&gt;&lt;br /&gt;The tricky part is integration to an existing, complex system. I was going to do this on the cell hosts. Seemingly the "right" place for it tho is probably on the map/mission host, but players transfer to/from that when they despawn/spawn, and I've not had sufficient opportunity to sit down and break that disconnection.&lt;br /&gt;&lt;br /&gt;And ultimately I want to replace our current world "grid" system, &lt;i&gt;&lt;b&gt;edit:&lt;/b&gt; an overhaul for&lt;/i&gt; which the area chat system was actually a basis for. The current system is frighteningly over-complicated by the fact its design screams "write me in object-oriented C++", but instead it was written in "no, we shall not use classes, even if you threaten to scare us! C". It has complex, unexplained, lines of code like this:&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;pre&gt;&lt;br /&gt;  FAST_POSITION fast;&lt;br /&gt;  fast.x=((raw.X - FAST_OFFSET_X*100 + &lt;u title='Nobody knows the secret of 87332, but it it isnt going to matter...'&gt;87732&lt;/u&gt;) / 100)&lt;br /&gt;          &gt;&gt;WIDTH_ADJUSTMENT_LEVEL;&lt;br /&gt;  fast.y=(THEATRE_MAX_X*1600);&lt;br /&gt;  if (fast.x &gt; fast.y)&lt;br /&gt;    &lt;i&gt;.. some error about out of bounds ..&lt;/i&gt;&lt;br /&gt;  fast.y=((raw.Y - FAST_OFFSET_Y*100 + THEATRE_&lt;u title='Yes, MAX is correct'&gt;MAX&lt;/u&gt;_Y)/100)&lt;br /&gt;          &gt;&gt;WIDTH_ADJUSTMENT_LEVEL;&lt;br /&gt;  fast.x=(THEATRE_&lt;u title='Yes, our MIN Y is the larger value'&gt;MIN&lt;/u&gt;_Y*1600);&lt;br /&gt;  if (fast.y &gt; fast.x)&lt;br /&gt;    &lt;i&gt;.. some error about out of bounds ..&lt;/i&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Hum. Ok.&lt;br /&gt;&lt;br /&gt;"WIDTH_ADJUSTMENT_LEVEL" is 4, so "&lt;u title='Shift right four bits'&gt;&gt;&gt; 4&lt;/u&gt;" is a very fast integral "divide by 16", some of the rest begins to make sense. That * 1600 is probably supposed to be divide by 1600.&lt;br /&gt;&lt;br /&gt;After a while going through defines, looking at numbers, typing stuff into calc, I came to the conclusion this code doesn't work. And lo. It's &lt;i&gt;called&lt;/i&gt; the same thing as the real function, its defined in three different files, but through the magic of compilation, it actually turns out that it uses a different function entirely:&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;pre&gt;&lt;br /&gt;  // Convert from cm to 16m units&lt;br /&gt;  x = raw.X / RAW_TO_GRID_RATIO ;&lt;br /&gt;  y = raw.Y / RAW_TO_FAST_RATIO ;&lt;br /&gt;&lt;br /&gt;  x -= GRID_X_OFFSET ;  // Zero-based from left edge of map&lt;br /&gt;  y -= GRID_Y_OFFSET ;  // Zero-based from top edge of map&lt;br /&gt;&lt;br /&gt;  // x and y are unsigned so if they go negative they become very large&lt;br /&gt;  if ( fast.x &gt; GRID_WIDTH || fast.y &gt; GRID_HEIGHT )&lt;br /&gt;    &lt;i&gt;.. error ..&lt;/i&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The sharp eyed will notice something about the syntax of the second bit of code ;)&lt;br /&gt;&lt;br /&gt;Where'd the shifting stuff go? Well, "&gt;&gt; 4" is a fast divide by 16. But since we're dividing by 100 to get from cm to m anyway, we might as well go ahead and divide by 1600 which is what "(X / 100) &gt;&gt; 4" amounts to.&lt;br /&gt;&lt;br /&gt;Well, for now I'm going to overcome the obstacle of surgery-on-the-old grid system by bypassing it entirely.&lt;br /&gt;&lt;br /&gt;No, there isn't going to be an separate, dedicated ordnance server, but there will be a server that handles ordnance.&lt;br /&gt;&lt;br /&gt;Tossers ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-114315482051198731?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/114315482051198731/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=114315482051198731' title='16 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114315482051198731'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114315482051198731'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/03/server-tracked-objects.html' title='Server Tracked Objects'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>16</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-114283590712276681</id><published>2006-03-20T00:04:00.000-06:00</published><updated>2006-03-20T00:25:07.160-06:00</updated><title type='text'>Oh, Hello</title><content type='html'>My last couple of entries got left as drafts. Too introspective. My coding brain has been locked in a busy loop working on a number of problems (yes, including the chat crash). Killer's decided its time for server tracked objects, and that means I have to tackle an area of code I've frankly been avoiding.&lt;br /&gt;&lt;br /&gt;I've parked the bandwidth checking code; having researched it, I don't want to send junk data for the test. When I have time and courage to attack the teulKit API I'll be able to get the data I need from the initial spam of data the host has to send you anyway. I can always pad that data out to help make the test viable. Naturally then I'd have the bandwidth data available on an ongoing basis, which lends itself beautiful to the sort of dynamic update system that our current update system doesn't lend itself to at all. We use a load-based distribution of players across hosts rather than a geographical distribution. That's going to come into direct conflict with a system of variable update rates. Bah.&lt;br /&gt;&lt;br /&gt;Spent the weekend mostly working on trying to find some of the kinks in the update system, e.g. the cause of some of the blinking, and trying to find ways to squeeze a few more visible players out of the system without insane bandwidth increases. I think I've come up with a good set that will allow us to nearly double the vis limit for players with 100kbps+ connections (i.e. broadband). It'll use nearly 92kbps *just* for the updates. I don't wanna push it up above that otherwise recovery becomes problematic. I can get another 10-18 players in under 52kbps.&lt;br /&gt;&lt;br /&gt;Also just got done reading a book Bloo loaned me, Vernor Vinge's &lt;a href="http://www.amazon.com/gp/product/1857981472"&gt;Across Realtime&lt;/a&gt;. Excellent book. Had a little struggle getting into it at first when I was reading the e-book version, but it's a real page turner.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-114283590712276681?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/114283590712276681/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=114283590712276681' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114283590712276681'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114283590712276681'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/03/oh-hello.html' title='Oh, Hello'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-114240442590371628</id><published>2006-03-14T23:11:00.000-06:00</published><updated>2006-03-15T00:33:45.970-06:00</updated><title type='text'>Long live the intermission</title><content type='html'>Usually its the map reset I hate - because setting up the intermission is a hassle. This one wasn't any of the usual hassle, although I think we are looking to better convey the &lt;i&gt;intent&lt;/i&gt; to the players next time. We also need to make sure that some of the objective placement is automatic. There were 8 objective towns, and the idea was to fight over those with paras, not to try and prevent fighting there. Not an obvious conclusion unless it's spelled out.&lt;br /&gt;&lt;br /&gt;I'm hoping that by the end of the week I might be able to bump the number of update packets we send you up from 6 packets a second to 8. That's 36.8kbps *just* of updates for "low" vis, 69kbps for high vis. But since we're sending more updates more frequently, I can probably afford to maybe increase the vis limit a little too.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-114240442590371628?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/114240442590371628/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=114240442590371628' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114240442590371628'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114240442590371628'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/03/long-live-intermission.html' title='Long live the intermission'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-114221340269268801</id><published>2006-03-12T19:21:00.000-06:00</published><updated>2006-03-12T19:30:02.740-06:00</updated><title type='text'>Intermission...</title><content type='html'>Well, the toolset all worked perfectly, and the intermission went in without a hitch. While I was waiting on Gophur I coded up a solution to one of the few lingering intermissions (rare equipment deployments - freighters etc) so that'll be in QA for the next intermission.&lt;br /&gt;&lt;br /&gt;The trouble with intermissions is that &lt;i&gt;someone&lt;/i&gt; is going to miss whatever we leave out. I think this was a good call. Yeah, I know plenty of you hate it. But it's a chance to try different things, to try tactics that might not work under regular conditions, do things a little differently, hang out with some different people, maybe even play the other side.&lt;br /&gt;&lt;br /&gt;I found it to be fairly good fun - I got a friend to haul myself and another bofors up north of Oostmalle, and chaos was wreaked :)&lt;br /&gt;&lt;br /&gt;Flew a few C47 and Ju52 sorties, jumped out of French, British and German planes, did some glider runs, and generally had a giggle.&lt;br /&gt;&lt;br /&gt;Actually, so much so that I neglected to get around to doing my UDP backchannel thing. Guess I'll do that next weekend :) Need to work on &lt;u title='Tables and Order of Equipment: Brigade spawn lists instead of CP spawn lists'&gt;TOE&lt;/u&gt;s.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-114221340269268801?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/114221340269268801/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=114221340269268801' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114221340269268801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114221340269268801'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/03/intermission.html' title='Intermission...'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-114214512560282529</id><published>2006-03-12T00:15:00.000-06:00</published><updated>2006-03-12T01:17:37.763-06:00</updated><title type='text'>I meant to reply to this...</title><content type='html'>&lt;div class='quote'&gt;CHJam wrote:&lt;br /&gt;&lt;i&gt;I inferred that you think '&lt;u title='Name changed so as not to further offend horse. DOH! :)'&gt;Joe&lt;/u&gt;' or folks who come from his perspective are pretty stupid and then you suggest later on you were pretty much just like him, lol?&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;If I think '&lt;u title='Or horse...'&gt;Joe&lt;/u&gt;' is stupid, then I'd have to suggest I'm &lt;i&gt;still&lt;/i&gt; very much like him - but I don't :)&lt;br /&gt;&lt;br /&gt;This is &lt;i&gt;my &lt;b&gt;blog&lt;/b&gt;&lt;/i&gt;. '&lt;u title='By which I mean horse, mkay'&gt;Joe&lt;/u&gt;' copped it a little back there because I'd posted on a forumy sort of topic, but I felt his dialogue was firmly locked in the forums. Preaching you the company line is work - if I wanna do that, you'll see me in the forums, tyvm.&lt;br /&gt;&lt;br /&gt;I also err on the side of rudeness here. I consider it a sort of filter. If my &lt;u title='or pretentiousness'&gt;conveyance&lt;/u&gt; bothers you, then it'd be best all round if &lt;u title='Not *YOU* personaly, CHJam :)'&gt;you&lt;/u&gt; buggered off to the forums and talked to "CRS" officialy there, because I'm a programmer, not a CS rep.&lt;br /&gt;&lt;br /&gt;Hey, who am &lt;a href="http://ww2.kfs.org/bald.jpg"&gt;*I*&lt;/a&gt; to call anyone's intelligence into question? :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-114214512560282529?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/114214512560282529/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=114214512560282529' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114214512560282529'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114214512560282529'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/03/i-meant-to-reply-to-this.html' title='I meant to reply to this...'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-114213807250185323</id><published>2006-03-11T21:02:00.000-06:00</published><updated>2006-03-11T22:34:32.563-06:00</updated><title type='text'>Low, Medium, High</title><content type='html'>Downloaded Microsoft's free &lt;a href="http://msdn.microsoft.com/vstudio/express/"&gt;Visual Studio Express&lt;/a&gt; so I have a C++ compiler on my home windows box, and to see whats new in the latest version.&lt;br /&gt;&lt;br /&gt;So I decided to play with something non-essential but useful. So I've been putting together the code for &lt;u title='I dont care about knowing your exact bandwidth, only one of three levels'&gt;guestimating&lt;/u&gt; your bandwidth. After the client connects to the hosts, before data starts flowing, before the client starts churning the disk, it'll do its little bandwidth test. For most players it shouldn't add more than a second or so to the connection startup. For the eleven players that connect at &lt;i&gt;less than 36.6kbps&lt;/i&gt; - you'd probably still be able to play on the training server, although it'd takes you an extra 10-30 seconds to connect to the host.&lt;br /&gt;&lt;br /&gt;I kinda decided if I was going to do this, I'd do it properly, with little touches like populating the packets with data that's neither random nor going to be easily compressed by a modem. Nyeah.&lt;br /&gt;&lt;br /&gt;Nicely split up into 6 files (2 client, 2 shared, 2 host). Kinda an interesting challenge. Our network API has some sort of throughput performance counters, but an example of the comments in that part of the source is this:&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;pre&gt;        // Oh&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;And it does sort of seem to not work. Without reading through all of the code related to it (much of which I believe is never compiled), I can't really tell what it thinks it &lt;i&gt;does&lt;/i&gt; do when it works.&lt;br /&gt;&lt;br /&gt;So - back to writing my own bandwidth guestimator. Had the basics of the code layout, but it did kinda look like something someone had written at home ;) So I sat and played with the cat for a half hour and the old hind-brain had its little epiphany, after which the code more or less wrote itself.&lt;br /&gt;&lt;br /&gt;My plan is to get the code into the host and client, get it QAed, and then run it in logging mode for a while so I can check my figures before unleashing it on the general public.&lt;br /&gt;&lt;br /&gt;Tomorrow I'm gonna add a UDP backchannel to the cell host connections (teulKit does this semi transparently); then if you have capacity for them and are keeping up with updates, instead of limiting your vis list updates based on single packet size, I'll "spill over" into a second packet -- 150-576 bytes for MID bandwidth and 80-1078 bytes for HIGH (the lower limits are to eliminate diminishing returns).&lt;br /&gt;&lt;br /&gt;If you have a good connection, this would essentially double+ the rate you receive updates :) I very much doubt it'll make 1.23, and I'd not hold my breath for seeing it in the 1.24 readme :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-114213807250185323?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/114213807250185323/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=114213807250185323' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114213807250185323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114213807250185323'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/03/low-medium-high.html' title='Low, Medium, High'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-114206803869090788</id><published>2006-03-11T02:40:00.000-06:00</published><updated>2006-03-11T03:07:18.733-06:00</updated><title type='text'>Good, Bad, Cool</title><content type='html'>Good: I was rather impressed with tonight's SG1; I'd been losing the faith since the big cast change at the start of this season, and I was sort of expecting the ending - contract renewals clearly on the table.&lt;br /&gt;&lt;br /&gt;Bad: Stargate Atlantis. Hmm. Perhaps not written by someone who's watched the series? Or written by the guy responsible for writing Ronan. He usually makes two non "background" appearances in each show. One in which he speaks, possibly a sentence. One in which he points a gun at someone. He may also make a small appearance looking displeased at some point, in a completely uneccessary way. More often than not his appearances are used as a crutch for Tayla's presence in some way.&lt;br /&gt;&lt;br /&gt;I think they suffer from over-crowding, I find that it feels like even the main characters - aside from Dr McKay - all feel like bit parts. They give everyone a few lines so you don't *really* get to see the actual story of a character - aside from Dr McKay.&lt;br /&gt;&lt;br /&gt;Given the build up of calamites over the last few weeks, you'd expect tensions to be high, not the "Hey, these guys are the stop-at-nothing human slaughtering bad guys, turn on the network firewall but lets give their them benefit of the doubt". And what a lousy excuse for an ending =( Part of Stargate's success is the huge, plentiful explosions. First image that comes to my mind when I think of Stargate usually has an explosion in it -- like when Tilc shoots down the huge ship with his staff-weapon cannon thingy :)&lt;br /&gt;&lt;br /&gt;Cool: Battlestar Galactica. Probably the ending was predictable for some, but the story carried me enough that I didn't see it coming. And at the end there - they have some very talented makeup artists :) Although that mustache is going to be unforgettable. Every serious and critical scene he has, the ghost of that mustache will be there twitching along the top of his lip... ;)&lt;br /&gt;&lt;br /&gt;I can't believe we're back in Sci-Fi limbo until July now. Dr Who doesn't count. If you thought the previous series were cheap, at least the former Whos were made by the full might of the BBC. Who 2005 is the work of BBC Wales. Wales is a "country" about the size of Dallas, but with a lot more sheep and a lot less flat. The show is quite good if you allow for that, but I don't want to allow for Land'O'Leeks, I wanna kick ass sci-fi show about The Doctor. DAMN YOU WELCHIES *waves fist in mock rage*&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-114206803869090788?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/114206803869090788/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=114206803869090788' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114206803869090788'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114206803869090788'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/03/good-bad-cool.html' title='Good, Bad, Cool'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-114198416233570456</id><published>2006-03-10T02:55:00.000-06:00</published><updated>2006-03-10T03:49:22.373-06:00</updated><title type='text'>Dusseldorf...</title><content type='html'>The Germans aren't ready to roll over for the Allies, eh? Are the Allies going to take that lying down or are they going to brace themselves for a difficult last mile? As you push the losing side into a corner, their "front" becomes smaller and it becomes easier for them to rally defenses -- if they're still fighting, and it seems like the Axis still are.&lt;br /&gt;&lt;br /&gt;I couldn't find a good fight anywhere tonight, it really sucked. I kept spawning in to crappy missions like an AF camp that was the only MSP the axis had going. I don't do teamspeak or tune to any of the numbered channels, because I know about 50-60% of our players don't either. Which means I largely wind up playing in the dark. Neither side of the HC likes to brave the seething tide of "helpful" opinion they can elicit by trying to keep the players appraised - we need some stuff in place to try and bear the load of that and help them disseminate info better.&lt;br /&gt;&lt;br /&gt;Then I saw the caps starting in Dusseldorf and went there. At first it looked hopeless, because the Axis players were spread out everywhere thanks to countless "noddy" missions, they also had a much faster turnover of players (bored, logging) dropping them severely. But Dus is a big place and sure enough the troops started to arrive.&lt;br /&gt;&lt;br /&gt;The Allies tried to make short work of it, and they had the south AB fairly rapidly. I wound up on sorvete3's mission from the Duss-Vohwinkel Depot. Just south of there is the huge German Production Facility #2 complex, which the Allies had captured, and south of that the South AB. I'm pretty sure the Brits got some MSPs going in there, because between PF2 and our depot there's a large square with various little berms and hillocks in it, and the place was crawling with infantry. Shots ringing out in every direction.&lt;br /&gt;&lt;br /&gt;I linked up with berzerkr and we managed to work our way down to PF2, capture it, take out some ei. He headed off to the SAB but as I started to join him up walked a trooper and I hesitated a moment too long, thinking it was bezerkr, only to realize he was wearing a brown uniform ;)&lt;br /&gt;&lt;br /&gt;For a good couple of hours we fought back and forth taking the square, advacing to the factory, and then being pushed back. Night fell, and for a while we had the upper hand, but then a brit managed to capture our mission's depot, which stemmed the tide of our troops sailing into the square, the Brits lost interest and headed off east, and the remainder of us snuck quietly down to the south ab.&lt;br /&gt;&lt;br /&gt;Naturally as soon as we poked our heads over the top of the rubble pile overlooking bullets headed our way. The first one taking me out solidly - my ruined corpse sprawled on its back several feet from where I'd been crouching as the camera panned out.&lt;br /&gt;&lt;br /&gt;Taking the south AB was not easy, but berzerkr made it in and captured it, only to die a few moments later. I raced towards the bunker, only to find an enemy trooper nervous as hell, scoping out the bunker, I quietly crept up behind him, and savagely knifed him to death. RAR :)&lt;br /&gt;&lt;br /&gt;I'd spawned a sapper, I had 3 rounds left in my rifle, and a bloomin' armybase to defend. I headed inside and hid. Shortly after sorvete3 arrived to assist, and moments later in ran an enemy high commander. L33t was my hiding, so I was able to follow him to the table and shot him in the back. I suspect that was you, Tomba, sorry mate :)&lt;br /&gt;&lt;br /&gt;Now we had 8 nerve-racking minutes holed up in the bunker, just the two of us. Its easy to lose track of time, so we were still sweating it out when we realized that guy number 3 who'd recently joined us had spawned in from the AB. We had supply!&lt;br /&gt;&lt;br /&gt;As a few more guys trundled into the bunker, I despawned and grabbed a sapper. Building up a fresh spawn list at the SAB would be a major threat to the allied attack, and I suspected tanks.&lt;br /&gt;&lt;br /&gt;And sure enough, even as I ran across the armybase, a crusader 3 rolled in to the AB, just looking far enough to his right not to notice me running into the rubble pile because at about the same time the first axis armor was spawning in the garage. Behind him was another cru3, who got greedy for some of these free spawning kills and rolled out of what would otherwise have been an inconvenient covering position, and right onto the end of my satchel. He rolled to a stop right as it went off, and apparently I know how to sap a crusader 3. The first satchel took him out. Even as he brewed up, a vickers rolled into our AB, and I could see several churchill's approaching. If that Crusader hadn't gotten greedy and stayed in the cover of the 6lber I found back there shortly afterwards, our armor wouldn't have been able to set up in the AB, and we'd have lost it soon after.&lt;br /&gt;&lt;br /&gt;But he got greedy and I got my kill, and our armor managed to spread out a small amount. Unusual and nev403 both managed to get themselves into good positions with crusader and churchil mk3s, and for a long time we weren't sure if the masses of infantry sweeping into the ab were going to overwhelm us.&lt;br /&gt;&lt;br /&gt;I found their mobile spawn east of our armybase, who redeployed. Unfortunately all of his troops simply ran, beeline, towards the AB, so we immediately knew where he was and where to look for easy kills to tip the infantry levels in our favor.&lt;br /&gt;&lt;br /&gt;nev and unusual had pretty much eradicated what little armor we'd been resupplied, and the British troopers were starting to make it into the ab more often. Axis troops were bracing themselves for the worst. And then it came:&lt;br /&gt;&lt;br /&gt;"Allied objective on Dusseldorf has been recalled".&lt;br /&gt;&lt;br /&gt;One of the other ABs had been captured and started to resupply. Great way to end the night and log. So many battles, awesome fun, and best of all was that I frequently found I was working with other guys/had guys working with me, covering each others backs, but it also seemed like the guys we were shooting at weren't just rambos either.&lt;br /&gt;&lt;br /&gt;Now not everyone wants that kind of battle all the time. It's draining. But we really need to make it so that you don't have to spend your night *hunting* for that kind of fight through a series of "fights" that ought really to be called "parades". I think we make a lot of information available to you, so that if you're willing to sit down and study the map, read the chat logs, ask questions, then you can probably find your way to a good fight in a few attempts.&lt;br /&gt;&lt;br /&gt;We've discussed a "fast action" button concept in the past, which I've always thought was awful: you'd just spawn in blind with no idea what was going on. Exactly what happens when people follow the mobile spawn icon blinding. Oh, FB mission? Well there goes an LMG. Oh, AF camp? What a waste of time. &lt;br /&gt;&lt;br /&gt;We have players who like to look at things like Orbats and brigade lists. But most people just want a quick way to flick through the fights with some sort of guide or indicator as to which fight might be a good fight.&lt;br /&gt;&lt;br /&gt;The lowest common denominator has to be "show me a fight with a good chunk of people, some stuff changing hands, shots fired, and my side could use a few more people but isn't totally outnumbered".&lt;br /&gt;&lt;br /&gt;Start with that, gimme a tab to let me see the list view, but otherwise show me a full-screen map, with some "objective" info about what I'm currently seeing, and give me back/next buttons to cycle through the current battles. I shouldn't have to find by scrolling the map around, nor should I have to find by going through some otherwise meaningless list of brigade names.&lt;br /&gt;&lt;br /&gt;Maybe that sounds like doing the same thing a different way to you, and irrelevant distinction? Let me ask you -- how often do you use your browsers "back" button or the backspace key instead of scrolling to the top/bottom of a page and clicking the "Up" or "Back" or "Top" &lt;i&gt;link&lt;/i&gt;?&lt;br /&gt;&lt;br /&gt;When you're channel surfing - how often do you thumb thru the channels with the up/down arrows rather than typing in the channel number if its only one or two channels away?&lt;br /&gt;&lt;br /&gt;I think its a subtle but essential difference. Clicking down thru the brigade list is a manual process and it invovles not just clicking but repositioning the mouse. It is two distinct tasks - clicking on brigades, and looking at what they do.&lt;br /&gt;&lt;br /&gt;When you can place the mouse over a single button and click it repeatedly to quickly cycle through an ordered-by-likely-common-interest list of the battles, with only information pertinent to what you are viewing on the screen, it doesn't seem like two tasks.&lt;br /&gt;&lt;br /&gt;I hope after some more feature patches we'll be in a position to spend some time/money on ironing out the few wrinkles in the UI which continue to make it difficult to get at the awesome gameplay lurking in the dark recesses of Europe, 1940...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-114198416233570456?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/114198416233570456/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=114198416233570456' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114198416233570456'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114198416233570456'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/03/dusseldorf.html' title='Dusseldorf...'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-114190156856185426</id><published>2006-03-09T04:16:00.000-06:00</published><updated>2006-03-09T04:52:48.596-06:00</updated><title type='text'>Time for a new laptop</title><content type='html'>This one is getting old and clunky. It's 5 years old. I could probably get a lot from replacing the battery. I hate shopping for laptops =/ I use the laptop for browsing, and working on code. I don't plan to run the game on it, although that'd be a plus. What I really want is a laptop that will go from off to useable in as little time as possible. I hate sitting around waiting while a laptop starts up. And something that'll give me a decent amount of battery life. 14-15in screen. Wireless. A bit of ruggedness wouldn't be bad, this one has taken a few knocks. Bit of memory wouldn't hurt (512mb?)&lt;br /&gt;&lt;br /&gt;The current 'top is a 600Mhz Inspiron 5000e which has treated me rather well. It gets a bit hot, but aside from feeling incredibly slow compared to my desktop pc doing just rudimentary web stuff, the only real reason I'm moving on is its tendency to power-off spontaneously and the fact that the battery is down to about 3 seconds of battery time =/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-114190156856185426?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/114190156856185426/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=114190156856185426' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114190156856185426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114190156856185426'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/03/time-for-new-laptop.html' title='Time for a new laptop'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-114189311447765535</id><published>2006-03-09T01:40:00.000-06:00</published><updated>2006-03-11T23:46:59.053-06:00</updated><title type='text'>The blindspot that got me here</title><content type='html'>I have this vivid memory from when I was a very young kid, holding a pencil mesmerized as I rotated it, turned it, moved my eye back and forth along it, and realizing that the world wasn't flat, we just see it that way, and some sense that it could be described, which didn't make sense until I discovered computers.&lt;br /&gt;&lt;br /&gt;Growing up the other kids I knew who played games couldn't understand how quickly I lost interest or failed to gain it in most games. &lt;a href="http://www.british-legends.com/"&gt;MUD&lt;/a&gt; and some online games on C=Net hooked my interest for a while, but the first games that I really sank my teeth into were &lt;a href="http://www.frontier.co.uk/"&gt;Elit&lt;/a&gt; and Paul Woakes' &lt;a href="http://mercenarysite.free.fr/merce.htm"&gt;Mercenary&lt;/a&gt; games. Actually, I'd often spend time just looking at the 3D.&lt;br /&gt;&lt;br /&gt;Every time I'd look at a 3D game, or rotating some 3d object in real space would sink me into a mesmerized buzz, a light bulb would come on. But alas. Instead of thinking "Hey, I should look into and understand this", I was also bedazzled by the possibilities of programming generally, so I only got as far as looking &lt;i&gt;a&lt;/i&gt; the 3D... ;)&lt;br /&gt;&lt;br /&gt;I think I figured I'd learn to do graphics later on. And I built up a good, solid hero-worship for guys who do graphical stuff.&lt;br /&gt;&lt;br /&gt;I occasionally tried to dabble with programming, but it always wound up requiring me to do something like resort to "Basic" or something. The manuals explaining higher level drawing functions and systems have &lt;i&gt;always&lt;/i&gt; totally blown me away with their jargon and terminology. And it so often seemed to be inconsistent. Rasters, viewports, scans, blits, blah, fnar, frufru, yadda, etc.&lt;br /&gt;&lt;br /&gt;Sometimes I gave it a try... I met &lt;a href="http://www.llamasoft.co.uk/"&gt;Jeff Minter&lt;/a&gt; at an Atari show and he was pretty rude to me. When I saw what had floated his ego, &lt;a href="http://www.llamasoft.co.uk/colourspace.php"&gt;Colourspace&lt;/a&gt;, I almost fell about laughing. I knew that even I could probably pull that off. So I wrote "Monospace" in Atari basic, and sent it in to a magazine, who happily published it as their first ever program listing. (Atari User? I don't recall the name. I got 70 quid for it). I rewrote it in assembler and made it a little more fancy, and much to my chagrin instead of showing what a crock it was my game-pal, Simon, got hooked on it. *grumble*&lt;br /&gt;&lt;br /&gt;Later on I was celebrating with some friends after, for the second time, getting some of my code accepted into a commercial operating system. The first had been some modules for &lt;a href='http://www.thoroughbredsoftware.com/'&gt;Thoroughbred Basic&lt;/a&gt; or more precisely their IDOL-IV development IDE. This time I'd written a bunch of &lt;u title='Inter-Process Communication'&gt;IPC tools&lt;/u&gt; for the motorola-based "MIRAGE" operating systems that was relatively widely used in hospitals and robotic control systems. This included what I would later discover were called "mutexes" and "semaphores". And the "sample" app to demonstrate the stuff was a multi-user chat application that &lt;u title='Yeah, it sounds like Unix chat which I hadnt seen at that time'&gt;split the display into "windows" (text regions)&lt;/u&gt;.&lt;br /&gt;&lt;br /&gt;I was running a BBS at the time, "The Alien BBS", and one of my buddies was looking to make a demo on the Amiga, so at my little celebration he asked me if I'd like to be part of his demo. I'd dabbled with a little wireframe 3d engine on the Atari ST, but it was pretty raw - i.e. pretty lousy, managing about 2-3 frames a second, heh.&lt;br /&gt;&lt;br /&gt;The code was in assembler so I ported it to the Amiga and made some optimizations. I could probably have quadrupled the frame rate by using polygons instead of point-pairs to describe the shapes. Bah.&lt;br /&gt;&lt;br /&gt;The demo consisted of "The Aliens" in a box in Wire3d rotating and animating a little, while playing a rendition of blue monday I'd knocked up in Soundtracker.&lt;br /&gt;&lt;br /&gt;This cemented my conviction that I am not a graphics programmer.&lt;br /&gt;&lt;br /&gt;Connecting computers, and people via them, was what drove me to learn as much about programming and development as I could. But I developed a near fear of any kind of "graphical" programming that drove me to focus on my network and systems coding, that set me on the path that got me here.&lt;br /&gt;&lt;br /&gt;And why do I waste your precious time with this? Meh. Actually, I'm really writing this for myself, but there was a reason.&lt;br /&gt;&lt;br /&gt;When NCSA Mosaic came out I was working for an ISP. I've always been good at pulling, manipulating and massging data. But presentation beyond the merely textual was always scary to me because I &lt;i&gt;drawing lines is hard&lt;/i&gt;. Boxes make me hyperventilate. But HTML is something I understand - its a data massager.&lt;br /&gt;&lt;br /&gt;At CRS I've slowly been developing various tools. Unfortunately theres very little consistency to them because they're somewhat homogenous. Whenever I need a new tool, I just create it on the fly.&lt;br /&gt;&lt;br /&gt;&lt;div class='code'&gt;&lt;pre&gt;&lt;small&gt;&lt;br /&gt;&amp;lt;playnet-page title="Gophurs Decal Test" db-based="true"&gt;&lt;br /&gt;&amp;lt;if sizeof="form.decal &gt; 0" and="" isanumber="form.decal"&gt;&lt;br /&gt; &amp;lt;sqlquery host="&amp;var.WDB;" query="&lt;br /&gt;    UPDATE wwii_player&lt;br /&gt;       SET player_decal = '&amp;form.decal:mysql;'&lt;br /&gt;     WHERE callsign = 'gophur'" /&gt;&lt;br /&gt;&amp;lt;/if&gt;&lt;br /&gt;&amp;lt;form method="post" action="&amp;page.path;?DB=&amp;form.DB;"&gt;&lt;br /&gt; &amp;lt;emit source="sql" host="&amp;var.QDB;" query="&lt;br /&gt;    SELECT player_decal&lt;br /&gt;      FROM wwii_player&lt;br /&gt;     WHERE callsign = 'gophur'"&gt;&lt;br /&gt;  Gophur's decal number:&lt;br /&gt;  &amp;lt;input type="text" name="decal"&lt;br /&gt;           value="&amp;sql.player_decal;"&lt;br /&gt;       maxlength="4" size="4"/&gt;&lt;br /&gt; &amp;lt;/emit&gt;&lt;br /&gt; &amp;lt;input type="submit" name="submit" value="Submit"/&gt;&lt;br /&gt;&amp;lt;/form&gt;&lt;br /&gt;&amp;lt;/playnet-page&gt;&lt;br /&gt;&lt;/small&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Generates a page like this &lt;a href="http://ww2.kfs.org/images/html1.png" target="view"&gt;&lt;img src="http://ww2.kfs.org/images/html1_t.jpg"&gt; [view]&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;(I use a combination of &lt;a href="http://www.roxen.com/"&gt;Roxen's&lt;/a&gt; sweet &lt;a href="http://docs.roxen.com/roxen/4.0/index.xml"&gt;RXML&lt;/a&gt; markup-based language, my own RXML tags, written in Pike, and Javascript)&lt;br /&gt;&lt;br /&gt;After a while the tools evolve a little more using javascript libraries I've built up, producing tools like the "&lt;a href="http://ww2.kfs.org/over.html.txt"&gt;Oversupplies Monitor&lt;/a&gt;" &lt;a href="http://ww2.kfs.org/images/html2.png" target="view"&gt;&lt;img src="http://ww2.kfs.org/images/html2_t.jpg"&gt; [view]&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;But all of these tools are tabular, and frankly, they can be a real pain to work with (like &lt;a href="http://ww2.kfs.org/images/html4.png"&gt;this hideous abomination&lt;/a&gt; that poor Doc has to work with). Better than having to do stuff manually, but sometimes not much.&lt;br /&gt;&lt;br /&gt;So as a background task, lately, I've been putting together a little javascript-based toolset that lets me write tools that manipulate data based on a map, particularly because we need one for setting up intermissions. Having gotten the basic direct-from-database map script working I finally presented the gang with the "Intermission Setup Tool" today &lt;a href="http://ww2.kfs.org/images/html3.png" target="view"&gt;&lt;img src="http://ww2.kfs.org/images/html3_t.jpg"&gt; [view]&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;There are a bunch of pros and cons with this tool. It uses &lt;a href="http://developer.mozilla.org/en/docs/AJAX:Getting_Started"&gt;Ajax&lt;/a&gt; to let it pull data live from the servers without adding a heft loading time to the page, it lets you zoom in and out, change ownerships, etc, deploy undeploy brigades. And when you're done, it generates a Lua script to create the setup you've described.&lt;br /&gt;&lt;br /&gt;It's probably something that should be done in Java. But I looked at doing it in Java and it looked awfully like graphics. I had to start drawing stuff and worrying about viewports and what not.&lt;br /&gt;&lt;br /&gt;But doing it in &lt;a href="http://developer.mozilla.org/en/docs/AJAX:Getting_Started"&gt;DOM&lt;/a&gt; and Javascript I could almost block out the fact that I was displaying data in a graphical fashion.&lt;br /&gt;&lt;br /&gt;It's kinda slow drawing the CP because basically each CP marker is a div, and what I do is set the x/y for each div based on the current zoom level, and if they are outside the "window" (viewport, I guess) then I make them invisible.&lt;br /&gt;&lt;br /&gt;&lt;hr/&gt;&lt;br /&gt;&lt;br /&gt;It's cool to finally have this out of the way - I think it should be enough to enable the production team to take over a huge chunk of the setup work for intermissions that was previously done manually (like you couldn't guess).&lt;br /&gt;&lt;br /&gt;Meanwhile the last few weeks I've had a bunch of tasks on the mental back-burner. Which means I've been distracted. Half my brain tied-up doing its own thing analyzing all the various options I've come up with for various problems: ways to increase the number of updates we send per update packet, send more update packets to players with more bandwidth, and ideally, some trying to figure some form of delta compression that will scale to the sorts of numbers of updates and users we are running.&lt;br /&gt;&lt;br /&gt;I had plenty of options on the table, I've pretty much eliminated most of them for one reason or another, and narrowed it down to 3 or 4 possible implementations. I need to gather some more data to decide which of those I want to go with, but then I also still need to design the final implementation, and then create some mockups to performance test. For instance, one optimization I'd love to get in is some caching of the updates we send out. Right now each player we send an update packet gets their own, uniquely-generated set of updates, so under busy conditions the cells are spending a lot of time re-generating the same updates. The cheaper it is to generate an individual update, the more updates per second I can generate.&lt;br /&gt;&lt;br /&gt;The downside to generating more updates is that when someones connection burps or lags even a handful of miliseconds, they're going to get warpage spikes. We still have people playing on sub 36.6k connections for whom that's going to get rough. Thats less than 8 x 576 byte packets every second - and for those guys we need to obey an MTU of 576 bytes to try and avoid fragmentation, which gives us a data size of 522 bytes for a total of 4kb a second. For 64 visible players that's 9 bytes per player per update. 1 byte for id, 2 bytes for x, 2 bytes for y, 2 bytes for z, we've nearly used all 9 bytes, and that's assuming we don't need to send any "management" information. We've still got orientation, velocities, state flags, turrets, etc, etc.&lt;br /&gt;&lt;br /&gt;Obviously we don't send you updates on everyone every update.&lt;br /&gt;&lt;br /&gt;The easiest trick might just be to send you more packets for each update. I can always stop the extra packets if your connection is lagging.&lt;br /&gt;&lt;br /&gt;Making progress with it though, and its really just a matter of analyzing all the data I have and raking in some more and testing which solution is best going to solve which problems and move us how far forward.&lt;br /&gt;&lt;br /&gt;It'd be helpful if I knew how much bandwidth a given client has. I've not really thought about it too hard, but because most people have a router or firewall, the client's machine usually doesn't know. Obviously I could send them a batch of packets and see how long it takes them to receive, but then a lil' lag during login could ruin your connection, and spamming you periodically while you're running around isn't exactly the best of ideas ;) If you wanna throw suggestions in, that's something I'd be happy to have ideas on :)&lt;br /&gt;&lt;br /&gt;Gophur's given me TOEs to look at as a 1.23 feature, although I've still got to figure how we're going to make it possible to change your mission while spawned. The obstacle here is that I need to change how and to which hosts the client connects in a fairly drastic way.&lt;br /&gt;&lt;br /&gt;That's seemed hideously complex until while walking to work this morning I realized I just wasn't making a clean enough break with the old code, which uses a complex redirect system to launch you into the game world. Where actually all I really need to do is dump the old system and replace it with something... Simple :)&lt;br /&gt;&lt;br /&gt;Once I ovecome that particular hurdle I may be able to tackle the mission system - as seen from a player's perspective - pretty drastically: I want you to be able to create missions while spawned, change your mission origin/objective, and switch between missions. You should only need to go back to the UI if a) you die, b) you want to change vehicles, c) you want to change brigade/personas, d) you really want to despawn out for a while.&lt;br /&gt;&lt;br /&gt;Right now the chat host is doing a lot of work the map/mission host does. And I can either ditch the map/mission host or I can reassign workloads. Then it will become practical to implement "brigade OIC" - that is, elected OICs who can lead the brigade when the actual OIC is not online.&lt;br /&gt;&lt;br /&gt;So far its all still theory, and frankly, its kinda daunting knowing where to start; whether I "upgrade" or "replace" code/systems is a big factor.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-114189311447765535?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/114189311447765535/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=114189311447765535' title='20 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114189311447765535'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114189311447765535'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/03/blindspot-that-got-me-here.html' title='The blindspot that got me here'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>20</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-114156179730048936</id><published>2006-03-05T05:40:00.000-06:00</published><updated>2006-03-05T06:30:13.496-06:00</updated><title type='text'>Aachengrad</title><content type='html'>Damn. &lt;i&gt;&lt;b&gt;&lt;font face="Verdana" size="36pt"&gt;What a fight!&lt;/font&gt;&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;I logged in after dinner and looked around the map for heavy &lt;u title='Early Warning System: Icons giving you an idea of how many enemies are in a town'&gt;EWS&lt;/u&gt; and Aachen looked busy. I swapped brigades and there was a hectic list of missions. I spawned in, stepped out of the barracks and promptly pitched my face into the dirt. The attack objective was less than an hour old.&lt;br /&gt;&lt;br /&gt;When I finally logged, the AO was still there but the Axis had just retaken the town. 8 hours and 57 minutes elapsed.&lt;br /&gt;&lt;br /&gt;Aachen CP comprises two towns - Aachen and Kornelimunster. This gives it 4 Armybases and an Airfield.&lt;br /&gt;&lt;br /&gt;The opening offensive was superb, the town looked like a gonner. But for some reason the initial wave of armor all bunched up a block away from the East Armybase. After blowing up 2 tanks, an armored car and the laffy with the rear facing anti tank gun, I felt a bit guilty and left the rest to the sappers crawling out of the wood work every time an Allied tank slowed below 20 mph.&lt;br /&gt;&lt;br /&gt;Around this time the Axis were taking measures based on the assumption the town was lost, and people promptly began setting out from Kornelimunster to try and stave off the seemingly impending closing of the airfield. However, back in Aachen itself the Allied attack was poleaxed by this sapper-massacre.&lt;br /&gt;&lt;br /&gt;The guys at the East Armybase figured they'd just terminated a "10 tanks and 2 guys" attempt to take the town, and set off to re-germanize Aachen. But every time I shot an EI, another one, two or three shot me. The Allies had a slight head count advantage, but the balance in Aachen stayed within 52:48 most of the night barring moments where multiple people despawned.&lt;br /&gt;&lt;br /&gt;The countless players on the ground and on foot in Aachen quickly realized this was a fight, not just shooting "the infantry" who happens to step out of a doorway while you run between flags. Every inch of advance had to be fought for.&lt;br /&gt;&lt;br /&gt;Four hours in, the Allies were more or less holding on to most of Aachen itself, the Axis clinging to the south armybase and Kornelimunster. Through out the fight the Allies managed periodically to gain and even hold the airfield, quite a feat.&lt;br /&gt;&lt;br /&gt;The cool thing about the fight holding out that long is that after about 4.5 hours ... Armor starts to appear again, but because it arrives in trickles now, its a little more interested in infantry support.&lt;br /&gt;&lt;br /&gt;Someone managed to open up some depots and I switched from Kornelimunster up to the Julich depot, to find an A15 Crusader tank patrolling up and down the road. An easy mark, I ran up and stuck a satchel on him. He turned angrily and, presented with another flat surface, I kindly handed him my second gift-wrap. Unfortunately, I have way less practice sapping as Axis than Allied, and I probably did little more than give his gunloader a toothe-ache.&lt;br /&gt;&lt;br /&gt;More tanks arrivd, and a steady stream of infantry. Orindarily in that area it would be a short fight to get an lmg in a good position. But with so many people and the 3-4 allied tanks in such a small area there was no "good position", and a veritable rain of bullets ensued, sprinkled with a generous serving of "waugh"s. (And one char-grilled vicky. Sorry, but that was just the most perfect satchel I've managed - I was only intending to scare you off, but when you heard me you turned your in exactly the wrong direction and by pure chance put your sweet spot directly under where I was placing my charge).&lt;br /&gt;&lt;br /&gt;This Allied second steam rolled across Aachen and it fell. I retreated to Kornelimunster.&lt;br /&gt;&lt;br /&gt;From the airfield it seemed like the fight was cornered. But then something came up and I had to drop out of fighting and switch to buzzard mode. What had seemed like a busy fight for the airfield suddenly spread out below me. There were at least 500-600 people fighting in Aachen. The buzzard-map literally seethed. I watched 30 infantry guys fighting each other for control of the ruins of a church. The allies eventually won thanks to the mobile spawn they had parked across the square, tucked behind a flag building. I watched a giant dance of armor, at guns, flaks and infantry around the airfield. It was staggering.&lt;br /&gt;&lt;br /&gt;My buzzard thing done, I depsawned and took a 5 minute break so I could continue playing without "buzzard insight". I came back to find that 4.5 hours after the initial wave, new armor was becoming available at our enclave. Simultaneously Allied armor was converging on the airfield. Myself and a couple of others managed to steal a position on a ridge and watch some of the crusaders driving up. Too used to the wonderful flat trajectory of the 2lber gun, I poured round after round into the A15 before finally realizing at the range/velocity/angle my rounds were bouncing off. Deciding we couldn't hurt him, he rolled on and turned his gun away. So we moved closer. And now the combination of range/velocty/angle resulted in a popped tank.&lt;br /&gt;&lt;br /&gt;And still the fight raged. I had an excellent set of sorties with the bofors, did some nasty damage to some over-confident vulchers. P38 don't fly so good with one wing, biotch? :)&lt;br /&gt;&lt;br /&gt;Eventually the battle started to wind down, but not much. More Allied armor, presumably from rear towns, started to assault the airfield outpost. Our equipment was pretty low, although timing was in our favor, but mostly we had a lot of equipment already out and deployed, guys who'd been waiting - even for several hours. For a while there I was worried we had some kind of visibility issue, pak36s kept letting tanks drive past them. But eventually I realized they were only firing when it wouldn't give away their positions. The Allied drivers paid a heavy price for getting impatient after that long drive between towns...&lt;br /&gt;&lt;br /&gt;Finally, and slowly, the Axis started to recover Aachen. The Allies certainly weren't "kicked" out of town, they made the Axis pay for every flag. &lt;br /&gt;&lt;br /&gt;I don't remember more than a handful of instants where I didn't have my hands full. I saw greentags running around all over the place, and I saw several of them become bluetags. I saw some awesome teamwork here and there.&lt;br /&gt;&lt;br /&gt;I did more dying than I did killing (if that's any consolation to my regular Allied buddies :) but I had an absolute blast.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-114156179730048936?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/114156179730048936/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=114156179730048936' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114156179730048936'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114156179730048936'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/03/aachengrad.html' title='Aachengrad'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-114144034143451588</id><published>2006-03-03T20:29:00.000-06:00</published><updated>2006-03-03T20:45:41.510-06:00</updated><title type='text'>Gophur will kick my ass...</title><content type='html'>For not working on something on the host side where I ought to be... But Ramp's hands are full with other stuff, and we've been saying this would be neat for so long, and I wasn't going to get anything else done today - it was a patch day.&lt;br /&gt;&lt;br /&gt;So I was looking at how Ramp does the "new orders" sound, and I remembered that when you receive a PM we remember who sent it, which would be the perfect place to put a "play sound effect" call.&lt;br /&gt;&lt;br /&gt;So I found a sound, added the lines of code and logged into the game. Got my pals okiemoe and tanky to send me some tells and bingo :) Audio feedback when you get PMs - no more than once every 3 seconds. I guess it'll need an option to turn it off before we let it go live.&lt;br /&gt;&lt;br /&gt;It's so close to the host interface that it almost doesn't count, but it makes noise! Woohoo! Technically it's my 3rd game-based sound. Theres the "beep beep beep" of the pagers indicating the game servers are down, and there is the "bip-bip" of the RDP and database messages we get to our cell phones. But this one is actually in game. Woohoo!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-114144034143451588?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/114144034143451588/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=114144034143451588' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114144034143451588'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114144034143451588'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/03/gophur-will-kick-my-ass.html' title='Gophur will kick my ass...'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-114137366413730325</id><published>2006-03-03T01:50:00.000-06:00</published><updated>2006-03-03T18:05:29.190-06:00</updated><title type='text'>So much for that entry</title><content type='html'>"P'king" is the noise my laptop makes when it spontaneously powers off =( Which tonight it did when I moved my hand from the keyboard to the mousepad. Bah.&lt;br /&gt;&lt;i&gt;Edit: And then Blogspot decided not to post the entry too. It must be ill-fated&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;So the short version:&lt;br /&gt;&lt;br /&gt;- Side balance stuff: jury not in, but the numbers are much more balanced, and play seems more fun.&lt;br /&gt;- Wish I'd gotten more features in 1.22.&lt;br /&gt;- Loving the "new toys" I have as of 1.22, kinda dumb but after 3 years of pure C having known quality base classes to work from a huge boost.&lt;br /&gt;- Thrilled with how my stuff's worked in 1.22, almost all of my code went in in its original form. Thanks to the C++ stuff I brought to a head with 1.22.&lt;br /&gt;&lt;br /&gt;Spent my night plowing through other compression stuff. Trying to find inspiration for procedural delta compression for updates before I resort to hand-crafted, because with so many different vehicles and types of vehicles and combinations of properties (turrets, guns, etc) I'll need to write a &lt;i&gt;lot&lt;/i&gt; of hand-crafted packers...&lt;br /&gt;&lt;br /&gt;Hope the client guys make some progress finding the bug causing the little quartet of new issues that 1.22 brought with it. Been having a lot of fun playing 1.22.&lt;br /&gt;&lt;br /&gt;Carlos Mencia rocks.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Edit: Strange things you find in Source Control. Looking around the sound files, I came across a morse-code file. Martini reads morse, and translated it as "Top Secret - All your base r belong to us"&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-114137366413730325?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/114137366413730325/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=114137366413730325' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114137366413730325'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114137366413730325'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/03/so-much-for-that-entry.html' title='So much for that entry'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-114063328737774224</id><published>2006-02-22T11:15:00.000-06:00</published><updated>2006-02-22T20:25:26.766-06:00</updated><title type='text'>OU vs OO</title><content type='html'>As I've mentioned before, writing code which merely uses classes and inheritance I consider "OU" (Object Usage); "OO" is about designing your code in terms of objects - discrete packets of data and/or functionality. A very subtle distinction but it makes a dramatic change, and a lot of legacy C programmers find it very hard to make the switch. Some guys I know have struggled with the term "Object". It makes them think of something physical, firm, rigid.&lt;br /&gt;&lt;br /&gt;"OU" code generally has classes which are little more than extended &lt;i&gt;struct&lt;/i&gt;s; almost every operation conducted on the data is done in the code of another object or non-object function. Well written OO code is more specific and modular: Here are some variables and this is how they work. Tight encapsulation is a bigger give-away for good OO design than inheritance...&lt;br /&gt;&lt;br /&gt;I've written a &lt;i&gt;lot&lt;/i&gt; of OU code in WWII Online in the process of converting from pure C to C[++] and on to real C++.&lt;br /&gt;&lt;br /&gt;Our strat host originally had a bunch of C structures for describing the 5 main world components (Supercells, CPs, Facilities, Buildings and Links). The code was entirely C, no member functions and no data privacy. More to the point, there was a phenomenal amount of code duplication. Something that only takes a few lines of code wouldn't be broken into its own function, it'd just be repeated wherever it needed doing.&lt;br /&gt;&lt;br /&gt;The code was also full of fault-proofing and second guessing. Wary of changes happening elsewhere in the code, a function might set the country of a CP to be one thing, call another function to make some other changes, and then re-assert the country and side of the CP "to be sure".&lt;br /&gt;&lt;br /&gt;Now that doesn't sound too bad except that the function might not outwardly be anything remotely CP related, it might be "strtCheckLinkFirebaseStatus(FacilityStruct* depot)". Not vaguely CP related, nosiree.&lt;br /&gt;&lt;br /&gt;All of this paranoia and replication made the code unpredictable and difficult to manage. It was designed/written top-down, built in terms of operations wanting to be performed by the system rather than actions allowable on a set of data.&lt;br /&gt;&lt;br /&gt;And the real issue was that all the paranoia code was neccessary, because there were functions all over the place interpreting data and/or making changes without the whole, upto-date picture. Which could cause bad data to suddenly spill out and cause chaos, and then very difficult to trace or reverse.&lt;br /&gt;&lt;br /&gt;In my first sweeps of cleanup of the strat host I converted it from raw C into basic C++. I didn't make it OO, just converted it into C++ and started introducing object concepts and privacy. This allowed me to leave most of the old C functions in-tact, while slowly hiding away and encapsulating parts of the data. For instance, concealing the country and side variables so that I could more easily control them (or more precisely access to them).&lt;br /&gt;&lt;br /&gt;Under the old code, when Antwerp Central Armybase changed ownership, the function for changing facility ownership (strtChangeFacilityOwnership) might notice that this is the last facility and Antwerp CP now belongs to a different country/side.&lt;br /&gt;&lt;br /&gt;It contained code neccessary to change a whole host of CP attributes. Fair enough. It also contained code for checking all of the facilities in the CP belonged to the new side. Erm, wait a second - didn't we start on the predicate that we were the last facility? Oh well, too late now. Next it ploughed ahead and "re-asserted" the ownership of all the buildings belonging to all the facilities. And finaly it went through all the links to neighboring towns, changed attributes of the neighboring CPs and updated all of the firebases.&lt;br /&gt;&lt;br /&gt;In the new model, its a bit cleaner but not perfect. But with each step of the process large amounts of code started to fall away, it became easier to see recurring sections of code, which could in turn to be encapsulated to simplify the system further.&lt;br /&gt;&lt;br /&gt;Now the code to change a facility's ownership makes the change and calls a CP-member function that updates the facility counts. This leaves it to the CP to decide whether or not it has left contention.&lt;br /&gt;&lt;br /&gt;What happens isn't too dissimilar to the old process, but everything is done in terms of the object being affected. This allows the code to be a lot less paranoid, because &lt;i&gt;control&lt;/i&gt; over all of the elements involved is scoped. The CP &lt;i&gt;notifies&lt;/i&gt; each of its facilities that an ownership change has occured. Its pseudo message-passing: the message passing is &lt;i&gt;implied&lt;/i&gt; by the calling of a particular member function. Then it lifts the AO, which sets in motion the destruction of all the radio tables. And finally the CP "notifies" all of its outgoing links that an ownership change has occured.&lt;br /&gt;&lt;br /&gt;So why is this only OU?&lt;br /&gt;&lt;br /&gt;Because, for example, the AO isn't a separate object, its just part of the CPStructure. Its encapsulated within the CPStruct. All the functions for operating on an AO are CP functions still.&lt;br /&gt;&lt;br /&gt;Because &lt;u title='Supercells, CPs [choke points], Facilities, Objects [individual buildings], Links'&gt;all five of the basic strat structures&lt;/u&gt; are based on some common data but instead of sharing them (through inheritance) they duplicate them. Heck, each of the structures starts like this: (Oh and for the wanna-be-hackers among you, this is purely internal to the host code)&lt;br /&gt;&lt;br /&gt;&lt;div class='code'&gt;&lt;pre&gt;&lt;br /&gt;typedef struct CPSTRUCT&lt;br /&gt;{&lt;br /&gt;//FULL_OBJ_ID must be the first field in the structure.&lt;br /&gt;//DO NOT MOVE!!!!!!!!!! -Meat&lt;br /&gt;    FULL_OBJ_ID    fullObjID;&lt;br /&gt;    CPSTRUCT*      prev;&lt;br /&gt;    CPSTRUCT*      next;&lt;br /&gt;    SINT32         subType;&lt;br /&gt;    UINT32         flags;&lt;br /&gt;    char           name[MAX_LEN];&lt;br /&gt;    char           filename[MAX_LEN];&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Now, admittedly, beyond this simple base, these structures become radically different. You really do not want to confuse a CPStruct with a FacilityStruct.&lt;br /&gt;&lt;br /&gt;But that is the worry of a C or OU programmer who is anticipating implementing a lot of structure-specific functionality outside of the structure - i.e. beyond his control - that warrants passing objects around as base types and then trying to perform decendant operations on them. Without using virtual functions.&lt;br /&gt;&lt;br /&gt;And we have code that does exactly that. Every time a "strat object" is changed, it gets put onto a queue for saving within a few seconds - rather than trying to commit the changes to disk instantly. This queue effectively does the following:&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;pre&gt;&lt;br /&gt;  FULL_OBJ_ID* entry;  // See the Meat comment in previous code&lt;br /&gt;  while ( (entry = getNextQueEntry(queue)) != NULL ) {&lt;br /&gt;   switch ( entry-&gt;obj_type ) {&lt;br /&gt;     case CP:&lt;br /&gt;       strtSaveCPEntry((CPstruct*)entry);&lt;br /&gt;     break;&lt;br /&gt;     case FACILITY:&lt;br /&gt;       strtSaveFacility((FacilityStruct*)facility);&lt;br /&gt;     break;&lt;br /&gt;   ...&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;When it could just do the following:&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;pre&gt;&lt;br /&gt;  StratBase* entry ;&lt;br /&gt;  while ( (entry = getNextEntry(queue)) != NULL ) {&lt;br /&gt;    entry-&gt;commit() ;  // Virtual function&lt;br /&gt;  }&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Which is more efficient: a vtable deference or a switch statement? If there's anything between them, I'm guessing its no more than a handful of cpu cycles. Which means that unless this is business critical, its worth writing the more manageable, easier to read version of the code.&lt;br /&gt;&lt;br /&gt;As a last point, I will conceed that there is more of a built-in overhead with C++, that if you're used to the rawness of C its easy to be surprized by.&lt;br /&gt;&lt;br /&gt;I think it winds up being swings and roundabouts. There'll never be a good case against the fact for business/operation critical tasks assembler &gt; c &gt; c++. But for overall application programming you can easily miss bigger-picture/organizational optimizations when you work at those levels.&lt;br /&gt;&lt;br /&gt;Well written OO code is easier to manage, QA and maintain. If you've worked on OO code that doesn't meet those specifications, then maybe you've been working on OU code instead.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-114063328737774224?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/114063328737774224/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=114063328737774224' title='13 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114063328737774224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114063328737774224'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/02/ou-vs-oo.html' title='OU vs OO'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-114059182647557311</id><published>2006-02-22T00:38:00.000-06:00</published><updated>2006-02-22T01:03:46.560-06:00</updated><title type='text'>"OO = slow"</title><content type='html'>It absolutely used to be true that writing &lt;u title='Object Oriented'&gt;OO&lt;/u&gt; code was slower. Whether or not its true depends on the language these days.&lt;br /&gt;&lt;br /&gt;C++ used to be lambasted as the absolute proof that OO programing was slow. But in the early days C++ was translated from C++ into C and then compiled. This meant that the code was "optimized" as C code, creating a huge perfomance hit. It also relied on mostly C libraries.&lt;br /&gt;&lt;br /&gt;In the years since C++ has developed some very solid support. Keeping it in the family like that helps the optimizers do a much better job&lt;br /&gt;&lt;br /&gt;And the C++ compilers and optimizers have come a &lt;i&gt;long&lt;/i&gt; way since then. A lot of the old runtime burden is dealt with by the compiler and optimizer.&lt;br /&gt;&lt;br /&gt;And since OO code tends to encourage tighter code re-use than straight C, well written OO code may actually run better on some modern processors.&lt;br /&gt;&lt;br /&gt;Code that is written in C++ isn't neccessarily OO. Code that is written in C++ and uses classes and inheritance isn't neccessarily OO.&lt;br /&gt;&lt;br /&gt;When I said some of the socket stuff I'd been looking at was inefficient, I mean more fundamental than the few clock cycles you might waste using vtables; things like poor memory management, lots of functionality that's "neat" in a simple or lightweight application, but that starts to use some serious resources when you try to run thousands of clients.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-114059182647557311?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/114059182647557311/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=114059182647557311' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114059182647557311'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114059182647557311'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/02/oo-slow.html' title='&quot;OO = slow&quot;'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-114023229556494448</id><published>2006-02-17T20:54:00.000-06:00</published><updated>2006-02-17T21:11:35.600-06:00</updated><title type='text'>Regarding imbalance posts...</title><content type='html'>I've said what I'm going to say. I'm not at liberty to post data, that the company feels it doesn't want published, here any more than I am on the WWII forums. The difference is when you call me liar on my own blog, you're calling &lt;i&gt;me&lt;/i&gt; liar, not arm-wrestling with the vague notion of a company.&lt;br /&gt;&lt;br /&gt;Ultimately, as I tried to explain and inadvertantly gave Kury the impression I think he's stupid, any kind of imbalance discussion gets crippled by people insisting on calling any imbalance they want to discuss "the imbalance". There is no "imbalance" singular - there are imbalances. They're all different, with different causes, different effects and different trends and patterns.&lt;br /&gt;&lt;br /&gt;The trouble is when someone thinks their imbalance is "the imbalance" and see us responding to "an imbalance thread", they read what we're saying totally out of context, and turn it from a discussion into a whackjob thread.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-114023229556494448?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114023229556494448'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114023229556494448'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/02/regarding-imbalance-posts.html' title='Regarding imbalance posts...'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-114015564802079650</id><published>2006-02-16T21:22:00.000-06:00</published><updated>2006-02-16T23:54:08.080-06:00</updated><title type='text'>So dumb and yet so satisfying</title><content type='html'>Today was a patch day (kinda) so actually getting anything done is normally outta the question for me. I can usually manage a few tweaks, or I add a couple new capabilities to my internal-tools javascript library. Never usually anything &lt;u title="Because the amount of QA required as followup precludes it"&gt;significant&lt;/u&gt;. But I go into patch day expecting to come out whipped. I found myself a little noncey task to twiddle with, and I realized that it wasn't really gonna get anywhere.&lt;br /&gt;&lt;br /&gt;The patch didn't happen and I found myself with just enough time to wrap up my little make-work task, some polish to some self-monitoring code, a little clear out of some old and uneccessary legacy code. And then I found myself doing a bit of polish on the make-work task...&lt;br /&gt;&lt;br /&gt;And it was done, tested, and working. I'd even had time to put a bit of polish into the lil' web page that drives it.&lt;br /&gt;&lt;br /&gt;So we now have opinion polls in game. Yeah, I know, lame. But there's just a buzz you get from writing a complete system like that, end to end, in so little time, so smoothly and cleanly. No cheesy hacks &lt;u title="Even had chance to clean a few up"&gt;involved&lt;/u&gt;. And the best part is that its built entirely on the various "improvements" I've blathered about in the past. &lt;br /&gt;&lt;br /&gt;One of the best patch days so far... And capped off with a most welcome Smallville fix. I always like the "super too" episodes, like the one with the young Flash. Decided to maintain the good mood and watch Robots after that. I like the overtly adult whit that runs along the simple humor, although every movie I've seen Ewan McGregor in has had very overt pastiches of or references to his other movies. Ah well, it was fun enough :)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.rickb.com/"&gt;Rickb&lt;/a&gt; pointed out we're fixing to have &lt;a href="http://www.srh.noaa.gov/ifps/MapClick.php?CityName=Bedford&amp;state=TX&amp;site=FWD"&gt;snow tomorrow&lt;/a&gt;. TV has been bleeping &lt;a href="http://www.srh.noaa.gov/fwd/productview.php?pil=FWDWSWFWD&amp;version+0&amp;max=25"&gt;Winter storm alerts&lt;/a&gt; all night. New folks moved in next door a couple weeks ago, and piled various empty boxes onto their porch, which the wind has since tossed onto my porch (they came out the other day as I was going back in and looked at me weird like I'd stolen their empty boxes or something... I was gonna go out and say something but it seemed a bit too forced).&lt;br /&gt;&lt;br /&gt;The upshot is that the winter storm out there is tossing this big empty boxes around, and it sounds like there's a war going on outside.&lt;br /&gt;&lt;br /&gt;That's enough typing for now. Gonna go make some me some nutella toasties.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-114015564802079650?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/114015564802079650/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=114015564802079650' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114015564802079650'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114015564802079650'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/02/so-dumb-and-yet-so-satisfying.html' title='So dumb and yet so satisfying'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-114007522350808812</id><published>2006-02-15T23:51:00.000-06:00</published><updated>2006-02-16T10:18:18.116-06:00</updated><title type='text'>Fun Rating 0</title><content type='html'>C programmers often make a mistake when learning C++. They think it is an object-oriented version of C. So it follows that if you write something in C++ it must be object oriented.&lt;br /&gt;&lt;br /&gt;What results is C code that uses C++ semantics, grammar and syntax, but its really just C code written in C++ lingo. I call it C-- - there are classes, and there are member functions. But if you take a slightly deeper look at the code you'll find that there is a lot of replication of work where the same chunks of code occur in a member function over here and a non-member function over there and there is an almost identical version over here too.&lt;br /&gt;&lt;br /&gt;Over the last few weeks I've been looking at various open source socket library/wrappers and even fully blown network libraries (e.g. &lt;a href="http://www.opentnl.org"&gt;Torque Network Library&lt;/a&gt;) and trying to dust off my &lt;u title="Which I've not really had call to use in the last 3 years"&gt;low-level networking skills&lt;/u&gt;. I'm looking into some significant overhaul of our "teulKit" network/RPC library.&lt;br /&gt;&lt;br /&gt;teulKit is essentially a message passing system that does some of its message passing across networks. Its an ideal candidate for an OOP system, but it was written in C so it tries not to be OOP. Some C programmers think that there is an inherent performance overhead in C++ code, and will methodically create C code that, under scrutiny, actually replicates what C++ would do. They do this in the firm conviction that because they wrote the code specific to their purpose it will be more efficient than the equivalent C++ code.&lt;br /&gt;&lt;br /&gt;In the early days of C++ this was true - because C++ code was translated into C and then compiled, so the optimizer had no concept of C++ behaviors. Modern day C++ compilers are usually C++ savvy. The C way of implementing a callback is to have a pointer to a function, which you have to check for NULL at runtime. In C++ you have a member function, perhaps declared virtual, so the NULL check can be performed at compile time. Net result is more efficient performance.&lt;br /&gt;&lt;br /&gt;A message-passing system like teulKit uses a lot of callbacks. And often it has to have intermediate functions which take one set of arguments and adapt them to the current purpose before passing them on to another set of functions for additional processing. This &lt;i&gt;is&lt;/i&gt; polymorphism. But when you do it in C you can wind up having to write a polymorph function for everything you deal with.&lt;br /&gt;&lt;br /&gt;And this is true for teulKit. Every message that gets sent has a sender, a send callback function and a packer. On the receiver it has an unpacker, a receiver and a handler. These functions are each several lines long. And then there is the process of registering each of the steps in the chain. In short it takes easily 100 lines of code just to allow teulKit to do what it does for one message. And then you have to write your actual functionality that generates the data for the sender to send and the processing functionality to process what was received.&lt;br /&gt;&lt;br /&gt;And between each of the functions is an assortment of teulKit functions that massage and move and transfer and check and munch the data going through.&lt;br /&gt;&lt;br /&gt;So deprived of Smallville episodes and bored of Lord of War (I meant to put Into the Blue on but couldn't be bothered to go change the disk when I realized my mistake), I decided to try and read teulKits UDP code to figure out if it works (it hasn't been used in 4 years, and so probably hasn't been maintained or tested), figure out if it is a simple UDP wrapper or if it provides functionality (it does nicely manage UDP connections and provide some functionality that would allow a mix of reliable and unreliable data via UDP, but none of the guaranteed delivery code seems to be linked to UDP, and there are some serious non-functionality that appears to be the reuslt of long duration tweaking).&lt;br /&gt;&lt;br /&gt;What it mostly seems to suffer from is out-of-date copies. When you try to implement C++ code in C you often wind up with a lot of duplicated chunks of code.  As maintenance occurs, these duplicates start to mutate and differ. And for a long time they still do more-or-less the same thing. But now you can't tell if they are different by design or negligence or possibly even just coincidentally similar.&lt;br /&gt;&lt;br /&gt;I didn't learn a whole lot of useful stuff on this tour-de-code. I'm going to have to sit and trace callbacks between files, between processes, through weird code branches, through big chunks of anonymous code that doesn't have anything to do with the function name -- who'd think "sendDatagram" would contain 300+ lines of code that performs management tasks on every connection the application has, all to the ends of ensuring the application doesn't allocate a new buffer for this outgoing data if there is one it can free up somewhere first. Similar code (possibly the same but differently maintained since it was copied&amp;pasted) occurs in the receiveDatagram function, and similar functionality (but no-longer recognizably the same) code is called in the "updateEndpoints" function that is invariably what the system drops into after its done sending/receiving datagrams.&lt;br /&gt;&lt;br /&gt;All that said, if someone knows a good C++ socket library, and by good I mean simple, clean, efficient and well written I've been browsing them on &lt;a href="http://www.sourceforge.org/"&gt;SourceForge&lt;/a&gt; and &lt;a href="http://www.freshmeat.net/"&gt;FreshMeat&lt;/a&gt;. As much as I'd like to actually writ it from scratch myself (I haven't stretched those legs in a while), I was hoping to find something along the lines of the UDP/Notify Protocol that TNL implements, that I might be able to work into a drop-in replacement for the transport part of teulkit. A big put-off for me with TNL is that for something so encompassing (and commercial) its lacking in recent compilable builds and performance documentation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-114007522350808812?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/114007522350808812/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=114007522350808812' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114007522350808812'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114007522350808812'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/02/fun-rating-0.html' title='Fun Rating 0'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-114005742016810886</id><published>2006-02-15T20:11:00.000-06:00</published><updated>2006-02-15T20:37:00.210-06:00</updated><title type='text'>Argh - disaster!</title><content type='html'>I've been tearing through Smallville episodes, watching 2 episodes a night on week days and 3-4 a day on weekends... I found that watching them on DVD cuts the teen-angst down a whole bunch. Sure, there are crappy episodes when they do something "else" with the cast - like the buffy episode, grr. But overall I'm hooked. Whether its &lt;a href="http://www.imdb.com/name/nm0471036/"&gt;Kristin Kreuk&lt;/a&gt;'s Dutch-Chinese cuteness or &lt;a href="http://www.imdb.com/name/nm1570568/"&gt;Erica Durance&lt;/a&gt;'s struggle to stay covered by what little wardrobe they provide &lt;a href="http://www.imdb.com/gallery/granitz/3156/Events/3156/EricaDuran_Grani_5177495_400.jpg?path=pgallery&amp;path_key=Durance,%20Erica"&gt;her&lt;/a&gt; with or the neat twist on superboy, I dunno...&lt;br /&gt;&lt;br /&gt;But last night I finally got caught up, which means tonight I'm suddenly and horribly doing cold turkey. Hell I actually started reading through our UDP network code while waiting for Lost. The Brit in me still finds it weird that an hour show only has 30-40 minutes of actual show to it.&lt;br /&gt;&lt;br /&gt;At least I have Into the Blue from Netflix. You'd have to be dead for Jessica not to be able to cure whatever ails ya.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-114005742016810886?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/114005742016810886/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=114005742016810886' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114005742016810886'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114005742016810886'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/02/argh-disaster.html' title='Argh - disaster!'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-114002853121588578</id><published>2006-02-15T11:35:00.000-06:00</published><updated>2006-02-15T12:35:31.250-06:00</updated><title type='text'>Warm and tingly</title><content type='html'>So someone brought up a feature we wanted to add for a while, and I've been putting it off for when I had time/features in place to do it properly. But when they brought it up on monday my little idea-crunching brain-thread eventually came back with a little note that my recent API enhancements ought to make it really simple.&lt;br /&gt;&lt;br /&gt;I spent most of my time on this feature trying to figure out where to store the neccessary information so that it wouldn't leak, get lost, corrupted, or confuse things by arriving late.&lt;br /&gt;&lt;br /&gt;With so much of my time being spent on research and investigatory stuff the last X months, it feels sooo good to add a little bit of polish somewhere. It's such a basic neccessity too: Finally the host remembers your channels between sessions, which also means finally we can auto-tune you to sensible channels (i.e. help channel for newbies) without then requiring you to type dot commands to tune/detune the things.&lt;br /&gt;&lt;br /&gt;On a project of this scale one of the nice things about (arguably) irrelevant detours like that are that, when you go back to what you are supposed to be working on, the old grey matter has had time to churn on other issues and make some interesting progress.&lt;br /&gt;&lt;br /&gt;Right now I'm looking at a way to double+ the number of players we can transmit updates for while reducing the CPU load on the hosts and bandwidth used by the updates -- so I can increase the frequency at which we send actual updates. Players on dialup and low-end isdn will get little to no benefit, but since thats under 5% of our players: too bad.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-114002853121588578?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/114002853121588578/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=114002853121588578' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114002853121588578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/114002853121588578'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/02/warm-and-tingly.html' title='Warm and tingly'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-113986222549621087</id><published>2006-02-13T13:56:00.000-06:00</published><updated>2006-02-13T14:23:45.556-06:00</updated><title type='text'>Brightly she burns!</title><content type='html'>Q1: So you've never seen higher than 60:40&lt;br /&gt;&lt;br /&gt;A1: We've seen higher than 60:40 (3:2) in spikes, yes. The highest imbalance ever was 17:1. The sample before it is 0:0 and the sample after it is 10:9. We've seen non-artefact spikes as high as 5:2. The duration is minutes, though, before it drops back into the 3:2 bracket.&lt;br /&gt;&lt;br /&gt;Q2: So you finally admit there is a side imbalance&lt;br /&gt;&lt;br /&gt;A2: We're not admitting what we previously denied, as much as some of you want to imply it. If you keep saying "the bus is here" eventually you'll be right. Some people just aren't good at dealing with 4 dimensions.&lt;br /&gt;&lt;br /&gt;Q3: So if there is no side imbalance, as you've said for 3 years, why are you doing something about one?&lt;br /&gt;&lt;br /&gt;A3: Generalizations are really killing this discussion, as per Q2. We closed last year with the release of a new boxed version of the game. This introduced new people into the pool of players, and the result has not normalized into even player numbers. We're resultingly seeing longer stretches around the 3:2 mark, and we are seeing it occasionally go higher.&lt;br /&gt;&lt;br /&gt;Q4: So when will you admit the problem is side swappers now that you have admitted there is a problem?&lt;br /&gt;&lt;br /&gt;A4: Our admission of a problem follows pretty hot on the heels of an actual problem, vs an imagined or exagerated one, starting to occur. Our player stats indicate that only small numbers of people swap sides. We can't tell why people swap stats, but aside from key events like release of the tiger, we don't see double-figure percentages of active players swapping sides.&lt;br /&gt;&lt;br /&gt;Q5: Why don't CRS just show us the numbers.&lt;br /&gt;&lt;br /&gt;A5: Probably for the same reasons other MMOs only show you numbers during beta. &lt;br /&gt;&lt;br /&gt;Q6: Why don't you just sidelock everyone and then we will know that sideswapping isn't the problem!&lt;br /&gt;&lt;br /&gt;A6: You're probably one of the people who denounces ongoing game development as being "a paid for beta" aren't you? Part of our task as developers is to try and eliminate as many of the "what ifs" as possible before we go to code. As a project, its not about educating our customers with the vagueries and nuances of game design and development. You're probably also one of those people who says "Remember when they &lt;i&gt;tried&lt;/i&gt; X and we all quit?". Let me ask you: Why don't Tropicana produce "unripe" and "rotting" versions of their juices, so you can see for yourself whether or not they taste good.&lt;br /&gt;&lt;br /&gt;There are two routes we can take: We can sidelock or we can give you an overpop warning. We have to choose one. Our data indicates that there are enough side-free players that they might reduce, dampen or fix the imbalance swings if we tell them at persona selection which side needs people most.&lt;br /&gt;&lt;br /&gt;This is subtle and low-impact. It doesn't futz with your play session, it doesn't dynamically change the rules of play on you while you're running to town.&lt;br /&gt;&lt;br /&gt;And if it fails, well then you got to see a "what if" that didn't work, and the worst you'll experience is 10-15s extra at the persona screen each login.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-113986222549621087?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/113986222549621087/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=113986222549621087' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113986222549621087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113986222549621087'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/02/brightly-she-burns.html' title='Brightly she burns!'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-113972351670439811</id><published>2006-02-11T22:56:00.000-06:00</published><updated>2006-02-11T23:54:53.616-06:00</updated><title type='text'>Three years of denial. MY ARSE.</title><content type='html'>&lt;div class="quote"&gt;&lt;i&gt;Horse wrote:&lt;/i&gt;&lt;br /&gt;The company has spent the last few years quite loudly denying that there is an imbalance problem. So when CRS suddenly 'gets religion', are you surprised that one side is up in arms and the other is just shell-shocked?&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;No, I didn't say I was surprized. I am dissapointed that folks I would consider friends, forget "customers", are actually this stupid.&lt;br /&gt;&lt;br /&gt;For three years, CRS has been saying it's not going to do anything about imbalance because there was no significant imbalance.&lt;br /&gt;&lt;br /&gt;Right now we have other things to be working on, we're in a good position to work on them, we're being asked to work on those things, and we've taken this detour.&lt;br /&gt;&lt;br /&gt;If you were smart, you'd stop and think: "Huh, CRS has always said its got data on this stuff. They just did this box release thing that they say brought in a lot of new players, and now they are the ones talking about imbalance".&lt;br /&gt;&lt;br /&gt;For what its worth, Horse, 2 + 2 = 4, not 1 :)&lt;br /&gt;&lt;br /&gt;&lt;div class="quote"&gt;&lt;i&gt;It wrote:&lt;/i&gt;&lt;br /&gt;Implementing any side balancing features is the wrong way to go right now. Just showing the numbers upon logging in should be the first step.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Could you make up your mind? Do nothing or do something? Which is it. All we're doing is telling you up front that a side is imbalanced (above a certain threshold), and when it happens, we're making you wait at the persona select screen an extra few seconds to make you aware of it.&lt;br /&gt;&lt;br /&gt;&lt;div class="quote"&gt;Horse wrote:&lt;br /&gt;Everyone with a clue has known for years about an imbalance problem.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;And he simultaneously proves Intelligent Design - if Dinosaurs are real, where are the Trexes today?&lt;br /&gt;&lt;br /&gt;&lt;div class="quote"&gt;&lt;i&gt;Fridge wrote:&lt;/i&gt;&lt;br /&gt;I'm not against trying to balance the game. I absolutely hate it when I am outnumbered 10 to 1. But think, for a moment, about how bad it will be if the field is not level? Why bother to play a game of poker against a player who can see half the cards because you happen have won the last few hands? (I know, the example shouws skill and not numbers but the analogy still applies).&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;FWIW - The numbers have never reached 10:1. The max has been 3:2. That doesn't guarantee that every encounter you have will be against a matched number of enemy. Prior to the box release the only real balance issue was the low-peak where numbers dropped low enough that a a few dozen players choice of side was enough to radically alter gameplay outcomes.&lt;br /&gt;&lt;br /&gt;Folks like horse have spent 2.5 years developing an absolute, fanatical belief that there is an overwhelming side imbalance, and won't be detered by little things like facts. I can understand why, what horse describes is how it can often seem on the ground. I've explained &lt;u title='Not least of the reasons being our vis system creates exactly this impression'&gt;why&lt;/u&gt; countless times. Hey, before I came to CRS, I was one of those people totally convinced that CRS were talking out of their ass about side imbalance. Some of you commented on how amazed you were I got a job there given my balance-flamage over the months before.&lt;br /&gt;&lt;br /&gt;Modifying game mechanics is drastic. We aren't seeing the sort of imbalance that warrants it. What we've seen is a small but persistent skew that is going to be troublesome. Our data indicates that it might be easily rectifiable without modifying gameplay. That's the fairest solution available.&lt;br /&gt;&lt;br /&gt;&lt;div class="quote"&gt;&lt;i&gt;Sicarius wrote:&lt;/i&gt;&lt;br /&gt;Fridge - That is a common fallacy that crops up when discussing balancing systems. You imagine a bad imbalance scenario, you evalutate the system response to that scenario, and then you assume that state will be the steady state. It won't be. The only time the system will need to intervene is when there is a significant imblanance and it only needs to act for as long as there is an imbalance. Drastic system responses to large imbalances should not occur because more moderate responses made when the imbalance is small will prevent it from growing. In the long run the system should be inactive the vast majority of the time because the teams will be pretty much balanced by themselves. If the system is active a lot of the time then it will have failed to solve the problem.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;We're not trying to address 3 years of side imbalance, we're addressing a worrying skew in balance that has developed since BE. Our stats indicate that there is a small percentage of players that aren't sidelocked. There are more than enough of them to dampen if not resolve the imbalance.&lt;br /&gt;&lt;br /&gt;The highest we've seen has been 60:40 (3:2). Most of the time its lower, but the spikes can cause a drop in players on the underdog side, which then prolongs and exagerates the overall imbalance.&lt;br /&gt;&lt;br /&gt;Most important of all, we're taking this approach &lt;i&gt;because&lt;/i&gt; we believe that it will affect the least number of people. Changing in-game rules like capture times etc doesn't affect the balance of players vs players. Are you supposed to run up to a table, see that its going to take you 5 minutes to capture and say "Oh, well, guess I'd better swap sides"?&lt;br /&gt;&lt;br /&gt;Changing which side some of our side-free players choose looks like it may be enough to slow the development of an imbalance. If that's not enough, then we may have to look at more stick, such as adjusting the despawn timer with the aim of modifying the number of players effectively "in field" at a given time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-113972351670439811?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/113972351670439811/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=113972351670439811' title='36 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113972351670439811'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113972351670439811'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/02/three-years-of-denial-my-arse.html' title='Three years of denial. MY ARSE.'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>36</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-113959631802442059</id><published>2006-02-10T12:15:00.000-06:00</published><updated>2006-02-10T20:42:45.240-06:00</updated><title type='text'>Can't do the forums right now</title><content type='html'>The whole side balance thing has been brewing so long that everyone wants to say something about it and be involved. Its the whole "rhubarb-rhubarb effect": get a bunch of people in a busy area and get them to mutter stuff loudly to each other, and the area will rapidly become noisy. It's a simian alarm-cry reaction, and as intellectual as we think speech is, it still has roots in our monkey hindbrains.&lt;br /&gt;&lt;br /&gt;We're not trying to deliver guaranteed side balance. We're trying to add some inertia to the logarithmic escalation that occurs when it exceeds certain constraints.&lt;br /&gt;&lt;br /&gt;Our first step is going to be a simple "let you know" at the front screen. Personas for a side that is 10% or more advantaged will see "OVERPOPULATED" instead of "Available", and you'll have to wait 10-15 seconds longer to select those personas than one on the unimbalanced side.&lt;br /&gt;&lt;br /&gt;People will quit for having to wait 15 seconds. But hey, right now we're losing people who believe they're imbalanced when they aren't, and losing people who are sick of being imbalanced when they are insanely imbalanced. Losing those people makes it worse. Losing a few of the guys who don't want to wait 10-15s longer to play at a 2:1 advantage makes things better.&lt;br /&gt;&lt;br /&gt;If things work out, then after a few weeks, maybe months, things will be more stabilized and the balance mechanism (which doesn't just kick in as soon as one side has 2 more guys than the other) won't be affecting people.&lt;br /&gt;&lt;br /&gt;RDP tourism, described by the most vocal nutjobs as being of catastrophic proportions, is only done by single figure percentages of our player base. Now, admittedly, that means it can be a lot of actual people, but the actual percentages are tiny.&lt;br /&gt;&lt;br /&gt;Course the ones that make you fall out of your chair laughing at the guys saying "If I have to wait I'm gonna quit". Dude. If you have to wait, its because you have a 2:1 advantage. A little basic math - your departure, as little as we want to lose any customer, does not make the game empty. You're waiting because one side, the one you want to play, already has a 2:1 advantage.&lt;br /&gt;&lt;br /&gt;We have a small number of players who aren't side-dedicated. Enough that with a little motivation and information they could dampen or even fix the imbalance.&lt;br /&gt;&lt;br /&gt;There is no queue system. It's just a frickin' delay. I've no idea why Gophur insists on calling it a &lt;a href="http://www.m-w.com/dictionary/queue"&gt;queue&lt;/a&gt;, although Bloo says its cause he's a f**kwit, but I couldn't possibly say that ;)&lt;br /&gt;&lt;br /&gt;Gotta say -- as sad as I was to see Krieger head out to Prague, finally getting to work with Bloo made my year :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-113959631802442059?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/113959631802442059/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=113959631802442059' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113959631802442059'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113959631802442059'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/02/cant-do-forums-right-now.html' title='Can&apos;t do the forums right now'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-113953285205483271</id><published>2006-02-09T14:30:00.000-06:00</published><updated>2006-02-09T20:36:54.163-06:00</updated><title type='text'>CRS has no clue about software development</title><content type='html'>Stop press. You read it here second! Or maybe third. How many websites have you visited? Ok. Add three to that and we'll go with that number. I don't want to be argumentative.&lt;br /&gt;&lt;br /&gt;Lets be fair. Sometimes our development process isn't logical. We work on the wrong stuff at the wrong time. When we should have been developing Brigade Spawning, we spent nearly 6 months working on the UI. When we should have been working on the infantry system we did all this crap with mobile spawns and made things worse. And, as some players have pointed out, we haven't done &lt;i&gt;anything&lt;/i&gt; in the last 4 years to improve performance. All we've done is add stuff.&lt;br /&gt;&lt;br /&gt;&lt;small&gt;&lt;hr /&gt;&lt;i&gt;FX: &lt;a href="http://www.amazon.com/exec/obidos/clipserve/B00005UWL1001001/0/ref=mu_sam_wma_001_001/103-6483730-1466204"&gt;Morning&lt;/a&gt; from the Peer Gynt suite.&lt;/i&gt;&lt;hr /&gt;&lt;/small&gt;&lt;br /&gt;&lt;br /&gt;One of the luxuries of being a developer is that you sit down, you design the application you're going to create, you print out that specification, and some time later you come back out of your office with a finished product. The boss hands you a pay check and a pat on the back, and you ride off into the sunset.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;i&gt;Maybe &lt;a href="http://www.amazon.com/gp/product/B000000UVS"&gt;Elgar&lt;/a&gt; would have been a better choice for the playlist&lt;/i&gt;&lt;hr /&gt;&lt;br /&gt;&lt;br /&gt;The above is true for some development tracks. I remember sitting down one night 20 years ago thinking how cool it would be if people didn't have to tour bulletin boards to *find* files, and built a file-cataloging database for BBS-PC! and Paragon bulletin boards which was widely used for a few years. Or the night I sent an email to the UK Naming Committee describing an idea for replacing the manual process of sending, screening, accepting and resubmitting domain registration requests, and then followed it up a couple hours later saying I'd implemented it in perl and it was now running...&lt;br /&gt;&lt;br /&gt;It starts to be less true when you start to think about a product that isn't a sealed box. If you're contemplating any kind of post-release patches or updates.&lt;br /&gt;&lt;br /&gt;When you're talking about an online, ongoing, game development project, its absolutely untrue.&lt;br /&gt;&lt;br /&gt;We're a small team, but we're still more than three guys. And our team members have always been relatively specialized. I, for example, couldn't build a 3D model to save my 'nads. I'm pretty sure that Gophur couldn't write a line of C++. And what Rickb knows about the host code you could probably use to fill the empty stamp I tried to describe the extent of my knowledge of our physics engine, opengl code, UI or pretty much anything that happens on the client.&lt;br /&gt;&lt;br /&gt;I'm responsible for 220,828 lines of code that comprise our game servers, and over 20,000 lines of HTML and javascript and 4000 lines of "pike" script that make up our internal management systems, 13,000 lines of &lt;a href="http://www.lua.org/"&gt;Lua&lt;/a&gt; code used for unit and automated testing, over 6000 lines of SQL, 3000 lines of Perl code use by extra-game automation and monitoring utilities (not from the ones Ramp is responsible for), and &lt;a href="http://www.flibble.org/"&gt;an awk script&lt;/a&gt; &lt;small&gt;(3, maybe 4, people will get that. Boingle ;)&lt;/small&gt;.&lt;br /&gt;&lt;br /&gt;Sure, in crunch time, I could join Rick, Martini, etc, in working on the rendering engine. I can also offer "Guaranteed" brain surgery and sex changes for unbeatable prices too.&lt;br /&gt;&lt;br /&gt;I consider my little domain to be plenty to keep me busy. When you hear me bleating about not knowing where the satchel point is on a tank, or what thickness the armor is... I've never touched a vehicle model, the day I have to I will know that renewing my H1B Visa will be an uneccessary expense...&lt;br /&gt;&lt;br /&gt;When we roll out a patch with a new infantry model or a new tank, and we didn't deliver everything we promised we would for performance - that's because we're a team. The art guys worked on art. The performance guys worked on performance.&lt;br /&gt;&lt;br /&gt;So some of you already get all that. But what you don't get is how we manage to roll out a patch, and not realize that the entire community is in an uproar about the Fufugnar issue and instead of fixing that we release a patch with parachuting dogs. What kind of morons are we?&lt;br /&gt;&lt;br /&gt;Unfortunately we're the software developing kind of moron. Those people totally suck. They like, try to plan what they're doing ahead of time. So when the Fufugnar issue comes up, if it isn't going to be something we can fit into the existing dev cycle, we might like have our designers or producers plan it into the next dev cycle so that when the current work tasks go into testing and QA, our artists/programmers/datadudes can start preparing it for the next dev cycle.&lt;br /&gt;&lt;br /&gt;I know, I know; its insane. When an issue comes up mid-way through a patch cycle, we &lt;i&gt;should&lt;/i&gt; railroad 3 weeks of work and obey the forums, halt the dev cycle and address the pressing issue.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Those of you who managed to grow ganglia between your neurons as an infant&lt;/i&gt; probably noticed that we frequently release point-patches during our main development cycles. Those of you who have never to run from a zoo to cries of "the ape exhibit has escaped!" probably even noticed something of a correlation to the length of a main dev-cycle and the number of point releases released during it?&lt;br /&gt;&lt;br /&gt;Everything that goes into a point release means research, design, implementation, evaluation, QA and testing.&lt;br /&gt;&lt;br /&gt;There are some folks who accuse us of operating our game as a live beta test. The way some folks treat beta-testing, it's hard to argue with that. But its often the same folks who are eager to bitch about how unwilling a Rat is to talk-shop when they are in game, or how we tend to play under aliases rather than our Rat names. Why would we do that if we "love" the game so much. Bullshit? Or side effect of so many hours in the game testing/QAing that you like to draw a distinction between "work" and "play"? You &lt;a href="http://www.zombo.com/"&gt;decide&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Putting together our development track is like Tetris (or maybe more like &lt;a href="http://www.puzzlepirates.com/"&gt;Puzzle Pirates&lt;/a&gt;?). You can't make priority number 1 the only thing that anyone in the company works on for an entire development cycle unless that project actually involves everyone on the project. Ah but look - priority number 71 would allow us to do priorities 3, 9 and 11 in the next cycle without any support from the guy we need to do priority 1. Guess what. Working on priority 71 makes no sense unless ... you have a clue!&lt;br /&gt;&lt;br /&gt;I've been pretty ill-tempered in this rant. So my ego needs me to finish on an apologetic note.&lt;br /&gt;&lt;br /&gt;Part of being a small team on a project like this is that there is naturally a lot of creativity within the team, and as players, there is also a lot of shop-floor feel on the team. We're not developing some remote, distant application for bankers, that we're never going to use. It's a game that we spend a &lt;u title='Last year someone stupidly and errantly told me the company had folded but my first thought was how annoyed I would be if after all this effort I wasnt going to get to play WWII Online. I want to get to be a player again at some point'&gt;hell of a lot of time playing&lt;/u&gt;.&lt;br /&gt;&lt;br /&gt;All this creativity, mixed with passion for the game, means that sometimes our folks do stuff they aren't asked to when they're not on company time. I've worked on a few things, out of hours that were either a puzzle to me or a challenge and that either directly resulted in or lead to what is now a feature -- depot spawning, vehicle reservation, vehicle delivery, map persistance between server up/downs. A lot of game features are the result of tools I wrote for QA and testing purposes when I was doing QA or development in my own time -- mobile spawning being an example. (See the /msp command on the training server). /who, /friends, /own, /status, /afk, /1,2,3,4, to name a few, are my little out-of-hours additions. And arguably the game would be better off if they were UI functions rather than archaic /commands.&lt;br /&gt;&lt;br /&gt;But there's my point again - &lt;i&gt;I&lt;/i&gt; couldn't have added &lt;i&gt;that&lt;/i&gt; functionality.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-113953285205483271?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/113953285205483271/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=113953285205483271' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113953285205483271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113953285205483271'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/02/crs-has-no-clue-about-software.html' title='CRS has no clue about software development'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-113944415189038187</id><published>2006-02-08T17:51:00.000-06:00</published><updated>2006-02-08T18:15:51.963-06:00</updated><title type='text'>Its like being family</title><content type='html'>Yeah, as a devoted follower of my blog, you now have the privellige of one aspect of being in the Smith family - you can frequently expect to go months without hearing from me ;)&lt;br /&gt;&lt;br /&gt;Back in the Warbirds days I actually went almost a year without calling in to the family until a rumor started out in the Warbirds forums that I'd died. I came home from work to find a whole stack of condolence messages on my answer machine. At the end of the tape was a worried message from my dad. It had been almost a year, after all.&lt;br /&gt;&lt;br /&gt;I've been working away on a number of problems, making small traction on a bunch of concepts that I hope we'll bring together in a series of pleasant surprizes. I sometimes get a little weighed under at the prospect of how much work some of these tasks are going to be, from when I first evaluated them 2-3 years ago. Only with all the under-the-hood work I've done some of them can be rolled out in moments.&lt;br /&gt;&lt;br /&gt;For instance, I recently developed a small class set that encapsulates threaded database access which can be processed in-thread or in the primary thread if they need to perform "authoritative" operations. Because its written from the ground up it avoids many of the performance pitfalls "C++ed" code, and because its written from scratch it also avoids lots of legacy tie-in stuff. It's positively fun to work with. Most importantly it massively reduces the overhead and manual workload involved in trying to add each and every callback set we use for this kind of IPC normally.&lt;br /&gt;&lt;br /&gt;As a technology test, I decided to see how long it would take me to implement the "tell people when their friends login" code. Answer: aproximately 25 minutes. Under the old system it would have taken significantly longer just because of all the overhead of the C-based IPC system we use.&lt;br /&gt;&lt;br /&gt;And all of the code-optimizations I did in the last 6 months have really paid off. At peak population we're seeing under 10% cpu usage on the chat and map hosts. A lot of that work is replicated between the two servers, and about 20% of the work (ie 2% cpu usage) is probably the synchronization of the two hosts.&lt;br /&gt;&lt;br /&gt;So my "big picture" game plan for the next 6 months is to disolve the map/mission host into the chat (or lobby) host and the cell hosts. This would drop a huge amount of overhead out of some of the feature functionality we're wanting to deliver, would reduce some of the sync-management overhead, and also reduce some of the network hassles that arise out of having a client maintain multiple connections.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-113944415189038187?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/113944415189038187/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=113944415189038187' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113944415189038187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113944415189038187'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/02/its-like-being-family.html' title='Its like being family'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-113850671096147955</id><published>2006-01-28T20:20:00.000-06:00</published><updated>2006-01-28T21:51:51.110-06:00</updated><title type='text'>Discussing hackers</title><content type='html'>Every now and again, someone tries to go nuclear on me for our reluctance to discuss our anti-cheat systems, "surely it can't hurt ...".&lt;br /&gt;&lt;br /&gt;I hacked a few games when I was a kid, but when I reached college I didn't consider myself a "hacker" (in the modern intrusive sense). However, I noticed something trivial and innocent about the college network. It just seemed that if it was for real, then the network security was a facade, the "network" itself would have to be wide open, its security relying entirely on the honorable use of particular commands/tools. The weak link in many security systems is the password file. I'd looked at it before on our network and it was surprisingly sparse. To test my theory, I looked at it using a non-network version of "edit". And voila. The network tools honored a code that said a particular character meant end-of-file. Regular edit did not. And the password file was simply some junk followed by end-of-file and then a simple, clear text list of username:password,username:password,... entries. First in the list was admin:kangaroo.&lt;br /&gt;&lt;br /&gt;I spent the next 3 hour lesson reading the network administrator manual and then logged in as admin and left the lecture team an email, bat files and source code for actually making the network secure. I almost got booted out of college for doing it ;)&lt;br /&gt;&lt;br /&gt;What unlocked the network for me was a trivial piece of information. It was actually something the admin *didn't* say.&lt;br /&gt;&lt;br /&gt;At the end of the day, all of the gaming instructions and data have to be available unencrypted to the CPU at some point and with a lot of determination you can work out what some or all the sequences of those instructions mean or interfere with the sequence/operation of them.&lt;br /&gt;&lt;br /&gt;Since the client is not merely a spectator we have to have some confidence in the behavior and operation of the client. Anything we tell anyone about what if, what, how or even when we detect could be that magic piece of the puzzle that allows a hacker/cheater to break through and destroy the game entirely, or it might inspire some honest and genuine player to poke at a hole in disbelief and find themselves able to become invulnerable. &lt;br /&gt;&lt;br /&gt;So when you're writing me a snotty-assed email about game security, after railing on &lt;i&gt;&lt;b&gt;&lt;a href="http://kfsone.blogspot.com/"&gt;me&lt;/a&gt;&lt;/b&gt;&lt;/i&gt; about how crappy you believe our &lt;i&gt;client&lt;/i&gt;'s security to be, about how clueless we appear to be, you can take your demands to be told how they work and what we know and &lt;i&gt;%*@"£$!'%:%*!&gt;$"£%^&amp;J£!=&amp;***$&lt;/i&gt;. And you might want to start by, uh, not sending me the email from a machine with a virus on it. Hard not to laugh my ass off at anything you say about security. Well, on top of your not being able to tell the difference between host and client.&lt;br /&gt;&lt;br /&gt;When your security is about protecting your end user from outside interference, you can brag about it. But when your security is there to protect you *from* your customer, you don't want anyone to know anything about it. Ideally you'd prefer them not to even know its there.&lt;br /&gt;&lt;br /&gt;But to answer that one question, "why don't you" ... Anything, absolutely anything, we do say about our security is potentially akin to putting a notice on your front door that says "This house is LOCKED! Key is under a rock somewhere in the yard".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-113850671096147955?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/113850671096147955/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=113850671096147955' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113850671096147955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113850671096147955'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/01/discussing-hackers.html' title='Discussing hackers'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-113814319510438610</id><published>2006-01-24T16:47:00.000-06:00</published><updated>2006-01-24T16:53:15.140-06:00</updated><title type='text'>Ringtones are the new ringtones</title><content type='html'>There seems to be a slow trend away from annoying ring tone songs and towards MP3s of ringing phones... It can be a little annoying - my ringing-tone turns out to be in several TV ads and the desk phones in Law &amp; Order and Law &amp; Order: CSI. In the last month or two I've noticed more phones "ring" than annoying me with some badly digitzed song fragment.&lt;br /&gt;&lt;br /&gt;Not been too many updates here lately, Christmas wore me out :) We're beavering away on 1.22 and 1.23 of the game, I'm finally getting over my rash of 18-20 hour days over Xmas, although I seem to have pulled something in my neck, so I'm resorting to sleeping on my lazi-boy as getting out of bed presents a painful physical challenge in the mornings ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-113814319510438610?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/113814319510438610/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=113814319510438610' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113814319510438610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113814319510438610'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/01/ringtones-are-new-ringtones.html' title='Ringtones are the new ringtones'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-113615499310247492</id><published>2006-01-01T16:26:00.000-06:00</published><updated>2006-01-01T16:39:45.540-06:00</updated><title type='text'>Holidays make man's hair fall out</title><content type='html'>&lt;img src="http://ww2.kfs.org/bald.jpg" align="left" /&gt; Actually, it was for a kids charity, but later on when I was calling &lt;a href="http://gophur.playnet.com/"&gt;Gophur&lt;/a&gt; to wish him a happy new year, we got to discussing the &lt;a href="http://forums.battlegroundeurope.com/showthread.php?t=77642"&gt;1.21&lt;/a&gt; release, I said "the first two weeks, well, week and a half" and he pointed out that 1.21 had only just been out for over a week...&lt;br /&gt;&lt;br /&gt;It's been a long, hard holiday... I could have sworn its been 3 weeks! :)&lt;br /&gt;&lt;br /&gt;Had a ton of fun with all the people I've hung out with during 1.21, new players and old, returning soldiers, hangers on, Axis and Allied. If nothing else, I've worked up a good head of enthusiasm for starting back to working on those rough edges and getting the UI systems working more the way you'd expect them to with all the changes Brigades on Map has introduced...&lt;br /&gt;&lt;br /&gt;But I'd swear that if I hadn't had it shaved off, it would all have fallen out anyway.&lt;br /&gt;&lt;br /&gt;Happy New Year :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-113615499310247492?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/113615499310247492/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=113615499310247492' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113615499310247492'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113615499310247492'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2006/01/holidays-make-mans-hair-fall-out.html' title='Holidays make man&apos;s hair fall out'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-113586625576612031</id><published>2005-12-29T08:13:00.000-06:00</published><updated>2005-12-29T08:25:55.076-06:00</updated><title type='text'>Unclean, unclean...</title><content type='html'>I spent the night playing French... I actually tried to get some sleep but got a call within 30 minutes of dozing off to say the servers were down. Note to readers: If you happen to come across a game devs cell number, calling him at 3am in the morning to tell him "the servers are down" probably warrants a quick check to make sure your farkin modem hasn't locked up first.&lt;br /&gt;&lt;br /&gt;After checking on the game I sorta couldn't resist just checking to see if anything was still happening, and then I sorta couldn't resist spawning in, and well... So I spent all but 40 minutes of the night (the attempted sleep) playing French.&lt;br /&gt;&lt;br /&gt;And...&lt;br /&gt;&lt;br /&gt;I... &lt;i&gt;had&lt;/i&gt; ... &lt;small&gt;&lt;i&gt;had fun&lt;/i&gt;&lt;/small&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://ww2.kfs.org/jarny.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;It's all a blur... Etain... Spincourt... Jarny... Etain... Jarny...&lt;br /&gt;&lt;br /&gt;Crazy infantry fights, we had the church in Jarny, we lost the church in Jarny, we had all the depots in Jarny, the enemy were surrounding the AB, we cleared them all out. I found a whole horde of EI trying to rush the east entrance to the AB and mowed them down with my Panhard, only to be destroyed by a sapper moments later.&lt;br /&gt;&lt;br /&gt;Fighting in Etain was incomprehensible. My tired, addled, cooked little brain at one point managed to spare a moment during a respawn to think "heck, I wish our game was like this".&lt;br /&gt;&lt;br /&gt;In the infantry &lt;u title="and by gameplay I mean not counting things like the predictor code or update rates etc which are mechanics not gameplay"&gt;gameplay&lt;/u&gt; the thing that stands out to me, and which also lacks in other areas, is on-the-fly teamwork. Three guys run into a berm, shoot some enemy infantry and move off separately. Or a guy willing to lead new players, or work with others to try and take a depot, or smoke an enemy position and advance on it... If we could make those groups easier to create and easier to maintain - just a sort of in-field grouping system... That could make all kinds of gameplay kinda interesting. Let infantry team up with a tank to provide support, or the truck and the 2 atgs he's going to tow, etc, etc...&lt;br /&gt;&lt;br /&gt;It looked like we were a hell of a lot of fun to shoot =)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-113586625576612031?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/113586625576612031/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=113586625576612031' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113586625576612031'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113586625576612031'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2005/12/unclean-unclean.html' title='Unclean, unclean...'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-113564932294881668</id><published>2005-12-26T19:55:00.000-06:00</published><updated>2005-12-26T20:08:42.980-06:00</updated><title type='text'>Ruddy 'eck, when did FBs become full on battles?</title><content type='html'>Last night I found myself in the area of Boxtel/Tilburg FB after some server-alerts about a client. Soon as I said "ahem" on the target channel the guy logged.&lt;br /&gt;&lt;br /&gt;I stayed for a bit see if anything else was fishy, but the fight going on below was pretty awesome, and even though there were a couple of airfields nearby the air was pretty much pre-occupied with itself and the AA guns blasting it out of the sky. It looked like fun. It was 12.50am. Spawned in a sapper and started making my way there.&lt;br /&gt;&lt;br /&gt;Had a chance to chat with various people, and particularly appreciate that some of the folks who hadn't seen a rat before didn't immediately jump into talking shop - that's usually a good measure that the people you're with are having enough fun that they don't see you as customer service. I got kills, I got killed. We tried mobile spawning, we rode in on trucks, we rode in with tanks, we walked. We threw grenades and we caught grenades. Ouch.&lt;br /&gt;&lt;br /&gt;Slowly satchels were making it onto the FB, but it seemed to be taking for ever. Finally we managed to push forward and we were within nade range of the FB. Folks bunched up and prepared to rush. And somehow the Allies bounced us. Next thing we knew we were waiting for fresh mobile spawns. But this was fun. It was a dang battle.&lt;br /&gt;&lt;br /&gt;Finally we managed to surround and access the FB, although it took a few for engineers to move up again and lay charges. But finally it was gone. Out of curiosity, I typed "/time".&lt;br /&gt;&lt;br /&gt;5.16am.&lt;br /&gt;&lt;br /&gt;WTH!&lt;br /&gt;&lt;br /&gt;I finished up my conversations and logged out. Just as I was exiting I saw "MSP Up for tilburg"... Heck. I was up this late already... I logged right back in. It took us another hour+ to capture tilburg. We really didn't know if we were going to make it - we were down to single figures of riflemen and not much else... We got a tiny trickle of armor from Division HQ, but Allied air and 2lbers did a pretty good job of stopping a roll. We lost our grip on the last armybase, and the Allies broke back out and we were discussing whether to pull out. And then, suddenly, we were in the AB and the table was ours.&lt;br /&gt;&lt;br /&gt;I finally logged out at 8am - after 16 hours in-game. I saw 2, maybe 3, people voicing dislike for some of the changes, but I noticed the latter was saying everyone had &lt;i&gt;told&lt;/i&gt; him this new patch sucked. He played with us for a good 5 hours and he seemed to be having fun at Tilburg there ;)&lt;br /&gt;&lt;br /&gt;Man it was a blast - It's taken a force of willpower to keep myself from logging in today. Now hopefully that'll translate into some fresh energy for getting to work on some of the less successful aspects of this patch that will make it work for a few of the people currently not liking it a whole lot.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-113564932294881668?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/113564932294881668/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=113564932294881668' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113564932294881668'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113564932294881668'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2005/12/ruddy-eck-when-did-fbs-become-full-on.html' title='Ruddy &apos;eck, when did FBs become full on battles?'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-113558228130328062</id><published>2005-12-26T01:21:00.000-06:00</published><updated>2005-12-26T01:31:21.303-06:00</updated><title type='text'>And I don't hate the Mac...</title><content type='html'>I had to use one once and hated having to use it. It's not for me. But I do like what the Mac is - which is a system designed &lt;i&gt;for&lt;/i&gt; its users rather than designed &lt;i&gt;because&lt;/i&gt; of them, like Windows. The trouble is the whole Mac ethos is so different than what I have to work and live with that it's actually more complex than Windows for me to adapt to. Using a Mac is thus as unpleasant an experience for me as it is for you Macaholics to use Windows or FVWM. Mac is simpler and more common sense for your traditional human being. For my needs its actually confusing and scary.&lt;br /&gt;&lt;br /&gt;Not a Mac hater, but not a Mac user. And absolutely not a Mac programmer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-113558228130328062?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/113558228130328062/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=113558228130328062' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113558228130328062'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113558228130328062'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2005/12/and-i-dont-hate-mac.html' title='And I don&apos;t hate the Mac...'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-113558153921107063</id><published>2005-12-25T23:48:00.000-06:00</published><updated>2005-12-26T01:18:59.243-06:00</updated><title type='text'>Annecdotes and poll.</title><content type='html'>Many years ago my company sent me to work on a computer system at a tour operator's called Marshall Suttons. The system looked great in concept on paper but it was an abomination to work with. Multiple screens for data entry, and data ordered into a logical fashion. The company already had working paper-based systems for this sort of stuff, and the computer system paid no attention to it whatsoever. I was 17 or 18, and new at this, and the guys I worked for had some experience under their belts, but it really seemed to me like the computer didn't ought to be dictating how the business ran, it should be a tool that did as much of the work as possible. The staff at MS weren't very happy with the system they were getting.&lt;br /&gt;&lt;br /&gt;The system was entirely text based on simple green-screen terminals. One day, while waiting on a full system compile (which took 30-40 minutes), I made a replacement input screen which looked a lot more like the forms that the staff worked on. And that evening I goofed off and expanded the programming environment to allow me to modify the display in a window-like fashion. The result was an entry screen where parts of the screen expanded and contracted as you focused them, so that data could be summarized where possible. For instance, displaying the full name and address was uneccessary most of the time.&lt;br /&gt;&lt;br /&gt;My bosses hated it. So I left it alone.&lt;br /&gt;&lt;br /&gt;A few months later, we had a meeting with Bob Marshall, and he was basically ready to kick us out on our ear. The system was dreadful and his staff hated it. The system was probably fine, nicely designed and thought out, just nicely designed and thought with no regard to the way in which Marshall Sutton operated.&lt;br /&gt;&lt;br /&gt;During this meeting, Bob highlighed some points. Ugh. Highlighted is not the word. I was genuinely worried for Bob's health as he got more and more angry and frustrated. His business was on the line here, and my bosses had the smug look of guys who are expecting to teach a fool that the grass is green.&lt;br /&gt;&lt;br /&gt;And I watched these couple of software developers try to sell Bob dry water. They wholly believed in the system they were selling him, in what was being delivered to him. And they had a point - the system had been well specified, nothing Bob complained about wasn't covered in the spec. I'm guessing his senior member of staff, Angela, had gone over the spec for him and told him what a steaming pile of crap it was from an end-users perspective, especially someone who would have to use it to conduct his business.&lt;br /&gt;&lt;br /&gt;[i]Lesson taken: Unless you're writing a piece of software for yourself, you're writing software for other people. And when you write software for other people, the first thing you should do is find out what and how its going to be used for. Don't ask what you're going to write, ask whos gonna use it and what for.[/i]&lt;br /&gt;&lt;br /&gt;At the point where the meeting was about to collape, little me stepped in. Bob and my bosses were arguing and Angela and I had gone to make tea. Angela was asking me if I would stay with the company if Bob ended their contract, and somewhere in the conversation, feeling a degree of attachment to these people I had essentially been working with for 6 months, I tried to give her some pointers for the *next* computer system.&lt;br /&gt;&lt;br /&gt;"You should make them design the entry screens based on your existing forms. Make them look at ALL the forms, show them the postits you use, etc. Make them start from that". This, from one of the computer people, appeared to thoroughly astonish her. She was quick to ask why I hadn't thought of that before, though. So since we were near the main computer, and I'm a defensive git when my reputation is on the line, I showed her my screen(s).&lt;br /&gt;&lt;br /&gt;We kept the contract. And the whole system rapidly changed from being clinical "comp.sci" textbook layouts for data entry to looking far more like Marshall Sutton's computer system.&lt;br /&gt;&lt;br /&gt;One other lesson I learned working at MS was so simple and obvious. I'd been creating reports, when Bob came over and gave me the thumbs down on a couple of my screens. Then he produced a piece of paper and explained why. On the paper was a report I'd just created, which highlighted a bad design habbit I had. "Never put related pieces of information so far apart they don't look related" he told me. There, sure enough, I had split the information up into an order that "made sense" to me. In some places I had left justified one field and right justified the other with the notion that some separation kept the values clearer, but what it did was create a gap between them that the average human subconsciously takes to indicate unrelatedness.&lt;br /&gt;&lt;br /&gt;I went thru and touched up all of my screens with that in mind, and the number of errors made by the staff dropped to less than 33% of what it had been before; less mistakes made meant less time apologizing/making up to customers, lead to happier staff... Win-win situation.&lt;br /&gt;&lt;br /&gt;And maybe its because of that... The way our new brigade flags are done *really* winds me up. Every single time I look at those flags I hear Bob Marshall's voice. At one point we had a huge pole on the flags so that you could actually comfortably fit another town beween a town and its flag. The gap got reduced by scaling the whole thing down, but what I was actually thinking was just to tuck the flag under the icon a little ways.&lt;br /&gt;&lt;br /&gt;So - which flag format do you prefer? Post a comment with "1", "2" or "3" on the first line...&lt;br /&gt;&lt;br /&gt;1:&lt;img src="http://ww2.kfs.org/flag1.png" /&gt;&amp;nbsp;2:&lt;img src="http://ww2.kfs.org/flag2.png" /&gt;&amp;nbsp;3:&lt;img src="http://ww2.kfs.org/flag3.png" /&gt;&lt;br /&gt;&lt;br /&gt;My thinking is that if the filters are set, by default, not to show towns which don't have brigades in the first place, then the icons don't need to be a massively huge as we were originally thinking. They can be dinky small things as shown. I'm torn between 2 and 3. That gap just drives me up the wall :) I like #2 because it is "in" the town, not next to it, above it, off to one side of it or near it.&lt;br /&gt;&lt;br /&gt;As to multiple brigades, lining them up doesn't work very well with the penants, given how small they are, but angling them a little bit seems to cure that.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://ww2.kfs.org/mflags.png" /&gt;&lt;br /&gt;&lt;br /&gt;Although as you can see by this point I've already started getting lazy with my paintshopping ;)&lt;br /&gt;&lt;br /&gt;Hope you all had a happy Christmas and have a great new year.&lt;br /&gt;&lt;br /&gt;- Oliver&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-113558153921107063?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/113558153921107063/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=113558153921107063' title='24 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113558153921107063'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113558153921107063'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2005/12/annecdotes-and-poll.html' title='Annecdotes and poll.'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>24</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-113557336702879600</id><published>2005-12-25T22:53:00.000-06:00</published><updated>2005-12-25T23:06:30.400-06:00</updated><title type='text'>Map filters</title><content type='html'>I dunno why Ramp turned ALL of the map filters on by default - I didn't even think to mess with them until just now and when I did it makes the map almost like a different beast.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://ww2.kfs.org/mopts.jpg" target="view"&gt;&lt;img src="http://ww2.kfs.org/mopts_t.jpg" align="left"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Obviously, if you're navy/air you may want to check the relevant filter option on...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-113557336702879600?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/113557336702879600/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=113557336702879600' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113557336702879600'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113557336702879600'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2005/12/map-filters.html' title='Map filters'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-113545466706934899</id><published>2005-12-24T13:57:00.000-06:00</published><updated>2005-12-24T14:04:27.070-06:00</updated><title type='text'>So not everyone hates brigades</title><content type='html'>Krafty &lt;a target="new" href="http://forums.battlegroundeurope.com/showthread.php?p=1165411&amp;posted=1#post1165396"&gt;wrote&lt;/a&gt;:&lt;br /&gt;&lt;div class="quote"&gt;If youve been watching the south since the 1.21 came up, youll have noticed that the 17th Infantry division broke through the lines of the french army at stenay for the better of an afternoon, and was able to move its division in, and capture towns cutting off montfaucon from the factories, alot of towns were capped, because the 17th was able to capture towns faster than the french could move thier brigades back from the front lines to chase them down. This over stretched the 17th, and the 1st panzer division (im in this division, as is the 31st) was pulled down from defense of bertrix around beauring, vireaux, that area, and had to reinforce the towns the 17th had previously been defending. This left an opening that the french exploited and they took wellin, putting a huge threat on bertrix. The 17th was forced to give up those towns, and had a heck of fight to not get taken off the board (be destroyed) by getting encircled...fortunately a running fight put things back how they looked at the starting line, as the 1st PD went back up north a bit, took back wellin, and got back to defending bertrix. At the end of a 40 hour period, the lines looked the same, but the french were low on equipment, since a huge chunk of towns were cut off from the factories for about 10 hours. Thats about one and half ab's full of equipment to all those towns that didnt get there...the supply is back to normal now, but alot of towns are drained.&lt;br /&gt;&lt;br /&gt;You cant tell me the fact that all that can happen in a video game isnt freaking cool....&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Given the number of people in the forums, and given how few posters there are generally hating on brigades, I think there's something good in there. The amount of discussion indicates, as we expected, that we are going to have to scrutinize and tweak very closely. The 1-man-cap-trains may turn out to be a non-issue, if they do, we have some ideas that introduce different and interesting gameplay and still solve those issues, but they involve extra rules, and this games is becoming D&amp;D like in its rules. TOEs take away the need for a lot of rules. You are here.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-113545466706934899?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/113545466706934899/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=113545466706934899' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113545466706934899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113545466706934899'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2005/12/so-not-everyone-hates-brigades.html' title='So not everyone hates brigades'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-113543506126208517</id><published>2005-12-24T08:22:00.000-06:00</published><updated>2005-12-24T08:44:18.363-06:00</updated><title type='text'>Hamster powered server architecture.</title><content type='html'>Christmas: Not the right time of year to find a couple of your servers having issues that smack of tickling some kind of OS or C library bug with your operating system.&lt;br /&gt;&lt;br /&gt;What I'm about to describe comes with the job of being the lead host developer at a small dev company. I'm not looking for sympathy, I just thought it might give you a little something to take the sharp edge off any server burps that I haven't yet flattened. Whatever the cause, the server burps are my fault so please don't post sympathy comments, it's nearly as annoying as being in game when the server craps out.&lt;br /&gt;&lt;br /&gt;I spent my evening in intense analysis of the server burps looking at code, reviewing code changes and even the "diff" files from recent operating system patches to see if anything we use was touched or covered.&lt;br /&gt;&lt;br /&gt;Finally I caught a couple hours sleep, with my laptop up and running next to my pillow, with terminal logins to each of the servers. Naturally the keyboard was locked to stop me rolling over and kicking you all out of the game.&lt;br /&gt;&lt;br /&gt;It would have been 3 hours sleep but for the first hour I couldn't stop watching the logs scrolling past. And the 2 hours I did catch I had a recurring dream where I would see the terminal window show an error that meant the server was going to crash, and I would press the wrong key, the server would crash and my network connection would pack up, and we'd have to get someone at the network center to go reboot everything. But the chat host wouldn't restart and the hot swap boxes were failing.&lt;br /&gt;&lt;br /&gt;And then I'd wake up. It had been a dream. And I'd look at the laptop and the terminal windows were showing an error that meant the server was going to crash... Cycle :)&lt;br /&gt;&lt;br /&gt;After 2 hours of that I was in a state of terror - I have no idea how I was actually staying asleep, which is probably why I finally woke up (I mean, I assume I'm awake, if I've started blogging my dreams in my sleep keep the pooch away from me). And I looked at the lap top and, sure enough, there was the error - servers down! Unlike my dreams the keyboard lock on the laptop completely foiled me, and by the time I had woken up enough to get around that, I realized that the servers were still up, Windows had just decided to move my old snapshot of what happened yesterday into focus.&lt;br /&gt;&lt;br /&gt;Fun fun fun :)&lt;br /&gt;&lt;br /&gt;Oh, you're wondering "Don't you have monitoring systems?" Yes, we do. When the servers have issues, pagers go off. And yes, we have systems for managing the servers and bringing things up and down. But whenever we have stability issues I have to kick into instant live mode, i.e. wearing both the coder and server hats at once.&lt;br /&gt;&lt;br /&gt;The trick is to be aware that by splitting your focus much greater attention to detail and care are required. Coders make lousy system administrators and SAs make lousy coders. (Ain't that right, &lt;a href='http://www.dubdubdub.co.uk/'&gt;Mike&lt;/a&gt;?) So I need to make sure I have both SA and Coder information to hand as readily as possible. And when you're dealing with a new issue and as yet unidentified issue, like this, hands on access to logs, etc, is often vital to supporting the conclusions of the pre-existing monitoring/detection tools - which may easily misinterpret the issue.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-113543506126208517?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/113543506126208517/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=113543506126208517' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113543506126208517'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113543506126208517'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2005/12/hamster-powered-server-architecture.html' title='Hamster powered server architecture.'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-113531344268931367</id><published>2005-12-22T21:26:00.000-06:00</published><updated>2005-12-22T23:15:29.736-06:00</updated><title type='text'>I need fingernails</title><content type='html'>I've chewed the old ones off.&lt;br /&gt;&lt;br /&gt;This &lt;a href="http://forums.battlegroundeurope.com/showthread.php?t=77642"&gt;last patch cycle&lt;/a&gt; has been a real dog. What you see is the result of virtually no effort.&lt;br /&gt;&lt;br /&gt;At least on actually writing code.&lt;br /&gt;&lt;br /&gt;Every single line of code in this cycle has had broad reaching implications. The rules that we released are &lt;i&gt;very&lt;/i&gt; close to those in the spec we started with 6 weeks ago, which is again very close to the original spec for 5 years ago.&lt;br /&gt;&lt;br /&gt;But we questioned everything again and again and again, because as we worked through it we tried out different contexts and goals. There is going to be a &lt;i&gt;lot&lt;/i&gt; of canned-sounding "we already thought of that" for the next few weeks.&lt;br /&gt;&lt;br /&gt;If you read those patch notes or &lt;a href="http://forums.battlegroundeurope.com/showthread.php?t=74333"&gt;Gophur's Brigades Primer&lt;/a&gt;, it sounds scarily complex. But actually you can boil the rules down very simply (or it would have taken me much longer to code, since code is all about rules).&lt;br /&gt;&lt;br /&gt;Because these rules are far-reaching, its often neccessary to explain both sides of the rules, which makes it sound like there are two rules.&lt;br /&gt;&lt;br /&gt;Some of the rules weren't entirely clearly expressed, perhaps. Its taken a few people a while to understand that you can *create* an isolated brigade by moving one of its neighbors, you just cant move a brigade into a location that isolates &lt;i&gt;it&lt;/i&gt; from all of its divisional group members.&lt;br /&gt;&lt;br /&gt;Consider the following towns. If you find your brigade deployed here, you've really done something wrong. For those unfamiliar with the game, these are &lt;i&gt;not&lt;/i&gt; in-game screenshots, and I am so clearly not an artist :)&lt;br /&gt;&lt;img src="http://ww2.kfs.org/images/map1.png" /&gt;&lt;br /&gt;&lt;center&gt;&lt;hr width="40%"/&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;An HC officer moves Brigades B1 and B2 up to Swinhope and Louth.&lt;br /&gt;&lt;img src="http://ww2.kfs.org/images/map2.png" /&gt;&lt;br /&gt;&lt;center&gt;&lt;hr width="40%"/&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;He moves the Division HQ up to Swinhope. Doing so appears to be invalid because now Brigade 2 is no-longer within 1 link of the division? True. But Brigade 2 wasn't moving, so it is left alone. You'll see why shortly.&lt;br /&gt;&lt;img src="http://ww2.kfs.org/images/map3.png" /&gt;&lt;br /&gt;&lt;center&gt;&lt;hr width="40%"/&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;He moves Brigade 1 to Binbrook. Brigade 2 is still isolated off in Louth. They must really have annoyed someone.&lt;br /&gt;&lt;img src="http://ww2.kfs.org/images/map4.png" /&gt;&lt;br /&gt;&lt;center&gt;&lt;hr width="40%"/&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;Brigade2 keeps loosing Vickies in Hubbard's Hills (what part of "Hills" do the drivers not understand?). They need DivHQ to do that. So DivHQ moves to Tetney. This is a valid move because Tetney is one-link from a divisional member - even though the member was previously isolated.&lt;br /&gt;&lt;img src="http://ww2.kfs.org/images/map5.png" /&gt;&lt;br /&gt;&lt;center&gt;&lt;hr width="40%"/&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;The confusing part that I hope to clarify is that the movement rule is a limitation to on where you can move *to*. The destination must be within a link of another divisional member. So: Brigade1 couldn't move further away from DivHQ, say to Tealby. But it *could* move back to Swinhope, since this would put it one link from a divisional member.&lt;br /&gt;&lt;img src="http://ww2.kfs.org/images/map9.png" /&gt;&lt;br /&gt;&lt;center&gt;&lt;hr width="40%"/&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;However&lt;/i&gt;: If the DivHQ were to move up one more place then Brigade 1 would become stuck, because none of the linked towns are 1-link from a divisional member anymore.&lt;br /&gt;&lt;img src="http://ww2.kfs.org/images/map10.png" /&gt;&lt;br /&gt;In order to recover, DivHQ or B2 has to move back to Tetney or Grimsby to provide B1 a valid move destination once more.&lt;br /&gt;&lt;center&gt;&lt;hr width="40%"/&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;There are a few other misunderstandings that people aren't sure about yet... If you cut off supply to a pocket in which the enemy has no brigades, we don't automatically hand them back to you. This could perceivably be a pain to undo if the enemy manages a deep penetration somehow. But we think you're all smart enough to figure that out :)&lt;br /&gt;&lt;br /&gt;Some folks thought you could only attack a town within range of a brigade. That's part of the plan for TOEs. We didn't do it right now because it killed paratroopers off as capturing infantry, but also because we're not yet ready for the removal of AOs.&lt;br /&gt;&lt;br /&gt;Other folks are worried it will create an "avoid the fight chess" system. Why we don't think it will is just too long to go into. Its one of the reasons that showing you the enemy brigades is the right thing to do for now. But we do expect and hope for some degree of free-cap chasing. I think players will start to see why as it plays out :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-113531344268931367?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/113531344268931367/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=113531344268931367' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113531344268931367'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113531344268931367'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2005/12/i-need-fingernails.html' title='I need fingernails'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-113503275154536149</id><published>2005-12-19T16:50:00.000-06:00</published><updated>2005-12-20T12:38:57.370-06:00</updated><title type='text'>This made my day</title><content type='html'>... and will probably last me the next week or two. It's been 3 years since I went from Player to Rat; most of you who've been with us that long have taken some time out from the game during that time - maybe a week or two, probably a lot longer. Not so for us. 5-7 days a week, 60-120 hours a week, we're in the game one way or another. And with all that I've forgotten the amazing "moments" (snail) I had that made me want to work on the game to try and make some of the bad stuff right.&lt;br /&gt;&lt;br /&gt;&lt;div class="quote"&gt;In fact, once you're caught up in the moment, there are some beautiful experiences to be had. Sure, the inside of a shed is pretty ugly even by the standards of five years ago, but taking off in a bomber and seeing the whole player-driven formation rise up around you, fading in and out as you ascend through the clouds, is breath-taking. Seeing tanks open up against each other as tiny people run for their lives between trees and hedgerows is unlike anything else you can play (except perhaps Flashpoint), and so it's these moments that really begin to decide what Battleground Europe is all about. When you get up into the sky and begin to see the sheer scale of what is going on here, or when you make a night raid on one of the front line 'forward bases' that spring up from enemy territory, you realise what a majestic and impressive game Battleground Europe can be. &lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.eurogamer.net/article.php?article_id=62195"&gt;Link&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Addendum:&lt;/i&gt; We manage to occupy two pages of &lt;a href="http://www.amazon.com/gp/product/0471752738"&gt;Scott Jenning's&lt;/a&gt; new book, but merely by merrit of being placed near the end of the first page ;) Our "roleplayers" are more on the renfair end of roleplay than RPGers, and we just don't fit the conventions very well (pull in the vis range by about 3km, crank up the polys, get rid of those complex colliders and give everything a health bar and get rid of physics, oh, and dumb-down movement so you're not trying to reflect the accuracy required for two riflemen to shoot at each other between churches 600m apart when all either can see is 4 pixels by 2 pixels: &lt;b style='font-size: 16pt;'&gt;l&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-113503275154536149?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/113503275154536149/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=113503275154536149' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113503275154536149'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113503275154536149'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2005/12/this-made-my-day.html' title='This made my day'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-113503004789321318</id><published>2005-12-19T15:54:00.000-06:00</published><updated>2005-12-19T18:41:04.120-06:00</updated><title type='text'>Still here</title><content type='html'>Thank you for the mails and PMs etc, but the recent departures didn't include me, and I'm not expecting to need my passport anytime soon. You'll have to look elsewhere for details first and foremost because the folks who went were good friends.&lt;br /&gt;&lt;br /&gt;I will tell you, tho, that the chicken tenders I had at Bennigans last week made me very, very ill. Coupled with the simple shock at last week's news made for a bloody miserable weekend. Took timeout from coding (and barfing) to play a little EQ2. The "mentor" system is pretty cool.&lt;br /&gt;&lt;br /&gt;Poking away at the last frayed edges of the brigade system which is by and large working well - winnowed out most of the minor issues (which occasionally manifest as seemingly huge issues, if you don't think in code-terms). Nothing exciting to report really except continued forward progress :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-113503004789321318?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113503004789321318'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113503004789321318'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2005/12/still-here.html' title='Still here'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-113461841753405508</id><published>2005-12-14T21:46:00.000-06:00</published><updated>2005-12-14T21:46:57.566-06:00</updated><title type='text'>Preload the SDMs already...</title><content type='html'>... I'm tired and wanna go home.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-113461841753405508?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/113461841753405508/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=113461841753405508' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113461841753405508'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113461841753405508'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2005/12/preload-sdms-already.html' title='Preload the SDMs already...'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-113459918361966996</id><published>2005-12-14T16:25:00.000-06:00</published><updated>2005-12-14T16:27:06.696-06:00</updated><title type='text'>It's a good job I do code reviews</title><content type='html'>Because these lines appeared to be important&lt;br /&gt;&lt;br /&gt;&lt;div class="quote"&gt;facility-&gt;country = newCountry;&lt;br /&gt;facility-&gt;side = newSide;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;So I decided to put them back in.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-113459918361966996?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/113459918361966996/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=113459918361966996' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113459918361966996'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113459918361966996'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2005/12/its-good-job-i-do-code-reviews.html' title='It&apos;s a good job I do code reviews'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-113446702916048544</id><published>2005-12-13T01:57:00.000-06:00</published><updated>2005-12-14T20:00:20.376-06:00</updated><title type='text'>Skillz</title><content type='html'>I played EQ for 4 years - I played a Bard and an Enchanter. The Enchanter got invited on all kinds of raids because he had abilities that were basically essential to raiding. On the other hand, the bard wasn't essential, just handy. But groups that knew me were more likely to ask me to bring my bard, because when I worked that bard we could do stuff that the devs hadn't planned for.&lt;br /&gt;&lt;br /&gt;For many of the people who keep coming back to WWII Online, I think its because of the skills you can develop &lt;i&gt;yourself&lt;/i&gt;. I'm not talking about twitch, although that is a part of it, our game is also a bit more cerebral than that. It's always going to limit our appeal - people, by and large, don't get that putting 50 rounds into the same spot on a tank doesn't do anything unless there is something to damage at that spot. Balistics are complicated and its hard to understand why shooting a tank with a 5 degree slope can make it invulnerable...&lt;br /&gt;&lt;br /&gt;I've been wondering why I can't seem to settle in any other MMO since EQ1, and I think that's it. DAoC kept me longest after EQ because the RvR involves both grey matter for team work and skills.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-113446702916048544?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/113446702916048544/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=113446702916048544' title='25 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113446702916048544'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113446702916048544'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2005/12/skillz.html' title='Skillz'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>25</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-113446042803892553</id><published>2005-12-13T00:46:00.000-06:00</published><updated>2005-12-13T04:28:48.870-06:00</updated><title type='text'>Don't give me credit...</title><content type='html'>... all I do is tell the client which towns should have what icons. All the good graphical stuff is the hard work of RAMP and GRANIK. But its coming along rapidly. And I got automatic handover of mission leader working in a flash too.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://ww2.kfs.org/mercyme.jpg"&gt;&lt;img src="http://ww2.kfs.org/mercyme_t.jpg" /&gt; Click for full size&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Please resist the urge to repost this on the forums, thanks :-P&lt;br /&gt;&lt;br /&gt;Edit: PS -- The image suffered badly in the jpeg conversion, some of the icons are animated and some of the text pulses to draw your attention - that's why some bits look oddly faded (they are, bad timing on the screenshot :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-113446042803892553?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/113446042803892553/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=113446042803892553' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113446042803892553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113446042803892553'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2005/12/dont-give-me-credit.html' title='Don&apos;t give me credit...'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-113431337208791225</id><published>2005-12-11T08:39:00.000-06:00</published><updated>2005-12-11T15:51:13.790-06:00</updated><title type='text'>Calling Zephraim Cochraine</title><content type='html'>&lt;a href="http://www.cnn.com/2005/TECH/space/12/09/russia.esa.clipper.reut/index.html"&gt;CNN Article&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;$59 million? I'm surprized they aren't appealing to &lt;a href="http://www.cnn.com/2005/TECH/space/12/08/virgin.space.reut/index.html"&gt;Private Investors&lt;/a&gt; and contractors; the &lt;u title='I love to press the apostrophe key'&gt;Russians&lt;/u&gt; do &lt;a href="http://www.cnn.com/2005/TECH/space/10/17/olsen/index.html"&gt;pretty well at that&lt;/a&gt;. Admittedly the fall-out when they lose one is going to be phenomenal... But still it's a pleasant irony to see the Russian's pioneer this twist of capitalism.&lt;br /&gt;&lt;br /&gt;Speaking of Startrek, Scott Bakula didn't work as Captain for me on &lt;a href="http://www.startrek.com/startrek/view/series/ENT/character/1122628.html"&gt;Enterprise&lt;/a&gt;. Especially with the whole "alternate timeline" they chose, it was hard to shake the image of &lt;a href="http://www.scifi.com/quantum/"&gt;Sam Beckett&lt;/a&gt;. The slightly-hunched, downbeat, kid-being-told-off look coupled with the fact that Janeway had a deeper voice than him and the style and quality of his acting made him stand out from the rest of the cast like ... like a double or stand-in playing the part reluctantly and expecting to be replaced in the final footage.&lt;br /&gt;&lt;br /&gt;I always wanted to watch Enterprise but predicting when it was on was difficult (UPN: The screwup channel) but apparently not enough to expend effort. I wonder if throwing in the "shower scene" (t'pol and some ky-gel in the decon chamber) so early in the season set false expectations. I woulda saved that for a few episodes in. Maybe the pilot was a really hard sell without it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-113431337208791225?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/113431337208791225/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=113431337208791225' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113431337208791225'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113431337208791225'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2005/12/calling-zephraim-cochraine.html' title='Calling Zephraim Cochraine'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-113428962366752872</id><published>2005-12-11T02:19:00.000-06:00</published><updated>2005-12-11T02:27:03.703-06:00</updated><title type='text'>Excitement!</title><content type='html'>Ok - I'm exagerating. But it's one of those pesky "little" things I've wanted to put in-game so long, that I'm excited about it - almost enough to counter my aching back and sore head (yes, incase you're wondering, after reading the forums).&lt;br /&gt;&lt;br /&gt;/makeleader&lt;br /&gt;&lt;br /&gt;Woohoo!&lt;br /&gt;&lt;br /&gt;A year ago it would have seemed impossible - just due to the way things were done - at least in a reasonable time scale. As it is I did most of it yesterday - and then I've spent today stepping through and testing it (and fixing dumb typos - per e.g. when I first tried it it took me a while to spot the typo that meant you could only /makeleader yourself). I expected great pains trying to change the neccessary fields, I was sure there'd be some catch 22 in trying to exchange the neccessary info between hosts.&lt;br /&gt;&lt;br /&gt;Guess I'd just forgotten how hugely I overhauled the map/mission host. All of the variables involved are already nicely wrapped with interfaces, so it was way simpler than I expected - infact most of the work was just adding the rules and writing the text for responses.&lt;br /&gt;&lt;br /&gt;But because it's such an old "wannado" it has that bit more excitement to it - these are the kinds of things that I remember wanting to come here to fix.&lt;br /&gt;&lt;br /&gt;Kinda funny though how excited I got over this:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://ww2.kfs.org/images/ml1.jpg"/&gt;&lt;br /&gt;&lt;br /&gt;The "########" is a localized string the client doesn't yet know - but I happen to know it's saying "KFS1 is now leader of this mission".&lt;br /&gt;&lt;br /&gt;And low and behold&lt;br /&gt;&lt;br /&gt;&lt;img src="http://ww2.kfs.org/images/ml2.jpg"/&gt;&lt;br /&gt;&lt;br /&gt;It's all clicked thru nicely. Still some rough edges to polish, but I'm going to leave those until we have a client that knows about this stuff, otherwise its kinda hard to test :)&lt;br /&gt;&lt;br /&gt;But, at long bloody last, hehe :)&lt;br /&gt;&lt;br /&gt;I'll probably take a look tomorrow at whats involved in letting you change the mission target :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-113428962366752872?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/113428962366752872/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=113428962366752872' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113428962366752872'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113428962366752872'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2005/12/excitement.html' title='Excitement!'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-113418596389405484</id><published>2005-12-09T21:30:00.000-06:00</published><updated>2006-03-25T06:14:26.613-06:00</updated><title type='text'>The evil that is: the printer</title><content type='html'>So it's been years since I owned a printer. The last one I owned was a HP, and I haven't had the courage to buy another since. I fear and dread the domination of my computer by this supposedly detached external device... I mean, the printer itself was fine, and printers are just some box you put on your desk that ruin perfectly good paper, right?&lt;br /&gt;&lt;br /&gt;But its the drivers. For some reason, printers manufacturers want onto your PC. All I want is an inkjet head that I can feed paper in exchange for the odd hard copy document. It's not a lot to ask.&lt;br /&gt;&lt;br /&gt;I hunted around and finally settled on a cheap Epson Stylus C66.&lt;br /&gt;&lt;br /&gt;Scanning the documentation, and noticing the presence of a drivers disk, I was a little worried. I think I may actually be able to get away without a custom printer driver, since this printer seems to be capable of talking to windows.&lt;br /&gt;&lt;br /&gt;But somehow I got suckered into installing the driver.&lt;br /&gt;&lt;br /&gt;First obstacle, which gave no obvious feedback, was that I had disabled the RPC locator and the print spooler. The spooler I can understand, but opening the RPC locator bothers me. Never mind. It's a Windows thing.&lt;br /&gt;&lt;br /&gt;With my drivers installed, I decided to find something to print. Particularly I wanted to print out the &lt;a href="http://www.wwiionline.net/images/sapper"&gt;sapper guides&lt;/a&gt;. I had the wrong link at the time so I ended up looking elsewhere.&lt;br /&gt;&lt;br /&gt;Very strange. I couldn't seem to find a good image - they all looked a little odd no matter the website. I actually thought my resolution had gotten changed. Nope. Still in 1280x1024.&lt;br /&gt;&lt;br /&gt;The printer is sitting there in the corner of my eye, and I can sense its evil.&lt;br /&gt;&lt;br /&gt;I did a restore point to before the printer, and unplugged it. Then I visited one of the websites again. The images looked like they used to. Install the printer driver, visit the website (no reboot required). The images look different.&lt;br /&gt;&lt;br /&gt;What the hell?&lt;br /&gt;&lt;br /&gt;I fired up the game. It looks &lt;i&gt;different&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;What the hell part of "printer" don't they understand in "printer driver". I don't recall asking to have a "WIGTGIWIS" (What I'm Going To Get Is What I'm Going To See" driver. I wanted a WYSIWYG driver.&lt;br /&gt;&lt;br /&gt;And because of what's doing, it nerfs my hardware 3d acceleration. Clearly they don't expect a gamer to buy a printer.&lt;br /&gt;&lt;br /&gt;Grrrr.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-113418596389405484?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/113418596389405484/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=113418596389405484' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113418596389405484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113418596389405484'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2005/12/evil-that-is-printer.html' title='The evil that is: the printer'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-113408422491695583</id><published>2005-12-08T17:20:00.000-06:00</published><updated>2005-12-08T17:23:44.946-06:00</updated><title type='text'>Brigades</title><content type='html'>All looking fairly promising. Kinda pleased with how I've coded it too, getting to see the under-the-hood work I've done these last two years coming together in enabling me to focus on the feature detail rather than implementation detail, and trying to add rules to the strat system is nice and clean these days rather than the mess of having to find references to variables through the code and make sure all those individual bits of code were "case aware".&lt;br /&gt;&lt;br /&gt;I still want to try and find mission and brigade OIC in, if I can, I've put a fair amount of background thought and might be able to do a minimal impact implementation of both. We'll see.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-113408422491695583?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/113408422491695583/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=113408422491695583' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113408422491695583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113408422491695583'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2005/12/brigades.html' title='Brigades'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-113404032714154541</id><published>2005-12-08T04:09:00.000-06:00</published><updated>2005-12-11T02:28:01.180-06:00</updated><title type='text'>Why not to be KFS1...</title><content type='html'>Back in the WarBirds days one of the cool things about playing was that you got to see the game devs right in there playing along side you. You could tell a dev by his all caps name - like KILLER, MO, etc.&lt;br /&gt;&lt;br /&gt;When I got converted from "kfsone" in WWII Online to "KFSONE" and eventually "KFS1", it was a huge thing for some players to see not just someone they'd known for years (e.g. via my WarBirds.org fansite), but a player of their new game joining the ranks. Someone who knew what it was like.&lt;br /&gt;&lt;br /&gt;Some of my friends took it the wrong way, and it became a real drag to log in some times and be spammed with "why didn't you fix this? when will that be added? why is the other side easier to play"; especially when you're less than a month into your job and only just getting hands on code.&lt;br /&gt;&lt;br /&gt;Other people took it differently, some people have been really great; folks like the squads we "Rat Night"ed with and the folks in Quizno's dogs.&lt;br /&gt;&lt;br /&gt;Other MMO devs have a simple rule, they separate "developer" from "player" and they avoid all the hassle of players wanting customer support from you any time you appear. But there was another element to it that I didn't get.&lt;br /&gt;&lt;br /&gt;That big, all-caps, name over my head tells people "Developer". And when they see a developer they have different expectations of you. I got that, and I've tried to live by it. But just recently I've really gotten back into playing the game. I'm hooked, right now. So I turned off several of my "Rat powers", and things, it seemed, were grand.&lt;br /&gt;&lt;br /&gt;Then suddenly the forums are on fire. "KFS1 the infinite spawn machine". This has been a test of the insane exageration system. In the event of a sane post, I would have exagerated the number of vehicles spawned to be something more infinite than, say, 6.&lt;br /&gt;&lt;br /&gt;What happened?&lt;br /&gt;&lt;br /&gt;Well, I had &lt;u title="Oh, you don't believe me, and nothing I can do will persuade you otherwise anyway, but I don't feking care, this is my blog and I get to speak my mind without having to worry whether you believe or not"&gt;turned off my rat powers&lt;/u&gt; previously, especially since I was hanging out with a squad. It seemed inapropriate to be hanging out with a regular player squad with stuff enabled.&lt;br /&gt;&lt;br /&gt;But I was, however, getting my game on, and I committed a cardinal sin. I got gamey.&lt;br /&gt;&lt;br /&gt;When players are despawning quick to avoid losing equipment and respawning, it's gamey. When that player has an ALL CAPS NAME, suddenly its something more. I mean, this is the guy that writes the game and its rules, and he's using one of their crappier aspects to his advantage.&lt;br /&gt;&lt;br /&gt;Being in-game as KFS1 is one thing, but &lt;i&gt;playing&lt;/i&gt; the game as KFS1 is something else. I'd been playing the game largely as "ktx" before but for some reason playing KFS1 and letting players *see* that the Rats aren't all off playing other games or something seemed like a good idea.&lt;br /&gt;&lt;br /&gt;I've lost track of the number of stories that have evolved around the original Sierc-le-Bains fight, and the jist of some of the recent variations just don't make sense... At the moron-end of the scale, a few players have already started citing other times it was happened when it must have been me under another name. (Great, not only am I a cheater now, but I'm rampantly creating accounts to do it with).&lt;br /&gt;&lt;br /&gt;My conscience is clear. Of course half the whiners are the same folks who previously where whining that the fact they never see rats in-game is clear evidence we don't play. Look - we found one, now lets lynch him &lt;i&gt;for&lt;/i&gt; playing, and I'd bet real money that the guys that stirred this up were a couple of guys recently returned from a ban that they really made it clear they weren't going to take sitting down. How &lt;i&gt;dare&lt;/i&gt; we go from wrist-slapping to banning hackers without giving them enough warning to figure out how not to get caught.&lt;br /&gt;&lt;br /&gt;So those of you who've been suckered into believing... Ok. I won't laugh&lt;u title="HAHAHAHAHAHAHAHAHAHAHAHA. I'm tired and harrassed and feel entitled to a little unprofessionalism."&gt;.&lt;/u&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-113404032714154541?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/113404032714154541/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=113404032714154541' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113404032714154541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113404032714154541'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2005/12/why-not-to-be-kfs1.html' title='Why not to be KFS1...'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-113386580358980609</id><published>2005-12-06T04:42:00.000-06:00</published><updated>2005-12-06T04:43:26.096-06:00</updated><title type='text'>Why there is no sequel to Daredevil</title><content type='html'>&lt;img src="http://ww2.kfs.org/ouch.jpg"&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-113386580358980609?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/113386580358980609/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=113386580358980609' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113386580358980609'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113386580358980609'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2005/12/why-there-is-no-sequel-to-daredevil.html' title='Why there is no sequel to Daredevil'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-113362093378836650</id><published>2005-12-03T08:31:00.000-06:00</published><updated>2005-12-03T08:42:13.826-06:00</updated><title type='text'>Kiln People</title><content type='html'>The &lt;a href="http://www.amazon.com/gp/product/0765342618"&gt;book&lt;/a&gt;, by David Brin. Pretty good read if you don't have time for one of those books you can't put down. And slightly more thought provoking than some of other recent reads. Next up is a mixture of programming books and the latest in the C.J.Cherryh "Foreigner" series. I conceed a little bit of trepidation about that, I've found reading her last few books a bit stressful.&lt;br /&gt;&lt;br /&gt;Watched &lt;a href="http://www.netflix.com/MovieDisplay?trkid=73&amp;movieid=60025027"&gt;About Schmidt&lt;/a&gt;, which I could relate to in eerie ways and left me feeling melancholoy. Probably my favorite Nicholson film now.&lt;br /&gt;&lt;br /&gt;I seem to have spent most of this week (ok, except Monday which I spent bed-ridden due to a neck injury) in discussions about the map. Soo much information to try and cram into it. We know that what we really need are different map modes for displaying different styles of information, rather than *everyone* trying to get all their information out of one single map.&lt;br /&gt;&lt;br /&gt;Gophur finally knocked out some solid ideas on that today, which I hope Ramp will have time to put together early next week.&lt;br /&gt;&lt;br /&gt;Meanwhile I spent most of today going from point A to point A. All of the test code I've had so far has been pretty much stand alone and it was time to package it together properly into classes so that I could finish fleshing the rules out. But with one thing and another it &lt;i&gt;feels&lt;/i&gt; like I didn't get anywhere. When I get up again later on this afternoon and plug my new classes in ... then it'll feel like sudden and lightning-fast progress.&lt;br /&gt;&lt;br /&gt;Ramp had some cool ideas for trying to anchor units together, but when it came to coding them they need too much detail-attention. It's amazing how something as easy as "check to see if you are near" translates into "write a spanning tree algorithm to determine the shortest distance across the network to a node whos existence you will only be able to verify or refute when you have either found it or exhausted the network". I could spend as long on that simple sounding, but entirely not-in-the-spec, feature as I will on the rest of the feature set... Eeek.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-113362093378836650?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/113362093378836650/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=113362093378836650' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113362093378836650'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113362093378836650'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2005/12/kiln-people.html' title='Kiln People'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-113340255044630591</id><published>2005-11-30T18:02:00.000-06:00</published><updated>2005-11-30T20:02:30.620-06:00</updated><title type='text'>SHOW US THE NUMBERS! WE PAID FOR THEM!</title><content type='html'>I realize that some of our players are &lt;i&gt;bewildered&lt;/i&gt; by our stance on disclosing player counts and populations. I realize that some of them are naturally going to see it as proof of some kind of numbers-imbalance conspiracy.&lt;br /&gt;&lt;br /&gt;But I'd have thought that, by now, some of them would start to register that it's not just us. Other MMO games make the same decision. Almost like, I dunno, it makes sense to people who run this kind of business.&lt;br /&gt;&lt;br /&gt;Last time this sort of discussion flared up on forums (that I noticed, anyway) the popular retort to this was "WoW's beta shows numbers". "Yes, while it's in beta", I replied. A small few players rebutted with "No! They will continue showing numbers after release, there is no reason not to!" and it flared up again so I went back to working on stuff. WoW stopped displaying numbers around about the time they released.&lt;br /&gt;&lt;br /&gt;Oddly, lots of our players think we don't play our game, or pay any attention to it, or monitor it. Plenty of them don't think we've ever been in another MMO. I recently had an email from a player saying&lt;br /&gt;&lt;div class="quote"&gt;When I log into any other MMO in the world, such as EverQuest or StarWasGalaxies both of which I play frequently, and Worlds of Wacraft which I also play, I can see player numbers. CRS hides the numbers because you are going bankrupt but don't have the balls to admit it&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Well, Chuck, anyone with &lt;a href="http://www.google.com/search?hl=en&amp;lr=&amp;c2coff=1&amp;q=playnet+chapter+11"&gt;access to google&lt;/a&gt; can see that we've been there done that. We're nowhere near Chapter 11 or bankrupcy at the moment. As for EverQuest and StarWa&lt;b&gt;r&lt;/b&gt;s Galaxies, they show server populations as "Light", "Medium" and "Heavy". I don't see anywhere else they show you player &lt;i&gt;numbers&lt;/i&gt;. And even Sony's "EverQuest2 players" doesn't show you actual player numbers - although with a little work you can work out the number of characters on a particular server - they don't outright reveal those figures tho.&lt;br /&gt;&lt;br /&gt;World of WarCraft hasn't kept its &lt;i&gt;box sales&lt;/i&gt; a secret, nor has it been shy about the peaks of its subscriber numbers, unless you scratch beyond the surface of the numbers their announcing, when it quickly becomes less clear as to what they're actually saying. We know 5 million odd people have played WoW, and we know they've had 5 million or so accounts in their database at some point, but the number of servers they have suggests an "active" subscriber base of more around the 2-2.5 million mark.&lt;br /&gt;&lt;br /&gt;The simple point is that &lt;i&gt;not disclosing&lt;/i&gt; our subscriber numbers or server populations is a &lt;i&gt;business decision&lt;/i&gt;. And &lt;i&gt;not disclosing&lt;/i&gt; is not the same as &lt;i&gt;not having&lt;/i&gt;. We're a small team, we can't &lt;i&gt;afford&lt;/i&gt; not to know this sort of thing. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://ww2.kfs.org/images/map.jpg" target="new"&gt;&lt;img src="http://ww2.kfs.org/images/thumb.jpg" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-113340255044630591?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/113340255044630591/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=113340255044630591' title='17 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113340255044630591'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113340255044630591'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2005/11/show-us-numbers-we-paid-for-them.html' title='SHOW US THE NUMBERS! WE PAID FOR THEM!'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>17</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-113288328261867889</id><published>2005-11-24T19:40:00.000-06:00</published><updated>2005-11-24T19:48:02.666-06:00</updated><title type='text'>Brain Freeze</title><content type='html'>Agh. I've been sitting looking at code for over 3 hours and I've not written a single line. Infact, I don't think I've understood a single line. I'm pretty sure I fell asleep at one point. My cat apparently thinks I'm ill, she's been really friendly. I tried playing some X3: Reunion but I can't stop thinking "man I thought *our* graphics engine was badly written" (before you, Jaeger :).&lt;br /&gt;&lt;br /&gt;Jaeger's enthusiasm is awesome, it reminds me of how much you bastards have ground me down and made me bitter sometimes, but its awesome none the less, he's made some kickass improvements, but the timing was also perfect, Martini is really into what he's doing and between them they're really dragging the engine out of the stone age. We really need to find an "infantry jaeger" :) Course, a second kfsone wouldn't be a bad thing either.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-113288328261867889?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/113288328261867889/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=113288328261867889' title='14 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113288328261867889'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113288328261867889'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2005/11/brain-freeze.html' title='Brain Freeze'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-113283586350119335</id><published>2005-11-24T06:30:00.000-06:00</published><updated>2005-11-24T06:37:43.530-06:00</updated><title type='text'>Go map!</title><content type='html'>Information that needs to be displayed:&lt;br /&gt;&lt;br /&gt;. Name of town&lt;br /&gt;. Country in control of town&lt;br /&gt;. Frontline status&lt;br /&gt;. Attack objective&lt;br /&gt;. Defend objective&lt;br /&gt;. Contention&lt;br /&gt;. Hold at all costs&lt;br /&gt;. Fallback&lt;br /&gt;. 0-8 EWS icons&lt;br /&gt;. Airfield&lt;br /&gt;. Naval base&lt;br /&gt;. Bomber deployment&lt;br /&gt;. Naval deployment&lt;br /&gt;. Para-deployment&lt;br /&gt;. Brigade(s) present&lt;br /&gt;&lt;br /&gt;Ramp was also hoping to do things like change the name font based on the number of ABs, things like that :)&lt;br /&gt;&lt;br /&gt;The system Ramp was using when I left the office today was looking pretty promising -- we changed the color scheme to try and be easier on the eye but also to try and condense the information and present it in a fashion that draws the eye by priority. When it's been thru a bit of beta, I'll see if I can't post some screenshots. But really right now it's hacked together by Ramp and I *know* I'm don't have an artistic eye :) We got some good feedback from one of the artists when we had the concept together, and I'm sure Granik (and probably Toto) will be the ones that make it work.&lt;br /&gt;&lt;br /&gt;On the host side, made some progress but not as much as I'd hoped. Stupid, I know, but the map aspect just hadn't occured to me. Dude, don't be cussing me like that, I don't live in a graphical world. When it comes to matters of the front-end stuff I've never claimed any skill or ability.&lt;br /&gt;&lt;br /&gt;But of course the map was already cluttered, and trying to add the brigade information just topped it. Nice work by Ramp tho. I hope this will fuel an additional map redo in an upcoming cycle. We experimented with a "strategic" map briefly - i.e ditching the backgrounds in favor of a more map-like look - which reduced the clutter enormously - but we didn't actually try and get it working.&lt;br /&gt;&lt;br /&gt;I did get the host more or less ready to be moving the brigades around, for now I'm leaving the ruleset as a Lua script so that its easier to mess with. And I've got to finish off the persistant map connection so that we can push you the brigade data as it changes without having to replicate the work on already busy world servers.&lt;br /&gt;&lt;br /&gt;Happy thanks giving. Now I plan to sleep for 14 hours. But I know full well that in 4 hours my phone will ring with Doc all in a fluster because some noble effort on his part has gone pear shaped and every CP that was British is now Russian and the Axis are all invisible. He's like Father Dougal.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-113283586350119335?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/113283586350119335/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=113283586350119335' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113283586350119335'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113283586350119335'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2005/11/go-map.html' title='Go map!'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-113277723404159362</id><published>2005-11-23T14:11:00.000-06:00</published><updated>2005-11-23T14:20:34.080-06:00</updated><title type='text'>Such an easy mistakeh to makeh</title><content type='html'>Ramp's changes to the map are looking kinda promising. There is so bloody much information to try and present tho, and all of it useful. On the web-map we have three different modes, and we probably need to ditch the complexity of the "Options" drop down and copy the webmap with multiple modes for viewing the map. Particularly, trying to do a strategic map overlaid on all the terrain features is troublesome. Its just very cluttered. And we're also trying to cram this information regardless of zoom level.&lt;br /&gt;&lt;br /&gt;We wanted to have big military-map style direction-of-force arrows, but they only work when you're zoomed in about half way - when the map is showing in full and you can see every city on the map and we're trying to squeeze directional arrows on there, they wind up being itty-bitty arrow-heads that blot something else out - so not very useful at that zoom level.&lt;br /&gt;&lt;br /&gt;Ok - so don't show everything at that level! But maybe you didn't zoom out to see the direction arrows - which are now drawing much to your chagrin.&lt;br /&gt;&lt;br /&gt;And of course cluttering up the icons with too much info is going to get into the way when you are a mission leader trying to manage your waypoints/contact reports etc. ("I can't see the facility, it's being overwritten by the thingymawhatzit icon").&lt;br /&gt;&lt;br /&gt;So we (ok, Granik and Ramp with some whimpering by me) have been trying to come up with a nice, compact way of displaying much of the same info, and most importantly some simple consistency to convey additional information. Per e.g. an orange or red border around a town's name (same color as the current attack objective icons) to indicate an objective. An inset yellow border to indicate "contested" - rather than an icon. That still leaves the icons for &lt;u title='At least for now - deployments arent yet associated with a particular brigade'&gt;deployments&lt;/u&gt; (bomber, paratroops, etc) and air/naval bases.&lt;br /&gt;&lt;br /&gt;IMHO its still going to be a little crowded, but since the features behind it aren't a great deal of work, we don't want to hold the featureset up for a lengthier map rework. At the very least not until we have the basics into beta.&lt;br /&gt;&lt;br /&gt;It's starting to look good tho. Some reasonable progress with the host side of things. Not really a lot to report until I start tieing the pieces together tho.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-113277723404159362?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/113277723404159362/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=113277723404159362' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113277723404159362'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113277723404159362'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2005/11/such-easy-mistakeh-to-makeh.html' title='Such an easy mistakeh to makeh'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-113261296630122359</id><published>2005-11-21T16:03:00.000-06:00</published><updated>2005-11-21T16:42:46.330-06:00</updated><title type='text'>Another weekend wrap</title><content type='html'>Saturday: Jaeger Bombs, Schnapps shots and something that tasted like concentrated peppermint. These were things I tried not to think of on Saturday. No hang over, but that may just have been the remaining alcohol. I wrote some code. Then I erased it.&lt;br /&gt;&lt;br /&gt;Sunday: That wonderful sensation of an active brain crawling out from behind the rocks, dusting off its hands and deciding that maybe it shouldn't have been keeping secrets. I was enlightened. That or else Killer bought me many Jaeger Bombs that I've lost the memories of knowing those things previously.&lt;br /&gt;&lt;br /&gt;I can't remember what about though. I tried to catch up on my hydration which stirred up a lot of alcohol.&lt;br /&gt;&lt;br /&gt;We had a meeting last week about getting visible traction on the brigades-on-map stuff. And it rapidly descended into a "map" meeting. The map is already cluttered, and we're talking about adding more information onto it. We had a plethora of solutions to different problems but a hard time trying to put them all together. Some things stop working so well when zoomed out. Some had too many options or nuances that made would make them difficult for a new player to get to grips with. Some made it very difficult for a new player to understand at all.&lt;br /&gt;&lt;br /&gt;We're going to roll with a "minimal change" notion for now, knowing it to be inellegant, but hopefully minimal dev time so that Granik and Ramp can put their fine minds to better changes. The key thing is that towns with no brigade or division should be minimally represented - a small dot. But they can still be an AO, they can still be contested, and they can still have EWS going. And of course there are the deployment icons (bombers, naval, paratroopers, etc).&lt;br /&gt;&lt;br /&gt;As usual, Granik is coming up with great stuff, but he has Gophur disliking it one way, me disliking it another and Ramp has an oar too :)&lt;br /&gt;&lt;br /&gt;In order go not get this stopped by a significant map redesign, we're going to start with a minimal change approach, hopefully to give Granik/Ramp time to think of other ideas.&lt;br /&gt;&lt;br /&gt;Granik did a really good job of not laughing his ass off when I tried to put a few thoughts together in Paint Shop - coder art usually looks less like it's been painted by an elephant.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-113261296630122359?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/113261296630122359/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=113261296630122359' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113261296630122359'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113261296630122359'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2005/11/another-weekend-wrap.html' title='Another weekend wrap'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-113218863050878217</id><published>2005-11-16T17:41:00.000-06:00</published><updated>2005-11-16T18:50:30.533-06:00</updated><title type='text'>Galaxies Discussions</title><content type='html'>I've been having interesting discussions with both Snail and Bloo about SWG:NGE the whys and wherefores. Bloo and I were discussing some of the reasons why, Snail and I are discussing the aspect of "moments". I think Snail and I are agreeing but having a conflict of terminology. Bloo and I had slightly different impressions of &lt;i&gt;why&lt;/i&gt; Sony did what they did. Bloo mailed me &lt;a href="http://games.slashdot.org/article.pl?sid=05/11/10/1559208&amp;tid=101"&gt;this /. link&lt;/a&gt; in which Mr Smedley reveals that both of our arguments were factors ("Not StarWars-y enough" and "Peaked subscriber base").&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-113218863050878217?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/113218863050878217/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=113218863050878217' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113218863050878217'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113218863050878217'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2005/11/galaxies-discussions.html' title='Galaxies Discussions'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-113217279909659158</id><published>2005-11-16T13:36:00.000-06:00</published><updated>2005-11-16T14:26:39.180-06:00</updated><title type='text'>StarWars Galaxies: NGE</title><content type='html'>As I mentioned before there's a lot of fuss around about the latest changes to StarWars Galaxies' latest update, "New Game Enhancements" (NGE).&lt;br /&gt;&lt;br /&gt;Its a radical change to the underlying game principles; they ditched the profession onion and went with 9 linear professions, they replaced MMORPG combat with twitch-like point-to-aim combat that uses mouse keys to achieve auto-attack that gives it its twitchy feel, they replaced a crappy intro/tutorial sequence with an actual newbie zone that feels very StarWarsy and a bit of story line along with a heap of structured and integrated quests.&lt;br /&gt;&lt;br /&gt;I tried my old SWG character on Sunday and Monday nights, and remembered &lt;u title="enough debilitating bugs to make WWIIOL seem nearly shiny and class balancing/tuning so out of touch with the game that all challenge is removed requiring difficulty to be implemented through sheer tedium"&gt;why I had come to hate the game&lt;/u&gt;, reminded of how difficult and alien the &lt;u title="It was oriented around chat. So checking your inventory was 'ctrl-i' instead of 'i'"&gt;control system was&lt;/u&gt;. And how terribly laggy everything was.&lt;br /&gt;&lt;br /&gt;I also created a new character and tried out the old-new tutorial. It was an improvement over the launch-day tutorial but it quickly degraded back to of "exit town, press numlock for 15 minutes, speak to npc, turn 180, press numlock for 15 minutes, follow waypoint back to me". The storyline was more immersive but the tasks not so.&lt;br /&gt;&lt;br /&gt;Then on Tuesday they released NGE and I created a new character. It was great fun. It feels StarWarsy, there is a great newbie area to learn in, the quests stories are readable (although it would benefit if there were a very few dead ends that made the npc bail on you and force you to restart that text-tree).&lt;br /&gt;&lt;br /&gt;The combat was smooth, the action looked very StarWarsy, excellent fun.&lt;br /&gt;&lt;br /&gt;Whoever was responsible for the smooth transition of existing players, though, apparently couldn't give a damn. There were issues that caused half the servers to be down the entire day, and weren't resolved when I logged off for the evening. The remaining servers were laggy as hell outside the newbie areas, something that was true a year ago too. It could take upto 30s for a fight to start if I was outside an unpopulated dungeon. I was continually receiving other people's "Level up!" and "-Stunned-" and "-Snared-" messages making it very confusing. When you're travelling NPCs and their spawns don't render until you've (nearly or sometimes entirely) passed them (and if you're a new player that means they usually render after they've started to attack you, or possibly killed you).&lt;br /&gt;&lt;br /&gt;The simple act of a level 70 player choosing a new profession causes a heap of errors in his chat buffer (too many commands queued), leaves him with no guide to what his new abilities are, and no familiarity with them, and with a hotkey bar full of all the level 1 abilities and specials. Expect to spend several hours sorting through your Abilities window trying to figure out which ones should be current because you can't sort abilities by level *or* drag abilities from the "Skills" window (anymore).&lt;br /&gt;&lt;br /&gt;Also the new content &lt;i&gt;appears&lt;/i&gt; to have been all aimed at newbies. Maybe this is because they are running a free trial. For an existing player the aim is apparently to rebalance content, which means that content you've already exhausted just becamse your new "current" content. I couldn't find any evidence of new quests or mobs for existing players outside buying the Trials of Obi Wan expansion.&lt;br /&gt;&lt;br /&gt;The profession resepc tool also missed something that indicates that &lt;i&gt;if&lt;/i&gt; anybody tested it, the testing was either too late to respond to or it was done by someone who didn't give a damn or didn't know what they were testing. During your levelling progression you are supposed to receive various rewards - a uniform, pieces of equipment, etc. Many people respeccing will make their prior equipment void and invalid for their new character. So not receiving the same rewards you would receive by levelling the character up is a pretty stark prospect.&lt;br /&gt;&lt;br /&gt;I had the misfortune of losing my best equipment to a death/decay bug just before I quit a year ago. I lost some of my fallback equipment to other issues on Monday night. And then what I had left (a modified tunic and an unmodified pair of leggings) I was no-longer valid for any of the professions I'm interested in. Ergo, I'm a naked, unarmed wookie with very little cash. "Jedi" is right out as a profession for me because I have no force crystals. Force crystals are still as rare as before Jedi were made a profession, so until &lt;i&gt;(if)&lt;/i&gt; they address that I have no chance of making the money to buy a crystal and I can't be arsed to grind my way into posession of a crystal just so I can *resume* playing my level 74 wookie.&lt;br /&gt;&lt;br /&gt;I would have deleted him and started afresh but he has claimed some rewards that I don't want to lose.&lt;br /&gt;&lt;br /&gt;NGE is a great platform for a new StarWars Online game - right now I don't know how far the NGE content lasts.&lt;br /&gt;&lt;br /&gt;If you disliked SWG previously chances are you'll like NGE (if you start a new character and if you felt the game wasn't really StarWars-enough for you before).&lt;br /&gt;&lt;br /&gt;But playing a respec'd character in the olde-worlde is very rough edged. Most of my gameplay was solo/alongside stuff, I tried interacting with other players briefly and found it so laggy and buggy (saying something in chat *still* cancels a trade window and more-or-less forces both players to have to log out to be able to initiate a working trade afterwards).&lt;br /&gt;&lt;br /&gt;I'll stop by SWG tonight to chat with some old friends, I'll toy with my newbie characters a bit since they were a great deal of fun, but I'm already wondering whether to play Axis or Allied tonight :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-113217279909659158?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/113217279909659158/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=113217279909659158' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113217279909659158'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113217279909659158'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2005/11/starwars-galaxies-nge.html' title='StarWars Galaxies: NGE'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-113208359935680546</id><published>2005-11-15T13:38:00.000-06:00</published><updated>2005-11-15T15:34:04.303-06:00</updated><title type='text'>Gophart</title><content type='html'>&lt;img src="http://ww2.kfs.org/images/gophart.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;Actually, it's not entirely &lt;a href="http://gophur.playnet.com/"&gt;Gophur&lt;/a&gt;'s fault; his arrows were fine until Ramp drew one (looked more like a hammer) and then everything that followed was just ... infected :)&lt;br /&gt;&lt;br /&gt;It did make it hard trying to take the images seriously tho :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-113208359935680546?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/113208359935680546/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=113208359935680546' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113208359935680546'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113208359935680546'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2005/11/gophart.html' title='Gophart'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-113206987893840045</id><published>2005-11-15T09:40:00.000-06:00</published><updated>2005-11-15T13:38:29.736-06:00</updated><title type='text'>Multiplayer Computer Games</title><content type='html'>My first ever computer game as a "settlers" type game played on a school computer that was so ancient the engineer had to open up and move wires around in. I'm not *that* old, but I do come from a town in one of the &lt;a href="http://www.thisisgrimsby.co.uk/"&gt;quieter corners of England&lt;/a&gt;, so the computer was fairly old at the time. I was 10 and it was 1981.&lt;br /&gt;&lt;br /&gt;My little group, seeking to embarrass me by treating me as "secretary" assigned me the role of typing. I took to it like a duck to water, and of course I got to be the one playing the game. The teacher, who normally hated me for having a German mother, actually complimented me on my abilities.&lt;br /&gt;&lt;br /&gt;So you have to understand - my first experience with a computer was hands on, and it was multiplayer.&lt;br /&gt;&lt;br /&gt;And the thought I came away from that experience was that it would have been much cooler if we had each been able to play on our own computer, with them all connected to the same game.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-113206987893840045?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/113206987893840045/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=113206987893840045' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113206987893840045'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113206987893840045'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2005/11/multiplayer-computer-games.html' title='Multiplayer Computer Games'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-113195054510737722</id><published>2005-11-13T23:55:00.000-06:00</published><updated>2005-11-14T00:42:27.590-06:00</updated><title type='text'>Weekend wrap</title><content type='html'>Done some heavy duty sleeping over the weekend to make up for the over-night stints watching the servers Wed/Thu/Fri. Probably slept about 24 of 48 hours this weekend.&lt;br /&gt;&lt;br /&gt;Friday morning Mo, Gophur, Killer and myself sat down and to consider a first pass of the brigades-on-map system. Why first pass? Because we're a little wary of whacking the playerbase with another change as radical as the introduction of brigades. And we want to get our players to the other side of the "AO fence". We said AOs would be painful and wouldn't last long. One out of two ain't great.&lt;br /&gt;&lt;br /&gt;So much has been said about brigades, TOEs, deployments, and it's been so long that I've been able to focus on them that I was honestly confused about what was involved anymore myself. Nothing a good 90 minutes with the spec wouldn't clear up, but the system Mo and Gophur were proposing is a good chunk of the way there &lt;i&gt;and&lt;/i&gt; its pretty elegant and simple. The question was, does it work, is it feasible, how long will it take to do.&lt;br /&gt;&lt;br /&gt;We spent well over an hour "playing" with the resulting system - moving brigades and divisions around, discussing attacks, attack options, defense options, etc, like a little board game.&lt;br /&gt;&lt;br /&gt;Over the last year or so, perhaps because I'd allowed so many brigade/toe concepts to pile up without resolving them, I was really becoming worried that brigades/toes might be an extra layer of separation between the "players" and the "managers" in our game. But having put time and play into these concepts, it's re-energizing. As a player you're going to have a much better idea of what you're jumping into, who you're fighting, and why you're fighting.&lt;br /&gt;&lt;br /&gt;Very excited by it. Monday we have to decide how it fits into the 1.21 feature development track. Getting &lt;u title='Officer In Charge'&gt;OIC&lt;/u&gt;s and &lt;u title='Table Of Equipment'&gt;TOE&lt;/u&gt;s in are very important to us, as are getting in some capture and supply rule changes.&lt;br /&gt;&lt;br /&gt;After sleeping and pontificating over the Brigades#1 concepts, the rest of the time I've spent playing the game and attacking one of the two Great Obstacles.&lt;br /&gt;&lt;br /&gt;I've had a total blast in our game. Like most of our players, and like a lot of MMORPG players, I play multiplayer-solo. I'm not a lone-wolf, but I like the informal thing of running into a berm and suddenly myself and the 8 other guys in there are a team. I had a particularly great time helping the Brits defend Bergen-op-Zoom from a terrificly fierce German assault. I spawned a sapper for no particularly good reason and wound up having one of my best and longest infantry action sorties ever. We spent a good hour with just 4 of us defending the south depot. I got a kill on a moving opel at about 600m, and then popped the infantry riding on him for good measure :) I threw nades into the big stand of trees by the depot periodically to be rewarded by a "waugh" or two.&lt;br /&gt;&lt;br /&gt;We definitely need a "danger" waypoint icon to tell people *not* to go to a particular spot. I don't think any of the 12+ waves of infantry that tried to occupy those trees realized just how bad a position it put them in given the surroundings. Other guys tried to sneak into the tents only to get shot in the back. We knew you were coming fells :)&lt;br /&gt;&lt;br /&gt;Then we ran all the way to the north depot, killing stray ei in town and having to get a passing rifleman to give me his ammo pack. I got all the way up to within 10m of an enemy mobile spawn truck. Aimed my gun at his eye, and realized I was out of ammo. I turned and ran. Shots rang out behind me, I ran into a berm where three ei turned and tried to grenade me, only to kill themselves, and then realized I was a sapper and I had satchels if I didn't have grenades.&lt;br /&gt;&lt;br /&gt;I turned, shot the two ei who had spawned from the truck, got a satchel placed and started running. I was out of ATP so I was limping towards the nearest bush as fast as I could, but sure enough moments later there were enemy troops firing at me. Fortunately, before the LMG could hit me the satchel went off and scored me a truck and 2 more infantry kills. A friendly rifleman running up asked me "Need any help". I got a warm fuzzy glow out of saying "Yeah actually I'm out of ammo" :)&lt;br /&gt;&lt;br /&gt;I hopped around the map and sides, playing German here, French there, but I also put in a lot of hours playing British -- my old stomping grounds, and I missed my regular Axis hangouts by playing so early.&lt;br /&gt;&lt;br /&gt;And then I spent time coding. And I got warm and fuzzy from that too...&lt;br /&gt;&lt;br /&gt;Unlike most MMOs our game world distributes players between servers not geographically but by function and load. It does set a finite upper-limit to our world population, not one we are anywhere near yet tho. And if we need to add geographic distribution the current mechanism will provide for an excellent sentinelling system. Some of the code is designed with future geographic distribution in mind - so that we could, for instance, divide the game world into 8 regions and still make it so that players don't see themselves "zoning".&lt;br /&gt;&lt;br /&gt;Because of this the game-world "cell host" is actually a mini-cluster of servers. The idea is that these servers would deal with "vehicles" moving around and seeing each other and the world around them. The actual management of world-state is done by a different server, which players never talk to directly, chat through another server, missions and other meta-data through other servers. But when you are in-game and you see a building blow up, you see a plane drop bombs or you see a tank drive along a road, you are seeing data from a cell host.&lt;br /&gt;&lt;br /&gt;Because ensuring timely dispatch of cell data is critical to our twitch nature, these hosts were actually not one but three processes. At the time they were developed this was a much more clean and desirable solution than threading or trying to switch to an &lt;u title='Real Time Operating System, like QNX'&gt;RTOS&lt;/u&gt;.&lt;br /&gt;&lt;br /&gt;I've described the woes and perils of this previously, but its been an obstacle to a number of things and is the cause of a number of problems for us. Earlier this week I took my first stab at merging the processes. Finally this weekend I've managed to get them working as one and delivery a massive reduction in CPU usage as a result. It's not yet finished -- there is a fair amount of data redundancy that could go away.&lt;br /&gt;&lt;br /&gt;There's probably a fair amount of improvement that can go in there to help support the other major obstacle in the mission system that I need to address, but it's a huge step forward.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-113195054510737722?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/113195054510737722/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=113195054510737722' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113195054510737722'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113195054510737722'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2005/11/weekend-wrap.html' title='Weekend wrap'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-113160156928138377</id><published>2005-11-09T23:12:00.000-06:00</published><updated>2005-11-09T23:46:09.310-06:00</updated><title type='text'>Galaxies</title><content type='html'>There's a lot of banter around about the huge swath of changes that the SOE team have bravely dared to try over at &lt;a href="http://f13.net/index2.php?subaction=showfull&amp;id=1130964917&amp;archive=&amp;start_from=&amp;ucat=1&amp;"&gt;StarWars Galaxies&lt;/a&gt;. Whether you like what they're doing to the game or not, it's bold stuff and gutsy of them to try it.&lt;br /&gt;&lt;br /&gt;But does it really address what's wrong with Galaxies? Having read various dev blogs and posts I really think that the folks on the team have had the root cause of gameplay issues hidden from them by both the screaming and the well intentioned players.&lt;br /&gt;&lt;br /&gt;I think far too many people forget to start with the basics. &lt;i&gt;&lt;b&gt;StarWars&lt;/b&gt;&lt;/i&gt;: Galaxies. Don't break it into two words. Think of it for now as "StarWars" - because that means something different than the juxtaposition of "Star" "Wars". Unlike D&amp;D Online or Wheel of Time Online, this is a franchise that starts with a classic and definitive action adventure movie and that has countless years of action adventure games establishing consumer expectations of a "StarWars TM" product.&lt;br /&gt;&lt;br /&gt;The team tried to do some really cool stuff with Galaxies, and they brought in many of the elements of that StarWars Online game many of us had dreamed of for so many years.&lt;br /&gt;&lt;br /&gt;Somewhere in the effort the process of developing StarWars Online because developing "a star wars based-game that is massively multiplayer". To see Raph Koster posting and conversing at the time, to hear him speak at the Austin Game conferences, you can't help but come away with the impression that he was an inspiration if not driving force behind much of the creative thinking going on in SWG.&lt;br /&gt;&lt;br /&gt;Whether Raph was That Guy or not, That Guy missed something critical. Instead of building a StarWars Online platform, the team tried to get all kinds of cool potential into the baseline game. Every team does it, but one of the things that thrilled StarWars devotees like Gophur and made their toes tingle was the panacea of StarWarsy goodness promised by the game.&lt;br /&gt;&lt;br /&gt;I had a friend who had obsessed about being a crafter in the StarWars universe and building a little workshop that people would visit and he would have knik-knaks stored around the house and he could roleplay a doddering little yoda into it. He summed up what went wrong rather nicely. "I can make pants".&lt;br /&gt;&lt;br /&gt;It seemed as though the team didn't recognize when it was time to stop creating and start refining. And because the game had such a huge girth, the team really had very little concept of how everything was going to interact.&lt;br /&gt;&lt;br /&gt;SWG had its onion system of skills and abilities. There was a wide range of skills and abilities divided into lots of classes. The problem is that there is glamor factor in knowing that you could have skills from any one of 20 other skill trees, but there isn't much longevity in it. You can't develop your character.&lt;br /&gt;&lt;br /&gt;This slammed up hard against the single-character-server policy. It mean't that if you had spent 20 years dreaming of being a bounty hunter and smuggler in an online StarWars universe, your gameplay value was going to be pretty short before you ran out of evolutions for your character. Sure, you can ditch some of your smuggler or bounty hunter skills and try something else, which might be fun for a little bit, but what you really want is to try it on another character so that when your buddies log in and say "hey lets go smuggle some stuff" you aren't left behind because you didn't retrain your smuggling skills back up yet.&lt;br /&gt;&lt;br /&gt;The game failed to live up to its StarWarysness, it failed to live up to its StarWarsTMyness. It also failed to live up to its Star&lt;i&gt;Wars&lt;/i&gt;yness.&lt;br /&gt;&lt;br /&gt;But fundamentally I think StarWars: Online was the wrong project to get all fancifully experimental on. Sony were plugging this as "From the makers of EverQuest" and although people bitched about it maybe being "EverQuest in space", I think we were comfortable with that notion.&lt;br /&gt;&lt;br /&gt;A lot of MMO designers are talking about failed gameplay this and fear of change that. I think its much simpler than that. SW:G was &lt;i&gt;probably&lt;/i&gt; the wrong product and market for that kind of experimentation. It's a market that sells Jedi Knight clones like hot cakes, and I think many of us were hoping for something more like Jedi Knight Dark Forces Quest Online.&lt;br /&gt;&lt;br /&gt;I think its that simple.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-113160156928138377?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/113160156928138377/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=113160156928138377' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113160156928138377'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113160156928138377'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2005/11/galaxies.html' title='Galaxies'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-113153354695056632</id><published>2005-11-09T04:02:00.000-06:00</published><updated>2005-11-09T04:52:26.980-06:00</updated><title type='text'>I've often wondered...</title><content type='html'>At AGC, &lt;a href="http://www.youhaventlived.com/qblog/"&gt;Richard Bartle&lt;/a&gt; mentioned the lineage of various games, and his mention of AberMUD sparked and a healthy smattering of ego reminded me of something I didn't imagine there's be any trace of these days.&lt;br /&gt;&lt;br /&gt;I often lay certain claims to having been involved in what was the infant scene for the current MMO industry when I dabbled in games like TradeWars for the Amiga (as did, I believe, Mark Jacobs), and also participated in a number of attempts to create a sort of distributed network. For a while I was even working with a bunch of folks to try and create a packet switched network although "packet" is a stretch of the imagination :)&lt;br /&gt;&lt;br /&gt;All along my obsession was trying to get a MUD system online so that people could come along and create MUDs with it and I could experiment with AI and gaming systems and see how game creators and game players interacted with them.&lt;br /&gt;&lt;br /&gt;To this end I'd created &lt;a href="http://groups.google.com/group/rec.games.mud.misc/msg/3c0f18eb41fbf2c1"&gt;AMUL&lt;/a&gt;, an Amiga based MUD language/environment based on my earlier Atari system. The Atari system differed largely in that it was actually an &lt;u title='Years later I was talking to a friend, Alistair Shenstone, about Motorola chips. Suddenly it dawned on me that in a particular line of assembler in my original Atari MUD I had forgotten to save a registered (the SSP) and that by adding this one register to the list of saved-registers it would probably have worked perfectly happy within the non-multitasking Atari TOS. I hadnt looked at the code for years before that.'&gt;Operating System&lt;/u&gt;. Its amazing what you learn by writing your own, complete, Operating System just to facilitate writing your own game system :)&lt;br /&gt;&lt;br /&gt;When it became clear that I wasn't about to get a job anywhere as an online game developer, at least not in the early 90s, I decided to persue a business career and hone my software development skills. I found a job developing complex multi-user business applications and went to it. Ok. So some of the &lt;a href='http://www.touchdoncaster.com/business/list/bid/2596168'&gt;customers&lt;/a&gt; might not seem to live up to the hype. But from there I moved into &lt;a href="http://www.demon.net/"&gt;making the Internet happen&lt;/a&gt; or at least playing an &lt;a href='http://www.gtld-mou.org/gtld-discuss/mail-archive/05098.html'&gt;active part in it&lt;/a&gt; (first paragraph of the reply). I have this habbit of not protecting my work and seeing it re-appear elsewhere.&lt;br /&gt;&lt;br /&gt;Anyhow, Dr Bartle's comments reminded me of conversations with two old fellow Demons, Ronald Khoo (Xenix, NetBSD, Aber5, Sleepless Nights etc) and Neil Styles (uhm, Sleepless Nights and boasting of powerful wrist action). At various times they both remarked to me on strong similarities between the version of Aber they were using (vs earlier Abers) and my &lt;a href="http://groups.google.com/group/alt.bbs/browse_thread/thread/dbed02b265d53b4c/47697af6c858a028?lnk=st&amp;q=%22oliver+smith%22+amul&amp;rnum=2#47697af6c858a028"&gt;Amiga-based MUD language&lt;/a&gt;, which set me to wondering if it has anything to do with the source code I sent Alan in &lt;a href="http://groups.google.com/group/rec.games.mud.admin/browse_thread/thread/a1590a360bfcb9a8/fc25e820e2f3b059?lnk=st&amp;q=%22oliver+smith%22+amiga+mud+language&amp;rnum=5#fc25e820e2f3b059"&gt;August of 93&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;And the last time I spoke to Alan, I was looking for people to acknowledge that I my interest, involvement even, in online game development was in evidence 10 years ago. He vaguely remembered the conversation we had an the code I sent him. I had to admit my ego definitely wanted me to believe that maybe I'd influenced the course of AberMUD.&lt;br /&gt;&lt;br /&gt;But after a little research I think AberMUD 5 largely pre-dates Alan's contact with my code. And if it had "inspired" him, well it would only have been a re-seeding of the original Essex MUD inspiration behind AberMUD. AMUD was heavily influenced by my encounter with the BCPL source code for Essex MUDL and my desire to be able to enter, at least closely, the Essex MUD source I had into my own MUD language. (Ok, I didn't actually want to *enter* it all in, but somehow being able to run significant chunks of Essex MUD in-tact from the source was a great validation for me :)&lt;br /&gt;&lt;br /&gt;I suspect the cold-shoulder was more likely to do with other newgroups and forums we &lt;u title='Alan did a lot of Linux TCP/IP kernel stuff while I was contributing to AmiTCP and KA9Q/NOS and the both of us frequently ended up in one or other side of an argument with Neil MacRae in some newgroup or other'&gt;interacted in&lt;/u&gt; than because of any "inspiration". Probably it was to do with me apparently just randomly calling him up and asking for, what might have sounded like, a reference.&lt;br /&gt;&lt;br /&gt;Alan suggested that his name might impact negatively when seen by the INS. But I already had a short letter by Dr Bartle which apparently impressed the heck out of the judge who, it turned out, was a bit of a gaming buff :)&lt;br /&gt;&lt;br /&gt;Ego sated. I can go back to sleep now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-113153354695056632?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/113153354695056632/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=113153354695056632' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113153354695056632'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113153354695056632'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2005/11/ive-often-wondered.html' title='I&apos;ve often wondered...'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-113152265607276657</id><published>2005-11-09T00:40:00.000-06:00</published><updated>2005-11-09T01:50:56.100-06:00</updated><title type='text'>Hey, hand me that ten gallon</title><content type='html'>Hat.&lt;br /&gt;&lt;br /&gt;Yeah, the cowboy one.&lt;br /&gt;&lt;br /&gt;A bad dose of flu yesterday/Sunday, a lot of missed sleep over recent weeks, and a real pit-of-the-stomach anxiety over BE, a dozen new directions buzzing angrily on the horizon threatening to hijack me half-way thru anything I develop...&lt;br /&gt;&lt;br /&gt;All of those variables come together to say: Cowboy dev time.&lt;br /&gt;&lt;br /&gt;That would scare me but my track-record on cowboy dev has always been pretty good. Although I credit that more to my practice of trying to write maintainable code rather than sexy code -- Cowboy code is code you are anticipating needing to maintain in short order.&lt;br /&gt;&lt;br /&gt;The trouble with cowboy code is that it's in your head. And today was extreme cowboy. I branched the baseline and took a hammer and chissel to three host processes that I want to combine into one. The amount of time they spend exchanging information between the three of them outweighs the amount of time they spend processing information by an order of 100:1. It needs to be done for performance and functionality reasons.&lt;br /&gt;&lt;br /&gt;This is a reduction of code, merging two code lines which at complicated merely by the fact that two of them depend heavily on communicating on each other through the third. I've decided against going through are more soundly integrating them into a single app, I'm going to leave the parallel systems in-place and simply cut out the IPC. So while it's wholly cowboy it's not entirely cavalier.&lt;br /&gt;&lt;br /&gt;All the same, there's a lot to keep track of. I made some great headway in the first 3 hours, I think I got about 70% of it done. And then the inevitable walk-in question (if there was a knock I missed it). The question needed asking, but that doesn't make the crash landing any less painful. I can managed to keep the threads together long enough to take a first pass at questions like this, and say "Have to ask me later".&lt;br /&gt;&lt;br /&gt;But very few people get that and they insist on switching to an interogative mode re-explaining it to you and saying "Right?" or "Ok?" after each atom of the repeat. And even back to my more youthful days, I could rarely hold on through that. My 'answering machine' mechanism gets really confused by all these little questions. And before I know it I've dumped my brain state to a /dev/null so it can rewind the type and figure out what it is I'm being asked that &lt;u title='I think its actually a nervous/guilty thing; I assume that since theyre asking so many more questions I must have said something to exasperate things'&gt;generated all these questions&lt;/u&gt;.&lt;br /&gt;&lt;br /&gt;During a dialog with a group of players today we were asked about some fairly cool and obvious extensions to the mission system. I mean, c'mon. Changing who is in charge of a mission is really simple, right? Heck, a player even sent me this little fragment of obviousness - he even added spaces infront of the semicolons for me, so it must be close, right?&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;void&lt;br /&gt;Mission::setLeader(Player* player)&lt;br /&gt;{&lt;br /&gt;  m_leader = player ;&lt;br /&gt;  ... some other stuff ... ;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;So I asked him, "Where is the mission object?". He gave me a quick 101 in C++. So I replied and asked "No, I mean *where* is the mission object?". He gave me a quick 101 in pointers and C++ member function calls. So I sent him a link to my &lt;a href="http://ww2.kfs.org/slides/"&gt;slides&lt;/a&gt; and asked him "*WHERE* is the mission object?" His solution was so simple it shows how stupid game developers are, and he told me so.&lt;br /&gt;&lt;br /&gt;Move the mission objects onto the same host as the player.&lt;br /&gt;&lt;br /&gt;"Which player?"&lt;br /&gt;&lt;br /&gt;Part of the nature of a distributed system is that yah kinda distribute things. You defeat the purpose if everything is duplicated everywhere. There's stuff it pays to do that with -- for instance almost every host in our network cluster has a relatively current image of the strat system. &lt;u title='CHOKE POINT - i.e. city, you n00b'&gt;CP&lt;/u&gt; and Facility ownerships, building visibility states. That stuff can be transported around the network at relatively low cost, and it means that every host can do rudimentary sanity checks without a network transaction to fetch a particular CP's information. The strat server runs at an average of 0.1% CPU during peak load times.&lt;br /&gt;&lt;br /&gt;The mission information changes far more frequently and there is far more of it. So keeping copies of it on every server would become expensive, and it largely consists of management information which neccessitates processing if you try to mirror it.&lt;br /&gt;&lt;br /&gt;So why not just tell the mission server to change the leader? Well that's the plan, but it's not as simple as that because it's not just a matter of removing the line of code that says &lt;code&gt;if spawned then noCanDo&lt;/code&gt;. If only it were.&lt;br /&gt;&lt;br /&gt;The systems we have in place are good systems, reliable systems, tightly optimized systems. This is a natural downfall of trying to change the fundamental nature of a tightly, hand-optimized system.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-113152265607276657?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/113152265607276657/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=113152265607276657' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113152265607276657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113152265607276657'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2005/11/hey-hand-me-that-ten-gallon.html' title='Hey, hand me that ten gallon'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-113108275774461409</id><published>2005-11-03T23:29:00.000-06:00</published><updated>2005-11-03T23:39:17.786-06:00</updated><title type='text'>The Next Big Thing</title><content type='html'>Oh, some of you are going to scream.&lt;br /&gt;&lt;br /&gt;As those of you who were at this years con will be aware (&lt;a href="http://ww2.kfs.org/slides/"&gt;slides here&lt;/a&gt;), our game isn't a PC sitting in gophur's office. It's actually a complicated cluster of machines, a sort of distributed computing grid.&lt;br /&gt;&lt;br /&gt;At the start of this year we had three really big obstacles to forward progress in game systems, where the host was related. 1/ The client's UI which had died at birth in version 1.6 and come to a screaming, stinking, revolting halt around version 1.16. 2/ A single point of failure from the map/mission host to the game-world hosts (cell hosts). 3/ The distribution of processing on the cluster machines (cell hosts).&lt;br /&gt;&lt;br /&gt;We've tackled #1. #2 is what makes some of the mission concepts we want to deliver (such as &lt;u title="Officer In Charge"&gt;OIC&lt;/u&gt; nearly impossible to implement. #3 is probably a huge contributor to some of the current infantry issues and also things like RTB at mobile spawns, server tracked objects (or ordnance) and further increasing the number of visible players.&lt;br /&gt;&lt;br /&gt;#2 is going to involve a hunka-chunka client work, so its looking like the next biggie for me is going to be the next day or two working on getting rid of two entire servers and re-integrating them into what we call "hostd". (Unimaginative I know). The result should be around a 500% drop in CPU usage on each of the machines, which will free up a little CPU for some "good stuff" while also freeing it up for the stuff that the hosts are currently supposed to be doing.&lt;br /&gt;&lt;br /&gt;It's a fairly massive undertaking, and hopefully the very least the players should see is no change at all, maybe a reduction in infantry warping, but I haven't had chance to really analyze this as a probably cause.&lt;br /&gt;&lt;br /&gt;After that I need to break ground on some of gophur's list on my board, until we have enough Rick and Ramp time to help me crack issue #2 up there. Once we get that done ... Oh yeah... Fun times. It just bugs me to be having to work on any more "under the hood" stuff this year, I think our playerbase is in need of some direct loving and not more greasing the wheels. But there's really no other way around it ;(&lt;br /&gt;&lt;br /&gt;Ah crap. It's 11.30 and I'm still in the office. Post ends.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-113108275774461409?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/113108275774461409/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=113108275774461409' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113108275774461409'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113108275774461409'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2005/11/next-big-thing.html' title='The Next Big Thing'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-113097218104168086</id><published>2005-11-02T16:47:00.000-06:00</published><updated>2005-11-02T16:56:21.120-06:00</updated><title type='text'>Civ IV</title><content type='html'>Civ IV: It's not that the problems are so major they can't be worked around, nor is it a case of "I could do better", it is that this is Civ &lt;i&gt;&lt;b&gt;IV&lt;/b&gt;&lt;/i&gt;, which they claim to have written from the ground up, and yet they've re-created bugs and mistakes from Civs II and III. I've got enough game-bugs to last me a life time at work, I was really hoping for a polished and well turned out Civ IV.&lt;br /&gt;&lt;br /&gt;I've built a huge toolset here at CRS for managing and monitoring the game (mostly written in &lt;a href="http://www.roxen.com/"&gt;Roxen's RXML&lt;/a&gt; which makes it a breeze). Over the last couple of weeks I've been dabbling some with &lt;a href="http://developer.mozilla.org/en/docs/AJAX:Getting_Started"&gt;Ajax&lt;/a&gt; concepts. It's kinda fun but I actually got to put some of it to use today. I'm used to web-based stuff that has to query hefty, non-oracle databases being kinda slow and clunky, but with a little dolop of Ajax you can really speed things up. Plus it's nice to be able to start thinking multithreaded in a javascript environment *chuckle*.&lt;br /&gt;&lt;br /&gt;Back to the grindstone. I can't decide which of the 5 things I'm working on to pick up again tho.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-113097218104168086?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/113097218104168086/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=113097218104168086' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113097218104168086'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113097218104168086'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2005/11/civ-iv.html' title='Civ IV'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-113081538240120547</id><published>2005-10-31T20:47:00.000-06:00</published><updated>2005-10-31T21:23:02.626-06:00</updated><title type='text'>Civ IV (no thanks) and Shadowbane (first peek)</title><content type='html'>For such a high-profile lineage, Civ IV is just sloppy, terribly so. Although if you read the Afterwords in the back of the manual it's not quite surprising. These guys are developing to a community and presumably they &lt;i&gt;chose&lt;/i&gt; to develop the game like a garage game.&lt;br /&gt;&lt;br /&gt;I can see why they did some of the things they did - for instance the fact that once you issue an instruction to an order the game scoots of to the next unit. But not immediately, just eventually. Just long enough, actually, for you to try and issue the second instruction you wanted to give your unit.&lt;br /&gt;&lt;br /&gt;When you're re-grouping units within a square it's a real clickfest. You click once and it automatically selects some random arangement of prior grouping. So you click on the icon for the unit you're going to try and regroup, it shuffles all the units visually and then it &lt;i&gt;deselects the units&lt;/i&gt;. What the hell?&lt;br /&gt;&lt;br /&gt;I like the idea behind the diplomacy and religion systems but annoyingly they've only given the meat of the system to the NPCs - which limits your options for juggling politics, although I guess with human players you can probably do that stuff verbally.&lt;br /&gt;&lt;br /&gt;I loved Civ3 and CivNet - spent so much time playing those, but taking them so crudely into 3d emphasized a lot of the omissions. And there are just so many minor bugs that I can't help but wonder if the QA team thought it sucked and decided to spend their time playing Civ3 together instead.&lt;br /&gt;&lt;br /&gt;On another note... Tried Shadowbane tonight. Had fun with the Ubisoft site, got locked out for 15 minutes - presumably - because their servers take a while to sync up, they don't *mention* that though.&lt;br /&gt;&lt;br /&gt;"Detecting display" claims my monitor runs in 1280x1024@-1hz, and then runs in safe mode of "800x600x4294967296hz". I wonder if that's why it's flickery?&lt;br /&gt;&lt;br /&gt;Didn't take me long to realize that ShadowBane isn't something you jump into. They have a hefty collection of races, base classes, professions and disciplines, and rolling a character without spending a day or two reading through all the stuff on that is not going to be a lot of fun. So I picked randomly and launched into the game.&lt;br /&gt;&lt;br /&gt;Yeesh, I thought the WWII 1.19 font was small - it was readable on a 19in monitor. The shadowbane default font is tiny by comparison. Ok - so tomorrow I'll find the option for it and crank up the size.&lt;br /&gt;&lt;br /&gt;The layout is immediately subtly different than MMOs, it has a feel of violence to it - which is a good thing. Everything is laid out to keep the bottom-center of the screen clear, which seems to be how a lot of people organize their pvp HUDs/UIs. I'm not sure why, though. My avatar is the last one I'm interested in, its of the least threat. It's the wizard 100ft away from me, currently obscured by the Options window that it would have been nice to have seen - especially since there are fliers in shadowbane.&lt;br /&gt;&lt;br /&gt;Then again, the view is 3rd person so it probably helps not to have the view of people walking up behind you obstructed.&lt;br /&gt;&lt;br /&gt;The tutorial window kicked in, the tips short and to the point, arranged like slides so that there are multiple tips per window.&lt;br /&gt;&lt;br /&gt;And here my first experience sort of wound-down.&lt;br /&gt;&lt;br /&gt;The last tip on the first pane says "Click the right arrow button to display the next tip, which will describe camera controls". &lt;CLICK&gt;&lt;br /&gt;&lt;br /&gt;"Tip: Your character has died!". No, she's standing up, she really doesn't look dead. Hmm. I wonder if this is just displaying a random tip? So I click through for a while and they seem to be randomly ordered. Nothing about camera control, nothing about movement.&lt;br /&gt;&lt;br /&gt;Finally I try some stuff, get confused and lost. Hitting esc brings up a menu top of which is help, under which I find "tutorial tips". Yay! This brings up the camera controls tip - at last.&lt;br /&gt;&lt;br /&gt;Back on track, I work through the camera controls tips. It's a little quirky (move to the edges of the screen to rotate your view the opposite way), but there are options for that so it's cool and heck I might even get used to it. We're rolling now.&lt;br /&gt;&lt;br /&gt;Nearing the end of the tip we come to "Press the M key, hold down the alt key or activate the middle mouse button to activate mouselook mode".&lt;br /&gt;&lt;br /&gt;Aha - that's the baby I was looking for.&lt;br /&gt;&lt;br /&gt;M&lt;br /&gt;&lt;br /&gt;Hi. This is a map of the world. I want mouselook mode.&lt;br /&gt;&lt;br /&gt;M&lt;br /&gt;&lt;br /&gt;Hmm. Ok&lt;br /&gt;&lt;br /&gt;Alt&lt;br /&gt;&lt;br /&gt;[Snow falls, the three human NPCs stand there blithely without so much as a thick coat]&lt;br /&gt;&lt;br /&gt;Hello? ALT&lt;br /&gt;&lt;br /&gt;[A player runs past, springs back 15 feet and re-runs the distance before vanishing]&lt;br /&gt;&lt;br /&gt;Middle mouse button.&lt;br /&gt;&lt;br /&gt;Ok. So there's no mouselook mode apparently. Nice of them to update the tips.&lt;br /&gt;&lt;br /&gt;Once again the tip concludes by saying "Click the right arrow button".&lt;br /&gt;&lt;br /&gt;Click.&lt;br /&gt;&lt;br /&gt;"Your character has reached 20th level!"&lt;br /&gt;&lt;br /&gt;Really? Wowza. This is the wrong tip, isn't it?&lt;br /&gt;&lt;br /&gt;Click.&lt;br /&gt;&lt;br /&gt;"Congratulations! You have gained a level!"&lt;br /&gt;&lt;br /&gt;Maybe not. Maybe I'm level 21 just by getting these confusing tips?&lt;br /&gt;&lt;br /&gt;Click.&lt;br /&gt;&lt;br /&gt;"Your character has died"&lt;br /&gt;&lt;br /&gt;Must have been a tough tip. Click.&lt;br /&gt;&lt;br /&gt;"You are a level away from 2nd tier!"&lt;br /&gt;&lt;br /&gt;Is this good or bad? Did I lose a level or gain one? Click&lt;br /&gt;&lt;br /&gt;"There is a door neary"&lt;br /&gt;&lt;br /&gt;YES! There is! Sweet. Lets see what this does for me. Ok. Right click to walk to the door. Got it. Double click on the door. Ok. Now right click to enter? Uhm. No. Character just standing there. Repeat several times with a couple of doors. Finally I notice a little window hiding up by my chat bar that says "Owned by &lt;white shield&gt;" I'm guessing I'm not allowed inside this building.&lt;br /&gt;&lt;br /&gt;Ok ok. Enough with the confusing tips. Lets see if it mean't *left* arrow button. So I try going backwards. Only the tips you get back clicking on the back arrow aren't the ones you've just been through. It seems someone has seen fit to randomize the tips without actually seeing the results for themselves implementationwise -- or maybe it looks/feels different if you have a different expansion than came with the free trial.&lt;br /&gt;&lt;br /&gt;As best I can tell the game is operated by right-clicking the mouse, there are no movement keys. There are, however, camera movement keys.&lt;br /&gt;&lt;br /&gt;Ok. So I had a bit of a freaky day and I'm a little rantish. I know that so I'm not going to give up on Shadowbane just yet. Tomorrow I'll read more of the offline tutorials/manuals, see if there are options to make the game drive a little more like other games, and see where I can get. It looks/sounds interesting, although it also looks/sounds complex.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-113081538240120547?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/113081538240120547/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=113081538240120547' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113081538240120547'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113081538240120547'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2005/10/civ-iv-no-thanks-and-shadowbane-first.html' title='Civ IV (no thanks) and Shadowbane (first peek)'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-113065703318583468</id><published>2005-10-30T01:15:00.000-06:00</published><updated>2005-10-30T01:23:53.213-06:00</updated><title type='text'>What I said before...</title><content type='html'>Ugh. I've been flipping from WWII to Civ IV. I went AFK for about a half hour to eat at one point and when I came back half my models had lost their colour and gone sort of murky.&lt;br /&gt;&lt;br /&gt;It would seem that Soren Johnson is a focus stealer. Despite the growing collection of annoyances and bugs I'm running into, I was starting to enjoy my last game and I had a 3 hour Civ IV session. And then I was in the middle of moving some units in a flanking move to attack Montezuma. I was trying to deploy my catapults next to his city but for some goddamn reason the game decided to pick a different unit. I had clicked the unit I wanted to move, it had been selected (little animation had played even), but as I was pushing the mouse down the screen started to slide left - the game f**king selected something else all on its own, and the result was that it moved all my defenders out of my capitol. Bye bye capitol.&lt;br /&gt;&lt;br /&gt;I've also gotten tired of it focusing dialogs arbitrarily. Maybe it is predictable, but I got the hang of how it selected things in CivIII fairly quickly. Right now I keep shooting myself in the foot by not waiting 3-5 seconds after every screen-move/action/etc. Instead things keep popping up that steal my default button/key or even appear under the goddamn mouse while I'm left clicking.&lt;br /&gt;&lt;br /&gt;Holy freaking hell. How difficult is it to disable default keys/buttons/etc for 250ms after displaying a new dialog to give the user chance to react -- or to recognize that the mouse button was depressed *before* the dialog was rendered and not interpret it as a click of a button you're about to or have just-this-frame drawn.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-113065703318583468?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/113065703318583468/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=113065703318583468' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113065703318583468'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113065703318583468'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2005/10/what-i-said-before.html' title='What I said before...'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-113059946335387946</id><published>2005-10-29T10:08:00.000-05:00</published><updated>2005-10-29T10:24:23.380-05:00</updated><title type='text'>Civ IV: When game developers ruled</title><content type='html'>Krieger and Gophur were planning to play this weekend but both of their CD2s are trashed so they didn't even get it installed.&lt;br /&gt;&lt;br /&gt;Yeah, I ran into the second CD being mislabelled too. It's crashed the first two times I've tried to launch the game. Bunch of other stuff that says "Wow, this is really low quality &lt;i&gt;software development at work&lt;/i&gt;".&lt;br /&gt;&lt;br /&gt;I very much suspect that the suits got antsy and the game got pushed out the door. At least that will be the tale.&lt;br /&gt;&lt;br /&gt;From a "suite" perspective, of course, the developers started to slip the project during the last months/weeks, after all that time of saying it was on track.&lt;br /&gt;&lt;br /&gt;Game development &lt;i&gt;is&lt;/i&gt; very different than any other form of development - in its entireity. But then so is every other form of development. But this garage-history does &lt;i&gt;not&lt;/i&gt; make it totally unique and unlike every other form of development. It shares far more with other development disciplines than practitioners are ready to admit (another trait of many other practices :)&lt;br /&gt;&lt;br /&gt;And Civ IVs foibles tell me that this is a game that was knocked up by game developers rather than developed by them.&lt;br /&gt;&lt;br /&gt;Game dev companies largely seem to fail to understand source control. Every time I hear a dev talking about a checkin that "breaks the build" I'm baffled - and then I remember that we mis-use source-control at Playnet and I wind up doing that exact thing.&lt;br /&gt;&lt;br /&gt;If you're going to run a source control system, it has a server. That server should be capable in some form of running an acceptance test: do these files you are checking in still compile? No, well then you cannot check them in outside of a personal branch.&lt;br /&gt;&lt;br /&gt;Most game programmers turn into whiney spoiled bratts when you describe something like this to them. Take some goddamn pride in your work. Do you have any idea how much better a feeling it is to release a game that is not just a fun concept but also a *great* play? An "inconvenience" like this rapidly turns into a convenience and the small discomfit of learning to work slightly differently rapidly becomes a real comfort and luxury.&lt;br /&gt;&lt;br /&gt;Remember all those times you got your vibe going, you get your thang on, you pull the latest code and ... Well, might as well get a coffee until someone figures out what they broke.&lt;br /&gt;&lt;br /&gt;Acceptance tests don't stop you checking your stuff in, they stop you breaking other people. You probably already do personal acceptance tests - how often do you save what you've done and tell the IDE to compile? Imagine, instead, that you replace "save" with "save&amp;check in" (to your a branch) and got the same compiler feedback?&lt;br /&gt;&lt;br /&gt;OK - those of you who use Source Safe are probably shaking fists or vomiting profusely - and any other revision control system that believes a branch is a copy of the entire repository (*sigh*).&lt;br /&gt;&lt;br /&gt;But like I said - game dev companies largely seem to fail to understand source control.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-113059946335387946?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/113059946335387946/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=113059946335387946' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113059946335387946'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113059946335387946'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2005/10/civ-iv-when-game-developers-ruled.html' title='Civ IV: When game developers ruled'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-113055624354836664</id><published>2005-10-28T22:22:00.000-05:00</published><updated>2005-10-28T22:24:03.550-05:00</updated><title type='text'>Civ IV: Ill Omen</title><content type='html'>I'm as far into the install as selecting the destination directory and already an annoying bug -- the installer keeps changing focus away from the directory window. I spent a lot of time playing Civ3 and CivNet - perhaps too much, my heart really isn't into IV. I suspect I'll be playing WWII and ShadowBane this weekend :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-113055624354836664?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/113055624354836664/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=113055624354836664' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113055624354836664'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113055624354836664'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2005/10/civ-iv-ill-omen.html' title='Civ IV: Ill Omen'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-113055604311757716</id><published>2005-10-28T22:09:00.000-05:00</published><updated>2005-10-28T22:20:43.143-05:00</updated><title type='text'>Installing Civ IV</title><content type='html'>I'd rather be playing &lt;i&gt;our&lt;/i&gt; game which I've missed these last 3 days, but I'm way too tired, and I'm eating to boot.&lt;br /&gt;&lt;br /&gt;I also decided to try ShadowBane, but when I go to www.shadowbane.com I get some flash thing that on neither my brand-new box or my old and creaky laptop does anything more than display "Loading" and "0%".&lt;br /&gt;&lt;br /&gt;Several people at today's seminars made a remark along the lines of "let me know when someone manages to create a non-geographically distributed server architecture" (referring to in-game geography). Uhm, well, WWII Online does that. We assign our players a server when they are in-world and that's where they live. We carefully manage what information needs to be kept where so that interprocess exchanges are minimized. At the second seminar, &lt;a href="http://www.gameconference.com/speakers/adamjoffe.html"&gt;Adam Joffe&lt;/a&gt; mentioned that Sony actually have a game with that architecture. Since it's not SWG, I wonder if it's either PlanetSide or TMO. I avoided asking him tho.&lt;br /&gt;&lt;br /&gt;And when I came to CRS this setup just seemed natural to me. While I understand zoning from a design and gameplay perspective, Damion Schubert's "comfy spaces" was right on, IMHO, from a purely technical standpoint - perhaps because I've never built a zoned game - just seems like it might be harder to implement. I envisage zone-handoffs being a nightmare.&lt;br /&gt;&lt;br /&gt;I figured there might be some magic reason, such as reducing the memory footprint that each process is associated with, so I tried asking. But I think the two approaches are alien enough that I would need to really corner someone for a discussion about it rather than wallop them with it as a post-presentation quick-question :)&lt;br /&gt;&lt;br /&gt;My Marie Callendar's pot pie just pinged. Time to eat.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-113055604311757716?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/113055604311757716/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=113055604311757716' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113055604311757716'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113055604311757716'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2005/10/installing-civ-iv.html' title='Installing Civ IV'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-113048049647274592</id><published>2005-10-28T00:27:00.000-05:00</published><updated>2005-11-02T02:38:00.100-06:00</updated><title type='text'>Austin</title><content type='html'>Came down to Austin yesterday with Gophur for the AGC. I realized last night that its very close to 20 years since I first (and last) met Richard Bartle so meeting him on as close to an anniversary as makes no difference was kinda cool. Best seminar of the day, IMHO, was &lt;a href="http://www.zenofdesign.com/"&gt;Damion Schubert&lt;/a&gt;'s "What Vegas can teach MMO designers". He drew the comparison between slot machines and the grind, which brought to mind the analogy of MMORPG &lt;u title="Instead of insert quarter and pull the lever, it's cast spell and insert dagger and see what comes out of the slot/corpse"&gt;gaming and gambling&lt;/u&gt;. I think that MMO content generally drives players to work one "machine" until they get the jackpot instead of encouraging them to work the floor, so to speak. So I wanted to ask him if in his research he'd come across anything on how casinos plan their rewards. But I think he was just starting an interview and I sort of fluffed the question.&lt;br /&gt;&lt;br /&gt;I'd love to hear his PvP version of the same talk :)&lt;br /&gt;&lt;br /&gt;Finally got to meet Jessica Mulligan briefly, although before I could talk to her Gophur and Marty carted me off for lunch.&lt;br /&gt;&lt;br /&gt;I know I was a little glassy-eyed finally meeting the mythic folks last year, but I didn't think I earned the alarmed, need-to-be-elsewhere, look of recognition =) That's what I call the look I saw on Damion when he got cornered by Doc (our Australian friend) at Maggie Maes.&lt;br /&gt;&lt;br /&gt;Lum joined us upstairs at Maggie Maes for the last half of the evening which was a blast, we ran a gamut of topics - from nipples to nipples with visits to other topics like the perils of being an MMO server developer, breasts, the ultimate call-girl based MMO sales strategy and, ofcourse, Hot Coffee. Gophur briefly described the candle he carried from age 7 for an online Star Wars game, and the descration he assigns to Raph Koster.&lt;br /&gt;&lt;br /&gt;Most novel of the 'nars was the first, Jane Macgonical's &lt;a href="http://en.wikipedia.org/wiki/Alternate_Reality_Game"&gt;Alternate Reality Game&lt;/a&gt;s, which covers things like &lt;a href="http://www.flickr.com/photos/avantgame/sets/750401/"&gt;The Ministry of Reshelving&lt;/a&gt;, &lt;a href="http://www.torontozombiewalk.com/"&gt;Zombies&lt;/a&gt; and &lt;a href="http://www.monochrom.at/daumen/netzwerk-eng.htm"&gt;Massively-multiplayer thumb wrestling&lt;/a&gt; :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-113048049647274592?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/113048049647274592/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=113048049647274592' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113048049647274592'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113048049647274592'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2005/10/austin.html' title='Austin'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-113017484175025076</id><published>2005-10-24T12:13:00.000-05:00</published><updated>2005-10-24T12:27:21.766-05:00</updated><title type='text'>Woot! Patch day!</title><content type='html'>I feel like I'm being born or something. We've been going at it so hammer and tooth since 1.19 I was almost going to say "this patch has been 9 months in the making" but it hasn't. It totally feels that way.&lt;br /&gt;&lt;br /&gt;I can't wait to get in and play some with the new tools and toys. And I can't wait to go out tonight and get sh*tfaced.&lt;br /&gt;&lt;br /&gt;Actually, I'm dreading talking to players in-game today after we roll out the patch. I wanna just play the game for a few hours today, without having to think about what comes next. Sometime in the last 9 months I've passed a bit of a turning point for me. The game has such cool stuff in its immediate future that the game "now" can become seriously less fun to think. So I'm finally starting to understand why the rats are so rarely &lt;i&gt;seen&lt;/i&gt; in-game.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-113017484175025076?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/113017484175025076/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=113017484175025076' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113017484175025076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/113017484175025076'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2005/10/woot-patch-day.html' title='Woot! Patch day!'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-112975993914278877</id><published>2005-10-19T14:45:00.000-05:00</published><updated>2005-10-19T17:12:19.156-05:00</updated><title type='text'>150fps in Anhee</title><content type='html'>Holy cow. I guess I can finally afford some of the niceties of a modern gfx card :)&lt;br /&gt;&lt;br /&gt;It bottomed out around 50fps, with 122fps while moving around as a rifleman.&lt;br /&gt;&lt;br /&gt;Getting the box running properly took me most of the night. I'd actually hit on the solution earlier in the day but if you don't uninstall nForce4 drivers before upgrading to 6.66 or 6.67 you start to get the BSOD all over the place.&lt;br /&gt;&lt;br /&gt;I had to bump the voltage to my memory up from 2.60 to 2.70, change the timing from 1T to 2T and change a bunch of DRAM settings to specific values I found squirrelled away on &lt;a href="http://forums.abit-usa.com/"&gt;the ABit forums&lt;/a&gt;. That, of course, caused Windows to stop booting, so I had to reinstall Windows.&lt;br /&gt;&lt;br /&gt;I plugged my old non-SATA drive in and started to reinstall. The drives worked fine but Windows-executive saw the non-SATA drive as C and the SATA as D. I figured this wouldn't be a problem so I was just very careful, and off it went installing Windows onto the SATA drive. I figured once the install was done Windows itself would see things the right way around, which it did.&lt;br /&gt;&lt;br /&gt;The trouble was that it was still booting from the old non-SATA drive, which meant when it came to removing that drive I wouldn't be able to boot. Plus it was offering me both versions of windows to boot from and not allowing me to make the non-SATA drive the default.&lt;br /&gt;&lt;br /&gt;So I unplugged the ATA drive, one last reinstall on the SATA drive, ghosted the resulting install, and set to installing drivers. Only once everything was up and running did I finally plug the ATA back in, and everything worked like a treat.&lt;br /&gt;&lt;br /&gt;Sadly I think I'm gonna be too tired to sit infront of a computer at home for a few nights :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-112975993914278877?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/112975993914278877/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=112975993914278877' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/112975993914278877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/112975993914278877'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2005/10/150fps-in-anhee.html' title='150fps in Anhee'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11458003.post-112969348715432293</id><published>2005-10-18T22:41:00.000-05:00</published><updated>2005-10-18T22:44:47.166-05:00</updated><title type='text'>Vexed</title><content type='html'>I'm trying to put the machine together. At first Abit made me believe they don't support the 3700+. Turns out it's a San Diego 3700+ which they do support (although they don't actually recognize the right CPU settings).&lt;br /&gt;&lt;br /&gt;Then it turns out my problem is memory timings. I get those resolved and then I discover my problem is ALSO a faulty ram stick. Grr.&lt;br /&gt;&lt;br /&gt;So I pop a MemTest86 CD into the drive and power up. Whir whir, beep, whir whir whir chug chug ... pause ... beep. WTF? It rebooted.&lt;br /&gt;&lt;br /&gt;I have a 1Gb usb flash drive, and I'm inclined to try and install memtest86 - a more recent version - onto that and see if it works.&lt;br /&gt;&lt;br /&gt;Unfortunately, despite finding lots of sights remarking at how easy it is to do things like this, &lt;i&gt;nobody actually bothers to describe how&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;So...&lt;br /&gt;&lt;br /&gt;Anyone here happen to know how to get a MemTest-86 booting USB Flash Drive? Can I burn an iso onto a flash drive somehow? Is there some kind of mini boot environment I can bootstrap onto my flash drive? Or ... what?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11458003-112969348715432293?l=kfsone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kfsone.blogspot.com/feeds/112969348715432293/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11458003&amp;postID=112969348715432293' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/112969348715432293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11458003/posts/default/112969348715432293'/><link rel='alternate' type='text/html' href='http://kfsone.blogspot.com/2005/10/vexed.html' title='Vexed'/><author><name>kfsone</name><uri>http://www.blogger.com/profile/04519838965968213025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://ww2.kfs.org/images/shifty.jpg'/></author><thr:total>2</thr:total></entry></feed>
