Monday, July 24, 2006
Keeping Score
I've been kind of taking it easy in SL recently. I started to see the early signs of burnout, and figured now would be as good a time as any to catch up on TiVo instead of squinting at my monitor.
Unfortunately, this meant that I missed all of the Relay for Life festivities. I'm a bit irked about that, as I'd planned on getting in on some aspect of it this time. As it is, I had to settle for lighting a dozen or so luminieres along the race course late last night. Given that my mother has had cancer three times in the last three decades (thyroid cancer when I was a kid, breast cancer my freshman year at college, uterine cancer earlier this year- the latter required no chemo or radiation after the surgery, thank God), that feels awfully piddly. I'm going to have to start putting aside some real money for the cause, and pronto. Throwing what amounts to fifty or sixty bucks US$ in at the last second feels pretty hollow and chintzy for such a personally important cause.
And that's really more than I intended to ever say about my personal life here.
In any case, I did finally get around to building the high score system for the GoD. As I mentioned way back whenever, that's just about the last piece of the puzzle. Mechanically, the Garage of DOOM is done. From here on, it's testing, balancing, tweaking, and decorating. Here's the obligatory screenshot.
Unfortunately, I'm still left with llSetText for the readout. This is unfortunate, but I can't afford the prims for an XyText display. Still, I don't think it looks too cheesy.
The names for the dummy scores are famous monster slayers from various sources. I'm sure you recognize most of them, but if not, here are the references. Not really relevant to anything, but it amused me, anyway. I was a little disappointed to find out that even IMDB doesn't list the last name of the protagonist in Shaun of the Dead. Otherwise, he'd be on the list, too.
Mechanically, the scoring system is somewhat convoluted. The main problem is that the garage is not a permanent structure. So, I had to store and process the scores
off-site, at ground level. Given that this places the score server over a kilometer away from the garage, this was a bit of a hurdle. In order to work around the distances involved, I had to resort to physical carriers to bring the information from place to place.
I suppose I could have futzed around with in-game e-mail, but I believe this method is both faster and more reliable in the long run. An out-of-game solution, like a website accessed through the new HTTP script calls, would probably have been more efficient. But, frankly, that's more work than I want to put into this minor aspect of the game. (Especially given my lack of experience in real-world web coding.) I seriously considered omitting the high scores system from the game altogether. It adds complication, and at its core it encourages people to cheat. (And I don't doubt there are many ways to cheat using outside scripts and objects. It's unavoidable.) Or, rather, it encourages people who are inclined to cheat to do so, anyway. There is little incentive to cheat at a game unless there is some outward sign of your feigned prowess. Otherwise, it would be as pointless as cheating at Solitaire.
In any case, I settled on using physical carriers to bring the scores back and forth. Each player death now launches a chain of events as follows:
- Take the final score and add the time bonus (one point per 10 seconds).
- Notify the player of his final score, and give him instructions on how to exit the garage.
- Rez a single-use teleporter device above the player. Said device either revives the player in a random location in the garage (within the first 10 seconds after death) or takes him back to the security office/entry area (after 10 seconds have passed).
- Rez an invisible "rocket" to carry the final score down to the score server.
- The rocket travels down to the score server and announces the latest score.
- The score server adds the score and the associated player to the scores list, then sorts it in order from highest to lowest. The top five scores are kept, while the rest are discarded. Two lists are kept: a daily best (which resets at midnight PST) and an all-time best (which is reset by yours truly, tentatively every month).
- The score server rezzes another rocket, and feeds it the current high score lists.
- The score rocket carries the scores lists back to the security room and announces them to the display objects (above).
- The scores list is parsed and displayed.
And there you go! A high scores system, in just about the most convoluted way imaginable. The security desk launches a dummy rocket on rez, as well, in order to grab the current scores lists when a new garage is created. All told, the update process takes less than 10 seconds, barring unforeseen circumstances (such as lag or physics failures). Not too bad, really.
After much debate, I also added a continue feature (as mentioned above). The exit teleporter device now comes equipped to reset the player. His score, timer, and Holy Hand Grenade counts are reset (to zero, zero, and one, respectively). But the monster count kept by the server is not reset. And, since the currently difficulty level is tied to the total monsters rezzed in a game session, this means the player can continue fighting against the more difficult monsters.
I was of two minds about this one. On the one hand, I hate to give away all the game's secrets for free. With indefinite continues, the player can keep going until he sees everything the game has to offer, no skill required.
On the other hand, I've found that I often don't even reach the hardest monsters in a single game, unless I'm really on the ball. I expect quite a few people will lose interest before they realize that there's more to the game than they'd see in the span of a single player life. The instruction manual (assuming it's read, and assuming I ever get around to writing it!) will solve this to some degree, as it'll have a complete catalogue of monsters and their relative difficulties. So he or she will know that there is more to the game than what he saw on the first outing.
I suppose it's more ego than anything else that's pushing me toward the continues. I'd hate for everyone not to have the chance to see my fancy Hard difficulty baddies, merely because they're not skilled enough to progress that far. I suppose I'll need to find a middle ground, and limit the player to only two or three continued sessions. I just hate to add that additional complication to the already bloating player life tracking code. Even after splitting into multiple scripts, the HUD is getting cumbersome again.
Oh well, I guess we'll see. Getting close to the official open beta period! Oy.