Last active
May 29, 2020 06:30
-
-
Save angadsingh/5d0041f9e5f5445c04b953a909cee930 to your computer and use it in GitHub Desktop.
Red Alert 2 Yuri's Revenge stats.dmp parser
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "gameReport": { | |
| "raw": { | |
| "MYID": 1, | |
| "ACCO": 0, | |
| "DATE": null, | |
| "VERS": "V1.001", | |
| "SPED": 0, | |
| "SPID": 0, | |
| "PNGR": 0, | |
| "PNGS": 0, | |
| "HASH": "", | |
| "BASE": true, | |
| "MODE": 0, | |
| "TRNY": 0, | |
| "GSKU": 10497, | |
| "IDNO": 28522 | |
| }, | |
| "fps": 59, | |
| "local_time": "Thu, 28 May 2020 02:03:26 +0530", | |
| "epoch_time": 1590611606, | |
| "players_in_game": 2, | |
| "map": "[2] Sahara Mirage LE v2.09", | |
| "starting_units": 10, | |
| "ai_players": 0, | |
| "crates": false, | |
| "build_off_ally_conyards": true, | |
| "mcv_redeploy": true, | |
| "superweapons": false, | |
| "short_game": true, | |
| "starting_credits": 100000, | |
| "duration": 599, | |
| "finished": true, | |
| "reconnection_error": false | |
| }, | |
| "playerStats": { | |
| "1": { | |
| "name": "hellbender", | |
| "raw": { | |
| "VID": 4294967295, | |
| "MEM": 4294967295, | |
| "CPS": 4294967295, | |
| "CPT": 4294967295, | |
| "HRV": 0, | |
| "CTY": 2, | |
| "COL": 15, | |
| "TID": 1, | |
| "CID": 0, | |
| "IPA": 4294967295 | |
| }, | |
| "detailed_counts": { | |
| "buildings_captured": { | |
| "CAAIRP": 1 | |
| }, | |
| "units_killed": { | |
| "APOC": 24, | |
| "HTNK": 27, | |
| "MTNK": 1, | |
| "HTK": 30 | |
| }, | |
| "infantry_killed": { | |
| "E2": 3, | |
| "DESO": 4, | |
| "FLAKT": 28 | |
| }, | |
| "buildings_lost": { | |
| "GAPOWR": 5, | |
| "GAREFN": 1, | |
| "GACNST": 1, | |
| "GAPILE": 1, | |
| "GATECH": 1, | |
| "GAWEAP": 6, | |
| "GASPYSAT": 1, | |
| "GTGCAN": 1, | |
| "CAAIRP": 1, | |
| "GAAIRC": 1 | |
| }, | |
| "units_lost": { | |
| "MTNK": 5, | |
| "CMIN": 10, | |
| "SREF": 48 | |
| }, | |
| "infantry_lost": { | |
| "E1": 37 | |
| }, | |
| "buildings_bought": { | |
| "GAPOWR": 5, | |
| "GAREFN": 1, | |
| "GACNST": 1, | |
| "GAPILE": 1, | |
| "GATECH": 2, | |
| "GAWEAP": 7, | |
| "GASPYSAT": 1, | |
| "GTGCAN": 1, | |
| "GAAIRC": 1 | |
| }, | |
| "planes_bought": { | |
| "PDPLANE": 5 | |
| }, | |
| "units_bought": { | |
| "AMCV": 1, | |
| "MTNK": 13, | |
| "CMIN": 11, | |
| "SREF": 83 | |
| }, | |
| "infantry_bought": { | |
| "E1": 37, | |
| "ENGINEER": 1 | |
| } | |
| }, | |
| "buildings_captured": 1, | |
| "units_killed": 82, | |
| "infantry_killed": 35, | |
| "buildings_lost": 19, | |
| "units_lost": 63, | |
| "infantry_lost": 37, | |
| "buildings_bought": 20, | |
| "planes_bought": 5, | |
| "units_bought": 108, | |
| "infantry_bought": 38, | |
| "funds_left": 7332, | |
| "disconnected": false, | |
| "no_completion": false, | |
| "quit": false, | |
| "won": true, | |
| "draw": false, | |
| "defeated": false, | |
| "side": "America" | |
| }, | |
| "0": { | |
| "name": "BKL", | |
| "raw": { | |
| "VID": 16777216, | |
| "MEM": 2147483647, | |
| "CPS": 2807, | |
| "CPT": 6, | |
| "HRV": 0, | |
| "CTY": 6, | |
| "COL": 21, | |
| "TID": 0, | |
| "CID": 0, | |
| "IPA": 16777216 | |
| }, | |
| "detailed_counts": { | |
| "units_killed": { | |
| "MTNK": 5, | |
| "SREF": 32 | |
| }, | |
| "infantry_killed": { | |
| "FLAKT": 1 | |
| }, | |
| "buildings_lost": { | |
| "NAPOWR": 4, | |
| "NATECH": 1, | |
| "NAHAND": 1, | |
| "NARADR": 1, | |
| "NAWEAP": 8, | |
| "NAREFN": 1, | |
| "NACNST": 1, | |
| "NABNKR": 3 | |
| }, | |
| "units_lost": { | |
| "HARV": 4 | |
| }, | |
| "infantry_lost": { | |
| "E2": 9, | |
| "DESO": 1, | |
| "FLAKT": 1 | |
| }, | |
| "buildings_bought": { | |
| "NAPOWR": 4, | |
| "NATECH": 1, | |
| "NAHAND": 1, | |
| "NARADR": 1, | |
| "NAWEAP": 8, | |
| "NAREFN": 1, | |
| "NACNST": 1, | |
| "NABNKR": 3 | |
| }, | |
| "planes_bought": { | |
| "SPYP": 2 | |
| }, | |
| "units_bought": { | |
| "HARV": 4, | |
| "APOC": 25, | |
| "HTNK": 27, | |
| "HTK": 30, | |
| "SMCV": 1 | |
| }, | |
| "infantry_bought": { | |
| "E2": 12, | |
| "DESO": 5, | |
| "FLAKT": 30 | |
| } | |
| }, | |
| "units_killed": 37, | |
| "infantry_killed": 1, | |
| "buildings_lost": 20, | |
| "units_lost": 4, | |
| "infantry_lost": 11, | |
| "buildings_bought": 20, | |
| "planes_bought": 2, | |
| "units_bought": 87, | |
| "infantry_bought": 47, | |
| "funds_left": 1, | |
| "disconnected": false, | |
| "no_completion": false, | |
| "quit": true, | |
| "won": false, | |
| "draw": false, | |
| "defeated": true, | |
| "side": "America" | |
| } | |
| }, | |
| "gameResult": "COMPLETION_QUIT" | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "VID1": { | |
| "tag": "VID1", | |
| "length": 4, | |
| "raw": "", | |
| "value": 4294967295 | |
| }, | |
| "MEM1": { | |
| "tag": "MEM1", | |
| "length": 4, | |
| "raw": "", | |
| "value": 4294967295 | |
| }, | |
| "CPS1": { | |
| "tag": "CPS1", | |
| "length": 4, | |
| "raw": "", | |
| "value": 4294967295 | |
| }, | |
| "CPT1": { | |
| "tag": "CPT1", | |
| "length": 4, | |
| "raw": "", | |
| "value": 4294967295 | |
| }, | |
| "HRV1": { | |
| "tag": "HRV1", | |
| "length": 4, | |
| "raw": "", | |
| "value": 0 | |
| }, | |
| "BLC1": { | |
| "tag": "BLC1", | |
| "length": 284, | |
| "raw": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE=", | |
| "value": null, | |
| "counts": { | |
| "CAAIRP": 1 | |
| } | |
| }, | |
| "UNK1": { | |
| "tag": "UNK1", | |
| "length": 72, | |
| "raw": "AAAAAAAAAAAAAAAYAAAAGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAe", | |
| "value": null, | |
| "counts": { | |
| "APOC": 24, | |
| "HTNK": 27, | |
| "MTNK": 1, | |
| "HTK": 30 | |
| } | |
| }, | |
| "INK1": { | |
| "tag": "INK1", | |
| "length": 104, | |
| "raw": "AAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABw=", | |
| "value": null, | |
| "counts": { | |
| "E2": 3, | |
| "DESO": 4, | |
| "FLAKT": 28 | |
| } | |
| }, | |
| "BLL1": { | |
| "tag": "BLL1", | |
| "length": 424, | |
| "raw": "AAAABQAAAAEAAAABAAAAAQAAAAAAAAAAAAAAAQAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQ==", | |
| "value": null, | |
| "counts": { | |
| "GAPOWR": 5, | |
| "GAREFN": 1, | |
| "GACNST": 1, | |
| "GAPILE": 1, | |
| "GATECH": 1, | |
| "GAWEAP": 6, | |
| "GASPYSAT": 1, | |
| "GTGCAN": 1, | |
| "CAAIRP": 1, | |
| "GAAIRC": 1 | |
| } | |
| }, | |
| "UNL1": { | |
| "tag": "UNL1", | |
| "length": 140, | |
| "raw": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAADA=", | |
| "value": null, | |
| "counts": { | |
| "MTNK": 5, | |
| "CMIN": 10, | |
| "SREF": 48 | |
| } | |
| }, | |
| "INL1": { | |
| "tag": "INL1", | |
| "length": 4, | |
| "raw": "AAAAJQ==", | |
| "value": null, | |
| "counts": { | |
| "E1": 37 | |
| } | |
| }, | |
| "BLB1": { | |
| "tag": "BLB1", | |
| "length": 424, | |
| "raw": "AAAABQAAAAEAAAABAAAAAQAAAAAAAAAAAAAAAgAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQ==", | |
| "value": null, | |
| "counts": { | |
| "GAPOWR": 5, | |
| "GAREFN": 1, | |
| "GACNST": 1, | |
| "GAPILE": 1, | |
| "GATECH": 2, | |
| "GAWEAP": 7, | |
| "GASPYSAT": 1, | |
| "GTGCAN": 1, | |
| "GAAIRC": 1 | |
| } | |
| }, | |
| "PLB1": { | |
| "tag": "PLB1", | |
| "length": 28, | |
| "raw": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQ==", | |
| "value": null, | |
| "counts": { | |
| "PDPLANE": 5 | |
| } | |
| }, | |
| "UNB1": { | |
| "tag": "UNB1", | |
| "length": 140, | |
| "raw": "AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAFM=", | |
| "value": null, | |
| "counts": { | |
| "AMCV": 1, | |
| "MTNK": 13, | |
| "CMIN": 11, | |
| "SREF": 83 | |
| } | |
| }, | |
| "INB1": { | |
| "tag": "INB1", | |
| "length": 16, | |
| "raw": "AAAAJQAAAAAAAAAAAAAAAQ==", | |
| "value": null, | |
| "counts": { | |
| "E1": 37, | |
| "ENGINEER": 1 | |
| } | |
| }, | |
| "CRD1": { | |
| "tag": "CRD1", | |
| "length": 4, | |
| "raw": "", | |
| "value": 7332 | |
| }, | |
| "CTY1": { | |
| "tag": "CTY1", | |
| "length": 4, | |
| "raw": "", | |
| "value": 2 | |
| }, | |
| "COL1": { | |
| "tag": "COL1", | |
| "length": 4, | |
| "raw": "", | |
| "value": 15 | |
| }, | |
| "LCN1": { | |
| "tag": "LCN1", | |
| "length": 1, | |
| "raw": "", | |
| "value": false | |
| }, | |
| "CMP1": { | |
| "tag": "CMP1", | |
| "length": 4, | |
| "raw": "", | |
| "value": 256 | |
| }, | |
| "TID1": { | |
| "tag": "TID1", | |
| "length": 4, | |
| "raw": "", | |
| "value": 1 | |
| }, | |
| "SID1": { | |
| "tag": "SID1", | |
| "length": 4, | |
| "raw": "", | |
| "value": 0 | |
| }, | |
| "CID1": { | |
| "tag": "CID1", | |
| "length": 4, | |
| "raw": "", | |
| "value": 0 | |
| }, | |
| "IPA1": { | |
| "tag": "IPA1", | |
| "length": 4, | |
| "raw": "", | |
| "value": 4294967295 | |
| }, | |
| "NAM1": { | |
| "tag": "NAM1", | |
| "length": 11, | |
| "raw": "", | |
| "value": "hellbender" | |
| }, | |
| "MYID": { | |
| "tag": "MYID", | |
| "length": 4, | |
| "raw": "", | |
| "value": 1 | |
| }, | |
| "VID0": { | |
| "tag": "VID0", | |
| "length": 4, | |
| "raw": "", | |
| "value": 16777216 | |
| }, | |
| "MEM0": { | |
| "tag": "MEM0", | |
| "length": 4, | |
| "raw": "", | |
| "value": 2147483647 | |
| }, | |
| "CPS0": { | |
| "tag": "CPS0", | |
| "length": 4, | |
| "raw": "", | |
| "value": 2807 | |
| }, | |
| "CPT0": { | |
| "tag": "CPT0", | |
| "length": 4, | |
| "raw": "", | |
| "value": 6 | |
| }, | |
| "HRV0": { | |
| "tag": "HRV0", | |
| "length": 4, | |
| "raw": "", | |
| "value": 0 | |
| }, | |
| "UNK0": { | |
| "tag": "UNK0", | |
| "length": 140, | |
| "raw": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACA=", | |
| "value": null, | |
| "counts": { | |
| "MTNK": 5, | |
| "SREF": 32 | |
| } | |
| }, | |
| "INK0": { | |
| "tag": "INK0", | |
| "length": 104, | |
| "raw": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE=", | |
| "value": null, | |
| "counts": { | |
| "FLAKT": 1 | |
| } | |
| }, | |
| "BLL0": { | |
| "tag": "BLL0", | |
| "length": 1440, | |
| "raw": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAEAAAABAAAAAAAAAAEAAAAIAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD", | |
| "value": null, | |
| "counts": { | |
| "NAPOWR": 4, | |
| "NATECH": 1, | |
| "NAHAND": 1, | |
| "NARADR": 1, | |
| "NAWEAP": 8, | |
| "NAREFN": 1, | |
| "NACNST": 1, | |
| "NABNKR": 3 | |
| } | |
| }, | |
| "UNL0": { | |
| "tag": "UNL0", | |
| "length": 8, | |
| "raw": "AAAAAAAAAAQ=", | |
| "value": null, | |
| "counts": { | |
| "HARV": 4 | |
| } | |
| }, | |
| "INL0": { | |
| "tag": "INL0", | |
| "length": 104, | |
| "raw": "AAAAAAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE=", | |
| "value": null, | |
| "counts": { | |
| "E2": 9, | |
| "DESO": 1, | |
| "FLAKT": 1 | |
| } | |
| }, | |
| "BLB0": { | |
| "tag": "BLB0", | |
| "length": 1440, | |
| "raw": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAEAAAABAAAAAAAAAAEAAAAIAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD", | |
| "value": null, | |
| "counts": { | |
| "NAPOWR": 4, | |
| "NATECH": 1, | |
| "NAHAND": 1, | |
| "NARADR": 1, | |
| "NAWEAP": 8, | |
| "NAREFN": 1, | |
| "NACNST": 1, | |
| "NABNKR": 3 | |
| } | |
| }, | |
| "PLB0": { | |
| "tag": "PLB0", | |
| "length": 44, | |
| "raw": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI=", | |
| "value": null, | |
| "counts": { | |
| "SPYP": 2 | |
| } | |
| }, | |
| "UNB0": { | |
| "tag": "UNB0", | |
| "length": 108, | |
| "raw": "AAAAAAAAAAQAAAAZAAAAGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB", | |
| "value": null, | |
| "counts": { | |
| "HARV": 4, | |
| "APOC": 25, | |
| "HTNK": 27, | |
| "HTK": 30, | |
| "SMCV": 1 | |
| } | |
| }, | |
| "INB0": { | |
| "tag": "INB0", | |
| "length": 104, | |
| "raw": "AAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4=", | |
| "value": null, | |
| "counts": { | |
| "E2": 12, | |
| "DESO": 5, | |
| "FLAKT": 30 | |
| } | |
| }, | |
| "CRD0": { | |
| "tag": "CRD0", | |
| "length": 4, | |
| "raw": "", | |
| "value": 1 | |
| }, | |
| "CTY0": { | |
| "tag": "CTY0", | |
| "length": 4, | |
| "raw": "", | |
| "value": 6 | |
| }, | |
| "COL0": { | |
| "tag": "COL0", | |
| "length": 4, | |
| "raw": "", | |
| "value": 21 | |
| }, | |
| "LCN0": { | |
| "tag": "LCN0", | |
| "length": 1, | |
| "raw": "", | |
| "value": false | |
| }, | |
| "CMP0": { | |
| "tag": "CMP0", | |
| "length": 4, | |
| "raw": "", | |
| "value": 528 | |
| }, | |
| "TID0": { | |
| "tag": "TID0", | |
| "length": 4, | |
| "raw": "", | |
| "value": 0 | |
| }, | |
| "SID0": { | |
| "tag": "SID0", | |
| "length": 4, | |
| "raw": "", | |
| "value": 1 | |
| }, | |
| "CID0": { | |
| "tag": "CID0", | |
| "length": 4, | |
| "raw": "", | |
| "value": 0 | |
| }, | |
| "IPA0": { | |
| "tag": "IPA0", | |
| "length": 4, | |
| "raw": "", | |
| "value": 16777216 | |
| }, | |
| "NAM0": { | |
| "tag": "NAM0", | |
| "length": 4, | |
| "raw": "", | |
| "value": "BKL" | |
| }, | |
| "ACCO": { | |
| "tag": "ACCO", | |
| "length": 4, | |
| "raw": "", | |
| "value": 0 | |
| }, | |
| "DATE": { | |
| "tag": "DATE", | |
| "length": 8, | |
| "raw": "9hZ5AAHWKYc=", | |
| "value": null | |
| }, | |
| "VERS": { | |
| "tag": "VERS", | |
| "length": 7, | |
| "raw": "", | |
| "value": "V1.001" | |
| }, | |
| "SPED": { | |
| "tag": "SPED", | |
| "length": 4, | |
| "raw": "", | |
| "value": 0 | |
| }, | |
| "AFPS": { | |
| "tag": "AFPS", | |
| "length": 4, | |
| "raw": "", | |
| "value": 59 | |
| }, | |
| "TIME": { | |
| "tag": "TIME", | |
| "length": 4, | |
| "raw": "", | |
| "value": 1590611606 | |
| }, | |
| "SPID": { | |
| "tag": "SPID", | |
| "length": 4, | |
| "raw": "", | |
| "value": 0 | |
| }, | |
| "PLRS": { | |
| "tag": "PLRS", | |
| "length": 4, | |
| "raw": "", | |
| "value": 2 | |
| }, | |
| "PNGR": { | |
| "tag": "PNGR", | |
| "length": 4, | |
| "raw": "", | |
| "value": 0 | |
| }, | |
| "PNGS": { | |
| "tag": "PNGS", | |
| "length": 4, | |
| "raw": "", | |
| "value": 0 | |
| }, | |
| "HASH": { | |
| "tag": "HASH", | |
| "length": 1, | |
| "raw": "", | |
| "value": "" | |
| }, | |
| "SCEN": { | |
| "tag": "SCEN", | |
| "length": 27, | |
| "raw": "", | |
| "value": "[2] Sahara Mirage LE v2.09" | |
| }, | |
| "UNIT": { | |
| "tag": "UNIT", | |
| "length": 4, | |
| "raw": "", | |
| "value": 10 | |
| }, | |
| "AIPL": { | |
| "tag": "AIPL", | |
| "length": 4, | |
| "raw": "", | |
| "value": 0 | |
| }, | |
| "CRAT": { | |
| "tag": "CRAT", | |
| "length": 4, | |
| "raw": "", | |
| "value": 0 | |
| }, | |
| "BASE": { | |
| "tag": "BASE", | |
| "length": 1, | |
| "raw": "", | |
| "value": true | |
| }, | |
| "BAMR": { | |
| "tag": "BAMR", | |
| "length": 4, | |
| "raw": "", | |
| "value": 3 | |
| }, | |
| "MODE": { | |
| "tag": "MODE", | |
| "length": 4, | |
| "raw": "", | |
| "value": 0 | |
| }, | |
| "SUPR": { | |
| "tag": "SUPR", | |
| "length": 4, | |
| "raw": "", | |
| "value": 0 | |
| }, | |
| "SHRT": { | |
| "tag": "SHRT", | |
| "length": 4, | |
| "raw": "", | |
| "value": 1 | |
| }, | |
| "CRED": { | |
| "tag": "CRED", | |
| "length": 4, | |
| "raw": "", | |
| "value": 100000 | |
| }, | |
| "DURA": { | |
| "tag": "DURA", | |
| "length": 4, | |
| "raw": "", | |
| "value": 599 | |
| }, | |
| "FINI": { | |
| "tag": "FINI", | |
| "length": 1, | |
| "raw": "", | |
| "value": true | |
| }, | |
| "OOSY": { | |
| "tag": "OOSY", | |
| "length": 1, | |
| "raw": "", | |
| "value": false | |
| }, | |
| "TRNY": { | |
| "tag": "TRNY", | |
| "length": 4, | |
| "raw": "", | |
| "value": 0 | |
| }, | |
| "GSKU": { | |
| "tag": "GSKU", | |
| "length": 4, | |
| "raw": "", | |
| "value": 10497 | |
| }, | |
| "IDNO": { | |
| "tag": "IDNO", | |
| "length": 4, | |
| "raw": "", | |
| "value": 28522 | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| when_changed "C:\Program Files (x86)\Origin Games\Command and Conquer Red Alert II\stats.dmp" "C:\Users\Angad Singh\Downloads\php-7.4.6-nts-Win32-vc15-x64\php.exe" statparser.php | |
| #get when_changed from https://github.com/benblamey/when_changed |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?php | |
| class GameResult | |
| { | |
| const COMPLETION_BIT1 = 1; //C&C95 for bit 1 prints "C&C95 - Completion status is player 2 resigned.\n" | |
| const COMPLETION_DISCONNECTED = 2; //Lost Connection To or Kicked/Autokicked CONFIRMED// for bit 2 C&C95 prints "C&C95 - Completion status is player 1 disconnected.\n" | |
| const COMPLETION_BIT4 = 4; | |
| const COMPLETION_NO_COMPLETION = 8; //Player didn't see game completion// //<CCHyper> 0x8 is i think when the player didn't see the end of the game Needs checking | |
| const COMPLETION_QUIT = 16; //Player Resigned/Quit it seems, Hitting Quit ingame sets this CONFIRMED /////Seems to be set when a player was specifically kicked via the Kick button instead of waiting for timeout | |
| const COMPLETION_BIT32 = 32; | |
| const COMPLETION_DRAW = 64; //CONFIRMED for Red Alert, unknown for TS/YR | |
| const COMPLETION_BIT128 = 128; | |
| const COMPLETION_WON = 256; //CONFIRMED | |
| const COMPLETION_DEFEATED = 512; //CONFIRMED | |
| const COMPLETION_BIT1024 = 1024; | |
| const COMPLETION_BIT2048 = 2048; | |
| const COMPLETION_BIT4096 = 4096; | |
| const COMPLETION_BIT8192 = 8192; | |
| const COMPLETION_BIT16384 = 16384; | |
| const COMPLETION_BIT32768 = 32768; | |
| } | |
| $CountableHeaps = [ | |
| "UNB" => "Units Bought", | |
| "INB" => "Infantry Bought", | |
| "PLB" => "Planes Bought", | |
| "VSB" => "Ships Built", | |
| "BLB" => "Buildings Bought", | |
| "UNK" => "Units Killed", | |
| "INK" => "Infantry Killed", | |
| "PLK" => "Planes Killed", | |
| "VSK" => "Ships Killed", | |
| "BLK" => "Buildings Killed", | |
| "BLC" => "Buildings Captured", | |
| "UNL" => "Units Lost", | |
| "INL" => "Infantry Lost", | |
| "PLL" => "Planes Lost", | |
| "BLL" => "Buildings Lost", | |
| "VSL" => "Ships Lost", | |
| "CRA" => "Crates Found" | |
| ]; | |
| $Types = [ | |
| "CR" => | |
| [ | |
| "Armor", | |
| "Firepower", | |
| "HealBase", | |
| "Money", | |
| "Reveal", | |
| "Speed", | |
| "Veteran", | |
| "Unit", | |
| "Invulnerability", | |
| "IonStorm", | |
| "Gas", | |
| "Tiberium", | |
| "Pod", | |
| "Cloak", | |
| "Darkness", | |
| "Explosion", | |
| "ICBM", | |
| "Napalm", | |
| "Squad" | |
| ], | |
| "IN" => [ | |
| "E1", | |
| "E2", | |
| "SHK", | |
| "ENGINEER", | |
| "JUMPJET", | |
| "GHOST", | |
| "YURI", | |
| "IVAN", | |
| "DESO", | |
| "DOG", | |
| "CIV1", | |
| "CIV2", | |
| "CIV3", | |
| "CTECH", | |
| "WEEDGUY", | |
| "CLEG", | |
| "SPY", | |
| "CCOMAND", | |
| "PTROOP", | |
| "CIVAN", | |
| "YURIPR", | |
| "SNIPE", | |
| "COW", | |
| "ALL", | |
| "TANY", | |
| "FLAKT", | |
| "TERROR", | |
| "SENGINEER", | |
| "ADOG", | |
| "VLADIMIR", | |
| "PENTGEN", | |
| "PRES", | |
| "SSRV", | |
| "CIVA", | |
| "CIVB", | |
| "CIVC", | |
| "CIVBBP", | |
| "CIVBFM", | |
| "CIVBF", | |
| "CIVBTM", | |
| "CIVSFM", | |
| "CIVSF", | |
| "CIVSTM", | |
| "POLARB", | |
| "JOSH", | |
| "YENGINEER", | |
| "GGI", | |
| "INIT", | |
| "BORIS", | |
| "BRUTE", | |
| "VIRUS", | |
| "CLNT", | |
| "ARND", | |
| "STLN", | |
| "CAML", | |
| "EINS", | |
| "MUMY", | |
| "RMNV", | |
| "LUNR", | |
| "DNOA", | |
| "DNOB", | |
| "SLAV", | |
| "WWLF", | |
| "YDOG", | |
| "YADOG", | |
| ], | |
| "UN" => | |
| [ | |
| "AMCV", | |
| "HARV", | |
| "APOC", | |
| "HTNK", | |
| "SAPC", | |
| "CAR", | |
| "BUS", | |
| "WINI", | |
| "PICK", | |
| "MTNK", | |
| "HORV", | |
| "TRUCKA", | |
| "TRUCKB", | |
| "CARRIER", | |
| "V3", | |
| "ZEP", | |
| "DRON", | |
| "HTK", | |
| "DEST", | |
| "SUB", | |
| "AEGIS", | |
| "LCRF", | |
| "DRED", | |
| "SHAD", | |
| "SQD", | |
| "DLPH", | |
| "SMCV", | |
| "TNKD", | |
| "HOWI", | |
| "TTNK", | |
| "HIND", | |
| "LTNK", | |
| "CMON", | |
| "CMIN", | |
| "SREF", | |
| "XCOMET", | |
| "HYD", | |
| "MGTK", | |
| "FV", | |
| "DeathDummy", | |
| "VLAD", | |
| "DTRUCK", | |
| "PROPA", | |
| "CONA", | |
| "COP", | |
| "EUROC", | |
| "LIMO", | |
| "STANG", | |
| "SUVB", | |
| "SUVW", | |
| "TAXI", | |
| "PTRUCK", | |
| "CRUISE", | |
| "TUG", | |
| "CDEST", | |
| "YHVR", | |
| "PCV", | |
| "SMIN", | |
| "SMON", | |
| "YCAB", | |
| "YTNK", | |
| "BFRT", | |
| "TELE", | |
| "CAOS", | |
| "DDBX", | |
| "BCAB", | |
| "BSUB", | |
| "SCHP", | |
| "JEEP", | |
| "MIND", | |
| "DISK", | |
| "UTNK", | |
| "ROBO", | |
| "YDUM", | |
| "SCHD", | |
| "DOLY", | |
| "CBLC", | |
| "FTRK", | |
| "AMBU", | |
| "CIVP", | |
| "VISC_LRG", | |
| "VISC_SML" | |
| ], | |
| "PL" => [ | |
| "APACHE", | |
| "ORCA", | |
| "HORNET", | |
| "V3ROCKET", | |
| "ASW", | |
| "DMISL", | |
| "PDPLANE", | |
| "BEAG", | |
| "CARGOPLANE", | |
| "BPLN", | |
| "SPYP", | |
| "CMISL", | |
| ], | |
| "BL" => [ | |
| "GAPOWR", | |
| "GAREFN", //Ore Refinery | |
| "GACNST", | |
| "GAPILE", //Barracks | |
| "GASAND", | |
| "GADEPT", //War factory | |
| "GATECH", | |
| "GAWEAP", //Service depot | |
| "CALAB", | |
| "NAPOWR", | |
| "NATECH", | |
| "NAHAND", | |
| "GAWALL", | |
| "NARADR", | |
| "NAWEAP", | |
| "NAREFN", | |
| "NAWALL", | |
| "CAHSE07", | |
| "NAPSIS", | |
| "CASYDN01", | |
| "NALASR", | |
| "NASAM", | |
| "CASYDN02", | |
| "GAYARD", | |
| "NAIRON", | |
| "NACNST", | |
| "NADEPT", | |
| "GACSPH", | |
| "GADUMY", | |
| "GAWEAT", | |
| "CABHUT", | |
| "GALITE", | |
| "REDLAMP", | |
| "GRENLAMP", | |
| "BLUELAMP", | |
| "YELWLAMP", | |
| "PURPLAMP", | |
| "INORANLAMP", | |
| "INGRNLMP", | |
| "INREDLMP", | |
| "INBLULMP", | |
| "CITY01", | |
| "CITY02", | |
| "CITY03", | |
| "CITY04", | |
| "CITY05", | |
| "CITY06", | |
| "CAHOSP", | |
| "INGALITE", | |
| "INYELWLAMP", | |
| "INPURPLAMP", | |
| "NEGLAMP", | |
| "NEGRED", | |
| "TESLA", | |
| "NAMISL", | |
| "ATESLA", | |
| "CAMACH", | |
| "TSTLAMP", | |
| "CASYDN03", | |
| "AMMOCRAT", | |
| "GAGREEN", | |
| "NAYARD", | |
| "GASPYSAT", | |
| "GAGAP", | |
| "GTGCAN", | |
| "NANRCT", | |
| "GAPILL", | |
| "NAFLAK", | |
| "CAOUTP", | |
| "CATHOSP", | |
| "CAAIRP", | |
| "CAOILD", | |
| "NACLON", | |
| "GAOREP", | |
| "CACITY01", | |
| "CACITY02", | |
| "CACITY03", | |
| "CACITY04", | |
| "CANEWY01", | |
| "CANEWY04", | |
| "CANEWY05", | |
| "CASWST01", | |
| "CATECH01", | |
| "CATEXS01", | |
| "CATEXS02", | |
| "CAWASH01", | |
| "CAFARM01", | |
| "CAFARM02", | |
| "CALIT01E", | |
| "CALIT01N", | |
| "CALIT01S", | |
| "CALIT01W", | |
| "CAMISC01", | |
| "CAMISC02", | |
| "CAMISC03", | |
| "CAMISC04", | |
| "CAPOL01E", | |
| "CAPOL01N", | |
| "CAPOL01S", | |
| "CAPOL01W", | |
| "CASIN01E", | |
| "CASIN01N", | |
| "CASIN01S", | |
| "CASIN01W", | |
| "CAPARS01", | |
| "GAAIRC", | |
| "CAFRMA", | |
| "CAFRMB", | |
| "CAWASH05", | |
| "CAWASH04", | |
| "CAWASH03", | |
| "CAWASH07", | |
| "CAWASH11", | |
| "CAWSH12", | |
| "CAWASH14", | |
| "CAWASH09", | |
| "CAWASH10", | |
| "CAWASH13", | |
| "CAARMY01", | |
| "CAUSFGL", | |
| "CAWASH08", | |
| "CALIT03E", | |
| "CALIT03N", | |
| "CALIT03S", | |
| "CALIT03W", | |
| "CALIT02L", | |
| "CALIT02R", | |
| "CAHSE01", | |
| "CAWT01", | |
| "CATS01", | |
| "CABARN02", | |
| "CAWA2A", | |
| "CAWA2B", | |
| "CAWA2C", | |
| "CAWA2D", | |
| "AMRADR", //power plant | |
| "CAPRS03", | |
| "CAGARD01", | |
| "CARUS01", | |
| "CAMIAM01", | |
| "CATRAN01", | |
| "CAMIAM02", | |
| "CANWY05", | |
| "MAYAN", | |
| "CAEUR1", | |
| "CAEUR2", | |
| "CAEUR04", | |
| "CAMEX01", | |
| "CARUS02A", | |
| "CARUS02B", | |
| "CARUS02C", | |
| "CARUS02D", | |
| "CARUS02E", | |
| "CARUS02F", | |
| "CANEWY06", | |
| "CANEWY07", | |
| "CANEWY08", | |
| "CAPARS02", | |
| "CAPARS08", | |
| "CAPARS09", | |
| "CARUS03", | |
| "CANEWY10", | |
| "CANEWY11", | |
| "CANEWY12", | |
| "CANEWY13", | |
| "CANEWY14", | |
| "CANEWY15", | |
| "CANEWY16", | |
| "CANEWY17", | |
| "CANEWY18", | |
| "CAPARS04", | |
| "CAPARS05", | |
| "CAPARS06", | |
| "CAPARS07", | |
| "CAWASH15", | |
| "CAPARS10", | |
| "CAPARS13", | |
| "CAPARS14", | |
| "CAGAS01", | |
| "CAPARS11", | |
| "CAPARS12", | |
| "CAFARM06", | |
| "CAMIAM04", | |
| "NAPSYB", | |
| "NAPSYA", | |
| "CAIND01", | |
| "CACOLO01", | |
| "CANWY09", | |
| "CANWY22", | |
| "CANWY23", | |
| "CANWY24", | |
| "CANWY25", | |
| "CANWY26", | |
| "CATEXS03", | |
| "CATEXS04", | |
| "CATEXS05", | |
| "CARUS02G", | |
| "CACHIG04", | |
| "CAMIAM03", | |
| "CARUS07", | |
| "CATEXS06", | |
| "CATEXS07", | |
| "CATEXS08", | |
| "CACHIG01", | |
| "CACHIG02", | |
| "CACHIG03", | |
| "CAWASH16", | |
| "CAWASH17", | |
| "CACHIG05", | |
| "CAWASH19", | |
| "CARUS08", | |
| "CARUS09", | |
| "CARUS10", | |
| "CARUS11", | |
| "CANEWY20", | |
| "CANEWY21", | |
| "CARUS04", | |
| "CARUS05", | |
| "CARUS06", | |
| "CAMSC01", | |
| "CAMSC02", | |
| "CAMSC03", | |
| "CAMSC04", | |
| "CAMSC05", | |
| "CAMSC06", | |
| "CAMSC07", | |
| "CAWASH18", | |
| "CAEURO05", | |
| "CAPARK01", | |
| "CAPARK02", | |
| "CAPARK03", | |
| "CAHSE02", | |
| "CAHSE03", | |
| "CAHSE04", | |
| "CASTRT01", | |
| "CASTRT02", | |
| "CASTL01", | |
| "CASTL02", | |
| "CASTL03", | |
| "CASTL04", | |
| "CAHSE05", | |
| "CAHSE06", | |
| "CAMIAM05", | |
| "CAMIAM06", | |
| "CAMIAM07", | |
| "CAFNCB", | |
| "CAFNCW", | |
| "CAMEX02", | |
| "CAMEX03", | |
| "CAMEX04", | |
| "CAMEX05", | |
| "CACHIG06", | |
| "CAMSC08", | |
| "CAMSC09", | |
| "CAARMY02", | |
| "CAARMY03", | |
| "CAARMY04", | |
| "TEMMORLAMP", | |
| "TEMDAYLAMP", | |
| "TEMDUSLAMP", | |
| "TEMNITLAMP", | |
| "SNOMORLAMP", | |
| "SNODAYLAMP", | |
| "SNODUSLAMP", | |
| "SNONITLAMP", | |
| "CAKRMW", | |
| "CARUFGL", | |
| "CAFRFGL", | |
| "CATRAN02", | |
| "CACUFGL", | |
| "CASKFGL", | |
| "CALBFGL", | |
| "CAMIAM08", | |
| "CAMISC05", | |
| "CAMISC06", | |
| "CASTL05A", | |
| "CASTL05B", | |
| "CASTL05C", | |
| "CASTL05D", | |
| "CASTL05E", | |
| "CASTL05F", | |
| "CASTL05G", | |
| "CASTL05H", | |
| "CAMSC10", | |
| "CAGEFGL", | |
| "CAUKFGL", | |
| "CAWASH06", | |
| "CAMSC11", | |
| "CAMSC12", | |
| "CAMSC13", | |
| "CAPOFGL", | |
| "CAMSC12A", | |
| "CAMOV01", | |
| "CAMOV02", | |
| "CABUNK01", | |
| "CABUNK02", | |
| "CAFNCP", | |
| "CASTRT03", | |
| "CASTRT04", | |
| "CASTRT05", | |
| "YACNST", | |
| "YAPOWR", | |
| "YABRCK", | |
| "YAWEAP", | |
| "YAYARD", | |
| "YADEPT", | |
| "YATECH", | |
| "GAFWLL", | |
| "YAGGUN", | |
| "YAPSYT", | |
| "NAINDP", | |
| "YAGRND", | |
| "YAGNTC", | |
| "CASLAB", | |
| "CATIME", | |
| "YAPPET", | |
| "CALOND04", | |
| "CALOND05", | |
| "CALOND06", | |
| "CAMOON01", | |
| "CATRAN03", | |
| "CAEAST01", | |
| "CAEGYP01", | |
| "CAEGYP02", | |
| "CAEGYP03", | |
| "CALA01", | |
| "CALA02", | |
| "CALA03", | |
| "CALA04", | |
| "CALA05", | |
| "CALOND01", | |
| "CALOND02", | |
| "CALOND03", | |
| "CAMORR01", | |
| "CAMORR02", | |
| "CAMORR03", | |
| "CASANF01", | |
| "CASANF02", | |
| "CASANF03", | |
| "CASANF04", | |
| "CASANF05", | |
| "CASEAT01", | |
| "NATBNK", | |
| "GAGATE_A", | |
| "CASANF09", | |
| "CASANF10", | |
| "CASANF11", | |
| "CASANF12", | |
| "CASANF13", | |
| "CASANF14", | |
| "CASANF06", | |
| "CASANF07", | |
| "CASANF08", | |
| "CASEAT02", | |
| "YACOMD", | |
| "YAPPPT", | |
| "GAROBO", | |
| "YAREFN", | |
| "YAROCK", | |
| "NABNKR", | |
| "CASANF15", | |
| "CASANF16", | |
| "CASANF17", | |
| "CASANF18", | |
| "CASIN03E", | |
| "CASIN03S", | |
| "CAURB01", | |
| "CAURB02", | |
| "CAURB03", | |
| "CAPOWR", | |
| "CALA07", | |
| "CAEGYP06", | |
| "CALA08", | |
| "CAEAST02", | |
| "CABARR01", | |
| "CABARR02", | |
| "CAMORR04", | |
| "CAMORR05", | |
| "CALA09", | |
| "CAEGYP04", | |
| "CAEGYP05", | |
| "CALA06", | |
| "CAMORR06", | |
| "CAMORR07", | |
| "CAMORR08", | |
| "CAMORR09", | |
| "CAMORR10", | |
| "CATIME01", | |
| "CATIME02", | |
| "CALA10", | |
| "CALA11", | |
| "CALA12", | |
| "CALA13", | |
| "CAPARK04", | |
| "CAPARK05", | |
| "CAPARK06", | |
| "CALA14", | |
| "CALA15", | |
| "CABUNK03", | |
| "CABUNK04", | |
| "CALUNR01", | |
| "CALUNR02", | |
| ] | |
| ]; | |
| class YRStatParser | |
| { | |
| public function getSide($side) | |
| { | |
| switch($val) | |
| { | |
| case 0: | |
| return "America"; | |
| case 1: | |
| return "Korea"; | |
| case 2: | |
| return "France"; | |
| case 3: | |
| return "Germany"; | |
| case 4: | |
| return "Great Britain"; | |
| case 5: | |
| return "Libya"; | |
| case 6: | |
| return "Iraq"; | |
| case 7: | |
| return "Cuba"; | |
| case 8: | |
| return "Russia"; | |
| case 9: | |
| return "Yuri"; | |
| } | |
| return ""; | |
| } | |
| private function getFieldValue($ttl, $data) | |
| { | |
| $response = ["raw" => null, "val" => null]; | |
| switch ($ttl["type"]) | |
| { | |
| //FIELDTYPE_BYTE | |
| case 1: | |
| $v = unpack("C", $data); | |
| $response["val"] = $v[1]; | |
| break; | |
| //FIELDTYPE_BOOLEAN | |
| case 2: | |
| $v = unpack("C", $data); | |
| if ($v[1] == 0) | |
| { | |
| $response["val"] = false; | |
| break; | |
| } | |
| else | |
| { | |
| $response["val"] = true; | |
| break; | |
| } | |
| //FIELDTYPE_SHORT | |
| case 3: | |
| $v = unpack("n", $data); | |
| $response["val"] = $v[1]; | |
| break; | |
| //FIELDTYPE_UNSIGNED_SHORT | |
| case 4: | |
| $v = unpack("n", $data); | |
| $response["val"] = $v[1]; | |
| break; | |
| //FIELDTYPE_LONG | |
| case 5: | |
| $v = unpack("N", $data); | |
| $response["val"] = $v[1]; | |
| break; | |
| //FIELDTYPE_UNSIGNED_LONG | |
| case 6: | |
| $v = unpack("N", $data); | |
| $response["val"] = $v[1]; | |
| break; | |
| //FIELDTYPE_CHAR | |
| case 7: | |
| $ttl["length"] -= 1; | |
| $v = unpack("a$ttl[length]", $data); | |
| //Make sure we only allow visual ascii characters and replace bad chars with ? | |
| $response["val"] = preg_replace('/[^\x20-\x7e]/', '?', $v[1]); | |
| break; | |
| //FIELDTYPE_CUSTOM_LENGTH | |
| case 20: | |
| $response["val"] = null; | |
| $response["raw"] = substr($data, 0, $ttl["length"]);; | |
| break; | |
| } | |
| return $response; | |
| } | |
| public function processStatsDmp($file) | |
| { | |
| global $CountableHeaps; | |
| global $Types; | |
| if($file == null) | |
| return null; | |
| $fh = fopen($file, "r"); | |
| $data = fread($fh, 4); | |
| if (!$data) { | |
| return "Error"; | |
| } | |
| $pad = 0; | |
| $result = []; | |
| while (!feof($fh)) | |
| { | |
| $data = fread($fh, 8); | |
| if (!$data) | |
| { | |
| break; | |
| } | |
| $ttl = unpack("A4tag/ntype/nlength", $data); | |
| $pad = ($ttl["length"] % 4) ? 4 - ($ttl["length"] % 4) : 0; | |
| if ($ttl["length"] > 0) | |
| { | |
| $data = fread($fh, $ttl["length"]); | |
| if ($pad > 0 ) | |
| { | |
| fread($fh, $pad); | |
| } | |
| $fieldValueArr = $this->getFieldValue($ttl, $data); | |
| $result[$ttl["tag"]] = ["tag" => $ttl["tag"], "length" => $ttl["length"], "raw" => base64_encode($fieldValueArr["raw"]), "value" => $fieldValueArr["val"]]; | |
| } | |
| } | |
| foreach ($CountableHeaps as $type => $name) | |
| { | |
| for ($i = 0; $i < 8; $i++) | |
| { | |
| if (isset($result["$type$i"])) | |
| { | |
| $raw = base64_decode($result["$type$i"]["raw"]); | |
| $length = $result["$type$i"]["length"]; | |
| for ($j = 0, $t = 0; $j < $length; $j += 4, ++$t) | |
| { | |
| $count = unpack("N", substr($raw, $j, 4))[1]; | |
| if ($count > 0) | |
| { | |
| $cat = substr($type, 0, -1); | |
| $result["$type$i"]["counts"][$Types[$cat][$t]] = $count; | |
| } | |
| } | |
| } | |
| } | |
| } | |
| return $result; | |
| } | |
| public function getGameStats($result, $thisPlayerName) | |
| { | |
| global $CountableHeaps; | |
| $playerStats = array(); | |
| $gameResult = null; | |
| $gameReport = []; | |
| $reporter = null; | |
| $cncnetGame = "yr"; | |
| foreach($result as $key => $value) | |
| { | |
| $property = substr($key, 0, -1); | |
| if ($property == "NAM") | |
| { | |
| $id = substr($key, -1); | |
| $playerStats[$id] = []; | |
| $playerStats[$id]["name"] = $value['value']; | |
| if ($thisPlayerName == $playerStats[$id]["name"]) { | |
| $reporter = $playerStats[$id]; | |
| } | |
| } | |
| } | |
| foreach($result as $key => $value) | |
| { | |
| $cid = substr($key, -1); // Current Index | |
| $property = substr($key, 0, -1); // Property without index | |
| if (is_numeric($cid) && $cid >= 0 && $cid < 8) | |
| { | |
| switch($property) | |
| { | |
| case "CMP": | |
| $gameResult = $value["value"]; | |
| $playerStats[$cid]['disconnected'] = | |
| ($gameResult & GameResult::COMPLETION_DISCONNECTED) ? true : false; | |
| $playerStats[$cid]['no_completion'] = | |
| ($gameResult & GameResult::COMPLETION_NO_COMPLETION) ? true : false; | |
| $playerStats[$cid]['quit'] = ($gameResult & GameResult::COMPLETION_QUIT) ? true : false; | |
| $playerStats[$cid]['won'] = ($gameResult & GameResult::COMPLETION_WON) ? true : false; | |
| $playerStats[$cid]['draw'] = ($gameResult & GameResult::COMPLETION_DRAW) ? true : false; | |
| $playerStats[$cid]['defeated'] = | |
| ($gameResult & GameResult::COMPLETION_DEFEATED) ? true : false; | |
| $refl = new \ReflectionClass('GameResult'); | |
| foreach ($refl->getConstants() as $k=>$v){ | |
| if ($gameResult & $v) { | |
| $gameResult = $k; | |
| break; | |
| } | |
| } | |
| break; | |
| case "RSG": | |
| $playerStats[$cid]['quit'] = $value["value"]; | |
| break; | |
| case "DED": | |
| $playerStats[$cid]['defeated'] = $value["value"]; | |
| break; | |
| case "ALY": | |
| // Unsupported ATM. My idea is that local_team_id should be the ID of the lowest ALLY -or-yourself | |
| // For now everyone is on his own team | |
| $playerStats[$cid]['local_team_id'] = $cid; | |
| break; | |
| case "SPC": | |
| $playerStats[$cid]['spectator'] = $value["value"]; | |
| break; | |
| case "LCN": //TS lost connection | |
| case "CON": | |
| $playerStats[$cid]['disconnected'] = $value["value"]; | |
| break; | |
| case "SID": // hack for Red Alert | |
| $playerStats[$cid]['side'] = $this->getSide($value['value']); | |
| break; | |
| case "NAM": | |
| break; | |
| case "CRD": | |
| $playerStats[$cid]['funds_left'] = $value["value"]; | |
| break; | |
| default: | |
| $heap_count_key = strtolower(str_replace(' ', '_', $CountableHeaps[$property])); | |
| if (array_key_exists($property, $CountableHeaps) && array_key_exists("counts", $value)) { | |
| $playerStats[$cid]['detailed_counts'][$heap_count_key] = $value['counts']; | |
| foreach ($value['counts'] as $type => $count) { | |
| if (array_key_exists($heap_count_key, $playerStats[$cid])) { | |
| $playerStats[$cid][$heap_count_key] += $count; | |
| } else { | |
| $playerStats[$cid][$heap_count_key] = $count; | |
| } | |
| } | |
| } else { | |
| $playerStats[$cid]['raw'][$property] = $value['value']; | |
| } | |
| } | |
| } else { | |
| switch($key) | |
| { | |
| case "CMPL": | |
| // Must be RA, not sure what to do though | |
| if ($value["value"] == GameResult::COMPLETION_DRAW) | |
| { | |
| foreach ($playerStats as $playerGR) | |
| { | |
| $playerGR['draw'] = true; | |
| $playerGR['won'] = false; | |
| $playerGR['defeated'] = false; | |
| $playerGR['no_completion'] = false; | |
| } | |
| } | |
| else { | |
| $gameWon = !$reporter['defeated'] && !$reporter['quit']; | |
| foreach ($playerStats as $playerGR) | |
| { | |
| $playerGR['won'] = !$gameWon; | |
| $playerGR['defeated'] = !$playerGR['won']; | |
| $playerGR['no_completion'] = false; | |
| } | |
| $reporter['won'] = $gameWon; | |
| $reporter['no_completion'] = false; | |
| $reporter['defeated'] = !$reporter['won']; | |
| } | |
| break; | |
| case "OOSY": | |
| $gameReport['reconnection_error'] = $value["value"]; | |
| if ($gameReport['reconnection_error']) | |
| { | |
| // If the game recons then the reporter marks himself as winner, admin will sort it out later | |
| foreach ($playerStats as $playerGR) | |
| { | |
| $playerGR['won'] = false; | |
| } | |
| $reporter['won'] = true; | |
| } | |
| break; | |
| case "SDFX": | |
| foreach ($playerStats as $playerGR) | |
| { | |
| $playerGR['disconnected'] = $value["value"]; | |
| } | |
| break; | |
| case "DURA": | |
| $gameReport['duration'] = $value["value"]; | |
| break; | |
| case "AFPS": | |
| $gameReport['fps'] = $value["value"]; | |
| break; | |
| case "QUIT": | |
| if ($reporter !== null && $cncnetGame != "ra") | |
| { | |
| $reporter['quit'] = $value["value"]; | |
| } | |
| $gameReport['finished'] = !$value["value"]; | |
| break; | |
| case "FINI": | |
| $gameReport['finished'] = $value["value"]; | |
| break; | |
| case "TIME": | |
| $gameReport['local_time'] = date('r', $value['value']); | |
| $gameReport['epoch_time'] = $value['value']; | |
| break; | |
| case "SCEN": | |
| $gameReport['map'] = $value['value']; | |
| break; | |
| case "UNIT": | |
| $gameReport['starting_units'] = $value['value']; | |
| break; | |
| case "CRED": | |
| $gameReport['starting_credits'] = $value['value']; | |
| break; | |
| case "SUPR": | |
| $gameReport['superweapons'] = $value['value'] ? true : false; | |
| break; | |
| case "CRAT": | |
| $gameReport['crates'] = $value['value'] ? true : false; | |
| break; | |
| case "PLRS": | |
| $gameReport['players_in_game'] = $value['value']; | |
| break; | |
| case "BAMR": | |
| $gameReport['build_off_ally_conyards'] = $value['value'] & 2 ? true : false; | |
| $gameReport['mcv_redeploy'] = $value['value'] & 1 ? true : false; | |
| break; | |
| case "SHRT": | |
| $gameReport['short_game'] = $value['value'] ? true : false; | |
| break; | |
| case "AIPL": | |
| $gameReport['ai_players'] = $value['value']; | |
| break; | |
| default: | |
| $gameReport['raw'][$key] = $value['value']; | |
| } | |
| } | |
| } | |
| return ['gameReport' => $gameReport, | |
| 'playerStats' => $playerStats, | |
| 'gameResult' => $gameResult]; | |
| } | |
| public function saveToJsonFile($obj, $file) | |
| { | |
| $raw_json = Null; | |
| try | |
| { | |
| $raw_json = json_encode($obj, JSON_PRETTY_PRINT); | |
| } | |
| catch (Exception $e) | |
| { | |
| $raw_json = Null; | |
| } | |
| if ($raw_json == Null) | |
| { | |
| switch (json_last_error()) { | |
| case JSON_ERROR_NONE: | |
| error_log('saveRawStats - No errors'); | |
| break; | |
| case JSON_ERROR_DEPTH: | |
| error_log('saveRawStats - Maximum stack depth exceeded'); | |
| break; | |
| case JSON_ERROR_STATE_MISMATCH: | |
| error_log('saveRawStats - Underflow or the modes mismatch'); | |
| break; | |
| case JSON_ERROR_CTRL_CHAR: | |
| error_log('saveRawStats - Unexpected control character found'); | |
| break; | |
| case JSON_ERROR_SYNTAX: | |
| error_log('saveRawStats - Syntax error, malformed JSON'); | |
| break; | |
| case JSON_ERROR_UTF8: | |
| error_log('saveRawStats - Malformed UTF-8 characters, possibly incorrectly encoded'); | |
| break; | |
| default: | |
| error_log('saveRawStats - Unknown error'); | |
| break; | |
| } | |
| } | |
| file_put_contents($file, $raw_json); | |
| } | |
| } | |
| date_default_timezone_set("Asia/Kolkata"); | |
| $parser = new YRStatParser(); | |
| $rawStats = $parser->processStatsDmp("C:\Program Files (x86)\Origin Games\Command and Conquer Red Alert II\stats.dmp"); | |
| $gameStats = $parser->getGameStats($rawStats, "hellbender"); | |
| $parser->saveToJsonFile($gameStats, "{$gameStats['gameReport']['epoch_time']}_stats_parsed.json"); | |
| $parser->saveToJsonFile($rawStats, "{$gameStats['gameReport']['epoch_time']}_stats_raw.json"); | |
| ?> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment