Categories
Uncategorized

Funorb first impressions

(the new casual games portal from Jagex, the people behind Runescape)

– good game/website integration, very smooth
– very basic game design – most games seem to ahve never been playtested, or designed by very novice game-designers. Most simply aren’t fun, and need just a few basic tweaks.
– control systems mostly awful, bouncing and snapping and with unnecessary lag.
– No ability to see your achievements! Achievements rock, but they don’t seem to understand the main point of them – showing them off.
– artwork and sound are extremely polished.

Summary:
– a very highly-polished (graphics, sound) attempt to clone Pogo, but without fully understanding how and why it works so well, and ultimately coming tragically short. Go play Kongregate instead – its much more of a mixed bag, but the overall experience is much, much more satisfying.

(Notes from several weeks ago, accidentally clicked save instead of publish at the time)

Categories
bitching maintenance

WordPress 2.5 can’t login; blog broken; debian sucks

I just tried to upgrade WordPress to 2.5, and the whole blog broke; when I got it half fixed, I couldn’t login as admin any more and instead got the following error – and here’s how to fix it:

Categories
programming

Why did people start calling ‘rewriting things better’ refactoring?

(re-posting from private forum thread)

My response to this question was a bit of a gross generalization, and made several assumptions about the questioner; I hope I didn’t misinterpret what they were getting at. I *think* I got it right:

Because it’s not “rewriting things better”.

It’s “changing the implementation of things without changing the observable effects of the overall system, even if the system is BROKEN at the moment”.

By cutting out a much smaller problem than “rewriting things better”, you get a more powerful suite of techniques: there are complete processes which just don’t work if you allow yourself to spend time improving the code at the points where, instead, you are meant to merely “refactor”.

Damn useful technique – although I found it hard at first to get over the idea of leaving broken features broken: I felt guilty doing it. But it works, and eventually the guilt goes away, as you see that it really is the right thing to do (…in the appropriate situations, of course, and as part of the right process(es)…)

In the forum thread, I didn’t go into the details – you can google a lot of uses for refactoring.

There’s one great example I ALMOST wrote about last year, but didn’t get around to (I didn’t realise until now that I’d never posted it…Doh!): using refactoring with unit testing to convert an old code base to a new code base, but doing it with many many passes.

Brief summary of the parts that would be relevant here:

  • Traditionally, with a horrendous mess of a codebase that needs converting, you’d either suck it down and spend many months (maybe many man-years) “converting” it – or else give up and rewrite it from scratch, one part at a time
  • With Refactoring, you can rewrite it from scratch INSIDE the existing codebase, LESS than one part at a time, so that you get to use all the new code you’re creating immediately (instead of waiting for the complete system to be rebuilt-from-scratch)
  • This works because Refactoring does NOT “fix” the code, it merely moves it around a bit, perhaps changes some minor subparts of it, often parts that have no effect on the overall system
  • “no effect” means NO effect: no performance improvement, no change to the end-users
  • …which allows you to use a particular Refactoring task in your schedule to merely “make the code slightly more amenable to be improved in the future; make it a bit less messy”

Yes, this shows no overall improvement in the system after each Refactoring pass – but you make those passes so EASY and so QUICK to do that one individual programmer can do literally HUNDREDS of them in a few weeks.

Traditionally, even doing just one “rewrite this small part of the system better” task would take months to even get started, because each time you think you’ve “fixed” it, you uncover another broken part, somewhere else in the system, somewhere that SHOULD be unrelated but sadly isn’t, that prevents your fix from working.

With refactoring you just shrug, smile, ignore it, and get on with making small incremental improvements every day, and go home happy in the knowledge you’ve at least achieved SOMETHING today, even if no-one else will see the result of it until you’ve achieved many more days of little somethings. But then they’ll be amazed, because in the limit – as the complexity of the codebase / number of refactorings tends towards large numbers – the sum total of small steps of refactoring quickly becomes net improvements to the code base that were literally IMPOSSIBLE with traditional software engineering: they would have taken so many man years, you’d never have finished them in the liftetime of the product you’re working on.

So. Just one example there, of how refactoring is a useful – and unique – tool, quite separate from “rewriting things better”.

Categories
computer games games design java tutorials programming

Writing games in Korean – part 2

Using a custom font renderer that lets me position text exactly where I want it, I put together a simple game that teaches you to count from 1 to 10 in Korean characters.

Screenshot of numbers test

First, you HAVE to manually download the Korean font I’m using (because I don’t think I can legally include it in the executable file :( )

http://www.i18nl10n.com/fonts/UnBatang.ttf

NOTE: you MUST (windows is rubbish) do “Save to” and select C:\Windows\Fonts (this causes windows to automagically “install” the font) – I can’t remember how to install new fonts on Linux or OS-X, but it should work fine with both of those OS’s too.

Then just stick the two attached files in a directory somewhere, and double-click on the one called korean-numbercounter-all.jar

Essential library (download this)
Main file (download this to same directory as the library file, and run this file)

NB: this is mainly just a proof of concept to test my rendering code, I’ve got a couple of other simple “games” like this I’ve knocked up as tests.

Categories
bitching Web 0.1

Web 0.1 – British Airways

Travelling to Helsinki with British Airways, 24 hours before the flight I received an email telling me that “Online Checkin is now available” and providing a link to check-in online.

So, from my blackberry, I tried the link. It’s broken – it runs some buggy javascript that ends up redirecting to the britishairways homepage (probably because someone is using a 10-year-out-of-date hacky “what is your web browser” check instead of writing the page properly), and then does something I haven’t seen in years – an infinite redirect to the same page. I left the browser for about 5 minutes, and it was constantly redirecting for all that time, as fast as it could load the tiny HTML fragment, around once every 5 seconds.

Sigh. I tried again, this time from Firefox. Now things worked fine, and it picked up my flight automatically from the code embedded in the URL they’d emailed me. Great.

Only, after clicking through a series of pages – I want online checkin; yes, I want it now; yes I’m ready to checkin; yes, I’m the only passenger / have all other passengers with me – it goes to an error page saying:

This flight does not support online checkin. Please checkin when you get to the airport.

So … what was the purpose in sending me that email in the first place?

If they hadn’t bothered, then I’d never have found out that their website is broken, and I wouldn’t have wasted my time trying to do an online checkin process that they don’t allow for flights to Helsinki. Even better, I would never have found out that the email address they sent me the email from has an auto-responder saying “we never read any emails sent to this address, please use http://www.britishairways.com for any support queries”.

Of course, the original email doesn’t say this, and the address isn’t something obvious like “noreply@”, so I’d written them a proper complaint and given them the details of their broken site. All of which they proceeded to automatically delete.

Verdict: BA’s hamfisted attempt at using the internet has shown not only their incompetence, but also their contempt for customer service. It’s also created a desire in me for online checkin, shown me how easy it COULD be, if I were flying with an airline that supported it. All in all, they’ve gone out of their way to use the internet to persuade me to stop flying with them in the future – and I haven’t even got to the airport yet! Definitely a case of Web 0.1…

Categories
computer games dev-process java tutorials programming

Writing games in Korean – part 1

First, check whether I can actually render Korean characters. I know that Unicode supports nearly all of the glyphs (or, more correctly it seems, “ideographs”) needed for Chinese, Japanese, Korean (typically abbreviated as “CJK”) – but I also know that MS Windows fonts are infamous for missing some/most/all of the unicode characters (there are tens of thousands of them, so this is not all that surprising – except that Microsoft has been shipping OS’s localized to those countries for many years now, so I’d hoped maybe they would include at least ONE “CJK + Latin” font on all machines by now, no? No; they don’t).

Quick test program using Java (NB: java one of the easier languages for this because it was invented late enough that Unicode had settled down, and so it has extremely good Unicode support built-in to the core libraries, unlike C++ et al. By default, Java uses unicode almost everywhere, so I don’t need to debug unicode support, yay!):

NB: …but then when I tried it I quickly discovered a problem. I quickly gave up on the obvious route, so might have missed a workaround, but… I could have done this using Java’s built-in GUI toolkit (Swing), which supports using any font as a text label. However, it seems there’s a design flaw in Swing that’s been around since 1997 (yes, folks, 11 years and counting): the only component that can have the font changed – JLabel – which is a “general-purpose” label for any GUI component (good idea!) … is incompatible with the only component capable of being a button – JButton – which is a “general-purpose” button. Crap. If I’m not missing something here, with one small piece of poor API design, Sun have made their *almost* international-friendly GUI system almost completely useless for multi-language GUIs. Just to be clear: it’s not specifically internationalization they’ve broken here: its a general issue – any forms of customized rendering cannot use the JButton / JLabel combo. Why? Why, why, why would you do such a stupid thing, after going to the effort of making these generic widgets? Oh, well. Custom rendering it is…

/**
 * Simple test program that renders Unicode characters from a particular font of
 * your choice, a couple of thousand at a time, automatically wrapping them based on
 * render width on screen.
 * 
 * You need to manually change the font name and the start/end co-ordinates of where
 * in the unicode constellation to render.
 */

import java.awt.*;
import javax.swing.*;

public class PaintSomeUnicodeChars extends JFrame
{
	void setup()
	{
		getContentPane().add( new charPane() );
	}
	
	public static void main( String[] args )
	{
		PaintSomeUnicodeChars window = new PaintSomeUnicodeChars();
		window.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
		window.setup();
		window.pack();
		window.setSize( 600, 500 );
		
		window.setVisible( true );
	}
}

class charPane extends JPanel
{
	public void paint( Graphics g )
	{
		int si = 44032;
		int ei = 46000;
		g.setColor( Color.red );
		g.setFont( new Font( "Verdana", 10, 40 ) );
		g.drawString( "Chars from " + si + " to " + ei, 30, 30 );
		
		g.setColor( Color.black );
		g.setFont( new Font( "Lucida Sans Unicode", 10, 20 ) );
		
		int accumulator = 0;
		int height = 20;
		int xwidth = getWidth();
		for( int i = si; i < ei; i++ )
		{
			char[] chars = Character.toChars( i );
			String drawString = String.copyValueOf( chars );
			int advance = g.getFontMetrics().charsWidth( chars, 0, chars.length );
			
			if( accumulator + advance > xwidth )
			{
				accumulator = 0;
				height += g.getFontMetrics().getHeight();
			}
			
			g.drawString( drawString, accumulator, height );
			
			accumulator += advance;
		}
	}
}

Why choose Lucida Sans Unicode?

Apart from the fact that it’s present on all modern Windows machines automatically, I cheated a bit and used Character Map (Start > Programs > Accessories > System Tools > Character Map) to quickly inspect each of the fonts already installed and find out which ones had lots of unicode in them. Character Map has a neat feature where it completely ignores missing characters, automatically skipping over them, so you can very quickly see if a font has lots of unicode, some, or very little.

Stepping through in the java app, I fairly quickly found lots of Unicode characters. success – I can correctly render arbitrary Unicode characters in java.

NB: important because it took a lot more lines of source than I expected; java’s built-in “char” datatype is incapable of being used to render Unicode, because it’s too small a range of values. That also means you can’t use ANY methods that take a char as argument (this is documented in the Java API docs for Character). I’d never really used the methods that take int’s as argument before…

Fonts…

Not really happy with the font, though, and it’s clearly missing a whole bunch of characters. Some googling for free CJK fonts found me that allegedly Arial Unicode MS would work – which comes free with Microsoft Office (which I have on one of my machines).

NB: the way font licensing works, it’s probably illegal to copy a font you have on one machine to another machine you own. Unless you can obtain the font from the original source (e.g. in this case by buying a second copy of MS Office).

Arial Unicode MS has lots of characters, but … they’re wrong. At least, one third of the ranges of Korean characters are completely useless, as far as I can tell, because whoever made this font (whoever Microsoft licensed it from?) didn’t read the spec carefully and stuck the wrong characters in from U+1100-U+11FF. More on this later…

Giving up on that font, I went looking for others. The first four or five I tried that didn’t look ugly were all from download sites in Japan or Korea and kept crashing on the download. I found a couple of places hosting UnBatang (“UnBatangOdal.ttf”) and claiming it was free, but the first I found where the download didn’t crash was on http://www.i18nl10n.com/fonts

UnBatang (the name you have to use in Windows / Java from inside an application in order to load it) seems to work very well. It has nicely painted ideographs for the main range of Hangul characters/syllables, and it has *correct* glyphs for the other two ranges (although they’re a bit ugly).

Unicode Hangul

Specifications for official standards tend to be big. Really big.

Specifications for anything to do with internationalization tend to be huge.

Add in localization and data-transfer between different cultures, and you can expect something gargantuan.

So, I was really really happy to find a downloadable copy of only the CJK Chapter of the Unicode 5.0 specification (it’s still a big document!). This contains a full explanation of what Hangul is in Unicode, where to find it (yay!), and why there are not one but three separate sets of Hangul glyphs.

Here’s the preface to the Chapter 12 PDF I downloaded, in case you want to find the spec / electronic version yourself:

Electronic Edition

This file is part of the electronic edition of The Unicode Standard, Version 5.0, provided for online
access, content searching, and accessibility. It may not be printed. Bookmarks linking to specific
chapters or sections of the whole Unicode Standard are available at

http://www.unicode.org/versions/Unicode5.0.0/bookmarks.html

Purchasing the Book

For convenient access to the full text of the standard as a useful reference book, we recommend purchasing
the printed version. The book is available from the Unicode Consortium, the publisher, and
booksellers. Purchase of the standard in book format contributes to the ongoing work of the Unicode
Consortium. Details about the book publication and ordering information may be found at

http://www.unicode.org/book/aboutbook.html

Unicode 5, Hangul, and Arial Unicode MS

So, armed with the offical spec, I read up on Hangul. What did I find?

The Unicode Standard contains both the complete set of precomposed modern Hangul syllable
blocks and the set of conjoining Hangul jamo. This set of conjoining Hangul jamo can
be used to encode all modern and ancient syllable blocks.

(this is the glyphs at U+1100–U+11FF)

“conjoining Hangul jamo” means “these glyphs have been positioned inside their spaces in the font so that if you need to make one ideograph out of, say, four Korean letters, you just pick the top-left version of the first letter, the top-right version of the second, etc, and OVERLAY all the glyphs, and what comes out will autamatically be correctly spaced out etc”.

What did the author of Arial Unicode MS do?

Made all those glyphs take up the full available space, and centre them horizontally and vertically.

Why? Seriously, why? Because any application that tries to render those characters is going to render them on top of each other (according to the specification, this is the ONLY point of having those characters), and you won’t be able to read at all what the letters say.

If you want to render just individual letters from the Korean alphabet, there’s a different range of Unicode where you can find them all centred etc (which Arial Unicode MS also has … so it seems to be just copy/pasting internally).

I guess the font author just didn’t read the spec. Or I’m completely misunderstanding the spec. But the fact that UnBatang spaces the conjoining jamos out in such a way that this works as I expected it to suggests to me that it’s the Arial Unicode that’s broken…

The joy of Conjoining

I couldn’t get hold of the Unicode spec section on how to conjoin, because of some mimetype problems between their server and my PDA’s web browser. I figured I could probably work it out by trial and error fairly quickly.

I can’t remember how to spell my name in Korean yet – I know the letters, I’m just a bit flaky on what the placement of them is. So, a quick experiment, to see how easy it is to position characters using the Conjoining Jamo from UnBatang:

	... constants used later - the Unicode values for the letters of my name: ...
	
	int a = 0x1161; // jungseong vowel
	int d = 0x1103; // choseong consonant
	int d2 = 0x11ae; // jongseong consonant
	int m = 0x1106; // choseong consonant
	int m2 = 0x11b7; // jongseong consonant
	int blank = 0x110b; // silent char you place at front if first letter is a vowel
	
	... the body of the paint method: ...
	
	g.setColor( Color.black );
	g.setFont( new Font( "UnBatang", 10, 30 ) );
		
	int w = 0;
	int lead = 0;
	w += renderIdeograph( g, blank, lead, 40  );
	w += renderIdeograph( g, a, lead+w, 40  );
	w += renderIdeograph( g, d2, lead+w, 40  );

	lead+=30; w = 0;
	w += renderIdeograph( g, blank, lead+w, 40  );
	w += renderIdeograph( g, a, lead+w, 40  );
	w += renderIdeograph( g, m2, lead+w, 40  );
		
	lead=0; w = 0;
	w += renderIdeograph( g, blank, lead+w, 80  );
	w += renderIdeograph( g, a, lead+w, 80  );
		
	lead+=30; w = 0;
	w += renderIdeograph( g, d, lead+w, 80  );
	w += renderIdeograph( g, a, lead+w, 80  );
	w += renderIdeograph( g, m2, lead+w, 80  );
	
	... and then this method to do the paint of each part of an ideograph: ...
	
	/** Doesn't really render an ideograph, renders a single glyph from the Font */
	public int renderIdeograph( Graphics g, int i, int x, int y )
	{
		char[] chars = Character.toChars( i );
		String drawString = String.copyValueOf( chars );
		int advance = g.getFontMetrics().charsWidth( chars, 0, chars.length );
		
		g.drawString( drawString, x, y );
		
		return advance;
	}

Which renders exactly like this:

hangul-adam-unbatang.PNG

Which makes me want to point out the nice thing about properly specified fonts: in the source code, I simply did “the natural thing”, as if I were outputting characters in an arbitrary conjoined language:

  1. Render the first part of the first ideograph at (x,y)
  2. Ask the font to tell you how many pixels wide (w) it just rendered that part
  3. Render the next part of the first ideograph at (x+w,y)
  4. …repeat until first ideograph is complete, increasing w more and more each time…
  5. Choose a value for how much you want the ideographs separated from start to start (ideograph_width)
  6. Render the first part of the second ideograph at (x + ideograph_width, y)
  7. …repeat as for first ideograph

And it worked. First time. I didn’t expect it to – I expected to have to do something strange like manually “reset” the (w) value each time I went from the first line of the ideograph to the second (Korean orders letters top-left, top-right, bottom-left, bottom-right, (repeat) … as opposed to Latin which is just left, right, more right, even more right, etc).

For this to have worked, it means the font is deliberately rendering the lower letters (e.g. d2 and m2 in my constants) a long way to the left of the origin that you tell it to render them at. This would be very, very confusing if you just tried to render these letters individually (well, duh).

Of course, if you try to run that code using Microsoft’s Arial Unicode MS font, you get a complete mess instead, because that font is FUBAR, as mentioned before. You get this:

hangul-adam-arial-unicode.PNG

…which is completely incomprehensible.

Categories
dev-process games industry

Bureaucracy

Thinking about the B-word recently … it seems that Bureaucracy doesn’t solve any problems; all it does is organize the solutions you already have, to make them more effective.

Which I think is why bureaucratic procedures MUST be updated, changed, revised, and replaced on a regular (almost frequent) basis. I vaguely remember that Lou Gerstner’s book on how he saved IBM in the 1990’s had some details on why bureacracy is good, and what it is.

It’s also why most attempts to introduce bureacracy fail to have any beneficial effect, and instead waste the time and energy of everyone involved; not because bureaucracy sucks (which is the impression most people get, quite understandably), but because it exposes and highlights all the other problems those organizations already had but were doing nothing to solve.

Sadly, in my experience the process usually seems to go something like this:

  1. Have a bunch of tricky but not impossible problems
  2. Management and/or staff lack one or more of the time, skill, experience, or courage to deal with them, or (for one of those reasons) grossly underestimate the scale of the problems
  3. Someone introduces bureaucracy to try and “solve” them rather than actually summon the energy or the courage to do the solving part themselves
  4. Bureaucracy takes lots of effort to introduce, and SEEMS to end up “making things worse”, because it exposes more eloquently the problems, so that more people see more problems than they saw before
  5. Management write-off the bureaucracy as a waste of resource
  6. Management ignore the problems that are now painfully, glaringly, obvious (as revealed by the bureaucracy)
  7. Management never does bureaucracy again, blames all the existing problems on bureaucracy, and hopes that by ceasing to do any bureaucracy those problems will gradually go away of their own accord.

If you introduce bureaucracy without knowing HOW and WHY it will solve your problems, then you are relying on nothing more solid than blind hope. Hope is not a strategy.

Categories
computer games games design massively multiplayer security

MMO Economies Suck: But developers are blameless

…according to Ed Castranova’s snippet that Scott J posted from the MDY vs Blizzard trial notes.

Courtesy of Scott, here’s a hosted copy of the source documents.

Ed writes a nice little explanation of why / how bots damage an in-game economy. I liked that. Good stuff – go read it. So far, so good – a great primer for anyone wanting to understand the situation better.

Unfortunately, the implication throughout the document is that this is all directly damaging to Blizzard’s revenue, and should be prevented *by someone other than Blizzard*.

I think this is a really stupid way of looking at things. My impression from reading the submission was that it’s overall a somewhat twisted description of the situation, coloured by a desire to use the facts (economic analysis) to support a personal desire (stop people using bots rather than go to the effort of fixing the bugs in the game-design). Sure, capitalist companies will pursue the cheapest possible means to achieve their goals, including suing people if they think they’ll succeed, but I deeply object to this kind of good factual analysis being spun to imply it proves stuff that it does not prove, and which consists an attempt to dodge responsibility and use the legal system to make up for mistakes in a company’s product-development strategy. Make better games, don’t blame the players for not playing the way they were “meant” to. Even the ones who are cheating. Ban them for cheating, stop them however you can, but don’t claim it’s not your fault that they’ve managed to cheat in the first place: of course it’s your fault.

Picking the snippet Scott quoted, which is nicely indicative of the whole piece:

Glider bots destroy this design, distorting the economy for the average player in two specific ways. When a Glider bot “farms” an area, it picks up not only experience points for its owner, discussed above, but also the “loot” that is dropped by the mobs killed by the bot. Because Glider can run constantly, it kills far more mobs than anticipated by WoW’s designers, thus creating a large surplus of goods and currency, flooding the economy with gold pieces and loot like the Essence of Water. This surplus distorts the economy in a specific way.

When bots gather key resources, they gather them in abundance. Owners of bots usually sell these resources to other players for gold, which inevitably deflates their price. Blizzard’s design intent is for the resources to command a certain high value, so that average players, who might get one or two of the resources in an average amount of play time, may obtain a decent amount of gold from selling them. But because characters controlled by bots flood the market with those resources, the market value of these resources is far less than Blizzard intended, and the average player realizes only a fraction of the intended value from the resources s/he finds. The deflated value of key resources presents a critical problem for ordinary players trying to enjoy the game. Blizzard’s game systems assume that players will be earning a certain amount of gold per hour, and many systems, such as repairs and travel, force players to make fixed payments of gold into WoW’s systems. Buying a horse, for example, costs a certain amount of gold. That pnce IS set by the game designers based on the assumption that normal players will accumulate gold at a certain rate, and that some of their gold will come from the value of resources that they harvest and sell. When the value of those resources plummets because of Glider, the amount of time it takes to accumulate the gold required for in-game expenditures like the horse skyrockets. This skews the economy, frustrates players, and, as a result of a less-satisfied user base, damages Blizzard.

My interpretation of the above argument:

  1. Designer makes various tables of numbers showing relationship between prices, rarity, the difficulty of achieving items at a given level, etc. This is normal – people who do this are often called “balance” game-designers, because they’re balancing out the risk/reward, cost/effect of everything
  2. Developers hard code these values, on the assumption that the world is perfect, they are God, and nothing could ever go wrong (this is fine; normally you make that kind of mistake once, and then fix it when you realise the problems this is going to cause)
  3. System collapses because of “bad people”
  4. When caught in such situations, Developers get to blame everyone except themselves, even though it’s clearly their own shoddy game design / implementation

The analysis is economically accurate, but the conclusions about the impact on design, and whose responsibility it is to contain/prevent/undo this, is just making out game developers to be lazy, stupid, bullies. People should take responsibility for their mistakes, not blame everyone else. Especially not blame the users of a game. Even if they hack your game to pieces and cheat like crazy THAT’S STILL YOUR FAULT AS A GAME DEVELOPER. You may hate them, rightly so, but it’s your responsibility to make better games. At least, that’s how we used to make games. Maybe the industry doesn’t work that way any more. Maybe it’s just me that thinks that way, maybe to everyone else in the industry a “bad game” isn’t your fault as a developer, it’s the players’ fault for not being clever enough to appreciate the coolness of your game.

Look at Diablo – it fell to pieces and died because of in-memory live hacking of the game-data. Seriously hardcore stuff (in a way). But that didn’t mean everyone just shrugged and said “those nasty hackers, they ruined a perfect game, it’s not the developers faut”, instead we took it to mean they hadn’t built it well enough, that next time they would have to change their approach, or their priorities, to prevent this from happening again.

To pick one more quote that underlines how silly I think this piece is because of the spin being put on it:

Glider bots occupy resources that Blizzard could otherwise put to other, more constructive uses. Because those resources are required to fight Glider, they are spent in a way that does not improve the game

Well, duh. And the same is true of most of the work being done by the Customer Service depts that all of the MMO companies pay large amounts of money to in salary every day. And it’s also true of the hardware that we use to run the game. Etc, etc. Just because a development cost “does not improve the game” doesn’t mean you have grounds to go and sue someone else for causing you to have to do it.

Where does it stop, if you go down that route? Are we going to start suing players who ask questions of the CS team that are too stupid? Will we bill players with crappy graphics cards for our time that was wasted diagnosing problems with their hardware that were stopping them from playing our games?

Which is not to say that I support botting or bot applications. I don’t support either. And I believe there are many different ways you can fight them, and there are many good reasons for shutting down people and organizations that use them. But I don’t think the reasons given above are included. And I don’t want to sink to the level of making specious arguments just because it’s the path of least effort…

Categories
fixing your desktop

Anti-aliasing fonts is really stupid

As a quick followup to this article (how to workaround the bug in Microsoft Office 2007 that breaks your fonts in Windows), I had to show someone today what I meant when I said that their laptop was set to “blurry” mode, and realised there was a quick way of testing it.

If you can’t be bothered to try it, here’s two screenshots that demonstrate precisely why I hate blurry fonts on any good-quality LCD:
blurry-windows-11.PNG

The image on the left is Windows in “blurry” mode (with forced anti-aliasing of all system fonts). The image on the right is the exact same system, just with blurring turned off. Note that the way Windows renders fonts, the title bar of the two windows looks significantly different. This is really annoying, because the left hand title IMHO looks much nicer – but that same effect isn’t applied to the rest of the window, including the menu bar, which looks awful.

Categories
games industry recruiting

Hiring bonuses in tech companies

I finally realized the answer to something that had been bothering me for years: why is it that so many “good” companies pay such small referral bonuses (the cash payed to an employee when they successfully find a friend/ex-colleague/etc to fill an open position at the company) ?

Categories
agile computer games dev-process games industry

Fighting Consulting Firms

a.k.a. how some Publishers view independent Developers

This is a quote found buried in the middle of the otherwise completely unrelated, but sometimes highly amusing, “rant to end all rants” about the rise and fall of the talent and skill of the people within the Ruby on Rails development community:

I have a few pieces of advice for people about to hire any company like ThoughtWorks. There’s just a few simple strategies you can follow to make sure you get the most out of them and get your money’s worth:

1. Make sure you have the right to see every resume and interview each consultant they place. Treat them like new hires and don’t let anyone who’s not worth the rate you’re paying on the team.
2. Demand a variable rate based on the position of the person and their experience.
3. Demand that no employees can leave the project to work on another project. These placements have to be for the life of the project or until the employee quits.
4. Require that you have the right to have someone replaced if they are not immediately capable. Part of what you’re paying is that a ThoughtWorker should be able to drop in commando style and just start working. The reality is they are usually totally lost anyway.
5. Seriously consider recruiting one full time employee as a team lead, another as a project manager, and then staff the rest of your team with independent consultants. You’ll find that you get more control and better quality at a lower price.

Having employed one extremely famous web-design consultancy, run by some of the most famous world experts in using XHTML/CSS (and doing so attractively), and had very similar discoveries/realizations about their dodgy business practices when we were charged 5-figure sums for 3 webpages that were thrown together in around half an hour … in 2005 … I found the list above quite a good starting point for anyone considering paying an external team of experts :).

