• Log InLog In
  • Register
Liquid`
Team Liquid Liquipedia
EDT 08:07
CEST 14:07
KST 21:07
  • Home
  • Forum
  • Calendar
  • Streams
  • Liquipedia
  • Features
  • Store
  • EPT
  • TL+
  • StarCraft 2
  • Brood War
  • Smash
  • Heroes
  • Counter-Strike
  • Overwatch
  • Liquibet
  • Fantasy StarCraft
  • TLPD
  • StarCraft 2
  • Brood War
  • Blogs
Forum Sidebar
Events/Features
News
Featured News
Serral wins HomeStory Cup 2914Serral wins Maestros of the Game 243ByuL, and the Limitations of Standard Play3Team Liquid Map Contest #22: Results and Winners7Code S Season 2 (2026): RO4 and Finals Preview12
Community News
PIG STY FESTIVAL 8.0! (13 - 23 August)7Neeb returns to progaming; rejoins ONSYDE14Weekly Cups (July 20-26): Early returns on 5.0.16b8IntoTheTV X SOOP SC2 League : Weekly & Monthly5Clem: "I don't have that much hope in Blizzard"9
StarCraft 2
General
Balance hotfix patch 5.0.16b (July 16) Neeb returns to progaming; rejoins ONSYDE Clem: "I don't have that much hope in Blizzard" Weekly Cups (July 20-26): Early returns on 5.0.16b Terran or Protoss
Tourneys
PIG STY FESTIVAL 8.0! (13 - 23 August) IntoTheTV X SOOP SC2 League : Weekly & Monthly Crank Gathers Season 4: BW vs SC2 Team League RSL Revival: Season 6 - Qualifiers and Main Event Sparkling Tuna Cup - Weekly Open Tournament
Strategy
[G] Having the right mentality to improve
Custom Maps
Nexus Wars 2021 GUIDE [M] (2) Industrial Park
External Content
Mutation # 536 Railroad Switch The PondCast: SC2 News & Results Mutation # 535 Assembly of Vengeance Mutation # 534 Burning Evacuation
Brood War
General
BW Drama: Terror's Debt Incident + C9 disbanding BGH Auto Balance -> http://bghmmr.eu/ BW General Discussion Making an Online Broodwar Manager Game ASL22 General Discussion
Tourneys
Escore Tournament - Season 3 [Megathread] Daily Proleagues 2v2v2v2 Tournament Small VOD Thread 2.0
Strategy
Fighting Spirit mining rates Odyssey Mineral Stack Saturation Simple Questions, Simple Answers PvT advise for noobs
Other Games
General Games
Nintendo Switch Thread Path of Exile ZeroSpace Early Access is Now Live! Stormgate/Frost Giant Megathread General RTS Discussion Thread
Dota 2
Looking for a Dota Mentor Official 'what is Dota anymore' discussion
League of Legends
[TL LoL EUW IHs] Teemo shall perish TSM pausing esports and CLG Dead
Heroes of the Storm
Heroes of the Storm 2.0
Hearthstone
Deck construction bug
TL Mafia
TL Mafia Community Thread TL Mafia Power Rank NeO.D_StephenKing vs This Guy From 1 Million Dance
Community
General
US Politics Mega-thread Russo-Ukrainian War Thread Artificial Intelligence Thread European Politico-economics QA Mega-thread How to buy a book - shipping from Korea to Europe
Fan Clubs
The IdrA Fan Club The HerO Fan Club!
Media & Entertainment
Anime Discussion Thread Movie Discussion! Series you have seen recently... [Req][Books] Good Fantasy/SciFi books
Sports
2024 - 2026 Football Thread 2026-27 Football Thread placeholder TeamLiquid Health and Fitness Initiative For 2023 Formula 1 Discussion MLB/Baseball 2023
World Cup 2022
Tech Support
Computer Build, Upgrade & Buying Resource Thread Simple Questions Simple Answers FPS when play League Of Legend on laptop
TL Community
Northern Ireland Global Starcraft The Automated Ban List
Blogs
What is a Gamer?
TrAiDoS
Hello guys!
LIN1s
ASL S22 English Commentary…
namkraft
Poker (part 2)
Nebuchad
An Exploration of th…
waywardstrategy
Customize Sidebar...

Website Feedback

Closed Threads



Active: 4944 users

s2gs file -- a fun little mystery for us

Forum Index > SC2 General
Post a Reply
1 2 3 4 5 6 7 Next All
dsjoerg
Profile Joined January 2012
United States384 Posts
April 20 2012 21:00 GMT
#1
hi TL nerds,

a lot of people have been asking over the years if we could figure out a way to get Spending Quotient and other interesting stats about our matches. there is an interesting file that i believe contains all the stats that are shown in the Summary Screen after a game completes.

it's the s2gs file. You can trigger arbitrary *.s2gs files to be downloaded to your machine by viewing game summaries in the SC2 client. In SC2, go to your Match History, then click on one of the magnifying glasses. That will trigger a new s2gs file to be downloaded to your machine.

On my Mac, they're in paths like this:
/Users/Shared/Blizzard/Battle.net/Cache/69/61/6961b3a6c6c294dbff91a786d60fddea962e70b01a040a5c7a096987896a2e0e.s2gs


On PCs I'm told they are here:
C:\ProgramData\Blizzard Entertainment\Battle.net\Cache


The easiest way to find a s2gs file is to look at some match summary screen in the game client, then go to the directory and sort by date modified.

If we all put our heads together, I bet we can figure out the format.

A fellow SC2 nerd, Nick, was able to get this far:

#!/usr/bin/env python

import zlib

data = open("test.s2gs","rb").read()

print zlib.decompress(data[16:])


Some of you may wonder about what Blizzard's reaction to this project will be. I hope that Blizzard will have the same reaction that they've had to the community's study of the structure of the MPQ and the replay format -- essentially none. Of course, if Blizzard prefers that this project not move forward, I for one will cease immediately.

I'm not sure what's the best way to structure our findings -- I guess people can post what they discover in this thread, and once that becomes unwieldy, someone can set up a wiki or public Google docs page to hold the findings. Or a github project.

You might be asking, what's the point of being able to parse s2gs files? Basically every tool that does anything useful with replays could parse s2gs as well, and all the info that is visible in the end-of-game summary screen could be merged with the replay info. For example, computing Spending Quotient would be trivial. There are about 30 other cool things would be immediately quite doable.
card-carrying grubby fan. developer of GGTracker.
Kralic
Profile Blog Joined March 2010
Canada2628 Posts
April 20 2012 21:04 GMT
#2
I am not sure what to say... so I will say good luck decrypting the encrypted file.
Brood War forever!
Monokeros
Profile Blog Joined November 2005
United States2493 Posts
April 20 2012 21:04 GMT
#3
This would be all kinds of amazing seeing this kind of information more power to you sir.
Keep the Dream Alive twitch.tv/monokerros
TelecoM
Profile Blog Joined January 2010
United States10808 Posts
April 20 2012 21:07 GMT
#4
Sounds interesting but I don't even understand what you are saying to be honest, hope it works out for you.
AKA: TelecoM[WHITE] Protoss fighting
spancho
Profile Joined September 2009
United States161 Posts
April 20 2012 21:15 GMT
#5
On April 21 2012 06:04 Kralic wrote:
I am not sure what to say... so I will say good luck decrypting the encrypted file.


I dont think its encrypted, just compressed. This seams like a cool project, but I cant think of anything you can get from the summery that you couldnt get from the replay file. Just easier parsing perhaps?
"Your face can't hurt 'cuz you're ugly." -Tasteless
dsjoerg
Profile Joined January 2012
United States384 Posts
April 20 2012 21:19 GMT
#6
spancho, the summary has a lot of things you can't get from the replay, for example:
* average unspent resources
* resource collection rate
* number of workers created
* first 64 things built by each player

each of these can be estimated from the replay, but in many cases the estimation will be off, sometimes by a lot.

the replay file contains build commands that fail due to lack of resources, and there's no way to tell which these are without recreating the whole game engine. unspent resources also cannot be calculated without essentially rebuilding the game engine.

also the replay file doesnt tell you when workers are killed. when my workers die it can change my resource collection rate a lot
card-carrying grubby fan. developer of GGTracker.
InfCereal
Profile Joined December 2011
Canada1759 Posts
April 20 2012 21:21 GMT
#7
On April 21 2012 06:15 spancho wrote:
Show nested quote +
On April 21 2012 06:04 Kralic wrote:
I am not sure what to say... so I will say good luck decrypting the encrypted file.


I dont think its encrypted, just compressed. This seams like a cool project, but I cant think of anything you can get from the summery that you couldnt get from the replay file. Just easier parsing perhaps?


It would be a way to get spending quotient without relying on a sketchy text recognition script.
Cereal
netherh
Profile Blog Joined November 2011
United Kingdom333 Posts
Last Edited: 2012-04-21 13:07:00
April 21 2012 13:05 GMT
#8
Would you care to upload a decompressed version of an s2gs file?

I keep getting an "input string does not conform to zlib format" when trying to do this myself...

Edit: nvm, got it working now.
Prillan
Profile Joined August 2011
Sweden350 Posts
April 21 2012 13:19 GMT
#9
This is really interesting. I've found some things and will continue trying to understand it. I will "publish" my findings here: (Wiki)User:Prillan/s2gs
TheBB's sidekick, aligulac.com | "Reality is frequently inaccurate." - Douglas Adams
zyce
Profile Blog Joined March 2011
United States649 Posts
Last Edited: 2012-04-21 13:32:46
April 21 2012 13:30 GMT
#10
I'm not sure this file has complete data, I'm only seeing reference points (game speed, difficulty, players) and no game data such as resources/workers.

It would be nice to chat with some others who are working with this data. I'm in #teamliquid on IRC.

Edit(s): zlib 1.2.5 being used instead of 1.2.6.
Beauty is not the goal of competitive sports, but high-level sports are a prime venue for the expression of human beauty. The relation is roughly that of courage to war.
zyce
Profile Blog Joined March 2011
United States649 Posts
April 21 2012 14:20 GMT
#11
After some further discussion, I believe this might be a red herring. A file containing reference points needed to parse the relevant packets coming from Battle.net, which are consumed by the replay scoreboard to populate variables.

Beauty is not the goal of competitive sports, but high-level sports are a prime venue for the expression of human beauty. The relation is roughly that of courage to war.
RobiTL
Profile Joined July 2010
France55 Posts
April 21 2012 17:05 GMT
#12
I added some things to your liquipedia page (including the 2 lines required in PHP to read and decompress the file)
Born to be Zerg
dsjoerg
Profile Joined January 2012
United States384 Posts
April 21 2012 21:30 GMT
#13
I believe the s2gs file is actually the concatenation of a few different logical files.
card-carrying grubby fan. developer of GGTracker.
RobiTL
Profile Joined July 2010
France55 Posts
Last Edited: 2012-04-22 00:54:05
April 22 2012 00:23 GMT
#14
Ok I'm 100% sure there is all the data that we want :D

Values as stored as the double !

0x28 => 40 => 20
0x50 => 80 => 40
0xF001 => 240+0 =>120
0x9802 => 152+1*128 => 280
0xc002 => 192+1*128 => 320
0x9003 => 144+2*128 => 400
0xe003 => 224+2*128 => 480
General rule : YY1 YY2 gives (YY1 + (YY2 - 1) * 128) / 2



Graph data is like this :
02 04 00 04 09 [XX] 05 06 00 09 [YY1 YY2 YY3 ...]
XX is X coordinates 00,02,04, ...,3C
YY is Y coordinate as stated above.

average unspent resource is preceded by 05040009ce0f02090802001e00
Ressource collection rate is preceded by 05040009ce0f02090a02001e00

05040009ce0f02090a02001e00 ==> ressource collection rate
0205060009 f018 02040004099a1300 => player 1's = f018
0205060009 ba1e 02040004099a1300 => player2's = ba1e
0000 3's
0000 4's
0000 5's
0000 6's
0000 7's
0000 8's
0000 9's
0000 10's
0000 11's
0000 12's
0000 13's
0000 14's
00 end
Born to be Zerg
RobiTL
Profile Joined July 2010
France55 Posts
Last Edited: 2012-04-22 02:52:53
April 22 2012 02:15 GMT
#15
Ok I just wrote a PHP script that reads all the score values, which leaves build order and graph data to do !
Here is an output example :

+ Show Spoiler +

Array
(
[Player0] => Array
(
[Resources] => 28425
[Units] => 32725
[Structures] => 6100
[Overview] => 69300
[Average Unspent Resources] => 797
[Resource Collection Rate] => 1592
[Workers Created] => 70
[Units Trained] => 132
[Killed Unit Count] => 87
[Structures Built] => 63
[Structures Razed Count] => 0
[Spending Quotient] => 82.506486242342
)
[Player1] => Array
(
[Resources] => 31012
[Units] => 56625
[Structures] => 7000
[Overview] => 98487
[Average Unspent Resources] => 1495
[Resource Collection Rate] => 1949
[Workers Created] => 112
[Units Trained] => 252
[Killed Unit Count] => 85
[Structures Built] => 32
[Structures Razed Count] => 11
[Spending Quotient] => 77.608697996132
)
)


And here is the PHP script :
+ Show Spoiler +

<?php
$c = bin2hex(gzuncompress(file_get_contents($_GET['file'].'.s2gs', false, null, 16)));
$desc = array('Resources','Units','Structures','Overview','Average Unspent Resources','Resource Collection Rate','Workers Created','Units Trained','Killed Unit Count','Structures Built','Structures Razed Count');
for ($i = 0; $i < sizeof($desc); $i++)
{
$bleh = str_pad(base_convert($i * 2, 10, 16), 2, '0', STR_PAD_LEFT);
$search = '09ce0f0209'.$bleh.'02001e00';
$pos = strpos($c, $search) + strlen($search);
$found = 0;
for ($p = 0; $p <= 14; $pos += 2)
{
$hex = substr($c, $pos, 2);
if ($hex == '02')
{
$found = 1;
$after = strpos($c, '020400', $pos);
$value = substr($c, $pos + 10, $after - $pos - 10);
$v = 0;
for ($x = 0; $x*2 < strlen($value); $x++)
{
$dec = base_convert(substr($value, $x*2, 2),16,10);
if ($x == 0) $inc = $dec;
if ($x == 1) $inc = ($dec-1)*128;
if ($x == 2) $inc = ($dec-1)*16384;
$v += $inc;
}
$v = $v / 2;
$players['Player'.$p][$desc[$i]] = $v;
$pos = $after;
}
if ($hex == '00')
{
if ($found == 1) $found = 0;
else $p++;
}
}
}
foreach($players as $k => $v)
{
$i = $players[$k]['Resource Collection Rate'];
$u = $players[$k]['Average Unspent Resources'];
$players[$k]['Spending Quotient'] = 35*(0.00137*$i-log($u))+240;
}
echo '<pre>';
print_r($players);
echo '</pre>';
?>
Born to be Zerg
dsjoerg
Profile Joined January 2012
United States384 Posts
April 22 2012 02:20 GMT
#16
holy moly!
card-carrying grubby fan. developer of GGTracker.
BrothersCommunityTV
Profile Joined August 2011
Belgium13 Posts
April 22 2012 02:42 GMT
#17
Great job everyone
Torpedo.Vegas
Profile Blog Joined January 2011
United States1890 Posts
Last Edited: 2012-04-22 02:45:22
April 22 2012 02:44 GMT
#18
Now do it with all the files in SC2, find me more goodies!

P.S. Can and admin rename the SC2 forum "The Goodie Room" for few hours or so? lol
RobiTL
Profile Joined July 2010
France55 Posts
April 22 2012 02:53 GMT
#19
I just added the spending quotient to my script, edited on my previous post.
Born to be Zerg
zylog
Profile Joined August 2010
Canada943 Posts
April 22 2012 03:00 GMT
#20
This is awesome. I wonder if this can somehow be integrated into sc2gears to add additional information for replay analyses.
1 2 3 4 5 6 7 Next All
Please log in or register to reply.
Live Events Refresh
CrankTV Team League
11:00
Crank Gathers S4: Playoffs
LiquipediaDiscussion
Escore
10:00
Season 3 Week 5
escodisco2159
LiquipediaDiscussion
[ Submit Event ]
Live Streams
Refresh
StarCraft 2
SortOf 251
ProTech60
StarCraft: Brood War
Britney 43667
Calm 8600
Horang2 3731
Jaedong 898
Shuttle 707
firebathero 648
Mini 269
BeSt 257
Zeus 228
EffOrt 226
[ Show more ]
Larva 175
Stork 169
Rush 151
Snow 141
Mong 116
Mind 105
ZerO 101
Soma 91
Tasteless 59
Sharp 57
Pusan 53
Sexy 46
ToSsGirL 41
hero 39
JulyZerg 29
scan(afreeca) 26
ZergMaN 17
Barracks 16
Sacsri 15
sSak 12
sorry 11
Noble 6
actioN 0
Dota 2
Gorgc6411
qojqva423
XcaliburYe75
Counter-Strike
kRYSTAL_24
Other Games
gofns13721
B2W.Neo774
Lowko436
XBOCT341
Fuzer 247
crisheroes223
DeMusliM168
Liquid`LucifroN162
Pyrionflax151
hiko68
Mew2King52
ZerO(Twitch)16
Mlord1
Organizations
StarCraft 2
Blizzard YouTube
StarCraft: Brood War
BSLTrovo
[ Show 14 non-featured ]
StarCraft 2
• mYiSmile16
• AfreecaTV YouTube
• intothetv
• Kozan
• IndyKCrew
• LaughNgamezSOOP
• Migwel
• sooper7s
StarCraft: Brood War
• BSLYoutube
• STPLYoutube
• ZZZeroYoutube
Dota 2
• WagamamaTV404
League of Legends
• Jankos1340
• TFBlade467
Upcoming Events
Big Brain Bouts
3h 53m
Spirit vs sOs
GgMaChine vs Percival
Serral vs MaxPax
OSC
10h 23m
Replay Cast
11h 53m
Afreeca Starleague
15h 53m
RSL Revival
20h 53m
ByuN vs SHIN
Solar vs Lambo
WardiTV Summer Champion…
22h 53m
Afreeca Starleague
1d 15h
RSL Revival
1d 20h
Clem vs Serral
herO vs Rogue
WardiTV Summer Champion…
1d 23h
WardiTV Weekly
2 days
[ Show More ]
Sparkling Tuna Cup
3 days
PiGosaur Cup
4 days
Replay Cast
4 days
Kung Fu Cup
4 days
Replay Cast
5 days
The PondCast
5 days
Replay Cast
6 days
IntoTheTV X SOOP
6 days
Liquipedia Results

