May 20th, 2012 by adam

(back to playing RotMG again)

1. the Oryx assault: make it more inclusive, more multi-player

Background: sooner or later, players learn that it is impossible to gain anything from the (compulsory) assault except level-ups. The assult is grouped into 3 separate squads of players, each of which have their own route into the center. There is an advantage to being first to the center – you get a chance to do damage to Oryx sooner, and get access to the portal in to his inner sanctum before the other squads.

Problem: 99% of players are guaranteed unable to enter the inner sanctum. They might as well quit before they start. 1% of players are almost certain to get into the sanctum – but need the help of their squad.

Change: Record which “squad” each player arrives in, and award a “squad bonus” to the squad whose player enters Oryx’s sanctum first.

Details:

  • hilight the players in the squad who have the necessary items to enter sanctum (e.g. with a glow)
  • use different shades of yellow on the map for the different squads, making it clear which squad is ahead
  • each time a player enters the sanctum, announce it in global chat, along with the squad ID (1, 2, 3 etc)
  • every player in the squad is credited with a temporary or consumable boost, e.g. one of:
    • +10% def bonus, temporary, lasting 5 minutes real time (rounded up – e.g. 8 def = +1 def; 13 def = +2 def)
    • +300hp pot, soulbound

Summary: Oryx assult becomes more competitive, more meaningful – and actually worthwhile for the lower-level players. Most importantly, the massive risk (very easy to die during the asssault) has a (potential) reward. The reward is temporary/consumable, so has no long-term effect on power inflation.

May 17th, 2012 by adam

I’ve played many hundreds – probably over a thousand – games on Kongregate alone, now.

On top of all the thousands I’ve played on console, PC, flash, handheld, mobile, etc.

I feel pretty confident in analysing game mechanics, and success/fail reasons for given game-designs, based off my extensive experience.

I frequently use my knowledge to influence design decisions and programming decisions in the games I work on.

But how many people in the games industry can say the same?

Hmm.

(PS: many people claim to “have no time to play games – too busy working”; my view has always been: if you really care about the art and the craft of this industry, you’ll make the time. No question about it)

May 17th, 2012 by adam

I can’t find this. NASA’s web presence (in their defence, they have a **** tonne of data) is damn hard to navigate for simple queries (i.e. anything that’s not highly-specific, PhD material). I’ve found the “12 months of the year blue marble” dataset that gives you: Earth, without clouds.

And that includes a single momentary snapshot of: Earth, with clouds.

But – surely – somewhere there is “24 hours of clouds moving around earth”? Can’t find it! Help?

May 17th, 2012 by adam

Something like 90% of game developers NEVER get a royalty for their games, and almost as many never get a bonus.

But for the handful that work on titles where the studio negotiated a good deal (modulo the Publisher’s legal team using legal chicanery to make all royalties work out at “$0″) … it’s interesting to see what they get.

So, for Call of Duty, we have: Infinity Ward’s 2003 royalty deal with Activision.

NOTE: that doc *does not include* bonuses; it mentions them a few times, and says they’re taken out “before” the royalties. One of the publisher tricks is to award 100% of the profit to their own executives as “bonuses” – so that the external developer gets a royalties based off $0. You’d really want to see the bonuses doc too to check what the value of these royalties is…

Anyway, that aside, some headline points:

  • no upside limit (royalties aren’t “capped” – a sneaky practice I’ve seen publishers use before. A dev studio should NEVER accept a cap!)
  • NEW game series / IP created by the developer: developer gets 10% of net income (profit)
  • Sequels to the developer’s NEW games, or NEW games that re-use the developer’s game-engine, and NOT made by the developer: developer gets 2% of net income (profit)
  • Sequels made to the developer’s EXISTING games by the developer: developer gets 10-15% of net income (profit)
  • Sequels made to the developer’s EXISTING games and NOT made by the developer: developer gets 4% of net income (profit)
May 9th, 2012 by adam

When you “upgrade” to Lion, be aware that Apple will silently wipe your “auto install / update” settings, and start aggressively downloading every update it can find for every Apple app you use.

In my case, this was gigabytes of data – I really don’t care (and don’t want) “upgrades” to PhotoBooth and other trash that Apple pre-installs. But, because Apple wants to force these on you, they’d already wasted large amounts of bandwidth (on my laptop – on a desktop broadband connection, I wouldn’t care), and reduced my internet browsing for a few days before I found this out.

So … when you upgrade … remember to open “Software Updater”, and change the setting (that Apple has overwritten), back to “don’t check automatically”. Sadly, there’s no setting for “don’t download stuff unless I tell you to” – but at least turning off the auto-check avoids this.

May 6th, 2012 by adam

Adobe just doesn’t seem to get the message: the latest version of Adobe Acrobat Reader puts a NEW virus(*) on your desktop, and all the old methods for removing it … don’t work. I previously used this tip from 2010 to remove the virus, while still using the Adobe software installed on my machine, but it no longer works.

With OS X Lion, I’m now trying again with a new approach (through trial and error this seems it might work – but I’ll update this in a few months if the virus still hasn’t come back)

  1. Open Finder
  2. Search for “Adobe Updater”
  3. Should be in an “Adobe Utilities” folder (if they had the chutzpah to call it “Adobe Viruses” I’d at least give them some credit for humour and outright shamelessness :))
  4. Delete that app – move it to Trash
  5. Empty the Trash (just in case it tries to run while hiding in the Trash – should be impossible, but with the back-door hacks Adobe’s already doing, you never know…)