At some point, I’d like to followup with my own lessons learnt from what to do and what not to do on the publisher side of the game-publisher/game-developer relationship.

Categories
computer games databases entity systems games design massively multiplayer programming system architecture

Entity Systems are the Future of MMOs Part 4

Massively Multiplayer Entity Systems: Introduction

So, what’s the connection between ES and MMO, that I’ve so tantalisingly been dangling in the title of the last three posts? (start here if you haven’t read them yet).

The short answer is: it’s all about data. And data is a lot harder than most people think, whenever you have to deal with an entire system (like an MMO) instead of just one consumer of a system (like the game-client, which is the only part of an MMO that traditional games have).

Obviously, we need to look at it in a lot more detail than that. First, some background…

Categories
community games design web 2.0

Are you pro-Community, or anti-Community?

Web 2.0 strategies often say “we can’t compete with our users, there’s too many hundreds of millions of them, and actually – collectively – they outmatch us in almost everything we do. So we’re going to bring them into our company, we’re going to let them develop the products, we’re going to let them take our technology and decide what other uses it can best be put to. And we’re not going to beat them over the head with copyright laws, because we can make so much money from the vastly increased volume of users that we get from this that it’s a virtuous circle. If we get too hung-up on controlling our data, and limiting access to our systems, and preventing people from accessing stuff “until it’s ready”, we actively prevent our community from helping us”.