Completed

Proleague 2026-07-30
SCTL 2026 Spring
Eternal Conflict S2 Finale

Ongoing

CSL 2026 Summer (S21)
KCM Race Survival 2026 Season 3
Escore Tournament S3: W5
RSL Revival: Season 6
CranK Gathers Season 4: BW vs SC2 Team League
BLAST Bounty Summer 2026
BLAST Bounty Summer Qual
Stake Ranked Episode 3
XSE Pro League 2026
IEM Cologne Major 2026
Stake Ranked Episode 2
CS Asia Championships 2026

Upcoming

ASL Season 22: Qualifier #1
ASL Season 22: Qualifier #2
K-JUNGMAN
Acropolis #5
Escore Tournament S3: W6
Escore Tournament S3: W7
Escore Tournament S3: W8
HSC XXX
SC4ALL II: StarCraft II
Kung Fu Cup 2026 Grand Finals
PiG Sty Festival 8.0
Light Tournament 2026
ESL Pro League Season 24
Stake Ranked Episode 4
Logitech G Connect 2026
SL StarSeries Fall 2026
FISSURE Playground #5
BLAST Open Fall 2026
Esports World Cup 2026
TLPD

1. ByuN
2. TY
3. Dark
4. Solar
5. Stats
6. Nerchio
7. sOs
8. soO
9. INnoVation
10. Elazer
1. Rain
2. Flash
3. EffOrt
4. Last
5. Bisu
6. Soulkey
7. Mini
8. Sharp
Sidebar Settings...

Advertising | Privacy Policy | Terms Of Use | Contact Us

Original banner artwork: Jim Warren
The contents of this webpage are copyright © 2026 TLnet. All Rights Reserved.