(*) Adobe’s “Updater” has so far:

  1. crashed my laptop (multiple times)
  2. caused it to overheat to the point of hardware damage (laptop emits a screeching noise – that’s the hardware’s “emergency shutdown” warning)
  3. stolen my internet bandwidth when I’m on 3G modem, costing me money, and preventing me from using my own machine

This app cannot be disabled, the web is full of people complaining and begging Adobe to get rid of it, it’s installed secretly (the user is not informed it exists, let alone asked if they want it), and it has NOTHING TO DO WITH the actual app I installed.

What do you reckon? To me, that sounds closer to a virus than anything else. I don’t for a moment believe that Adobe is unaware of the amount of hatred it instils in their customers…

April 26th, 2012 by adam

One of the peculiar distinctions of Jack Vance’s writing is that he vomits obscure words onto the page as if he’d just eaten a dictionary that severely disagreed with him. Sometimes he seems to be parodying his characters – but other times he happily does it for himself.

To be clear: I’ve never seen him mis-use or abuse a word. When you know what all the words mean, it’s a joy to read (although he uses very few words – preferring to use the exact correct – single – word … than to use 10 more commonly-known words to describe the same thing)

Many of them I know – although I know that most people don’t. But at least as many I *don’t* know – although I do recognise them as genuine English words.

And then, occasionally, you meet an Archveult. And then it gets interesting.

JustF***ingGoogleIt: Google: Archveult

The only dictionary hit I could find was an evil bit of SEO that claimed – in the lies it told Google – that it held a definition for the word, but actually just provided a page that said: “I think you mistyped XXXX instead”.

Next step: commercial, offline, paper dictionaries. Real ones, Shakespearean ones, etc.

In the meantime, my best guess – and this is rather funny if true – is that it’s a deliberate portmanteau of “Archmagician” and “La Reyne le Veult” (the Royal Assent). Because the only story I’ve found it in so far (where the word is used repeatedly) is about an (almost) all-powerful woman attempting to conquer the universe by turning all men into women.

(and read the story before you get too excited by that)

Filed in “game design” because … well.

April 23rd, 2012 by adam

I feel sorry for Toshiba; they make good products, but their marketing
seems to belong to a much smaller, poorer company.

Take this advert, from April 2012, when Apple is already far along with shifting their whole laptop lineup to “ultra thin” MacBook airs (rumour suggests the non-thin models will continue to be phased out next cycle – doesn’t matter so much for this post, but if true, it adds extra emphasis to the post):

…and compare it with Apple’s photo from the same period:

Apple’s problems

The iPad 3 is considerably heavier and thicker than the iPad 2. This is a pain for users, but for Apple Marketing it’s a disaster. They’ve been fighting to prevent people equating “iPad” with “low power, low utility, inferior Laptop”. The iPad 1 had a fair go, but struggled. The iPad 2 went a long way to achieve it with it’s ultra slim/light/long battery life.

With other companies (e.g. Google) we’d assume that Apple did intensive market research on iPad 1 vs iPad 2, and found that weight didn’t factor into the purchase decision much. Given this is Apple … I expect it was an internal decision instead. They decided that the sheer awesomeness of the Retina display meant the pain of the weight + thickness would just have to be accepted. Personally, I agree: the Retina makes such a huge difference that it’s a no-brainer to buy an iPad 3.

(NB: even with the considerable increase in weight, and in battery quality, the iPad 3 has a considerably shorter battery life than previous iterations)

So, what does Apple do?

It’s not a bug, it’s a feature: Apple redefines Reality

All previous Apple marketing for iPad/iPhone has included side-on photos on the front page. iPad 3 is the first to use an isometric view – not just on the front page, but *everywhere*.

APPLE LESSON 1: If it’s bad, hide it.

The photo they use is EXTREMELY poorly positioned. The iPad 3 is contorted, the image is squished by perspective, the flower image looks terrible.

But you won’t notice any of that (unless you’re a product-photographer). No, you’ll notice HOW THIN IT LOOKS!

Apple carefully chose the angle to use perspective to hide the actual width of the product. It’s just shallow enough an angle to make it appear that you’re seeing the width – but just deep enough an angle to hide most of the width. (recall that the iPad 2 and iPad 3 both have a very deep bevel on the underside).

Apple also carefully chose the lighting: white iPad 3, ultra bright lights (my gut feel is these are even brighter than normal in Apple ads, which is very bright to start with), even the photo of a delicate thin flower (see what they did there?) is itself over-exposed a little. The iPad itself seems to almost … disappear … on the advert.

APPLE LESSON 2: If it’s really bad, make a photo that lies.

Toshiba: Fat, dark, and ugly

Let’s revisit Toshiba’s photo:

  1. the angle TRIPLES the width of the lid
  2. the angle DOUBLES the width of the base (look at the extreme bottom right edge – the base appears to mirror around the white hilight stripe)
  3. the inside is DARK, with HEAVY, THICK, DIRTY lighting
  4. the shadow underneath the laptop is ALMOST AS THICK AS the laptop itself, and coloured DARK BLACK

OK, so I could forgive poor colour scheme – marketing had no choice in that.

You could (maybe) forgive the stupid choice of perspective – maybe the laptop just looks ugly at any other angle. Or maybe they “needed” to show the ports on the side (if so, they failed: the lighting is so bad you can’t see the important ones).