Think about that: many of us, on a daily basis, are actively preventing our communities from helping us.

Categories
programming

Data and Digital Computers don’t exist?

There’s no such thing as a digital computer. Except in extremely controlled or constrained environments. I suspect those exist … somewhere … but I don’t work in hardware development, so I’m pretty ignorant of that area.

This is something I didn’t realise until I was studying Computer Science at university, and it was something of an epiphany for me: not that “computers aren’t infallible” but that – at least in the way I spent my life imagining them – they don’t exist AT ALL. All you’ve got is an analogue computer that pretends a billion times a second to be digital, and some number of times a second fails. Fortunately for you who rely on digitalness, a bunch of other analogue circuits inside your analogue computer exist specifically to detect when the simulation diverges from a what a theoretical digital computer would do, and overwrite parts of the analogue data with new data to make it conform to the digital ideal it is simulating. It’s only ever a simulation, and – for the most part – a poor one, with lots and lots of stuff going on to try and keep the simulation accurate.

This isn’t an analogy, or metaphor – this is how modern computers actually work.

Is this useful? Probably not :),

I think indirectly it helped me, over time, to let go of organization in software development and embrace the unknown, which is pretty useful in any explorative or uncontrollable project management situation (just to be clear: I don’t mean only games development here, I’ve seen plenty of similar situations in mainstream IT). The last time I had a grasp of current physics theory, it was fairly widely accepted that there’s nothing in the real world that’s ever “known”, there are only estimates, but digital computers quietly squat there in literature and culture apparently sticking two fingers up at the whole concept. Only, they don’t, it’s really just us being lazy about terminology, and being self-delusional about the concept of “digitalness”.

