Stats and Tracking SDK

From GameSpy SDK

Stats and Tracking SDK

Overview

The GameSpy Stats and Tracking SDK provides a simple, secure way to report the results and statistics of games to a central server. These results can then be used to help facilitate online rankings, ladders, and tournaments. Tracking is done in a very abstract manner than can be applied to any type of multiplayer game (we provide many examples to demonstrate this, you simply need to find the one that best matches your game) and the results can be displayed and interpreted in a game-specific format.

When used in combination with GameSpy Arcade, the CDKey SDK, or the Presence and Messaging SDK, the Tracking SDK can uniquely and securely identify players and verify their identities for ranking and ladder purposes. Any of the above products provide the unique identification information needed for tracking of individual players.

Game data is sent to the tracking server in the form of "snapshots." These snapshots include information about what has happened in the game, the settings in use, and the players involved. For example, a simple deathmatch game might include information like:

  • The map being played
  • The players that are playing (including their unique identifying information)
  • The score, ping, number of deaths, and other information for each player
  • The server settings (such as timelimit, game type, etc)

This data provides a summary of the game that can then be used to update rankings, players statistics, and ladders / tournaments.

Almost any type of data or statistic can be sent using these snapshots; the examples in Appendix A demonstrate just a few of the possibilities. We are more than happy to help you decide what items are important to track for your game.

You can compose these snapshots manually (the format is described below) or use the bucket system, which is included in the SDK. With the bucket system, each value in the snapshot is assigned a bucket. Buckets can contain integer, real, or string values. For example, each player in the game might have a score bucket that contains the player's score, and each team in the game might have a color bucket that gives that team's color. These buckets support standard operations like addition, subtraction, averaging, concatation, and more that make them easy to add to your game. Buckets use fast hash-table based lookups and will not affect the performance of your game at all.

Security has been given the utmost consideration in the design of the stats and tracking system, and this documentation includes a full rundown of the security guarantees that can be made (and those that can't). We fully disclose any potential holes or possible areas of exploitation for you to be aware of. Our realistic view of security means that you will never misled into thinking the system is more secure than it really is, and you will never lose face because you assumed something was secure that wasn't.

We fully support disk based logging in case of a loss of network connectivity or server downtime, however, we don't recommend this for all games because of the security implications it carries.

How It Works (Low-Level Description)

The following terms are used throughout this document.
Server
The machine that is "hosting" the game and to which the clients connect
Host
Same as a server
Client
A single player / machine that connects to a server / host
User
Same as a client

Process:

  1. On startup, the host connects to our tracking server, is authenticated, and is assigned a unique connection ID. If disk logging is enabled (see below) and there are logged games, they are sent to the tracking server.
  2. When the actual game starts, the host sends a new game notification to the tracking server and creates internal structures for managing the game information.
  3. During the game the host collects information into buckets (or developer's own data structures) and sends out snapshots at regular intervals (in case the host is reset before the game finishes)
  4. (If player authentication is used) As players connect, the host sends out a challenge to the client, which formats a response based on its password or CD Key. This response is sent back to the host and stored as part of the snapshot.
  5. When the game is complete, a final snapshot is sent to the tracking server.
  6. A new game can be started immediately over the same connection (multiple simultaneous games over the same tracking server connection are supported as well).
  7. The tracking server post-processes the data to extract some standard information and verify the authentication of the players. Disk logged or unusual games are marked for inspection.

The connection to the tracking server is TCP, and all transactions (aside from the initial connection) are non-blocking.

In the event that the tracking server is unavailable, game snapshots will be logged to disk if disk logging is enabled or ignored if disk logging is disabled. Either way your game doesn't have to worry about it, although it can determine whether the connection is working at any time.

There is no actual limit to the size of snapshots, although we recommend you choose what data you send wisely to conserve space. Most games will probably use snapshots of 1KB-8KB (even with 32-64 players).

You can send as many snapshots as you want, but it is recommended that you not send them more than once every 2-3 minutes. Each snapshot replaces the previous one, so sending them more often simply means that in the event of a host crash, more recent data will be preserved. Many games could probably get by with a single, final snapshot, or a midway + final snapshot.

Security Analysis

No Internet game tracking system is perfectly secure. While we believe our security is better than many similar systems, we won't pretend to be perfect. If anyone tells you their system is 100% secure they are either ignorant or lying outright.

There are three levels of security for the system:

  • Host run by trusted person (e.g. an official server or server being run by a trusted service)
  • Host run by an untrusted person with disk logging disabled (insecure host)
  • Host run by an untrusted person with disk logging enabled (insecure host)

If the host is run by a trusted authority, the entire system is extremely secure. Clients cannot authenticate as anyone besides themselves without a valid password. All snapshot information is communicated over the safe link between the trusted host and the tracking server. Disk logging is safe as well since no 3rd parties can access the trusted host's logs. Overall, hosts run by a trusted authority are the ONLY way to guarantee 100% accurate reporting and the ONLY way we recommended running servers for large tournaments and ladders (especially where prizes are involved). Note that even with a trusted server you can never verify the actual identity of the client without physically seeing them. All you can say is that the client playing knows the password of the authenticated client.

Allowing untrusted persons to run a host adds a huge amount of security risk to the system (since the snapshots are generated by the insecure host), and while the vast majority of insecure hosts will report accurately, in the end there is no way to say that any information received from an insecure host is accurate, or that the host is returning information at all. The most simple hack for an insecure host is to not report any stats at all. This in itself may cause problems (e.g. two players playing a ladder match, and the host ends up losing and does not report).

The host authenticates with the tracking server at initial connection using a secret key challenge/response mechanism. All communication between host and tracking server is encrypted with a multi-byte XOR encryption algorithm based on hidden internal keys. Disk based logging is encrypted with a similar system, and an additional checksum algorithm is used to ensure the data has not been tampered with.

Breaking these encryption routines and checksums is possible (since all of the code and keys reside on the host), however it would not be trivial. Most hackers would likely attack from another angle (as described below) to circumvent the checksum and encryption algorithms. However, we will from now on assume that a hacker has broken both the encryption and checksum routines, can read encrypted data as plain text, and can re-encrypt changed data with the correct checksums. With enough incentive, a hacker will extract the encryption and checksum routines, so assuming anything else would be foolish.

Under these assumptions it is clear to see why disk logging is very risky - a hacker can log a real game to disk, then edit this log to reflect different results, and have the game send the edited log to the tracking server. This can all be done without changing one byte of code in the host executable (although the hacker would have to understand the code quite well to figure out the encryption and checksum routines).

Instead of taking the time to decrypt the data, most hackers will likely try to find and change the data before it is encrypted and checksumed. The process of finding the unencrypted data is easier than determining the encryption/checksum algorithms, however changing the data in memory before it is encrypted is very tedious and time consuming, and changing the data significantly requires large byte-code modifications to the host executable (something that is at least as difficult as breaking the encryption/checksum routines).

There are several precautions that have been taken to make finding and changing the data even more difficult, since most amateur hackers will give up after a few hours if they are unable to find a starting point to begin their hack. For example, we obfuscate all (important) strings used in the SDK to make it harder to find the SDK code in the rest of your executable. Our challenges are based on the connection and session id's to help spot strange values. We use different keys for encrypting different things.

Doing a checksum on your executable and sending it as part of the snapshot can help insure that the host has not been tampered with. Individually these protections can be worked around by a good hacker, however taken together, there is a chance that a hacker will miss one of the protections and be caught as a result. Our tracking server marks all unusual snapshots for later analysis.

One important feature of our system is that even with an insecure host, the host can never steal another user's "identity" and pose as them, or report invalid stats for them on another server. Player authentication is based on a challenge/response system. A challenge (which originates from the tracking server) is sent to the client and a response is generated based on a hash of the challenge and the client's password. This hash eventually makes its way back to the tracking server where it can be verified with the challenge and password that the tracking server knows. The challenge and response in itself are not sufficient to determining the client's password, and the same response cannot be used for more than one connection (since the challenge constantly changes). This means that packet sniffing the client to server connection will not gain any useful information.

If disk based logging is enabled, the challenge will be generated by the host. Because the tracking server is not involved, it cannot guarantee that this challenge will always be different, and thus a host could (after a valid client connects once) reuse the same challenge/response in a different disk log. This is again assuming that the insecure host has figured out the disk logging encryption / checksum algorithms and can change data at will.

So How Secure Is It?

After all of that you may be concerned about how secure the system really is. From our perspective, the system has excellent security in a trusted environment to use for large tournaments and ladders. You can feel confident that the client is either the registered player or has the password of the registered player, which is the best assurance you can get without physically seeing the person play.

In an unsecure environment we believe the system to still be very secure if it is only used for "fun." By "fun" we mean that the statistics, rankings, and tracking data is not of significant value. Value can be more than just monetary however, so it is important to understand how players will regard the system and its uses. The important thing to remember is that even if a hacker were to break the system, the "value" (both gained by the hacker and potentially lost by the developer) should be minimal and players should understand that "breaking" the system will not gain them anything in the long run. While this will not assure that someone will not break (or attempt to break) the system, it will guarantee that the repercussions of the break will not override the value of the system.

Authentication

The stats and tracking backend can use three different methods to authenticate players. Depending on your game, you can choose which of these methods is best.

Player Name
By default, if no other authentication information is provided, players will be tracked by their name, as reported to the stats system. Obviously this is the lowest level of security, as any player can play as another player by changing their nick name. In some situations this level of security may be sufficient (e.g. when there are no rankings or ladders involved, just game results).
Presence and Messaging Profile ID (pid)
The tracking system supports tracking by an ID and password for the GameSpy Presence and Messaging system. This system (available as a separate SDK) allows players to maintain different profiles with passwords that they can log in with. Even if you aren't using the full presence and messaging SDK, you can still use the account creation / maintenance components to create unique accounts for player tracking and ranking.
CD Key
If your game comes with unique CD Keys you can do tracking via the keys. They CD Keys themselves are not sent on the wire, so you don't have to worry about people setting up servers to steal the keys. Unique identification is based on the combination of the CD Key and the Nickname, so a single CD Key user can have multiple "profiles" by using different nicks.

To use profile ID based authentication, you need to ask the user for their profile ID and password on the client (note: This info can be passed in on the command line for games supported by GameSpy Arcade). The profile ID should be sent to the host during connection and included as the "pid" key for that player. The password is sent to the GenerateAuth function along with the challenge from the host to generate an authentication token, which should be sent back to the host and included as the "auth" key for that player. In the actual snapshot this info will look like (for a single player):

\pid_3\4364342\auth_3\3eaf547cf31de5946aefc3148765d3ac

Using CD Key authentication is similar, except that instead of a profile ID you will send the CD Key hash, which can be obtained using gcd_getkeyhash (on the host) in the CD Key SDK. The auth value is based on the un-hashed CD Key and the challenge value and should be generated on the client using the GenerateAuth function, as above. In the snapshot this will look like:

\cdkey_3\1a353adf3263adfe3298adce37dfac73\auth_3\3eaf547cf31de5946aefc3148765d3ac

Note that, by default, all authentication is done post-game. The snapshots are recorded on the tracking server and analyzed after the game is marked as complete. If a player's authentication is incorrect it will be flagged as an error there, and will show up in the game display for that game. If you require pre-game authentication (e.g. a player must be authenticated before they enter the game) we can provide that as a separate service.

Snapshots

All of the stats and tracking is done in the form of "snapshots". Each snapshot gives full information about anything you want to track related to the server, players, or teams. Snapshots are formatted similar to Developer Spec query replies, namely, as key\value backslash delimited pairs. You can track virtually any type of information about the game using snapshots, as the examples in Appendix A demonstrate. If you have a something that you'd like to track with snapshots but aren't sure how, please contact us.

There are three types of keys used in snapshots:

  • Server Keys (\keyname\)
  • Player Keys (\keyname_N\) where N is the player number, starting at 0
  • Team Keys (\keyname_tN) where N is the team number, starting at 0

Most games that allow players to join and leave during the game reuse existing "slots" and player numbers (e.g. if you have players 0 1 2, and players 1 leaves, the next person to join will be player 1 again).

In order to report accurate stats for ALL players, each player needs to have a unique ID. The Stats SDK Bucket system handles all of this for you. If you create snapshots manually, you will need to make sure that each player has a unique number.

Snapshots describe a "game." What defines a game, or the boundary between two games, is game specific. For example, a "game" may consists of a single level/map. When the level starts, a new "game" is started with a fresh snapshot. When the level ends a final snapshot is sent.

You can send multiple snapshots during the course of the game. Each snapshot will replace the previous one. If the game is still in progress (i.e. more snapshots are possible) send the snapshots with the type of SNAP_UPDATE. Once the game is completed, send a final snapshot with a type of SNAP_FINAL. This will signal the backend that the game is complete and ready to be processed.

The following is a list of "standard" keys that you may want to use in your snapshots. You are free to add your own keys for game-specific information.

Standard Keys

gamever
followed by a version specifier (x.yy format preferred)
location
followed by a 5 digit numeric string (for a US Zip code) or a 2 letter country code (for Non-US).
hostname
followed by a descriptive host-defined string (can include spaces) that identifies the server (e.g. "Joe's Game!")
mapname
followed by the map name (either filename or descriptive name)
gametype
string which specifies the type of game, or the mod being played.
maxplayers
numeric string, max number of players for this server
fraglimit
number of total kills or points before a level change
timelimit
amount of total time before a level change occurs
player_N
followed by a string which specifies a player name (may include spaces)
score_N
numeric string that contains the score (kills/points) for player N
scoreY_N
numeric string that contains the score (kills/points) for player N against player Y
skill_N
a skill rating, if applicable, for player N
ping_N
the ping for player N
team_N
the team player N is on, either numeric or string
deaths_N
number of deaths a player has had
pid_N
profileid for the player
cdkey_N
hashed CD key of the player
auth_N
authentication reply to the given challenge (based on password or cdkey)
ctime_N
the "connect time" for this player (in any format, secs recommened)
dtime_N
the "disconnect time" for this player (in any format, -1 or empty for still connected)
ping_N
ping for this player
team_tN
the name for team N
score_tN
the score for team N
ctime_tN
connect/formation time for team N
dtime_tN
disconnect/disbanding time for team N
serverck
a checksum for the server executable
gamemode
current mode of the game, e.g. openplaying, exiting, etc.
state
a string that gives a text description of the current state

File Manifest

The following files should be included with this package. If any of the files are missing, please contact devsupport@gamespy.com.

File
Description
gstats.c
API code
gstats.h
API header file
gbucket.c,h
Bucket helper code and header
nonport.c,h
System dependent code and header
darray.c,h
Dynamic array code and header
md5c.c,h
MD5 hash code and header
\statstest\
Example and test code for the Stats and Tracking SDK
gstats.dsw
Devstudio project for API and sample code

In addition, to build the SDK and samples, you will need to separately download the GameSpy "common code" package, which includes the shared SDK code used by this SDK and others.

When extracting this package, make sure you preserve the directory tree in order to assure that the code builds correctly.

Implementation

The following is a quick rundown of the basic steps needed to support the SDK. The reference documentation much more extensive documentation for each function.

Step 1: Initialize the Tracking Server Connection

Before the actual gameplay begins you will probably want to connect to the tracking server. You are required to be connected to the tracking server to call NewGame or SendGameSnapshot (unless disk based logging is enabled).

First, set the global gcd_gamename and gcd_secret_key variables to your gamename and secret key. If these values aren't set correctly, you will be unable to connect to the tracking server.

Once these values are set, call

int InitStatsConnection(int gameport)

...with the game port that the host is running on. If your game doesn't use multiple ports (or doesn't support more than one host per machine) then you can just use 0.

This call is blocking and make take 1-2 seconds to complete the authentication process. This is the only blocking call in the SDK; all other calls will return immediately.

Step 2: Create A New Game

When the game begins you will want to call

statsgame_t NewGame(int usebuckets)

If you are going to be using bucket based logging pass 1 for usebuckets, otherwise pass 0.

If you are going to be running more than one game at a time on the host, you will need to store the returned value to pass into the rest of the SDK functions, otherwise you can ignore it and just pass NULL (they will use the last game created).

Step 3: Fill In Server Information Buckets (If Using Buckets)

Once you've started the game you'll probably want to fill in some of the basic server information buckets like hostname, mapname, gamever, etc. You should use the BucketStringOp, BucketIntOp, and BucketFloatOp functions to do this. These "op" functions provide the basis for all bucket operations. These functions are actually implemented as macros, but this should not matter for your implementation.

The prototypes are similar, the only difference being the type of the value parameter (String, Int, or Float).

Bucket(type)Op(game, name, operation, value, bucketlevel, index)
game
The game to send containing the bucket you want to operate on. If set to NULL, the last game created with NewGame will be used.
name
The name of the bucket to update.
operation
bo_set, bo_add, bo_sub, bo_mult, bo_div, bo_concat, or bo_avg
value
Argument for the operation (bucket OP= value, e.g. bucket += value, bucket *= value)
bucketlevel
bl_server, bl_team, or bl_player. Determines whether you are referring to a server, player, or team bucket
index
For player or team buckets, the game index of the player or team (as passed to NewPlayer or NewTeam). This will be translated to the actual index internally. Not used for server buckets (bl_server).

This will probably look something like:

BucketStringOp(game, "hostname",bo_set,hostname->string,bl_server,0);
BucketStringOp(game, "gamever",bo_set,GAMEVERSION,bl_server,0);
BucketStringOp(game, "mapname",bo_set,level.mapname,bl_server,0);
BucketIntOp(game,"arena",bo_set, arena, bl_server, 0);
BucketIntOp(game,"rounds",bo_set, settings.rounds, bl_server, 0);
BucketIntOp(game,"round",bo_set, 1, bl_server, 0);
BucketIntOp(game,"armor",bo_set, settings.armor, bl_server, 0);
BucketIntOp(game,"health",bo_set, settings.health, bl_server, 0);

Step 4: Create/Remove Players and Teams (If Using Buckets)

As players enter the game and teams are created (if your game has teams) you need to call the NewPlayer and NewTeam functions. Calling NewPlayer or NewTeam creates a bucket for that player/team's information and allocates that player/team a unique number. It also creates the ctime bucket for connect time and sets the value.

The prototypes for these functions are:

void NewPlayer(statsgame_t game,int pnum, char *name);
void NewTeam(statsgame_t game,int tnum, char *name);
game
The game to add the player to. If NULL, the last game created with NewGame will be used.
pnum
Your internal reference for this player, use this value in any calls to the Bucket___Op functions.
name
The name for this player. If you don't have one yet, set it to empty ("") then call
BucketStringOp(game,"player",bo_set,realplayername, bl_player, pnum) 
when you get a real playername.

If players/teams can leave during the game you should call the RemovePlayer and RemoveTeam functions so that the disconnect times can by set correctly.

Step 5: Authenticate Clients

If you support authentication via one of the methods described above, you will need to authenticate clients as they connect. To authenticate a client, send them a challenge (as obtained by calling GetChallenge) and have the client calculate a response (using GenerateAuth) based on that client's "password".

Note that in the case of CD Key authentication, the "password" is the un-encoded (plain text) CD Key. Send this response back to the server along with the identifier (cd key hash or profile id) for the player. Also note that in the case of the CD Key SDK, the server already has the cd key hash for the player (it can be obtained by calling gcd_getkeyhash in the CD Key SDK).The server then sets these values in the appropriate buckets (or stores in the client structures if not using buckets).

This will look something like:

  1. Server (send the challenge to the client)
    challenge = GetChallenge(game);
  2. Client (send the response and profile id to the server)
    GenerateAuth(challenge, my_password, response);
  3. Server
    BucketIntOp(game, "pid",bo_set, pid_number,bl_player, client.index);
    BucketStringOp(game, "auth",bo_set,response,bl_player, client.index);

Step 6: Update Buckets As Game Progresses (If Using Buckets)

As the game plays out you will want to update the appropriate buckets as changes occur. For example, when a player scores a point, you will want to update the score bucket for that player. Basically every place in your code where you change data that you want reported, you should make a bucket call.

If you want to refer to other players or teams in your key names, you need to use GetPlayerIndex and GetTeamIndex to get the translated (unique) index values for that player/team. For example, to record "Doom-square" style stats of "player A killed player B 10 times", you need to use the a player key in the form of scoreY_N. Y is the translated index of player B (obtained by GetPlayerIndex). N is the translated index of player A (which is set automatically for player buckets).

Here are some examples of typical modifications to game code needed to add buckets:

Your code:

players[i].score += 1;
players[j].deaths += 1;

Addition:

BucketIntOp(game, "score",bo_add, 1,bl_player, i);
BucketIntOp(game, "deaths",bo_add, 1,bl_player, j);
sprintf(keyname, "score%d",GetPlayerIndex(j));
BucketIntOp(game, keyname,bo_add, 1,bl_player, i);

(note: the above code adds a kill by player i against player j)

Your code:

mygame.globals.timelimit = newvalue;

Addition:

BucketIntOp(game,"timelimit",bo_set, newvalue, bl_server, 0);

Step 7: Send Snapshots

During the game you can send snapshots so that if the server crashes, at least some information about the game will be preserved. Games which are never "complete" (as signaled by a final snapshot) are flagged as such in the tracking backend, and how they are handled for rankings and ladders is implementation dependant. How many of these "update" snapshots you send is up to you, although sending more than 3 per game is probably overkill. For example, if your game typically runs 30 minutes, then sending a snapshot every 10 minutes would probably be fine. Once the game is complete, send a final snapshot.

The prototype for SendGameSnapShot is:

int SendGameSnapShot(statsgame_t game, const char *snapshot, int final);
game
The game to send a snapshot for. If set to NULL, the last game created with NewGame will be used.
snapshot
The snapshot to send. If you are using buckets, this will not be used, so you can pass in NULL.
final
If this is SNAP_UPDATE, the game is marked as in progress, if it is SNAP_FINAL, the game is marked as complete.

If you are using buckets, you don't need to worry about building the snapshot - it is built automatically based on the current contents of the buckets. If you are building snapshots yourself, you'll need to make sure that all keys and values are stripped of "\" characters, that players/teams are uniquely identified, and that their numbering is contiguous, starting from zero.

Step 8: Calling the Think function

During the game, if you are connected to the stats server for periods longer than 5 minutes, you'll need to call the function StatsThink. StatsThink should be called periodically to remove keep alives from the socket buffer. This function should be called at least once every 5 minutes.

Step 9: Send A Final Snapshot And Free The Game

Once the game is complete, send a final snapshot (set final to SNAP_FINAL in SendGameSnapShot) then call FreeGame to free the game and buckets (if you are using buckets).

Note that this does NOT close the connection to the tracking server. You can create a new game immediately (using NewGame) or at a later time without re-opening the tracking server connection. The tracking server connection is only closed when you call CloseStatsConnection, which should be done when shutting down, or when no more games are going to be sent.

Appendix: Sample Snapshots

The following are examples of what we think snapshots for some common multiplayer games might look like (including the type of data interesting to record, and how it would be recorded). You are free to add your own game-specific data as needed to the snapshot.

The other purpose of creating these examples was to prove that the snapshot system can record ANY type of interesting game data (in lieu of a time-based logging format).

You can view these samples using the "validator" application including in the SDK (just cut/paste). In addition to the standard keys from the list above, each game has some game-specific keys with their descriptions.

18 Player Rocket Arena 2 Pickup (Team) Match

Key Descriptions:
arena
the arena number this match is taking place in
armor
initial armor value
armorprotect
armor protection setting
compmode
whether competition mode is on
damagescoring
whether damage scoring is on
fallingdamage
whether falling damage is on
health
initial health value
healthprotect
health protection setting
round
the current round number for the match
rounds
the max number of rounds
railkills_N
number of kills with the rail by this player
rocketkills_N
number of kills with the RL by this player
grenadekills_N
number of kills with the grenade launcher by this player
otherkills_N
number of kills with other weapons by this player
suicides_N
number of self-kills by this player
Completed:
\round\8\suicides_0\0\rocketkills_11\3\score_14\33\suicides_1\0\rocketkills_12\1\otherkills_10\1\score_15\2\suicides_2\0\score_16\4\suicides_3\0\dtime_1\291\rocketkills_14\2\score_17\0\fallingdamage\0\player_0\Tyruss\auth_3\4525e27af21f90c27d0c725e836d26bd\suicides_4\0\ping_0\192\player_1\Wrath[X-D]\suicides_5\0\dtime_3\514\rocketkills_16\1\ping_1\174\player_2\Psychotron\suicides_6\0\ping_10\83\rocketkills_0\7\score_t0\2\ping_2\186\player_3\[McP]crt\suicides_7\0\ping_11\172\deaths_0\6\ping_3\70\player_4\Snakester\score_t1\4\suicides_8\0\ping_12\455\armor\100\deaths_1\3\ping_4\42\player_5\Hieronymus\suicides_9\0\suicides_10\0\rocketkills_3\4\ping_13\115\deaths_2\6\ping_5\87\player_6\Armaggedon\suicides_11\0\rocketkills_4\6\ping_14\178\score_0\38\deaths_3\5\ping_6\212\player_7\Dr.Veigle[JURY]\suicides_12\0\rocketkills_5\8\ping_15\80\dtime_9\528\compmode\0\score_1\28\deaths_4\5\ping_7\97\player_8\Thunder_Chicken\rocketkills_6\2\suicides_13\0\ping_16\57\score_2\29\deaths_5\5\ping_8\115\player_9\JewfiSh\player_10\Elder_Midget\suicides_14\0\rocketkills_7\2\ping_17\214\score_3\43\deaths_6\5\ping_9\215\player_11\basTard [JURY]\suicides_15\0\railkills_0\1\hostname\Nostromo House Of Whack\gamever\v2.25\score_4\30\deaths_7\6\team_10\1\player_12\Groover[MCK]\railkills_1\2\suicides_16\0\score_5\29\deaths_8\4\team_11\0\player_13\fishbat\railkills_2\1\suicides_17\0\ctime_0\0\score_6\27\deaths_9\6\deaths_10\5\team_12\1\player_14\Wrath[X-D]\ctime_1\0\score_7\31\ctime_10\0\deaths_11\5\team_13\0\player_15\Xerious\railkills_4\1\rounds\9\ctime_2\0\score_8\14\ctime_11\36\deaths_12\2\railkills_5\3\team_14\0\player_16\Dbl_Trbl\damagescoring\1\ctime_3\0\score_9\9\grenadekills_0\2\ctime_12\126\deaths_13\1\team_15\0\player_17\Homey\ctime_4\0\grenadekills_1\1\ctime_13\308\deaths_14\2\team_16\1\team_0\0\ctime_5\0\ctime_14\382\deaths_15\2\team_17\0\arena\7\healthprotect\1\team_1\0\ctime_6\0\grenadekills_3\1\ctime_15\451\deaths_16\0\team_2\0\ctime_7\0\grenadekills_4\1\ctime_16\662\deaths_17\0\team_3\0\ctime_8\0\ctime_17\715\armorprotect\1\team_t0\#7 Pickup Red\team_4\0\ctime_9\0\grenadekills_6\1\hostport\27910\team_t1\#7 Pickup Blue\team_5\1\otherkills_3\1\grenadekills_7\2\team_6\1\score_10\15\grenadekills_8\1\ctime_t0\0\team_7\1\score_11\12\health\100\ctime_t1\0\team_8\1\score_12\15\dtime_13\392\mapname\ra2map1\pid_3\100007\team_9\1\rocketkills_10\6\score_13\0\grenadekills_12\6

1v1 Quake 3 Competition Match

Key Descriptions:
gameck
a checksum for the game dll
rocketK_N
number of kills with the RL by this player
railK_N
number of kills with the Railgun by this player
shotgunK_N
number of kills with the Railgun by this player
selfK_N
number of suicides
armorPU_N
total ammount of armor picked up by this person
rocketsPU_N
total number of rockets picked up
slugsPU_N
total number of slugs picked up
rockethitp_N
hit percentage for rocket shots
railhitp_N
hit percentage for rail shots
In Progress:
\hostname\My_1v1_Server\mapname\q3map23\timelimit\20\fraglimit\60\gametype\competition\serverck\34234223\gameck\354322333\gamemode\closedplaying\state\Playing, 5 minutes left\player_0\ken\score_0\50\deaths_0\20\rocketK_0\33\railK_0\15\shotgunK_0\4\selfK_0\2\ctime_0\0\dtime_0\1\ping_0\53\armorPU_0\3530\rocketsPU_0\235\slugsPU_0\300\rockethitp_0\0.75\railhitp_0\0.10\pid_0\23432\auth_0\cc7a0058cde6e6973df985bc0a5caf67\player_1\bob\score_1\18\deaths_1\50\rocketK_1\10\railK_1\8\shotgunK_1\0\selfK_1\0\ctime_1\0\dtime_1\1\ping_1\154\armorPU_1\1330\rocketsPU_1\35\slugsPU_1\50\rockethitp_1\0.25\railhitp_1\0.05\pid_1\3353232\auth_1\923db4c9d457626560652a50b8a3b4f2
Completed:
\hostname\My_1v1_Server\mapname\q3map23\timelimit\20\fraglimit\60\gametype\competition\serverck\34234223\gameck\354322333\player_0\ken\score_0\60\deaths_0\22\rocketK_0\43\railK_0\17\shotgunK_0\4\selfK_0\4\ctime_0\0\dtime_0\-1\ping_0\56\armorPU_0\4330\rocketsPU_0\335\slugsPU_0\320\rockethitp_0\0.79\railhitp_0\0.15\pid_0\23432\auth_0\cc7a0058cde6e6973df985bc0a5caf67\player_1\bob\score_1\20\deaths_1\62\rocketK_1\10\railK_1\10\shotgunK_1\0\selfK_1\0\ctime_1\0\dtime_1\-1\ping_1\165\armorPU_1\1430\rocketsPU_1\65\slugsPU_1\70\rockethitp_1\0.25\railhitp_1\0.09\pid_1\3353232\auth_1\923db4c9d457626560652a50b8a3b4f2\gamemode\debriefing\state\Match completed, Ken Wins

Quake 3 FFA Server

Key Descriptions:
gameck
a checksum for the game dll
rocketK_N
number of kills with the RL by this player
railK_N
number of kills with the Railgun by this player
shotgunK_N
number of kills with the Railgun by this player
selfK_N
number of suicides
armorPU_N
total ammount of armor picked up by this person
rocketsPU_N
total number of rockets picked up
slugsPU_N
total number of slugs picked up
rockethitp_N
hit percentage for rocket shots
railhitp_N
hit percentage for rail shots
Completed
\hostname\Random_Deathmatch_Server\mapname\q3map20\timelimit\20\fraglimit\15\gametype\deathmatch\serverck\34234223\gameck\2343242\gamemode\debriefing\state\Timelimit hit\player_0\jimmy\score_0\7\deaths_0\2\rocketK_0\5\railK_0\0\shotgunK_0\2\selfK_0\0\ctime_0\0\dtime_0\0:13:54\ping_0\254\rockethitp_0\0.77\railhitp_0\0.0\pid_0\2332\auth_0\cc7a0058cde6e6973df985bc0a5caf67\score0_0\0\score1_0\2\score2_0\2\score3_0\1\score4_0\1\score5_0\1\score6_0\0\score7_0\0\player_1\l33t0n3\score_1\6\deaths_1\6\rocketK_1\6\railK_1\3\shotgunK_1\2\selfK_1\2\ctime_1\0:05:33\dtime_1\0:00:15:32\ping_1\463\rockethitp_1\0.67\railhitp_1\0.2\pid_1\0\auth_1\\score0_1\1\score1_1\0\score2_1\1\score3_1\0\score4_1\2\score5_1\1\score6_1\1\score7_1\1\player_2\gr0v3r\score_2\6\deaths_2\4\rocketK_2\8\railK_2\0\shotgunK_2\0\selfK_2\2\ctime_2\0\dtime_2\0:07:20\ping_2\222\rockethitp_2\0.72\railhitp_2\0.0\pid_2\45508\auth_2\efa7eaccde6e6973df985bc0a5caf674\score0_2\0\score1_2\1\score2_2\0\score3_2\1\score4_2\1\score5_2\2\score6_2\2\score7_2\0\player_3\walla\score_3\12\deaths_3\14\rocketK_3\4\railK_3\0\shotgunK_3\10\selfK_3\2\ctime_3\0\dtime_3\-1\ping_3\352\rockethitp_3\0.24\railhitp_3\0.0\pid_3\44653\auth_3\6fd3ea58cde6e6973df985bc0a5c12ad\score0_3\2\score1_3\0\score2_3\3\score3_3\0\score4_3\2\score5_3\2\score6_3\3\score7_3\2\player_4\crt\score_4\14\deaths_4\6\rocketK_4\10\railK_4\4\shotgunK_4\2\selfK_4\2\ctime_4\0:03:23\dtime_4\0:08:20\ping_4\53\rockethitp_4\0.87\railhitp_4\0.45\pid_4\233332\auth_4\32af0058cde6e6973df985bc0a5c32af\score0_4\2\score1_4\5\score2_4\2\score3_4\1\score4_4\0\score5_4\3\score6_4\1\score7_4\0\player_5\mrpants\score_5\7\deaths_5\4\rocketK_5\4\railK_5\3\shotgunK_5\0\selfK_5\0\ctime_5\0\dtime_5\0:08:25\ping_5\322\rockethitp_5\0.47\railhitp_5\0.20\pid_5\0\auth_5\\score0_5\1\score1_5\1\score2_5\1\score3_5\2\score4_5\0\score5_5\0\score6_5\1\score7_5\1\player_6\basty\score_6\4\deaths_6\0\rocketK_6\3\railK_6\1\shotgunK_6\1\selfK_6\1\ctime_6\0\dtime_6\0:3:24\ping_6\34\rockethitp_6\0.43\railhitp_6\0.10\pid_6\32332\auth_6\aa3a0058cde6e6973df985bc0a5caf3af\score0_6\0\score1_6\1\score2_6\0\score3_6\1\score4_6\1\score5_6\0\score6_6\0\score7_6\1\player_7\badasshank\score_7\7\deaths_7\2\rocketK_7\2\railK_7\5\shotgunK_7\0\selfK_7\0\ctime_7\0:17:32\dtime_7\-1\ping_7\234\rockethitp_7\0.23\railhitp_7\0.40\pid_7\0\auth_7\\score0_7\0\score1_7\2\score2_7\0\score3_7\2\score4_7\1\score5_7\1\score6_7\1\score7_7\0

4v4 Team Quake 3 Competition

Key Descriptions:
gameck
a checksum for the game dll
rocketK_N
number of kills with the RL by this player
railK_N
number of kills with the Railgun by this player
shotgunK_N
number of kills with the Railgun by this player
selfK_N
number of suicides
armorPU_N
total ammount of armor picked up by this person
rocketsPU_N
total number of rockets picked up
slugsPU_N
total number of slugs picked up
rockethitp_N
hit percentage for rocket shots
railhitp_N
hit percentage for rail shots
tkills_N
Number of teammates a player has killed
quads_tN
Number of Quad powerups team N has gotten
avglifespan_tN
Average lifespan for a player in team N
In progress:
\hostname\TeamPlay_Competition_Server\mapname\q3map22\timelimit\20\fraglimit\200\gametype\competition\serverck\34234223\gameck\562156\gamemode\closedplaying\state\Playing, 5:30 minutes left\player_0\crt\score_0\35\deaths_0\12\rocketK_0\30\railK_0\3\shotgunK_0\2\selfK_0\0\ctime_0\0\dtime_0\-1\ping_0\150\rockethitp_0\0.75\railhitp_0\0.72\pid_0\2332\auth_0\cc7a0058cde6e6973df985bc0a5caf67\team_0\0\tkills_0\0\player_1\Kaaos\score_1\17\deaths_1\14\rocketK_1\0\railK_1\17\shotgunK_1\2\selfK_1\0\ctime_1\0\dtime_1\-1\ping_1\170\rockethitp_1\0.45\railhitp_1\0.70\pid_1\23544\auth_1\efa7eaccde6e6973df985bc0a5caf674\team_1\0\tkills_1\2\player_2\Cr0m\score_2\20\deaths_2\22\rocketK_2\10\railK_2\10\shotgunK_2\0\selfK_2\0\ctime_2\0\dtime_2\-1\ping_2\163\rockethitp_2\0.23\railhitp_2\0.85\pid_2\56874\auth_2\6fd3ea58cde6e6973df985bc0a5c12ad\team_2\0\tkills_2\0\player_3\Scunion\score_3\25\deaths_3\8\rocketK_3\10\railK_3\15\shotgunK_3\0\selfK_3\0\ctime_3\0\dtime_3\-1\ping_3\171\rockethitp_3\0.70\railhitp_3\0.75\pid_3\568745\auth_3\aa3a0058cde6e6973df985bc0a5caf3af\team_3\0\tkills_3\0\player_4\k1ll3rman\score_4\7\deaths_4\33\rocketK_4\6\railK_4\1\shotgunK_4\0\selfK_4\0\ctime_4\0\dtime_4\-1\ping_4\210\rockethitp_4\0.10\railhitp_4\0.05\pid_4\564578\auth_4\32af0058cde6e6973df985bc0a5c32af\team_4\1\tkills_4\0\player_5\h4x0r\score_5\23\deaths_5\19\rocketK_5\25\railK_5\0\shotgunK_5\0\selfK_5\2\ctime_5\0\dtime_5\-1\ping_5\121\rockethitp_5\0.50\railhitp_5\0\pid_5\564578\auth_5\43540058cde6e6973df985bc0a535332\team_5\1\tkills_5\0\player_6\gr33nmachin3\score_6\17\deaths_6\24\rocketK_6\25\railK_6\0\shotgunK_6\2\selfK_6\0\ctime_6\0\dtime_6\-1\ping_6\213\rockethitp_6\0.45\railhitp_6\0\pid_6\12788\auth_6\af3a0058cde6e6973df985bc0a5c7543\team_6\1\tkills_6\10\player_7\h4lfl1f3\score_7\2\deaths_7\23\rocketK_7\0\railK_7\0\shotgunK_7\4\selfK_7\0\ctime_7\0\dtime_7\-1\ping_7\154\rockethitp_7\0.60\railhitp_7\0\pid_7\8979841\auth_7\54530058cde6e6973df985bc0a5c2342\team_7\1\tkills_7\2\team_t0\[McP]\quads_t0\7\score_t0\97\avglifespan_t0\1:20\team_t1\Kr0z\quads_t1\2\score_t1\49\avglifespan_t1\0:35
Completed:
\hostname\TeamPlay_Competition_Server\mapname\q3map22\timelimit\20\fraglimit\200\gametype\competition\serverck\34234223\gameck\562156\gamemode\debriefing\state\Match Complete, Fraglimit hit\player_0\crt\score_0\75\deaths_0\35\rocketK_0\45\railK_0\28\shotgunK_0\2\selfK_0\0\ctime_0\0\dtime_0\-1\ping_0\152\rockethitp_0\0.80\railhitp_0\0.60\pid_0\2332\auth_0\cc7a0058cde6e6973df985bc0a5caf67\team_0\0\tkills_0\0\player_1\Kaaos\score_1\47\deaths_1\29\rocketK_1\23\railK_1\20\shotgunK_1\2\selfK_1\0\ctime_1\0\dtime_1\-1\ping_1\172\rockethitp_1\0.65\railhitp_1\0.45\pid_1\23544\auth_1\efa7eaccde6e6973df985bc0a5caf674\team_1\0\tkills_1\2\player_2\Cr0m\score_2\40\deaths_2\35\rocketK_2\25\railK_2\23\shotgunK_2\0\selfK_2\0\ctime_2\0\dtime_2\-1\ping_2\160\rockethitp_2\0.45\railhitp_2\0.65\pid_2\56874\auth_2\6fd3ea58cde6e6973df985bc0a5c12ad\team_2\0\tkills_2\0\player_3\Scunion\score_3\38\deaths_3\16\rocketK_3\43\railK_3\23\shotgunK_3\0\selfK_3\0\ctime_3\0\dtime_3\-1\ping_3\175\rockethitp_3\0.80\railhitp_3\0.85\pid_3\568745\auth_3\aa3a0058cde6e6973df985bc0a5caf3af\team_3\0\tkills_3\0\player_4\k1ll3rman\score_4\13\deaths_4\65\rocketK_4\10\railK_4\3\shotgunK_4\0\selfK_4\0\ctime_4\0\dtime_4\-1\ping_4\208\rockethitp_4\0.15\railhitp_4\0.10\pid_4\564578\auth_4\32af0058cde6e6973df985bc0a5c32af\team_4\1\tkills_4\0\player_5\h4x0r\score_5\27\deaths_5\23\rocketK_5\26\railK_5\3\shotgunK_5\0\selfK_5\2\ctime_5\0\dtime_5\-1\ping_5\124\rockethitp_5\0.30\railhitp_5\0.01\pid_5\564578\auth_5\43540058cde6e6973df985bc0a535332\team_5\1\tkills_5\0\player_6\gr33nmachin3\score_6\19\deaths_6\35\rocketK_6\25\railK_6\33\shotgunK_6\2\selfK_6\0\ctime_6\0\dtime_6\-1\ping_6\220\rockethitp_6\0.40\railhitp_6\0.20\pid_6\12788\auth_6\af3a0058cde6e6973df985bc0a5c7543\team_6\1\tkills_6\10\player_7\h4lfl1f3\score_7\12\deaths_7\36\rocketK_7\0\railK_7\10\shotgunK_7\4\selfK_7\0\ctime_7\0\dtime_7\-1\ping_7\160\rockethitp_7\0.40\railhitp_7\0.0\pid_7\8979841\auth_7\54530058cde6e6973df985bc0a5c2342\team_7\1\tkills_7\4\team_t0\[McP]\quads_t0\14\score_t0\200\avglifespan_t0\1:35\team_t1\Kr0z\quads_t1\2\score_t1\71\avglifespan_t1\0:20

1v1 Starcraft Match

Key Descriptions:
elapsedtime
total time this match has taken
startpos
relative starting position on the map
gasmined
total gas resources mined
mineralsmined
total mineral resources mined
tspent
total resources spent
unitsP
total units produced
unitsK
number of enemy units killed
unitsL
number of own units lost
structuresP
total number of structures erected
structuresK
number of enemy structures razed
structuresL
number of own structures lost
race
which race the player played
Completed:
\hostname\crt_vs_walla\mapname\Lost Temple\gametype\One on One\serverck\234234\gamemode\Debriefing
\state\Game Complete, crt wins\elapsedtime\36:49\player_0\crt\score_0\45284
\startpos_0\Center Right\gasmined_0\10410\mineralsmined_0\34874\Tspent_0\40975
\unitsP_0\453\unitsK_0\140\unitsL_0\254\structuresP_0\45\structuresK_0\19
\structuresL_0\1\race_0\Zerg\pid_0\23432\auth_0\cc7a0058cde6e6973df985bc0a5caf67\player_1\walla\score_1\33396\startpos_1\Bottom Center\gasmined_1\8570\mineralsmined_1\24826
\Tspent_1\32438\unitsP_1\183\unitsK_1\254\unitsL_1\142\structuresP_1\57\structuresK_1\1\structuresL_1\19\race_1\Protoss\pid_1\3353232\auth_1\923db4c9d457626560652a50b8a3b4f2

1v1v1v1 Starcraft Match

Key Descriptions:
elapsedtime
total time this match has taken
startpos
relative starting position on the map
gasmined
total gas resources mined
mineralsmined
total mineral resources mined
tspent
total resources spent
unitsP
total units produced
unitsK
number of enemy units killed
unitsL
number of own units lost
structuresP
total number of structures erected
structuresK
number of enemy structures razed
structuresL
number of own structures lost
race
which race the player played
In progress:
\hostname\4 Player Game!\mapname\Hellhole\gametype\Melee\serverck\234234\gamemode\closedplaying\state\Playing\elapsedtime\13:33\player_0\crt\score_0\15468\startpos_0\Center Right\gasmined_0\5468\mineralsmined_0\10548\Tspent_0\15048\unitsP_0\124\unitsK_0\32\unitsL_0\22\structuresP_0\11\structuresK_0\1\structuresL_0\0\race_0\Zerg\pid_0\23432\auth_0\cc7a0058cde6e6973df985bc0a5caf67\player_1\walla\score_1\15484\startpos_1\Bottom Center\gasmined_1\2154\mineralsmined_1\8456\Tspent_1\8987\unitsP_1\68\unitsK_1\24\unitsL_1\34\structuresP_1\8\structuresK_1\0\structuresL_1\1\race_1\Protoss\pid_1\3353232\auth_1\923db4c9d457626560652a50b8a3b4f2\player_2\jimmy\score_2\12081\startpos_2\Top Left\gasmined_2\5486\mineralsmined_2\9754\Tspent_2\13548\unitsP_2\112\unitsK_2\16\unitsL_2\3\structuresP_2\9\structuresK_2\1\structuresL_2\0\race_2\Terran\pid_2\45645\auth_2\923db4c9d457626560652a50b8a3b4f2\player_3\pants\score_3\8456\startpos_3\Top Right\gasmined_3\5124\mineralsmined_3\7854\Tspent_3\10548\unitsP_3\70\unitsK_3\3\unitsL_3\16\structuresP_3\12\structuresK_3\0\structuresL_3\1\race_3\Zerg\pid_3\0\auth_3\
Completed:
\hostname\4 Player Game!\mapname\Hellhole\gametype\Melee\serverck\234234\gamemode\debriefing\state\Game Complete, crt wins\elapsedtime\45:20\player_0\crt\score_0\35478\startpos_0\Center Right\gasmined_0\15848\mineralsmined_0\30548\Tspent_0\40812\unitsP_0\264\unitsK_0\354\unitsL_0\120\structuresP_0\23\structuresK_0\29\structuresL_0\5\race_0\Zerg\pid_0\23432\auth_0\cc7a0058cde6e6973df985bc0a5caf67\dtime_0\-1\player_1\walla\score_1\24564\startpos_1\Bottom Center\gasmined_1\6804\mineralsmined_1\15486\Tspent_1\20488\unitsP_1\152\unitsK_1\64\unitsL_1\152\structuresP_1\14\structuresK_1\7\structuresL_1\12\race_1\Protoss\pid_1\3353232\auth_1\923db4c9d457626560652a50b8a3b4f2\dtime_1\-1\player_2\jimmy\score_2\16450\startpos_2\Top Left\gasmined_2\10184\mineralsmined_2\15481\Tspent_2\25484\unitsP_2\160\unitsK_2\48\unitsL_2\145\structuresP_2\13\structuresK_2\6\structuresL_2\13\race_2\Terran\pid_2\45645\auth_2\923db4c9d457626560652a50b8a3b4f2\dtime_2\-1\player_3\pants\score_3\12054\startpos_3\Top Right\gasmined_3\7840\mineralsmined_3\12648\Tspent_3\18456\unitsP_3\132\unitsK_3\15\unitsL_3\132\structuresP_3\16\structuresK_3\0\structuresL_3\14\race_3\Zerg\pid_3\0\auth_3\\dtime_3\23:30

2v2 Starcraft Match

Key Descriptions:
elapsedtime
total time this match has taken
startpos
relative starting position on the map
gasmined
total gas resources mined
mineralsmined
total mineral resources mined
tspent
total resources spent
unitsP
total units produced
unitsK
number of enemy units killed
unitsL
number of own units lost
structuresP
total number of structures erected
structuresK
number of enemy structures razed
structuresL
number of own structures lost
race
which race the player played
Completed:
\hostname\2v2 Teams\mapname\Hellhole\gametype\Team Melee\serverck\234234\gamemode\debriefing\state\Game Complete: Yellow wins\elapsedtime\30:12\player_0\crt\score_0\35478\startpos_0\Center Right\gasmined_0\15848\mineralsmined_0\30548\Tspent_0\40812\unitsP_0\264\unitsK_0\354\unitsL_0\120\structuresP_0\23\structuresK_0\29\structuresL_0\5\race_0\Zerg\pid_0\23432\auth_0\cc7a0058cde6e6973df985bc0a5caf67\team_0\0\player_1\walla\score_1\24564\startpos_1\Bottom Center\gasmined_1\6804\mineralsmined_1\15486\Tspent_1\20488\unitsP_1\152\unitsK_1\64
\unitsL_1\152\structuresP_1\14\structuresK_1\7\structuresL_1\12\race_1\Zerg\pid_1\3353232\auth_1\923db4c9d457626560652a50b8a3b4f2\team_1\0\player_2\jimmy\score_2\16450\startpos_2\Top Left\gasmined_2\10184\mineralsmined_2\15481\Tspent_2\25484\unitsP_2\160\unitsK_2\48
\unitsL_2\145\structuresP_2\13\structuresK_2\6\structuresL_2\13\race_2\Terran\pid_2\45645\auth_2\324324c9d457626560652a50b8a3b4f2\team_2\1\player_3\pants\score_3\12054\startpos_3\Top Right\gasmined_3\7840\mineralsmined_3\12648\Tspent_3\18456\unitsP_3\132\unitsK_3\15
\unitsL_3\132\structuresP_3\16\structuresK_3\0\structuresL_3\14\race_3\Protoss\pid_3\4548\auth_3\3533db4c9d457626560652a50b8a3b4f2\team_3\1\team_t0\Yellow\score_t0\60042\team_t1\Green\score_t1\28504

2 Human vs. 1 Computer Starcraft Match

Key Descriptions:
elapsedtime
total time this match has taken
startpos
relative starting position on the map
gasmined
total gas resources mined
mineralsmined
total mineral resources mined
tspent
total resources spent
unitsP
total units produced
unitsK
number of enemy units killed
unitsL
number of own units lost
structuresP
total number of structures erected
structuresK
number of enemy structures razed
structuresL
number of own structures lost
race
which race the player played
aiplayer_N
whether of not the player is controlled by the computer
Completed:
\hostname\2 vs Computer\mapname\Sherwood Forest\gametype\Team Melee\serverck\234234\gamemode\debriefing\state\Game Complete: Humans win\elapsedtime\12:32\player_0\crt\score_0\35478\startpos_0\Center Right\gasmined_0\15848\mineralsmined_0\30548\Tspent_0\40812\unitsP_0\264\unitsK_0\354\unitsL_0\120\structuresP_0\23\structuresK_0\29\structuresL_0\5\race_0\Zerg\pid_0\23432\auth_0\cc7a0058cde6e6973df985bc0a5caf67\team_0\0\aiplayer_0\0\player_1\walla\score_1\24564\startpos_1\Bottom Center\gasmined_1\6804\mineralsmined_1\15486\Tspent_1\20488\unitsP_1\152\unitsK_1\64\unitsL_1\152\structuresP_1\14\structuresK_1\7\structuresL_1\12\race_1\Zerg\pid_1\3353232\auth_1\923db4c9d457626560652a50b8a3b4f2\team_1\0\aiplayer_1\0\player_2\Hal (AI)\score_2\16450\startpos_2\Top Left\gasmined_2\10184\mineralsmined_2\15481\Tspent_2\25484\unitsP_2\160\unitsK_2\48\unitsL_2\145\structuresP_2\13\structuresK_2\6\structuresL_2\13\race_2\Terran\pid_2\0\auth_2\\team_2\1\aiplayer_2\1\team_t0\Yellow\score_t0\60042\team_t1\Green\score_t1\16450

4v4 Rainbow 6 Team DM

Key Description:
sex_N
sex (M or F)
totaltime_N
total number of seconds for the match
specialty_N
specialty (Assault, Recon, Sniper, etc.)
roundsfired_N
total rounds fired
hitpercent_N
total hit %
tkills_N
number of team player's killed
Completed:
\hostname\Jim's Server\mapname\Killing Field\gametype\Double Bluff\totaltime\300\difficulty\Veteran\player_0\John\ping_0\28\team_0\0\kills_0\5\deaths_0\7\sex_0\M\specialty_0\Assault\roundsfired_0\54\hitpercent_0\85\tkills_0\1\pid_0\46829\auth_0\cc7a0058cde6e6973df985bc0a5caf67\player_1\George\ping_1\46\team_1\0\kills_1\8\deaths_1\2\sex_1\M\specialty_1\Assault\roundsfired_1\66\hitpercent_1\67\tkills_1\3\pid_1\64372\auth_1\923db4c9d457626560652a50b8a3b4f2\player_2\Paul\ping_2\38\team_2\0\kills_2\2\deaths_2\9\sex_2\F\specialty_2\Sniper\roundsfired_2\78\hitpercent_2\30\tkills_2\0\pid_2\55497\auth_2\cc7a0058cde6e6973df985bc0a5caf67\player_3\Ringo\ping_3\12\team_3\0\kills_3\5\deaths_3\6\sex_3\M\specialty_3\Assault\roundsfired_3\29\hitpercent_3\98\tkills_3\2\pid_3\66634\auth_3\923db4c9d457626560652a50b8a3b4f2\player_4\crt\ping_4\152\team_4\1\kills_4\6\deaths_4\4\sex_4\F\specialty_4\Assault\roundsfired_4\55\hitpercent_4\55\tkills_4\3\pid_4\44844\auth_4\cc7a0058cde6e6973df985bc0a5caf67\player_5\Walla\ping_5\22\team_5\1\kills_5\9\deaths_5\8\sex_5\M\specialty_5\Sniper\roundsfired_5\47\hitpercent_5\67\tkills_5\4\pid_5\57987\auth_5\923db4c9d457626560652a50b8a3b4f2\player_6\Mr. Pants\ping_6\58\team_6\1\kills_6\3\deaths_6\3\sex_6\M\specialty_6\Assault\roundsfired_6\26\hitpercent_6\59\tkills_6\2\pid_6\48489\auth_6\cc7a0058cde6e6973df985bc0a5caf67\player_7\KAAOS\ping_7\99\team_7\1\kills_7\6\deaths_7\7\sex_7\M\specialty_7\Recon\roundsfired_7\38\hitpercent_7\42\tkills_7\0\pid_7\68413\auth_7\923db4c9d457626560652a50b8a3b4f2\team_t0\Red\score_t0\20\team_t1\Blue\score_t1\24

4 vs. Computer Rainbow 6 Coop

Key Description:
sex_N
sex (M or F)
totaltime_N
total number of seconds for the match
specialty_N
specialty (Assault, Recon, Sniper, etc.)
roundsfired_N
total rounds fired
hitpercent_N
total hit %
tkills_N
number of team player's killed
difficuly
mission's difficulty level (Rookie, Veteran, Elite)
human_N
1 for a human, 0 for an AI player
Completed:
\hostname\Jim's Server\mapname\M78 Rescue Gilligan\gametype\cooperative\totaltime\289\kills\17\deaths\3\roundsfired\97\hitpercent\64\tkills\0\player_0\Smoothie\ping_0\10\team_0\0\kills_0\10\deaths_0\2\roundsfired_0\56\hitpercent_0\70\tkills_0\0\human_0\1\pid_0\55544\auth_0\cc7a0058cde6e6973df985bc0a5caf67\player_1\AI\ping_1\10\team_1\0\kills_1\0\deaths_1\0\roundsfired_1\3\hitpercent_1\0\tkills_1\0\human_1\0\pid_1\0\auth_1\\player_2\Slurpie\ping_2\28\team_2\1\kills_2\5\deaths_2\1\roundsfired_2\26\hitpercent_2\64\tkills_2\1\human_2\1\pid_2\66854\auth_2\923db4c9d457626560652a50b8a3b4f2\player_3\AI\ping_3\10\team_3\1\kills_3\2\deaths_3\2\roundsfired_3\12\hitpercent_3\50\tkills_3\0\human_3\0\pid_3\0\auth_3\\team_t0\Red\kills_t0\10\deaths_t0\2\roundsfired_t0\59\team_t1\Blue\kills_t1\7\deaths_t1\3\roundsfired_t1\38

1v1 FIFA Soccer

Key Descriptions:
time
total match time in seconds
precipitation
rain, snow, sleet, etc.
surface
grass, turf, etc.
human_N
1 for a human, 0 for an AI player
goals_N
number of goals scored by this player
assists_N
number of assists by this player
steals_N
number of steals by this player
shots_N
number of shots on goal by this player
fouls_tN
number of times this team fouled
yellowcards_tN
number of yellowcards received by this team
redcards_tN
number of redcards received by this team
Completed:
\hostname\John's Cup\mapname\Brazil\gametype\Standard\totaltime\5400\precipitation\Light Rain\surface\Grass\player_0\Boy George\human_0\1\ping_0\10\team_0\0\goals_0\2\assists_0\1\shots_0\7\steals_0\8\pid_0\58894\auth_0\cc7a0058cde6e6973df985bc0a5caf67\player_1\AI\human_1\0\ping_1\10\team_1\0\goals_1\0\assists_1\1\shots_1\2\steals_1\3\pid_1\0\auth_1\\player_2\George Michael\human_2\1\ping_2\48\team_2\1\goals_2\1\assists_2\2\shots_2\4\steals_2\11\pid_2\64485\auth_2\923db4c9d457626560652a50b8a3b4f2\player_3\AI\human_3\0\ping_3\10\team_3\1\goals_3\1\assists_3\0\shots_3\2\steals_3\1\pid_3\0\auth_3\\team_t0\Italy\score_t0\3\fouls_t0\3\yellowcards_t0\1\redcards_t0\0\team_t1\England\score_t1\2\fouls_t1\6\yellowcards_t1\1\redcards_t1\1

2v2 NBA Live (with 3 computer players on each team)

Key Descriptions:
time
length of game in seconds
points
number of points scored
shotpercent_N
player's shot percentage
threes_N
number of 3-pointers
rebounds_N
number of rebounds
blocks_N
number of blocks
steals_N
number of steals
fouls_N
number of fouls
shotpercent_tN
team's shot percentage
threes_tN
number of 3-pointers
rebounds_tN
number of rebounds
blocks_tN
number of blocks
steals_tN
number of steals
fouls_tN
number of fouls
possessionTime_tN
total time of possession for the team
Completed:
\hostname\Play Basketball Here!\mapname\New Jersey\gametype\5v5\time\2880\player_0\Billy\human_0\1\points_0\38\shotpercent_0\48\threes_0\4\rebounds_0\7\blocks_0\2\steals_0\3\fouls_0\3\pid_0\19875\auth_0\923db4c9d457626560652a50b8a3b4f2\player_1\Bob\human_1\1\points_1\45\shotpercent_1\58\threes_1\5\rebounds_1\4\blocks_1\1\steals_1\5\fouls_1\4\pid_1\44978\auth_1\cc7a0058cde6e6973df985bc0a5caf67\player_2\AI\human_2\0\points_2\9\shotpercent_2\21\threes_2\3\rebounds_2\3\blocks_2\0\steals_2\4\fouls_2\2\pid_2\0\auth_2\\player_3\Joey\human_3\1\points_3\29\shotpercent_3\31\threes_3\1\rebounds_3\1\blocks_3\0\steals_3\3\fouls_3\4\pid_3\11189\auth_3\923db4c9d457626560652a50b8a3b4f2\player_4\John\human_4\1\points_4\52\shotpercent_4\66\threes_4\6\rebounds_4\8\blocks_4\4\steals_4\7\fouls_4\3\pid_4\71824\auth_4\cc7a0058cde6e6973df985bc0a5caf67\player_5\AI\human_5\0\points_5\8\shotpercent_5\58\threes_5\0\rebounds_5\3\blocks_5\0\steals_5\5\fouls_5\3\pid_5\0\auth_5\\team_t0\Nets\score_t0\92\shotpercent_t0\50\threes_t0\12\rebounds_t0\14\blocks_t0\3\steals_t0\12\fouls_t0\9\possessionTime_t0\1757\team_t1\Lakers\score_t1\89\shotpercent_t1\54\threes_t1\7\rebounds_t1\12\blocks_t1\4\steals_t1\15\fouls_t1\10\possessionTime_t1\1123

1 player PGA Tour 99

Key Descriptions:
nholes
number of holes on the course
par
par for the course
holeXX_N
score for player N on hole XX
score_N
current score for player N (vs. par)
In progress:
\hostname\Single_Player_Game_(Bob)\nholes\9\mapname\Augusta National, Back 9\gametype\normal\gamemode\playing\state\Hole 12\par\36\player_0\Bob\score_0\-1\hole10_0\4\hole11_0\3 
Completed:
\hostname\Single_Player_Game_(Bob)\nholes\9\mapname\Augusta National, Back 9\gametype\normal\gamemode\debriefing\state\Completed\par\36\player_0\Bob\score_0\4\hole10_0\4\hole11_0\3\hole12_0\5\hole13_0\7\hole14_0\4\hole15_0\5\hole16_0\6\hole17_0\2\hole18_0\4

1v1 Checkers

Key Descriptions:
moves
total number of moves made in the game
winner
player number of the winner
time_N
total number of seconds player took to make his moves
pieceslost_N
number of pieces this player lost
kings_N
number of times this player "kinged" a piece
Completed:
\hostname\I play checkers real good.\gametype\Standard\moves\27\winner\0\player_0\Obi-wan\time_0\240\pieceslost_0\8\kings_0\2\player_1\Darth Vader\time_1\257\pieceslost_1\12\kings_1\0

3 Player You Don't Know Jack

Key Descriptions:
correct_N
number of correct answers
wrong_N
number of wrong answers
Completed:
\gametype\Toilet Humor\player_0\Snap\score_0\800\correct_0\4\wrong_0\2\player_1\Crackle\score_1\12000\correct_1\5\wrong_1\1\player_2\Pop\score_2\3500\correct_2\3\wrong_2\1