After seeing Georg Zoeller’s phenomenal talk on development telemetry at GDC, I had a bunch of ideas about data and interesting things to do with it. I’m still working on my streamlined bug reporting tool for NWN2 (ran into a wall dealing with IPC between C# and C++). This post, however, is about a much flashier, much more finished project.
In the presentation above, there were several screenshots of useful, good-looking visualizations of data, including heatmaps of things like crash locations and gameplay activity. I wanted to be able to make pictures like that! Problem is, I couldn’t find any code or libraries to do quite what I wanted, and rather fighting with what was out there, I decided to roll my own.
I wrote the core code a while ago, so I don’t really remember enough to post-mortem that. Much more recently, though, I felt unsatisfied with the “hacky” (to be generous) interface of one button in a form that ran the whole generation process when you clicked it. It was time to revisit the project.
Most of the interface was just a matter of pulling several parameters to the HeatMap constructor out of code and into the GUI, but it makes me a lot happier to have a tool that other people can reasonably use. At this point, it’s abstract enough to be used for many applications beyond the original use case of plotting deaths on a NWN area minimap.
Besides that, I’m very happy with my approach to scaling the gradient for maximum contrast over the map. The data set mapped in this screenshot, for example, has a massive concentration of points at the gate near the bottom left, and relatively sparse concentrations almost everywhere else. The simplest approach to scaling the gradient is a linear transition from minimum to maximum heat values, but this results in a hot point at the large concentration and cool-looking points over the rest of the map.
I fought with a few different approaches before I realized that I could approach most data sets as being vaguely normal distributions (albeit often skewed left or right). This means percentiles are meaningful, and I can map them to particular points on the color gradient (e.g. dark blue is the 20th percentile, green the 60th, etc.). Rather than some of my dead-end approaches, which required manual tweaking to get a map that looks good, this allows the program to calibrate automatically to the shape of the data set, leaving just a few intuitive parameters to twiddle until the user is satisfied.
In the interest of minimizing the number of times the wheel must be invented, the (C#) code is available here. Do whatever you want with it, though I’d love to hear from you if you find it useful!
(As an aside, WordPress seems to change my C# tag to C++ whenever I save the post. Suppose I’ll do without for now.)
Time for an update on the Hasbro v. Atari dispute. Atari responded to the complaint, attaching the complete license agreement and several communications between the companies. Hasbro filed and was granted an emergency motion to seal those exhibits. Atari objected to this motion, and since then most of the filings relate to whether the sealing order should be vacated. I hope it is, because I’d love to take a look at that agreement.
Below is the current document history for the case, with links to the interesting ones.
|–||Filed: 12/16/2009 Entered: 12/17/2009||Summons Issued|
|1||Filed: 12/16/2009 Entered: 12/17/2009||Complaint (Cover Sheet)|
|2||Filed & Entered: 12/17/2009||Corporate Disclosure Statement|
|3||Filed & Entered: 12/18/2009||Order of Recusal|
|4||Filed & Entered: 12/21/2009 Terminated: 01/11/2010||Motion to Appear Pro Hac Vice|
|5||Filed & Entered: 12/21/2009 Terminated: 01/11/2010||Motion to Appear Pro Hac Vice|
|6||Filed: 12/21/2009 Entered: 12/22/2009||Application for Admission Pro Hac Vice|
|7||Filed: 12/21/2009 Entered: 12/22/2009||Application for Admission Pro Hac Vice|
|8||Filed & Entered: 12/22/2009||Notice of Appearance|
|9||Filed & Entered: 12/22/2009||Notice of Appearance|
|10||Filed & Entered: 12/22/2009||Answer to Complaint|
|11||Filed & Entered: 12/24/2009 Terminated: 12/28/2009||Motion to Seal|
|–||Filed & Entered: 12/28/2009||Order on Motion to Seal|
|12||Filed & Entered: 12/31/2009||Summons Returned Executed|
|13||Filed & Entered: 12/31/2009||Motion to Vacate|
|14||Filed & Entered: 12/31/2009||Response to Motion|
|15||Filed & Entered: 01/07/2010||Response to Motion|
|16||Filed & Entered: 01/07/2010||Response in Opposition to Motion|
|17||Filed & Entered: 01/08/2010||Answer to Counterclaim|
|–||Filed & Entered: 01/11/2010||Order on Motion to Appear Pro Hac Vice|
|18||Filed & Entered: 01/11/2010||Corporate Disclosure Statement|
|19||Filed & Entered: 01/12/2010||Motion to Appear Pro Hac Vice|
|20||Filed & Entered: 01/12/2010||Application for Admission Pro Hac Vice|
|–||Filed &Entered:01/13/2010||Motion Forwarded to Chambers|
|21||Filed &Entered:01/14/2010||Reply to Response to Motion (Affidavit, Exhibit 1, Exhibit 2)|
|–||Filed &Entered:01/15/2010||Motions Referred|
I wasn’t able to find a full copy of the Hasbro v. Atari complaint anywhere on ye internette, so I registered with PACER and grabbed my own copy. Happy reading!
I was thinking about the BGL09 Procedural Story session, and an interesting idea came to me in the shower, as such ideas are wont to do. Could we perhaps use crowdsourcing to research the problem? What I’m thinking is a web game, something along the lines of Kingdom of Loathing, where each narrative is generated automagically, responding on the fly to the player’s choices (using such verbs as the game provides), and the player can rate each beat as “canny” or “uncanny”.
That may be getting ahead of the problem, though, as it’s still difficult just to generate believable and interesting prose to describe a beat. That could be a first step, then, using a similar approach. Maybe just a random story generator, without any game-like element, and the player reader has a similar canny/uncanny rating system.
That’s not very interesting for the reader, though. How about generating beat skeletons (e.g. W does X to Y with Z) and having the player/reader/writer write the prose? Then how do we make sure the prose actually matches the skeleton? Yet another ranking system? And what’s the incentive for people to participate? (Well, it would be easier than reading a book given the average attention span…)
Yesterday was Boston Game Loop 2009. It was pretty awesome times! There were a lot of familiar faces, and some cool new ones. The venue (Microsoft’s NERD in Cambridge) was very nice, though it suffers from a shortage of power outlets, and I think they tried to man-in-the-middle my SSH sessions after lunch (someone did, anyway!).
The grid got more full than not (should probably have a second day next year), so choosing sessions became challenging at times. The sessions I ultimately graced with my presence follow:
Business Models for Indies (Audio)
This ended up focusing heavily on contract negotiations, going into specifics of royalty splits, rights (e.g. exclusivity, logo placement), differences between publishers, differences between physical and digital distribution, and so on. This was largely because the Dejobaan guys were awesome and happily answered questions about anything other than sales numbers. We did touch a bit on business models, particularly how to reconcile “free” and “being able to pay for lunch”.
- Everything is negotiable
- Digital distribution is the way to go (though that’s just a broad umbrella)
- Smaller publishers can sometimes be convinced to give you advances
- PR will make or break your sales
Project Management Philosophies (Audio)
I expected this to be an overview of agile, waterfall, et al presented in the rather boring/painful way that project management usually is. Nevertheless, I went because sometimes I need to understand the synergies inherent in leveraging buzzwords. It turned out to be a roundtable, and a pretty interesting one at that, as it addressed many of the issues I’ve noticed at Rogue Dao.
- Developers need a properly-sized box — too big and they get lost, too small and they can’t be creative (and ultimately get frustrated and bitter)
- Communication is pretty much the most important thing in the world
- Not directly part of the talk, but I noted a fundamental assumption that devs don’t need handholding, which means everyone needs a functional understanding of the toolchain and how departments interact (something RDS lacks miserably)
- For startups, corporate stock is very effective in lieu of payment, especially for technical folks
- Producers often have a huge disconnect between their understanding of devs’ abilities and reality. This is bad.
- Feedback should be a regular occurrence (this goes back to communication)
- Be specific when giving criticism (and praise!)
- Take notes on specific things to criticize and praise if that helps
- Producers are there to help developers do their jobs.
Session idea for next year: Managing an entirely Internet-based team.
Game Balance, Methods & Practices (Audio)
I walked into this session (which was kind of a hybrid panel/roundtable) thinking “iteration”. That’s pretty much what it came down to, though there were some interesting ideas about how to iterate well. The focus was heavily FPS/MMO/RTS, so not well-aligned with my interests. Still, there were some general principles that I can use.
- Balance is not just numbers: look-and-feel matters too, even if the mechanical numbers are identical
- FPS players will bitch; MMO players will bitch a lot louder (and rightly so, because imbalance has much longer consequences in a persistent environment)
- Death of a thousand papercuts (no, not the trope): There’s a trade-off in making large balance changes at once vs. tweaking more incrementally (kind of like ripping off a band-aid)
- Metrics are super-useful, but which ones?
- Obvious ones: K:D ratios, how long weapon was used, achievements, etc.
- Track everything and apply AI (or an approach like sabermetrics) to figure out what actually matters
- Use aggregate player stats or $bignum of AI games to identify areas of imbalance (though the latter may just be revealing quirks of the AI instead…)
MMO Players: Casual vs. Hardcore (Audio)
Something about the terms “casual” and “hardcore” made me not want to attend this session, so that’s exactly why I did. They seemed a pair of obnoxious, heavily-used but poorly-understood generalizations. The roundtable (which was a bit heavy with WoW talk) did nothing to dissuade me of this notion, but it did help with understanding why they’re such useless terms: their meanings are heavily dependent on the person using them. That aside, the discussion did branch into some more meaningful subjects, such as learning curves, player elitism, achievements, PvE vs. PvP, free-to-play MMOs, virtual assets, etc.
- Don’t use the terms “casual” and “hardcore”, because they will be misunderstood.
- In-game tutorials: the more detailed (without resorting to jargon), the more accessible the game will be to casual players.
- As a designer, your own placement on the casual-hardcore spectrum will color your design. Make sure you take an objective look (or have someone objective look at it).
- All studios should have at least one Luddite tester on call.
Procedural Story & Emergent Narrative (Audio)
This roundtable (which really should have been held in a round formation) got pretty much stuck as Shane warned it might from the outset. I knew (and warned pretty early) that I would basically be channeling Chris Crawford. I think a lot of the other attendees got some understanding of the potential awesomeness of emergent narrative, though, so I consider it a success. If you have no idea what the title of the talk means (or even if you think you do), you should give it a listen.
By the way, this time slot had a lot of other sessions I was interested in. If you have notes/audio from those, please please please post them.
- Procedural story and emergent narrative are even more poorly understood than I thought going in.
- Shane is a pretty cool dude, and has done wonders to restore my faith in Bethesda.
- I totally didn’t think to mention it when NWN came up, but that could be a great engine for experimenting with this stuff, as it already has a lot of the necessary code underpinnings.
- I need to play L4D and Facade.
Meaning in Games & Interactive Metaphor (Audio)
This was a nice finale, out on the lovely NERD patio. The audio has some rumbly noises here and there from the wind and the Red Line running by, but you can generally hear everyone. We started by discussing Passage, then got into any number of other games, with varying degrees of metaphor in their mechanics. There was also discussion of moral choices in games and why they are really hard (impossible?) to do well, and why choices about things other than morality are often much more interesting.
- Morality systems, at present, are silly (and can often be seen to endorse negative behavior)
- Not stated overtly in the discussion, but: truths expressed subtly through the gameplay (Rollercoaster Tycoon example at ~20:25 in the audio), which the player must realize to be successful at the game, are far superior to explicit statements of what the player should do (BioWare-style good/evil meters). Hidden variables are a good thing?
- If you’re going to make an intentional metaphor, be careful that you don’t have an unintended one too.
- If you’re not bothering with metaphor, still be careful about your unintended implications.
- Shadow of the Colossus: Designing everything for a particular strong emotional impact can be very effective (if that’s what you want to do with your game, anyway).
- Use metrics about how much the player cares for $gameplay_element (weapon, companion, etc.) to target the emotional impact. This is a clear advantage of an interactive medium.
- Killing is often treated remarkably lightheartedly. This is strange. Your friends should generally be passing judgment on your murderous rampages.
Thanks to Señor Kazemi, Señor Macmillan, the sponsors, and all the attendees for a fantastic event. I look forward to next year’s with great zeal!
I was recently reading through old entries on Maerduin’s blog, when this entry gave me pause. In part, he discusses the changes to the planar cosmology in 4th Edition, concluding: “In short, the planes are no longer cosmological reflections of a woefully inadequate set of moral attributes. They are places of mystery!” This bothered me for a while, as that reflection of a woefully inadequate set of moral attributes is among my favorite settings. On the other hand, I fully agree that the alignment system is a terribly shallow and naïve way of categorizing morals and ethics. “How do I reconcile these conflicting beliefs,” I asked myself?
Belief, as it turns out, is the key word there. Planescape, unlike any other setting I am aware of, is a place (or many places) made, manipulated, and unmade by the beliefs of myriad sentient beings. This mutability applies even to its denizens — the same people whose beliefs shape the multiverse can themselves be believed out of (or into) existence. In such an exotic environment, wonderful and unique stories can flourish.
Does Planescape need the arbitrariness of the good/evil and law/chaos axes or the inhospitability of the Inner Planes to exist? No, but without them, it would not be Planescape — just as Forgotten Realms without the Sword Coast would not be FR. Contrived as it may be, the Planescape cosmology makes for great storytelling, even if some of the areas are never actually visited. Starting from themes that its players knew well — the alignment system, the classical elements, various mythologies — the designers of Planescape created a multiverse that was familiar in some ways yet fundamentally alien (and mysterious) in others. They did this without resorting to some of the most overused fantasy cliches (aloof elves who live in forests, anyone?).
You can have your Shadowfell and Elemental Chaos. I’ll take Sigil and Avernus any day.
(On an unrelated note, Firefox seems unhappy about the word “inhospitability”. I submit that Firefox can pike it.)
I will try my hand at this blogging thing, so that perhaps my escapades can prove instructive to others.
As to the most recent escapade, I recently found myself fighting with Shorewall. A hastily hand-drawn, but informative, diagram of the network:
odin acts as bridge, router, and single point of catastrophic failure. artemis and cobblebox have enough services running that I want them to have public IPs, so they are bridged to the cable modem segment. Everything is also connected to the LAN, which odin NATs from its bridge interface to eth2. odin provides DNS, DHCP, etc. to the LAN. So far, so good (except that dhcpd still won’t update bind properly…).
Yes, this is far more complex than it strictly needs to be, but it means I can make pretty graphs and figure out how close I am to making Comcast angry.
I soon found that I need to be able to forward ports on odin’s external interface (br0) to machines on the LAN. It’s easy with a two-interface machine: just say, for example, “any traffic in zone net with a destination port of 5121/udp goes to 192.168.10.2:5121″, or, in shorewall-speak (/etc/shorewall/rules):
#ACTION SOURCE DEST PROTO DESTPORT SRCPORT ORIGINAL_DEST DNAT net loc:192.168.10.2:5121 udp 5121
Let’s give it a shot on the three-interface setup. Oops, still can’t connect from dmz (the zone with artemis and cobblebox). How about adding this, then?
DNAT dmz loc:192.168.10.2:5121 udp 5121
Great, now it works! Except… oh shit, I can’t connect to anything else on port 5121 now. WTF?
Turns out that those rules apply to any traffic in those zones with a destport of 5121, meaning all my outgoing traffic on 5121 was getting rewritten to go to 192.168.10.2. To stop this, we use the original destination in the rules. Because the original destination (read: the address of br0) is obtained via DHCP, though, it’s bad mojo to specify it in the file. The solution to that is to modify /etc/shorewall/params. The net result is:
/etc/shorewall/rules: #ACTION SOURCE DEST PROTO DESTPORT SRCPORT ORIGINAL_DEST DNAT net loc:192.168.10.2 udp 5121 - $BR0_IP DNAT dmz loc:192.168.10.2 udp 5121 - $BR0_IP /etc/shorewall/params: BR0_IP=$(find_first_interface_address br0)
Yes, all this information was clearly in the FAQ if I had bothered to read, but my attention span is oh hey, I didn’t know WordPress could do that