It also emphasizes some of the fundamental differences between two aspects of systems: substance and data. A very poor explanation, I’m too tired, but: the substance of the system that is your computer is in no way digital; the data that conceptually “exists” (but doesn’t, in fact, exist) within that system is truly digital. The substance and the data are two extremely different things. So, part of each system (e.g. your Operating System, or your application, or your networking library, etc) actually exists, and has real-world behaviours. Other parts do not exist, and are more conceptual.

I find this in turn helps me appreciate the fundamental incompatibilities of data and systems, except for systems designed to store particular kinds of data, and vice versa, and above all to appreciate data as the lingua franca for all digital electonics: it’s the only thing in that universe that actually is digital. All the rest is an approximation…

Categories
games industry

[bruceongames] Some great game development blogs

Bruce had a smart idea: a regular roundup of blogs written by games-industry professionals. Not players, not retailers, not journalists – no, the people who actually make the games. And then asked everyone to copy/paste repeat the post. So, here we go, Bruce’s list from http://www.bruceongames.com/2008/02/27/some-great-game-development-blogs/

* Mainly About Games. Informative and well written it has a nice personal feel to it.
* Dopass.com. Short entries not just about gaming. Funny at times.
* A path through possibility. Irregular updating but well worth a read for some incisive commentary.
* Japanmanship. An incredibly good read of a Western developer’s life in Japan.
* Magical Wasteland. Refreshingly irreverant.
* Survival Horror. Does what it says on the tin.
* Gamedev.net. A big and serious site with a lot of good content.
* Seven Degrees of Freedom. Very nice diary style blog.
* Random Encounters in Imaginary Realms. Just cherry picks the good stuff.
* Cheeky. Sparse and interesting development diary.
* Peter Mackay’s projects and development diary. Quake on Gamecube.
* Life In The Rain. Often long interesting personal articles.
* T=Machine. Wide ranging blog with much that is happening at the sharp end online.
* Black Company Studios. Semi diary semi event driven articles. Nice.
* .mischief.mayhem.soap. A serious game developer’s blog.
* JakeWorld Blog. The life of a game developer.
* Gamefeil. Games, comics, diary.
* Scientific Ninja. Technical stuff here.
* Devbump. Aggregation of gaming articles.
* Nimblebit. Game development diary. Lots of technical stuff.
* It’s Bezness time. Bedroom developer diary.
* I love it, I feel like Sisyphus. On start-ups, game development and programming.

…and of course all those in the blogroll over in the right-hand navbar on this page. I add blogs there because they’re people I know and what they write is well worth reading. Although I keep forgetting to add people, so this idea of Bruce’s is probably better :).

Categories
computer games conferences games industry GDC 2008 recruiting

GDC08: Hottest Jobs at the Hottest Companies

Summary

Speakers: Karen Chelini, SCEA; Jason Pankow, Microsoft; Matthew Jeffrey, EA

I didn’t stay more than about half the session – my laptop battery ran out, so I couldn’t take any more notes. I’m writing this up really only because there was one key point that came up which illustrates something that CMP and their GameCareerGuide.com do often which hugely angers me, and I want to see changed. They not only spread a rumour that is blatantly not true, but I keep meeting undergraduates and students wanting to break in to the games industry who are in danger of having years of their lives wasted because of this misinformation.

Which is a real pity, because other than that I think GameCareerGuide.com is fantastic. I wouldn’t have written an article for them if I didn’t believe in them and in what they do (generally).

Categories
databases dev-process programming

Improving your dev process: Automating collection of game-crash info

(As spotted in last month’s Game Developer magazine’s Inner Product column. Good enough that I wanted to draw some attention to it, and hopefully add a bunch more of these good ideas as I come across them / remember them)

Most games, when they crash hard enough, memory dump. The customer (or internal tester during development) can then be requested by the dev team to find a specific file in a specific directory (the mem dump) and email it to them for analysis.

Some games actually popup a dialogue to the user, to tell them about this file, and where to find it, and who to email it to.

Some even include some contextual information automatically (“the user was on Level 3, and has the following DirectX hardware info”). Most just ask the user to fill in a field “telling us what you were doing when it crashed”.

Most games, during development, automatically either popup – or display in a custom textarea – a message every time somethign unexpected happens, something that MIGHT be a symptom of a bug. There are even conference talks about how to avoid making your playtesters so sick of error messages that they stop bothering to read them, and hence the messages become mostly a waste of time.

How many games do a simple call to the SQL client library to send to the local SQL server a simple detailed report of what happened, when, why, and how bad it was? This information is ALL already available, but how hard is it to copy/past the following into your source code and execute it as an SQL command?

INSERT INTO reports.errors (time, problem, severity, stacktrace, user, IP, clientversion) values (TIMENOW(), “+assertion.getMessage()+”, “+assertion.getLevel()+”, “+assertion.getStacktrace()+”, “+assertion.getUsername()+”, “+system.getLocalIPAddress()+”, “+client.getVersion()” );

Nice idea – free, detailed, metrics on exactly why, when, and where your game exe is crashing, any unexpected problems, anyone who’s running an out-of-date version, etc.

And with the dev team no longer having to rely on users *actually bothering to tell them* when they see big flashing warnings and errors, we might avoid some of the programmer/artist antipathy (“[artist] hey, can you help me with something?” “[programmer] its got an error! no wonder it doesnt’ work!”, “oh, ignore that, it always does that”, “um, how long has it been ‘always’ doing that?”, “ever since around the time the game started running really slowly, 2 months ago. It sucks – now everything takes me twice as long to test. But that’s just life, I guess” [cue: programmer grinds teeth, smashes forehead on desk, or similar]).

NB: I have nothing against artists. They are just an easy scapegoat for a not-very-funny-but-actually-quite-painful-if-you’ve-been-there joke. No artists were harmed in the making of this post.

Categories
alternate reality games GDC 2008

GDC08: Alternate Reality Games group gathering

(re-posted here from the main IGDA ARG SIG blog (http://igda.org/arg), because the IGDA webserver is too weak and crappy to allow image uploads, which I needed to do :( )

The 2008 GDC Group Gathering went well, with approximately 20+ people turning up. We had a quick discussion about SIG activities and then broke out for the standard mingling and networking. Photos + discussion items below.

Categories
computer games conferences games design GDC 2008 massively multiplayer

GDC08: Free to Play! Pay for Item: The Virtual Goods Debate

Summary

Speakers: Daniel James, Three Rings; Matt Mihaly, Iron Realms Entertainment

Very brief notes…

Categories
alternate reality games computer games conferences games design GDC 2008

GDC08: Lessons Learned in Location-based gaming

Summary

Speaker: Jeremy Irish, Groundspeak

Entertaining, with a lot of very small anecdotes, but nothing non-obvious in this talk. Everything he gave as advice you’d probably work out for yourself within your first project without losing time from doing so.