But … who in Toshiba Marketing approved a photo with a black shadow underneath that makes their “thin” laptop look considerably thicker than it is? There’s no excuse for this: it’s a terrible photo (should have been rejected during the photo-shoot) – but it’s a catastrophically bad piece of marketing.

TOSHIBA LESSON 1: ?

April 19th, 2012 by adam

Hume just posted his Lessons Learned from the warmup for Ludum Dare 23 (48 hours to write a game from scratch – starts this weekend!) – and his positive experience using an Entity System.

In his epic comment (sparked by a different Adam – not me, honest), is this gem:

“Using the entity system for the first time was unreal to me. It’s like polymorphic code. I did really weird things on the fly. For example:

- In the health processor, if the enemy was just destroyed, set a flag in the lifecycle component.
- In the lifecycle processor, if the fresh kill flag is set, extract its loot component and put that into a new entity with a small randomized velocity component and a gravity component so that the loot drops; then, remove most of the other components from the entity and add an explosion component.

The “enemy” still has the same entity ID — any other components that are looking for that entity will still find it (e.g. missiles homing in on the wreckage, or score processors looking for slain entities) — but by swapping one set of data with another, its implementation has changed from an enemy to some kind of non-interactive effect object.”

(emphasis mine)

Identity. It’s important.

(Quick sidenote: for all the people asking questions like “but … which variables do I put in Component A as opposed to Component B? How do I manage Events in an Entity System? … etc” – Hume’s approach above is a good concrete example of the first-draft, easy-to-write way of doing things. Copy it.)

Identity in games

This is one of those things that newbie game programmers seem to underestimate, frequently.

And when I say “newbie” I include “experienced, skilled programmers with 10+ years of coding experience – but who haven’t yet shipped a game of their *own*”.

(e.g. I’ve seen a couple of studios that started as Digital Agencies, or as Animation Studios, etc – that then transitioned to writing their own games. This is the kind of thing that they often struggle with. Not for lack of skill or general programming experience, but for lack of the domain-specific experience of game coding)

Examples of Identity in games, off the top of my head – all of these are independent, and interact in complex ways with each other :

  1. Game-role: e.g. … “enemy”, “powerup”, “start location”
  2. Code ‘object’ (in OOP terms): e.g. … “the sprite you are drawing at position (4,5) is part of Object X. X is coloured THIS colour”
  3. Gameplay ‘object’: e.g. … “the sprite at (4,5) represents a Tank. If a Tank sprite ever touches a Glass sprite, we need to play the Broken Glass noise”
  4. Physics element: e.g. … “5 milliseconds ago, our Physics Engine thought this thing was THERE. Now it’s over HERE. Don’t confuse the Physics Engine! Make sure it ‘knows’ they are the same object – not two separate objects”
  5. Network “master/clone”: e.g. … in multiplayer, there are N copies of my avatar: one per computer in the game. One of those N is the original – and changes to the original are constantly used to overwrite the clones; changes to clones are LOCAL ONLY and are discarded. Which is original? What do we do with incoming “changes” – which local Code Object do we apply them to? (your Code Object will be different from my Code Object – but they’ll both be the same identical Network Object, save mine is flagged “clone”)
  6. Proper Noun object: e.g. … “The Player’s Tank” is a very specific tank out of all the Tanks in the game. Many lines of game code don’t care about anything except finding and operating on that specific tank.
  7. Game-Over representation: e.g. … after the player has killed all the enemies, and they see a Game Over (won/lost/etc) screen, and you want to list all the enemies they killed … how do you do that? The enemies – by definition – no longer exist. They got killed, removed from the screen, removed from memory. You could store just the absolute numbers – but what if you want to draw them, or replay the death animations?
  8. …etc

Identity in Entity Systems

ES’s traditionally give you a SINGLE concept of Identity: the Entity (usually implemented as a single Integer). Hmm. That sounds worryingly bad, given what I wrote above. One identity cannot – by definition – encompass multiple, independent, interrelated identities.

But we’re being a bit too literal here. ES’s give you one PRIMARY identity, but they also give you a bunch of SECONDARY identities. So, in practice…

Secondary Identities in an ES

In OOP, the Object is atomic, and the Class is atomic. You cannot “split” an Object, nor a Class, without re-defining it (usually: re-compile).

In ES, the Entity is atomic, and the Component is atomic. But the equivalent of an OOP Object – i.e. “an Entity plus zero or more Components” – is *not* atomic. It can be split.

And from there comes the secondary identities…

A Primary Identity: e.g. “The Player’s Tank” (specific)
A Primary Identity: e.g. “a Gun Component” (generic)

A Secondary Identity: e.g. “The Gun component … of the Player’s Tank Entity” (specific)

Revisiting my ad-hoc list of Game Identities above, I hope it’s clear that you can easily re-write most of those in terms of secondary identity.

And – bonus! – suddenly the relationships between them start to become (a little) clearer and cleaner. Easier for humans to reason about. Easier *for you to debug*. Easier *for you to design new features*.

Global Identity vs. Local Identity

Noticeably, the network-related Identities are still hard to deal with.

On *my* computer, I can’t reference entities on *your* computer. I cannot store: “The Gun component … of YOUR player’s tank”, because your “Player’s Tank” only exists in the memory of your computer – not mine.

