GibStats


[Log Standard]  

  Welcome
  News
  Downloads
  Log Standard

  Supporters

  Mail/Mailing List

  GibStats
Why?

    This is an attempt to propose a standard for logging events of Quake and Quake2 mods.

    I have been working on a statistics program, GibStats, for the past year. Many problems were created as there was no standard for logging events of mods and their special scoring systems in Quake. This meant that for each mod I had to add many special addidition to support it. Many mods could not be taken care of at all.

    According to the mail I receive, many people enjoy playing Quake and setting up some kind of public or private league. But this is only possible if one can store and display statistics about past Quake games. This is what GibStats was made for. But the problem with Quake is that no one ever established a standard which events should be logged and how. Now, I am trying to prevent the same problem coming up in Quake 2 and to set a standard for Quake.

    The proposal I am making is to set the standard for the logging of at least the dedicated servers and preferable also the listen server / client.

    If you want to support this standard by adapting it in future version of your mod (or in some other way) then send an e-mail to gibstats@usa.net with the link to your site. I am going to set up a page with everybody supporting it.
     
Supporters of the Log Standard
    The Supporters can be found here
Log Standard for Quake (Ver. 1.2 of 08.02.1998)
     
    There is a simple example of implementing the Log Standard for Quake at my site available (source code). You can find all the GSLogMod changes by searching for "GSLogMod".
    You can always obtain the newest version of this standard at my site or a link to the newest version, even though there should not be any changes from now on.
     
    1. Definitions

    • The log is written by the dedicated/ listen server (you may also implement it for the client).
    • "/" = is be replaced by a chr(9), as otherwise one has trouble if "/" is contained in a player name.
    • The player names and team names have to be striped of any chr(9) contained in them before they are printed to the log. Otherwise the logs obviously may become unusable.
    • Every line is followed by a carriage return.
    • "[..]" represents an item which is obligatory.
    • "<...>" represents an item which is only applicable to certain patches.
    • all messages stated here have to logged exactly with the same "keywords" (Player, Map, Left, etc) as stated here. Otherwise they become unreadable.
    • any sequence of letters which is not in a "<...>" or "[...]" has to be logged exactly the way as set out below.
    • the following keywords (specifying the action or type of score) are reserved and fixed. Meaning you have to implement them as stated here for the predefined purpose: StdLog, PatchName, LogDate, LogTime,  DeathMatchFlags, Map, Player, Kill, Suicide, PlayerLeft, PlayerConnect, PlayerRename, PlayerTeamChange, GameStart, GameEnd, TeamScore. All other parts of the messages below are only for the purpose of explaning and giving an example.
    • if you want that a log parser is able to log something which has not been mentioned here then either
      • make that item a [TypeOfScore] and log a positiv or negative value in [Score] (the log parser will then count that type of score according to the value you assigned to [Score]) or
      • if it concerns control of the logging like "GameStart", "GameEnd", "PlayerName", etc. then mail and I will have a look if I include it in an update

    2.  Start of Log
    "//StdLog/[Vers]"
    StdLog = indicating that now a standard log is going to follow
    [Vers] = the version number of the implemented log standard (Ver. 1.2 of 26.01.1998)
    Occurrence: once or at beginning of logging or every map change
     

    3.  Patch Name
    "//PatchName/[PatchName]"
    [PatchName] =  name of the patch, for example "CTF ThunderWalker", "PainKeep", "Expert Quake".
    Log a short and clean name, eg not sfköl 1.3. The patch name comes one to one into the stats. Do not specify sub versions like 1.2, as each new version the parser thinks it is a new patch.
    Occurrence: once or at beginning of logging or every map change
     

    4. Log Date
    "//LogDate/[CurDate]"
    [CurDate] = current date of the computer ("DD.MM.YY")
    Occurrence: once or at beginning of logging or every map change
     

    5. Log Time
    "//LogTime/[CurTime]"
    [CurTime] = current time of the computer (not of the game)  ("HH:MM:SS")
    Occurrence: once or at beginning of logging or every map change
     

    6. Log DeathFlags
    "//LogDeathFlags/[DeathMatchFlags]"
    [DeathMatchFlags] = value of the the deathmatch flags setting of the server
    Occurrence: every map change
     

    7. Map Names
    "//Map/[MapName]"
    [MapName] = long name of the map (not the file name like "base1", but the level name like "Outer Base"
    Occurrence: whenever a new map is started.
    Example: "//Map/Basewalk"
     

    8. Player Names
    "//Player/[PlayerName]/<Team>/[Time]"
    [PlayerName] = the name of the player, but stripped of any chr(9) characters.
    <Team> = the name of team the player is playing on, but stripped of any chr(9) characters.
    [Time] = the time in full seconds since the begining of the map (level) at which this is loged.
    Occurance: After the map name follows the list of all players currently connected to the server.
    In case a patch with teams is played, the team name follows the player name separated "/"=chr(9). If no teams are available only the "/" is printed to the file.
    Example:
    "//Player/Fritz/Red/5"
    "//Player/Thomas/Blue/6"
    "//Player/Rasmus/Red/7"
    No Team Example:
    "//Player/Fritz//5"
    "//Player/Thomas//5"
     

    9. Scores and Frags
    "[Killer]/<Target>/[Type of Score]/<Weapon>/[Score]/[Time]/<Ping>"
    [Killer]  = the name of the player to whom the score is added or subtracted (without chr(9)).
    <Target> = if the score was a frag, empty if there has not been any target (suicides, deaths, CTF, etc).
    [Type of Score] = what caused the score.
    Predetermined values:
    • Kill
    • Suicide
      Other possible values dependend on the patch and scoring system:
    • F. Capture
    • F. Def.
    • F. Return
    • FC Frag
    • TeamScore
    • Assist
    • Heads
    • others types of scores

    This should be the type of score that was made, whatever according to the patch that might be. This is absolutely essential.
    This is besides the [Score] logging the heart of the standard. Here the mod programmer can add whatever he would like to have counted. If this is logged any program can count the occurance of his special scoring categories, be it Heads (like HeadHunters), Flag Captures or for example Gaining Control of the Hill: what ever!
    As there will be no adaptation for these categories on the stats program side, the category will come out in the stats exactly as it is named in the log. Therefor it is advisable to keep the names short and to a maximum of two words: use instead of long descriptions like Capture of the Flag, Flag Capture or F. Capture.
    Any [TypeOfScore] without at least a killer will be ignored.
    <Weapon> = which weapon, if any, was used to score.
    If you are logging non standard weapons then please log the weapon as the pickup name of standard weapons is written = start with capital letter and continue in small letters = Rocket Launcher, Blaster
    The Quake2 Weapons for "Kill" and "Suicide" (whenever applicable) are:
    • Blaster
    • Shotgun
    • Super Shotgun
    • Machinegun
    • Chaingun
    • Grenade Launcher
    • Rocket Launcher
    • Hyperblaster
    • Railgun
    • BFG10K
    • Hand Grenade
    • Telefrag

    For suicides either state the name of the weapon or the cause of the suicide. If you are not sure you can leave the weapon blank:
    • Fell
    • Drowned
    • Slime
    • Lava
    • Squished
    • Spiked
    • other deaths

    [Score] = how many points are added or subtracted from the score of the player.
    Predefined values: Kill = 1, Suicide = -1.
    You can insert here the score for whatever category your patch supports, eg. the score for "President Kill", "Hill Capture", etc.
    [Time] = the time in full seconds since the begining of the map (level) at which the score happen.
    <Ping> = the ping of the Killer. At the moment the ping can still be manipulated very easily. Logging does therefor not make much sense.
    Occurrence: each time a score is added to the score of a player
    Example of a kill:
    Fritz/Thomas/Kill/Rocket Launcher/1/5/165
    Example of suicide:
    Fritz//Suicide/Grenade Launcher/-1/8/178
    Example of Capture of Flag:
    Fritz//Flag Capture//15/17/210
    Example of a team score for team-mates capture:
    Rasmus//TeamScore//10/17/134
    Fritz//TeamScore//10/17/134
    (for each player receiving points one message)
    Example of Head to Altar:
    Fritz//Heads//16/19/350
    Example of Team-mate Kill:
    Fritz/Rasmus/TeamKill/Shotgun/-1/78/69
     

    10. Player disconnected / left the game
    "//PlayerLeft/[PlayerName]//[Time]" = whenever a player leaves the game.
    Occurrence: each time a player leaves the game.
     

    11. Start Counting Frags
    "//GameStart///[Time]" = for mods like clan mods, were the game starts at a certain point and only frags after this moment should be counted.
    Occurrence: once in a map, when the scoring starts.
     

    12. Stop Counting Frags
    "//GameEnd///[Time]"= as before just indicating the end of the game.
    Occurrence: once in a map, when the scoring stops.
     

    13. Player Connecting
    "//PlayerConnect/[PlayerName]/<Team>/[Time]" = whenever a player joins a game which has already started.
    Occurrence: each time a player enters a running game.
     

    14. Player Changes Team
    "//PlayerTeamChange/[PlayerName]/[Team]/[Time]" = whenever a player changes team in a running game.
    Occurrence: each time a player changes teams.
     

    15. Player Changes Name
    "//PlayerRename/[OldPlayerName]/[NewPlayerName]/[Time]"
    [OldPlayerName] = the player whos name is changed.
    [NewPlayerName] = the new name of the player.
    Occurrence: each time a player changes name.
     

    16. Further additions to Logging Standard
    Further enhancements and additions are possible. The format published here is the base of this standard. Any furthr addition will be compatible with this standard. Therefor you can implement this standard into your patch, which already enables any log parser to extract a huge amount of information. If you want to follow later enhancements is up to you. Your implemntation will stay compatible.
     

    17. Summary
    Here is a summary of all keywords of the Logging Standard:
    • The "[...]" means that an argument has to be logged. The "<...>" means that the argument is optional or only applicable to some patches or messages, like weapons (none for death through falling) or teams.
    • Each Tab has to be seperated by a chr(9).
    • If an entry has to be included in the log it is marked as not optional. If these, not optional, messages are not implemented there will not be any statistics.
    • GibStats: if GibStats processes this bit of information.
    • GSLogMod: if the GSLogMod logs this bit of informtion.

     
Function Tab1 Tab2 Tab3 Tab4 Tab5 Tab6 optional GibStats GSLogMod
LogVers     StdLog [Vers]     no yes yes
Patch     PatchName [PatchName]     no yes no
Date     LogDate [CurDate]     yes no no
Time     LogTime [CurTime]     yes no no
Deathflags     LogDeathFlags [DeathMatchFlags     yes no no
Map Name     Map [MapName]     no yes yes
Player Name     Player [PlayerName] <Team> [Time] no yes yes
Scores [Killer] <Target> [TypeofScore] <Weapon> [Score] [Time] no yes yes
Player Left     PlayerLeft [PlayerName]   [Time] no yes yes
Start Game     GameStart     [Time] no yes yes
GameEnd     GameEnd     [Time] no yes yes
PlayerConnect     PlayerConnect [PlayerName] <Team> [Time] no yes yes
Team Change     PlayerTeamChange [PlayerName] <Team> [Time] yes no no
Rename     PlayerRename [OldPlayerName] [NewPlayerName] [Time] no yes no