There are (trivially) obvious solutions / approaches here, not least: make your Entity integers global. e.g. split the 64bit Integer into 2 32bit Integers: first Integer is the computer that an Entity lives on, the second is the local Entity Integer. Combined, they are a “global Entity ID”.

(I’m grossly over-simplifying there – if you’re interested in this, google for “globally unique identifiers” – the problems and solutions have been around for decades. Don’t re-invent the wheel)

But … at this point, they also offer you the chance to consider your game’s network architecture. Are you peer-to-peer, or client-server?

For instance, P2P architectures practically beg for unique Global entity numbers. But C/S architectures can happily live off non-global. For instance:

  • On each client, there are ONLY local Entity numbers
  • When the client receives data from the server, it generates new, local, Entities
  • …and adds a “ServerGenerated” component to each one, so it’s easy to see that they are “special” in some ways. That component could hold info like “the time in milliseconds that we last received an update on this object” – which is very useful for doing dead-reckoning, to make your remote objects appear to move smoothly on the local screen
  • The server *does* partition all entities from all machines. But none of the clients need to know that

Or, to take it further, if your network arch is any good at all for high-paced gaming:

  • The server differentiates between:
    1. The entity that the game-rules are operating on
    2. The entity that client 1 *believes* is current
    3. …ditto for client 2, client 3 … etc (each has their own one)
    4. The entity that the game-rules accept (e.g. if a hacked client has injected false info, the game-rules may override / rewrite some data in the local object)
  • The server also tags all the entities for a single in-game object as being “perspectives on the same thing”, so that it can keep them in synch with each other
  • The server does Clever Stuff, e.g.:
    • Every 2 milliseconds, it looks at the “current entity”, and compares it to the “client’s belief of that entity”. If it finds any differences, it sends a network message to the client, telling it that “you’re wrong, my friend: that entity’s components have changed their data. They are now X, Y and Z”

… or something like that. Again, I’m grossly over-simplifying – if you want to write decent network code, Google is your friend. But the fastest / lowest latency multiplayer code tends to work something like that.

How?

Ah, well.

What do you think?

(hint: you can do wonders using Reflection/Introspection on your entity / components. By their nature, they’re easy to write generic code for.

But you WILL need some extra metadata – to the extent that you may wish to ‘upgrade’ your Entity System into a SuperEntity System – something with a bit more expressive power, to handle the concept of multiple simultaneous *different* versions of the same Entity. Ouch)

Yeah, I’m bailing on you here. Too little time to write much right now – and it’s been a *long* time since I’ve implemented this level of network code for an ES. So, I’m going to have to think hard about it, refresh my memory, re-think what I think I knew. Will take some time…

April 19th, 2012 by adam

This is from 4 years ago, courtesy of Steve Yegge. I just came across it by accident, it’s wonderfully well written, but one bit caught my attention in particular:

“First, you can’t tell interviewers what’s important. Not at any company. Not unless they’re specifically asking you for advice.”

Wait – what? … why not? Surely – if you’re being an honest candidate – your views on what’s important are a huge part of the interview process? These people want to know what you’ll be like as a colleague, how you tick – no?

“You have a very narrow window of perhaps one year after an engineer graduates from college to inculcate them in the art of interviewing, after which the window closes and they believe they are a “good interviewer” and they don’t need to change their questions, their question styles, their interviewing style, or their feedback style, ever again.”

Ah. Right. Yes, makes sense now. Sad, but true.

I will also add: for all the reasons Steve cited, I *do not run interviews this way*, and haven’t for a long time now. In my late twenties, I learnt the hard way how stupid a lot of those practices are.

Looking back at my sole Google interview, it explains a lot: I had no idea that Google accepted / allowed these practices among their interviewers – I’d assumed they’d have actively stamped them out. Apparently not. It was a big part of why I never considered Google again: if “A people hire A people” and “B people hire C people”, that part of Google’s process stank of the B people. Not a place I wanted to work…

Of course, Steve’s still writing about Google’s hiring, and his criticisms seem to be getting sharper over time. Just last year, he dropped this into a post:

“It’s a match made in heaven, I’m tellin’ ya. It might take you a couple tries to get in the door, because Google’s interview process — what’s the word I’m looking for here — ah yes, their process sucks at letting in all the qualified people. They’re trying to get better at it, but it’s not really Google’s fault so much as the fault of interviewers who insist that you’re not qualified to work there unless you are exactly like them.”

So … given Steve’s one-man crusade to undo the bad work of Google HR, I’d recommend anyone rejected by Google to give them another go. But don’t look at interview prep questions, don’t brush up on obscure programming technique – just read and re-read Steve’s blog posts, and remind yourself that it’s “a stupid process” you’re trying to get past, one that doesn’t fairly represent the company – nor the colleagues – you’ll be working for.

April 18th, 2012 by adam

… It removes one of the most valuable features of OS X for laptop owners:

OS x lion WILL NOT recharge a plugged-in iPhone when the lid is closed (after 10 seconds of pretending to charge – just long enough to fool you – Apple cuts the power)

At conferences, on sales trips, on plane trips … I have relied on this feature many many times to recharge a phone off the laptop battery.

Now?

Denied.

No user setting for it (that I can find so far) just … Removed :(

April 17th, 2012 by adam

No link provided, but should be easy to find the studio email HR address:

“Hi All, I’m looking for a QA person to join us at Zoe Mode. I need someone with experience as I need QA for multiple titles of different genres. A sense of rhythm will help. Please pass this on, thx.”

Alys is a good person to work with.

April 14th, 2012 by adam

Almost a year after Apple’s disastrous “force consumers to download Lion, instead of installing from DVD”, apparently it still doesn’t work. It’s hard to recommend OS X to anyone after this experience.

UPDATE 2: Apple’s “download a file from the internet” code is so bad it’s causing the MacBook to overheat – 80 degrees celsius, very close to the “automatically reboot” temperature. This is *to download a file*. Apple’s misuse / misunderstanding of web technologies seems quite incredible.

(the process is called “storeagent”)

My last 24 hours:

  1. Buy Lion
  2. Download starts
  3. …it’s a 4gb download, this takes a long time…
  4. Download stops at 25% for no reason.
  5. Resume button gives a wait cursor for 5 seconds, then goes back to “paused”
  6. Repeat twice
  7. Third time, the Resume button is disabled, and now Lion is stuck in “Waiting” and there’s no buttons you can press except “cancel”
  8. Remains in “waiting” for many hours. Googling suggests this is a permanent crash in Apple’s App Store.
  9. Cancel the download, re click the “buy app” link
  10. Apple quits OS X, kills all apps, deletes all unsaved data, throws me out to the login screen
  11. Login again, and Lion icon has appeared in the dock.
  12. …but: Lion now refuses to even start downloading – it’s stuck on “Paused, 0 of 0 bytes”

UPDATE:

  1. Try again (delete OS X Lion, re-purchase from App Store) and … finally the download starts. Waiting now to see if it will complete this time, instead of giving up partway like before…

I.e. Apple’s infrastructure is still blocking me from downloading the OS. How hard can it be to *download a file* ?

Next step: walk in to an apple store and ask them to give me a USB stick, since their webserver is FUBAR.

April 13th, 2012 by adam

Third Reich vs. Game of Thrones … one of the best Downfall mashups I’ve seen (particularly like the timing on “Headless”)

http://www.youtube.com/watch?feature=fvwp&v=1kLSYTHQbm4&NR=1

April 6th, 2012 by adam

“Disruption” used to be mentioned frequently as the thing that every company wanted to be (urged on by investors).

But what is it, really? I’ve met lots of people who believe it’s “a fancy word for ‘innovation’” – but if that’s all, it would be pretty pointless and vapid.

This post from 2011 gives a great explanation based on simple concrete ideas. It explains why disruption is interesting to companies and managers.

What about investors?

It’s a great explanation, although it’s mostly from the perspective of business owners / management. Why do investors – especially startup / VC investors – care about disruption?

The key here is Des’s paragraph about share price:

“Microsoft’s share price hasn’t moved. This is because they are precisely predictable. Their shareholders have gotten exactly what they paid for, and not a penny more.”

A share price that doesn’t move *still provides profit to shareholders* (in the form of annual dividend). In fact, it often provides rather a nice sum of money – just like the rental income from owning property).

…but: Angel/VC investors make the bulk of their profit from changes in the share-price, not from dividends. Two reasons:

  1. Startups usually choose NOT to pay dividends – the money is reinvested into the company instead, to try and grow even bigger, even faster (pour gasoline on the fire of your success, make it burn faster!)
  2. The returns from dividends are – like rent on property – a small fraction of the investment. The returns from the share-price changing are – like betting on a horse-race – a substantial multiple of the investment

If you run your startup perfectly …

If you do everything you said you would do …

If nothing goes wrong …

… your investors may class you a failure. And they’d be right to do so. They didn’t invest for the dividends, they invested for the “surprise me” factor.

(which should, perhaps, give you pause for thought: if they’re “right” to pan you for achieving your aims … are/were you “right” to take their investment?)

April 3rd, 2012 by adam

Thanks to Mike Leahy for spotting this:

http://blog.gemserk.com/2012/02/02/how-we-use-box2d-with-artemis/

…a short blog post (with code) on how a team is integrating Box2D (a very well known open source physics lib) with Artemis (a java implementation of Entity Systems which starts from the same point as my Entity Systems posts, but fleshes it out)

March 28th, 2012 by adam

I’ve recently been playing the excellent Realm of the Mad God – a very fast-paced 2d co-operative shooter. My feeling is that it’s going to be one of the most important games of 2011/2012, as it continues to grow in popularity. Typical experience of this game is that within 30 seconds of being dumped into the main level, you’re surrounded by monsters, and then surrounded by other players, all on the same screen as you, blasting away in a rainbow of colours.

Sounds good. As if that’s not enough … it’s the guys who’ve been working with AmitP (Amit J Patel) (Amit maintains one of the best up-to-date collections of links and algorithms for indie game-developers). If you haven’t seen Amit’s pages, I recommend browsing through the blog – his links collection is OK, but his blog posts on algorithm design are excellent. If you get as far as the posts on “how I auto-generated a realistic 3D-world”, you may notice a striking similarity to the 2D worlds used in RotMG …

Anyway, it parallels an idea for an MMO shooter I’ve had kicking around for a long, long time. For me, it’s been a delight to see what works (and doesn’t) about the core ideas. The RotMG authors have done a great job of making a fast, simple, quick, easy-to-grasp game.

The Good

Fast. No barriers to play

This is how MMO-shooters should be: fast, furious, permadeath – but very quick to get back into the fray. You should expect to die tens of times every hour.

Permadeath – but paralled with some perma-advancement

Your progress is split evenly between items (which can be banked) and avatar stats (which are lost forever upon death).

Perma-advancement increases variety, unlocks new features

With 10 classes, there’s plenty of variety – and each class can only be unlocked by achieving a minimum level of progress with one or more other classes.

NB: this part could be improved and expanded IMHO. In particular, the classes are wonderfully varied – but merely unlocking classes isn’t enough these days. Plenty of games have shown that permanent-unlocks work best when there’s a variety of game-features in there. Also, the classes themselves would work better if there were some cross-effects (c.f. Diablo 2′s Lord of Destruction expansion, which had abilities in one class improve abilities in your older classes, re-vitalizing them for re-play)

Free game, paying is optional – payment kicks in when you’re most bought-in to the design

Free players get a tiny storage for permanent items (1/50th of what paying players get – it’s not enough! … so pay!), and are only allowed 1 class “alive” at once.

In a delicious twist, if you don’t pay for the game, the only way to take advantage of a newly-unlocked class is … to commit suicide … since you’re only allowed a single character per account (unless you pay)

You can ONLY benefit from other players, never suffer

(there’s actually a case where you can suffer, sadly – Thief’s get killed as a secondary-effect of other players teleporting to them, since the game doesn’t have a “prevent people from teleporting to me” flag)

This is the one that should have most wannabe-MMO-designers sitting up and paying attention. If you group-up with other players:

  1. You all get the same experience-points as if you’d single-handedly killed every monster
  2. You get the points just for being nearby – no need to score hits just to “tag” it for yourself
  3. Mob strength is constant, but player damage is multiplicative on number of players present

Net effect:

Every player is willing and eager (*) to collaborate with every other player, without words being exchanged, without fear of being ripped-off.

In a game that’s fast paced and frantic, you don’t have to keep pausing to negotiate. Other players can ONLY benefit you, so … run with them.

(*) – or just ignores the other players. Their presence doesn’t provide negative impact on you. It’s only their absence that is negative (in game-design terms).

Interesting design choices for lag

As a real-time game with dozens of players on screen at once, lag is guaranteed to effect gameplay. We’re always saying “try to work around lag through game-design changes”, so here’s the decisions they made:

  1. When packets are lost, everything moves in exactly the same direction it was going, at exactly the same speed, forever
  2. “Speed” used above is the “on-screen speed, including any rubber-banding effect”
    • FAIL: this means monsters and players often move MANY times faster than they are allowed to – so that when the lag stops, the side-effects are magnified
  3. Your avatar can’t be hit NOR damaged while it’s missing packets from the server
    • For the early parts of the game, this *almost* completely fixes lag problems
  4. Projectiles (bullets etc) that your client didn’t receive are queued up and sent to you all in one go once the packet-dropping stops
    • FAIL: this multiplies the damage output of enemies (NB: not players!), breaking all the designed-in balance in the game
    • In mid to late game, this ruins the gameplay – players end up running around never seeing a single enemy, because if you’re close enough to see it, a single flicker of lag will cause you to receive ZERO damage initially, followed by MORE damage than the monster is capable of – delivered instantaneously
  5. The client is authoritative on player liveness/death
    • MILD FAIL: in effect, coupled with the other features of the game, and the lack of lag compensation … this means you CAN and SHOULD (and, for some cases, effectively: MUST) cheat. You can run a bot on your machine – and if the network is less than perfect, you have to, in order to play the game properly.

Overall, apart from the massive security flaw (where anyone could write a bot to be invulnerable – and the developers are encouraging them to do so), it seems very close to a good solution for an MMO shooter.

I’m surprised by the way they approached the “save up the enemy bullets, then unleash them all at once”. My guess is that it wasn’t designed, it was just an accident: maybe they took a slightly lazy approach to compensating for lag (they don’t), and the net effect is this. It looks very much like what you get when using TCP for game-data packets (I really hope they’re not using TCP; if so, most of the lag is the developers’ own fault)

The Bad

I’ve unlocked half the classes, and looked at what classes other people play (and which classes rise high on the leaderboards). There’s good variety, and almost all the classes get used – even the beginning class, the one you get for free, works well.

Except one.

Unfortunately, at around 50% through unlocking the special classes, one of the classes is horribly unbalanced. The Assassin (which is supposedly an upgraded Thief – but is a massive downgrade) is almost impossible to play. The special ability fails completely when there’s lag (which is frequent in this game), and the class is the weakest, lowest-range of the lot. Looking around, you rarely see Assassins (I suspect: you only see them when people are desperately trying to upgrade them, to get past this dull and frustrating point in the upgrade tree).

Worse, because the *only* way to unlock the higher level classes is to reach the level cap with this class … you’re forced to play it. Over and over again. Watching the bad game-design … over and over … and over … again.

Every time the assassin dies, it’s like another twist of the knife:

We know you don’t enjoy this

We know that a mistake in our game design has you stuck here

(and our overall game design makes that “mistake” into “a disaster”)

We know that this whole process is turning “a class that wasn’t much fun” into “a class you hate”

And there’s nothing you can do about it!

So, single-handedly, it’s driven me to *not* purchase any game credit. I’d enjoyed the game enough to that point that I’d already decided to buy it – and if this had been on iTunes, I’d have paid already. But since it’s not an iPhone/iPad game, and paying for it is a bit more difficult, I hadn’t made the payment yet.

As it stands, I’m still playing occasionally, but now it’s for research rather than for enjoyment, which is a great pity.

Monetization: money thrown away

I think the developers are missing an ENORMOUSLY successful way to make money from this game. In fact, it’s so big, I suspect they could increase their revenues by a substantial multiplier.

With a permadeath game, there really is no need to actually delete the dead character. If the player isn’t paying, they are forced to kill their character sooner or later to change characters.

Taking a leaf from Flickr’s book, why not keep ONE single character in storage, with a tempting “buy now, for goodies *and to have this one returned to you, ready to play*”?

I’d set it so that when you change class (if you’re a free player), only the last character of the PREVIOUS class is retained. If you switch from Warrior to Knight, you can die many times as a Knight, and your Warrior remains on ice. But if you then grow tired of the Knight and switch to a Rogue … the Warrior is tipped out, and replaced with the last Knight you had.

i.e. you setup the exact flow of decision-making and options and “safety” that the player would have had, if only they’d purchased sooner, and allow them to benefit from it retroactively – if only they make the decision to pay.

Of course, it’s a very limited “retroactively” – it’s a sampler, to let you see the benefits of paying.

(*) – Flickr’s early promise was “upload your photos in highest resolution, you can view them for free – but only low-res versions. HOWEVER, we keep the high-res versions for you – forever, for free – until you decide to purchase a subscription. At which point, not just your new photos, but ALL your photos, become magically available at highest res”. It was a great way of simultaneously offering a high-value to paying customers, while making non-paying customers feel they weren’t committing themselves to loss. It reassured a lot of potential customers at a time when Flickr wasn’t yet famous, and most people weren’t yet “hooked” – it bridged that gap.

Analyse this

So, the interesting question is: how common is this problem?

Are the dev team correlating “players who pay” and “the point at which they pay”?

More importantly, are they correlating “players who DON’T pay” and “how their experience differed from the average”?

The last time I saw an MMO with a level-based kick in the teeth this bad … was in Tabula Rasa. We had a point where poor signposting by the quest designers meant many players were given quests that were many levels too hard for them, and effectively impossible to do. Those players died over and over and over again in a short time – and they hated it.

The dev team knew “you’re not supposed to do that quest”, but often they (randomly) gave it to new players as the first quest. I wasn’t privy to the arguments over whether this needed to be changed (and there were definitely arguments), but I did see the analytics that eventually got produced. They showed an almost perfectly smooth, averaged, graph of player behaviour – bar a big notch at this particular location. It stuck out like Rudolph’s nose on a snowy day.

I wonder if there’s a similar notch in RotMG? For a game that’s almost *designed* to drive people to rage-quit … what stats do they see on “what the last thing was before a player stopped playing forever?” … and what stats do they see on “…stopped playing for a long time, but eventually came back”?

March 20th, 2012 by adam

http://wonder-tonic.com/geocitiesizer/content.php?theme=2&music=1&url=google.com

(see what I did there? topical music + animated gif combo!)

March 20th, 2012 by adam

Finally, I worked out how to type pinyin on a mac, using only the keyboard.

Nǐ hǎo!

Only, GoogleTranslate acts like a prick, and pretends it has no idea what you’re saying. This, Google, is just silly:

(for comparison, I tested – if you hit the “switch” button, and type “Hello”, you can copy the output, hit switch again, and Google still pretends you’re talking gibberish)

To add insult to injury, if you don’t manually hit the “Turn OFF instant translate”, it keeps manually switching the From language … to English. Every time you type a letter, it reverts to “English –> English”. HOW MANY WORDS IN ENGLISH EVER USE ACUTE, GRAVE, OR CIRCUMFLEX? Sigh. Not very smart.

Worst bit is … this was working fine a couple of months ago. Then Google “rewired it”, and now it’s broken. My friends at Google say this (constantly breaking things, never letting the user keep a working version) is “good” and “the future” because it puts control into Google’s hands: one version, on all desktops. If this is the future of Cloud Computing, Cloud Computing is dead and buried already… Version control is not a “feature”, it’s a right.

March 19th, 2012 by adam

TheChaosEngine – private forums hangout for games-industry professionals. There’s an epic thread on there where people post projects they / their team / their employer has published on iPhone. It’s currently 40 pages long, so I went through and pulled out the links to the iTunes pages for each game.

NB: these run the gamut from “my first iPhone app” to “large-team of developers working for multinational publisher”. Quality here will vary hugely – YMMV!

Also, interesting to note … these are listed in order of posting to the forums, so … as you go down the list, you’re seeing an evolution over time of personal/indie (and occasionally “big team / AAA”) games on the app store.

TCE games, in first-launched order (earliest first)

  1. http://toucharcade.com/2008/12/12/ivory-tiles-a-unique-iphone-puzzle-game/
  2. http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=298060143&mt=8
  3. http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=289208006&mt=8
  4. http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=303057162&mt=8
  5. http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=305889055&mt=8&s=143441
  6. http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=307740243&mt=8
  7. http://zenbound.com/itunes
  8. http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=307117698&mt=8
  9. http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=311115651&mt=8
  10. http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=318996099&mt=8&s=143441
  11. http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=317781445&mt=8
  12. http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=321510472&mt=8
  13. http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=323694495&mt=8
  14. http://bit.ly/ifistchaosengine
  15. http://appshopper.com/utilities/isundial-2
  16. http://bit.ly/qqq_iphone
  17. http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=333962577&mt=8
  18. http://itunes.com/app/Coretex
  19. http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=334682266&mt=8
  20. http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=334683021&mt=8
  21. http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=335955369&mt=8
  22. http://tinyurl.com/yc9bpr5
  23. http://itunes.apple.com/us/app/revz/id352513901?mt=8
  24. http://itunes.apple.com/gb/app/fm-2010/id352933624?mt=8
  25. http://itunes.apple.com/gb/app/koan/id366816832?mt=8
  26. http://itunes.apple.com/us/app/tiki-towers/id298127125?mt=8
  27. http://ultrablast.net/
  28. http://bit.ly/aurifi_itunes
  29. http://itunes.apple.com/gb/app/denki-blocks/id371685186?mt=8
  30. http://bit.ly/yatr_iphone
  31. http://bit.ly/qqq_worldfoot
  32. http://itunes.apple.com/au/app/gamebook-adventures-2-the/id375065935?mt=8
  33. http://itunes.apple.com/app/id356565414?mt=8
  34. http://itunes.apple.com/app/reckless-racing/id386234787?mt=8
  35. http://itunes.apple.com/gb/app/tiltstorm/id392545121?mt=8
  36. http://itunes.apple.com/us/app/awakening-the-dreamless-castle/id386161821?mt=8
  37. http://itunes.apple.com/au/app/gamebook-adventures-1-an-assassin/id352871101?mt=8
  38. http://itunes.apple.com/au/app/gamebook-adventures-4-revenant/id395652668?mt=8
  39. http://itunes.apple.com/gb/app/cricket-captain-2010/id406333955?mt=8
  40. http://itunes.apple.com/us/app/pocket-frogs/id386644958?mt=8&partnerId=30&siteID=0JkCNyaaKoo
  41. http://itunes.apple.com/us/app/sky-burger/id311972587?mt=8&partnerId=30&siteID=0JkCNyaaKoo
  42. http://itunes.apple.com/us/app/scoops-ice-cream-fun-for-everyone/id291591378?mt=8&partnerId=30&siteID=0JkCNyaaKoo
  43. http://itunes.apple.com/us/app/dizzypad-frog-jump-fun/id357104694?mt=8&partnerId=30&siteID=0JkCNyaaKoo
  44. http://itunes.apple.com/us/app/textropolis/id301643671?mt=8&partnerId=30&siteID=0JkCNyaaKoo
  45. http://itunes.apple.com/gb/app/kamicrazy/id299644692?mt=8
  46. http://itunes.apple.com/us/app/bubble-dreams/id400309976?mt=8&ls=1
  47. http://itunes.apple.com/au/app/gamebook-adventures-5-catacombs/id422246290?mt=8
  48. http://itunes.apple.com/gb/app/family-games/id417601428?mt=8
  49. http://itunes.apple.com/gb/app/moving-day/id395714931?mt=8&ign-mpt=uo%3D4
  50. http://itunes.apple.com/gb/app/to-fu-the-trials-of-chi/id436987555?mt=8
  51. http://itunes.apple.com/gb/app/bashi-blocks/id441051678?mt=8
  52. http://itunes.apple.com/gb/app/magnetic-billiards-blueprint/id432152950?mt=8
  53. http://itunes.apple.com/au/app/specky-mark-of-the-year/id458244379?mt=8
  54. http://itunes.apple.com/gb/app/quarrel-deluxe/id453203047?mt=8
  55. http://itunes.apple.com/us/app/death-at-fairing-point-a-dana/id445507820?mt=8
  56. http://itunes.apple.com/us/app/lap-uranus/id447548601?ls=1&mt=8
  57. http://itunes.apple.com/app/cutesy-the-quest-unicorn/id463920538?mt=8
  58. http://itunes.apple.com/app/funpark-friends/id444438531?mt=8
  59. http://itunes.apple.com/gb/app/myragdoll-3d/id444210353?mt=8
  60. http://itunes.apple.com/gb/app/puzzler-world-2/id465620717?mt=8
  61. http://itunes.apple.com/app/shark-jug/id473563382
  62. http://itunes.apple.com/au/app/mini-motor-racing/id426860241?mt=8
  63. http://itunes.apple.com/gb/app/grabatron/id481309065?mt=8
  64. http://itunes.apple.com/us/app/leapin-frogs/id487318065?mt=8
  65. http://itunes.com/apps/gravityrocks
  66. http://itunes.apple.com/app/puzzle-bonsai/id491318778?mt=8
  67. http://bit.ly/lighthousegame
  68. http://itunes.apple.com/us/app/my-coin-match/id472717295?mt=8
  69. http://itunes.apple.com/gb/app/froad/id469021974?mt=8
  70. http://j.mp/EufloriaHD
  71. http://itunes.apple.com/us/app/end-night-hd/id498102948?ls=1&mt=8
  72. http://smallgreenhill.com/ballonawall/index.php
  73. http://itunes.apple.com/us/app/rune-raiders/id497702195?mt=8

Non-chronological

These posters didn’t provide a real iTunes link – I had to hunt it down on their websites – so they’re out of order:

  1. http://itunes.apple.com/us/app/ax-raven-elite/id331999733?mt=8
  2. http://itunes.apple.com/us/app/red-card-rampage/id388957922?mt=8
  3. http://itunes.apple.com/us/app/wordsnap-contraption/id412453514?mt=8&ls=1
  4. http://bit.ly/zSf5vc