Fork me on GitHub

What

As with other strategy games that involve building a base, also in C&C Generals ZH, the order the player builds objects is vital to succeed in the game. In order to analyse build sequences we need to parse the replay file format of the game.

Contents

Contents

When

C&C Generals ZH came out in 2003 and I still play it from time to time. I’ve recorded videos of my game play and exported replay files. After playing around with the replay files and doing some statistics on them I could extract most of the information I was interested in.

Note Also have a look at the Replay Parsing Code in OpenSAGE an open-source re-implementation of the game engine behind many Command & Conquer games. The parser in OpenSAGE can parse much more than I’ve found here.

Why

I’ve written some scripts to automatically take screenshots surrounding the mouse cursor and the use image similarity hashes to compare them against known images.

Doing this I can extract build orders, but some clicks are missed and it’s difficult to also get positions of the objects on the game map. It becomes particularly challenging when moving around in the game as the viewing field also changes during game play.

Background

Binary formats

In contrast to human readable formats like comma-separeted (*.csv) files for spreadsheets

ColumnOne;ColumnTwo;ColumnThree;
Value;Value;Value;
Value;Value;Value;

or *.yaml files

table:
  ColumnOne:
    Value
    Value
    Value
  ColumnTwo:
    Value
    Value
    Value
  [..]

Binary is just values one after the other. The structure is known only the the program reading and writing it. There may be Lengths-Fields (i.e. one value can be 20 indicating that another is 20 bytes long) or Conditional-Fields (i.e. a value only appears if another value is set to certain value).

To view such a file commonly hex-representation is used (8 bytes are two hex values). This is what it looks like using ‘:%xdd’ in the vim text editor.


(hex view of a C&C Generals ZH Replay-file)

Parsing Binary in Python

Like most programming languages Python has libraries to read values from binary formats.

In order to retrieve four bytes of an unsigned Integer you can use:

import struct
value = struct.unpack('I', f.read(4))[0]

Where ‘I’ in upper-case indicates “unsigned integer”. The ‘4’ indicates to read 4 bytes.

A sequence of bytes can represent numeric values of various lengths (short, int, long, long long), positive values only (unsigned) or positive and negative values (signed).

Decimal values are usually stored in IEEE-754 format to allow larger value ranges. There powers of 10 are used. For example 2,230,000 is stored as 2.23 x 10^6.

There can also be text as seen the hex-view. Text is just multiple charcaters that together form a ‘string’. They are commonly null-terminated (‘\0’) to indicate the end.


(Python struct format options)

Assumptions

I had some simplifying assumptions to steer me in the right direction.

Replay isn’t encrypted or compressed

As we can see strings of text in the text editor and repeating patterns and, it wouldn’t make much sense to do so, it’s unlikely that the replays are encrypted or even compressed.

Replays consist of sequences of commands

With the replay feature we can export a replay and view it later. Since the file size of the replays are only a couple 100 Kilobytes it is clear that the replay feature relies on resimulating the game as opposed to recording a full video.

This is achieved by issuing the same commands the players issued during game play. Hence there have to be building construction commands in the replays that I can use to find the most efficient build sequences.

Use of packets

Since games can vary in length it is clear that the replay consists of some sort of repeating blocks (packets, chunks, segments…) on after another. These will likely not be of the same length as they can carry different amounts of information.

Packets have type field

With packets in the stream there is likely a “type” field to represent different kinds of information in the packets.

Packets have timestamps

Since, in a typical game, there can be anywhere from a single to thousands of units on the field the number of packets per moment in time has to be variable.

Hence there have to be time stamps in the data. These time stamps are usualy near the beginning of packet.

Byte Alignment

Usually in binary formats the fields are byte-aligned (1 Byte = 8 bits). In compression sometimes that is not the case in order to squeeze out a few bits to recuce the overall file size, but that requires a lot of effort on the developer. It’s safe to assume the values are byte-aligned in most cases.

How

Analysis

With the assumptions we have made we can start reverse engineering the replay file format first by applying statistics.

Finding timestamps

The first step I tool was to look for monotonously increasing numbers.

A game usually runs at 15 to 60 fps, given the typical length of game 30 minutes to a couple of hours, the timestamps are probably 32-bit unsigned integers. Signing them wouldn’t make sense as the game doesn’t play in the past. Using floats wouldn’t make sense due to the loss of accuracy for timestamps.

So we can look for unsigned integers.

with open(replay_file, "rb") as f:
  while f.tell() < os.fstat(f.fileno()).st_size - 4:
    value = struct.unpack("I", f.read(4))[0]
    if 1000 < value < 1000000:
      if len(values) > 0:
        (_, last_value) = values[-1]
        if last_value < value and last_value + 1000 > value:
          values += [(f.tell() - 4, value)]
      else:
          values += [(f.tell() - 4, value)]
    f.seek(f.tell() - 3)
  return values

Tweaking the difference to the last value and plotting the values we get a quite obvious relation.

Looking at the difference of the positions we see that these monotonously increasing values are often 256 bytes appart from one another.

Whether the above is really a timestamp or just a monotonously increasing interger in the packets doesn’t really matter at this point. We’ve found positions in the proximity of packets and that’s what matters.

Finding type fields

Similar to above we can then search for type fields, just guessing they are also unsigned integer.

Here I’m searching for 100 possible integers after the presumed timestamp position.

def find_fields(replay_file, timestamps_positions, type_str):
  results = []
  with open(replay_file, "rb") as f:
    for position in timestamps_positions:
      f.seek(position)
      arr = []
      for i in range(0,100):
        value = struct.unpack(type_str, f.read(4))[0]
        if value > 5 and value < 10000: # assume type field between 5 and 10000
            arr += [value]
      if len(arr) > 0:
        results += [(position, arr)]
  return results

Looking at the frequency we see that the value 1092 appears 4514 times. Interesting.

512 : 8855
1092 : 4514
67 : 3959
575 : 1847
13 : 1763
3391 : 1147

I also found that it appears more or less often comparing different replay files of varying game play lenghth.

The “1092” is likely a packet type, but it appears much too frequent to be a move order, unit creation or build command.

Helper function

I’ve written a small helper function that I use below through-out.

It that takes a list of tuples :

[(fieldName, fieldType, fieldLength), ...]

so I can specify the format as

format1095_1 = [
  ("packetTime", "I", 4),
  ("packetType", "I", 4),

  ("unknown", "HEX", 8),
]

and just iterates over it reading every entry.

By adding/removing field until I get reasonable values we can see, if we can get reasonable output.

Parsing the Header

With some of the type fields values known we can make a reasonable guess about the length of the header. Just read until we read an unsigned integer somewhere in the same range as 1092. The header also contains printable characters.

formatHeader = [
  ("game", "c", 6),   # GENREP

  ("unknown", "HEX", 7),

  ("numTimecodes", "h", 2),
  ("name", "c", 0),             # Last Replay
  ("buildVersion", "c", 0),     # Version 1.7
  ("buildDate", "c", 0),

  ("unknown", "HEX", 2),

  ("version_major", "B", 1),
  ("unknown_0", "B", 1),
  ("version_minor", "B", 1),

  ("unknown", "HEX", 8),
  ("configuration", "c", 0),
  ("unknown", "HEX", 8),
  ("is_30", "B", 1),
  ("unknown", "HEX", 3),

  ("nextPacketTime", "I", 4),
  ("nextPacketType", "I", 4), # e.g. 1092 (see below)
]

We can see a start tag, the replay name, a date that is likely the date the game was built (it came out in 2003) and some details on the map.

Finding coordinates

Float values are commonly used to store coordinates. We expect three in sequence for x,y and z coordinates.

They also have interesting properties:

That makes floats relatively easy so spot in binary files.

def find_float_values(replay_file, positions):
  results = []
  with open(replay_file, "rb") as f:
    for position in positions:
        arr = []
        for i in range(0,50):
          value = float(struct.unpack("f", f.read(4))[0])
          if value > 5 and value < 3000: # reasonable range for a float coordinate (not e.g. e^+30)
              arr += [value]
        if len(arr) > 0:
          results += [(position, arr)]
  return results

I noticed that I was getting a lot of (512.0, coordinate, coordinatate) in my results list.

Just plotting the last two as x and y yields:

For a short and a long game. Looking at that we’ve definitely found game play coordinates.

Find other Packet Types

So 1092 seems to be a packet type. It’s likely that there are other packet types at least in the range of 1092 +/-100. Let’s count how many float values we find near them.

float_count_near_type_field = {}

for type_field in range(1092 - 100, 1092 + 100):
    result = find_float_values_near_type_field(replay_file, type_field)
    float_count_near_type_field[type_field] = len(result)
    if len(result) > 10:
        print(f"{type_field}: {len(result)}, ", end="")
1001: 34, 1003: 32, 1024: 21, 1027: 16, 1037: 22, 1038: 11, 1042: 14,   1047: 143, 1049: 12,
1052: 22, 1070: 11, 1082: 15, 1083: 34, 1084: 12, 1087: 14, 1092: 3640, 1095: 42,  1111: 16,
1137: 13, 1149: 20, 1154: 13, 1156: 14, 1157: 16, 1171: 11, 1173: 19,   1190: 11

Decode Construct Building

So there are 12 occurences of “1049” and “1084” near float values of ranges that could be coordinates.

I happen to know that I’ve build 12 buildings in that particular game. I tried it with multiple replays and building varying types of structures until I was sure. Plotting the coordinates near those packets yields the same pattern of building locations I built in the game.

We’ve established that there are frequent packet types like “1092”, but also “1049” and “1084” that likely have something to do with building construction.

53149, ('packetTime', 'I', 4) = 912
53153, ('packetType', 'I', 4) = 1049
53154, ('unknown_1', 'B', 1) = 2
53156, ('unknown_2', 'H', 2) = 0
53158, ('unknown_3', 'H', 2) = 768
53160, ('unknown_4', 'H', 2) = 256
53162, ('unknown_5', 'H', 2) = 262
53164, ('unknown_6', 'H', 2) = 257
53166, ('buildingType', 'H', 2) = 1261 -- Gla Barracks
53167, ('unknown_', 'B', 1) = 0
53168, ('unknown_', 'B', 1) = 0
53172, ('x', 'f', 4) = 1279.33740234375
53176, ('y', 'f', 4) = 473.4322814941406
53180, ('z', 'f', 4) = 18.75
53184, ('unknown', 'I', 4) = 3222719460
15192, ('nextPacketTime', 'I', 4) = 1290
15196, ('nextPacketType', 'I', 4) = 1049

Decode Timestamp

By creating a video of game play with screen capture, creating two buildings in the game and analysing the replay alongside the video we can compare timeCode in the replay file to that of the video.

56536, ('timeCode', 'I', 4) = 978
56553, ('buildObjectId', 'H', 2) = 1994 -- Nuclear Reactor
video at 0m38s = 38s

178096, ('timeCode', 'I', 4) = 3099
178113, ('buildObjectId', 'H', 2) = 1996 -- Barracks
video at 1m47s = 107s

timecode_diff = 3099 - 978 = 2121
videotime_diff = 107s - 38s = 69s

-> approx 30:1 relation

228805, ('timeCode', 'I', 4) = 3984
228822, ('buildObjectId', 'H', 2) = 1999 -- Bunker
video at 2m18s = 138s

timecode_diff = 3984 - 2121 = 885
videotime_diff = 138s - 69s = 31s

-> approx 30:1 relation

So 30 ticks in the game correspond to 1 second.

Decode Create Unit

Next I wanted to find the packet to resemble create unit. So we build two buildings and inbetween create specific units. Then repeat with a different type of unit.

Eventually I was able to esablish that “1049” is a packet resembling the creation of units and decode a field the resembles the unit type.

164236, ('packetTime', 'I', 4) = 2812 
164240, ('packetType', 'I', 4) = 1047 
164241, ('is_2', 'B', 1) = 2
164242, ('is_0', 'B', 1) = 0
164243, ('is_0', 'B', 1) = 0
164244, ('is_0', 'B', 1) = 0
164245, ('is_1', 'B', 1) = 1
164246, ('is_0', 'B', 1) = 0
164247, ('is_2', 'B', 1) = 2
164248, ('unitType', 'B', 1) = 123 -- Gla Rebel
164249, ('buildingIdUnitWasCreated', 'B', 1) = 5 
164250, ('is_0', 'B', 1) = 0
164251, ('is_0', 'B', 1) = 0
164252, ('incrementingUnitNumber', 'B', 1) = 1 
164253, ('is_0', 'B', 1) = 0
164254, ('is_0', 'B', 1) = 0
164255, ('is_0', 'B', 1) = 0
164259, ('nextPacketTime', 'I', 4) = 2812 
164263, ('nextPackageType', 'I', 4) = 1092 

Decode Move Order

Using the same approach, building two known buildings and doing something inbetween, we can get the move order packets. Observing the number of occurrences of those packets and plotting the result also helps here.

385085, ('packetTime', 'I', 4) = 6702
385089, ('packetType', 'I', 4) = 1068
385090, ('is_2', 'B', 1) = 2
385091, ('is_0', 'B', 1) = 0
385092, ('is_0', 'B', 1) = 0
385093, ('is_0', 'B', 1) = 0
385094, ('is_1', 'B', 1) = 1
385095, ('is_6', 'B', 1) = 6
385096, ('is_1', 'B', 1) = 1
385100, ('x', 'f', 4) = 1174.520751953125
385104, ('y', 'f', 4) = 412.6291809082031
385108, ('z', 'f', 4) = 18.75
385112, ('nextPacketTime', 'I', 4) = 6703
385116, ('nextPacketType', 'I', 4) = 1092

Plotting the coordinates from these packages shows an ‘8’ shape. As I was moving the bulldozer around two bunkers that makes sense.

Complete Decode

With that information we can try to parse a full-replay file.

We’ve established some type fields

the header
1092 - unknown occur very frequently
1049 - create building
1047 - create unit
1068 - move order

and they seem to comprise most of the replay file.

It’s neccessary to skip packets of unknown content. As we haven’t found a packetLength field we’ll have to do this manualy by trying to detect integers in packetTypes range.

By doing this I’ve found additional packetTypes:

formats = {
    "1097" : (format1097, "unknown"),
    "1092" : (format1092, "camera_position"),
    "1095" : (format1095, "repeating"),
    "1003" : (format1003, "related_to_select?"),
    "1001" : (format1001, "select_unit"),
    "1049" : (format1049, "create_building"),
    "1068" : (format1068, "move_order"),
    "1047" : (format1047, "create_unit"),
    "1043" : (format1043, "set_waypoint?"),
    "1066" : (format1066, "unit_enter_structure"),
    "1054" : (format1054, "all_unit_exit_structure"),
    "1060" : (format1060, "attack_order"),
    "1002" : (format1002, "multi_unit_enter?"),
    "1058" : (format1058, "?"),
    "1051" : (format1051, "stop_build"),
    "1052" : (format1052, "sell_building"),
    "1044" : (format1044, "use_experience_points"),
    "1045" : (format1045, "building_upgrade"),
    "1078" : (format1078, "building_feature"),
    "1067" : (format1067, "gather_supplies"),
    "1065" : (format1065, "continue_building"),
    "1053" : (format1065, "single_unit_exit_structure?"),
    "1069" : (format1069, "attack_move"),
    "1074" : (format1074, "unit_stop"),
    "1038" : (format1038, "vehicle_attack"),
    "1042" : (format1042, "capture_building"),
    "1062" : (format1062, "vehicle_to_repair?"),
    "1061" : (format1061, "attack_nothing"),
    "1072" : (format1072, "guard"),
}

The “buildingType” field in “create_building” corresponds to

buildingTypeMap = defaultdict(lambda: "unknown", {
  # China Tank General
  "1994" : "Nuclear Reactor",
  "1996" : "Barracks",
  "1999" : "Bunker",
  "2001" : "Gattling Gun",
  "1995" : "Supply Center",
  "1998" : "War Factory",
  "2002" : "Internet Center",
  "2000" : "Propaghanda Center",
  "2003" : "Command Center",
  "1997" : "Air Field",
  "1992" : "Nuclear Missile",
  
  # Usa Laser General
  "1562" : "Laser Turret",
  "1550" : "Cold Fusion Reactor",
  "1556" : "Barracks",
  "1558" : "Supply Center",
  "1557" : "Fire Base",
  "1549" : "War Factory",
  "1553" : "Air Field",
  "1552" : "Strategy Center",
  "1551" : "Particle Canon",
  "1555" : "Supply Drop Zone", 
  
  # Gla
  "1261" : "Gla Barracks",
  "1256" : "Gla Supply Stash"
})

The “unitType” field in “create_unit” corresponds to

unitTypeMap = defaultdict(lambda: "unknown", {
  "183" : "China Tank Red Guard",
  "251" : "Usa Laser General Ranger",
  "197" : "China Construction Dozer",
  "185" : "China Tank Hunter",
  "125" : "Gla Rpg Trooper",
  "123" : "Gla Rebel",
  "136" : "Gla Worker",
  "127" : "Gla Terrorist",
  "196" : "Supply Truck",
  "188" : "Battlemaster Tank",
  "194" : "Troop Crawler",
  "195" : "Gattling Tank",
  "193" : "Dragon Tank",
  "199" : "Listening Outpost",
  
})

The complete list of formats is:

Show full list
formatHeader = [
  ("game", "c", 6),   # GENREP

  ("unknown", "HEX", 7),

  ("numTimecodes", "h", 2),
  ("name", "c", 0),             # Last Replay
  ("buildVersion", "c", 0),     # Version 1.7
  ("buildDate", "c", 0),

  ("unknown", "HEX", 2),

  ("version_major", "B", 1),
  ("unknown_0", "B", 1),
  ("version_minor", "B", 1),

  ("unknown", "HEX", 8),

  ("configuration", "c", 0),

  ("unknown", "HEX", 8),

  ("is_30", "B", 1),
  
  ("unknown", "HEX", 3),

  ("nextPacketTime", "I", 4),
  ("nextPacketType", "I", 4), # e.g. 1092 (see below)
]

format1097 = [
  ("packetTime", "I", 4),
  ("packetType", "I", 4),
  
  ("unknown", "HEX", 14),

  ("nextPacketTime", "I", 4), # 1097
  ("nextPacketType", "I", 4),
]

format1092 = [
  ("packetTime", "I", 4),
  ("packetType", "I", 4),

  ("is_2", "B", 1),
  ("is_4", "I", 4),

  ("unknown", "I", 4),
  ("unknown", "I", 4),
  ("type1092_x", "f", 4),
  ("type1092_y", "f", 4),
  ("type1092_z", "f", 4),
  
  ("unknown", "HEX", 24),

  ("nextPacketTime", "I", 4), 
  ("nextPacketType", "I", 4), # 1095 or 1092
]

format1095 = [
  ("packetTime", "I", 4),
  ("packetType", "I", 4),

  ("unknown", "HEX", 14),

  ("nextPacketTime", "I", 4),
  ("nextPacketType", "I", 4), # 1097
]

format1097 = [
  ("packetTime", "I", 4),
  ("packetType", "I", 4),

  ("unknown", "HEX", 14),

  ("nextPacketTime", "I", 4),
  ("nextPacketType", "I", 4), # 1092
]

format1003 = [
  ("packetTime", "I", 4),
  ("packetType", "I", 4),

  ("unknown", "HEX", 8),

  ("nextPacketTime", "I", 4),
  ("nextPacketType", "I", 4),
]

format1001 = [
  ("packetTime", "I", 4),
  ("packetType", "I", 4),

  ("unknown", "HEX", 8),
  ("unitCount", "B", 1),
  ("is_1", "B", 1),
  
  ("unitId", "I", 4),
    
  ("nextPacketTime", "I", 4),
  ("nextPacketType", "I", 4),
]

format1047 = [
  ("packetTime", "I", 4),
  ("packetType", "I", 4), # 1047
    
  ("unknown", "HEX", 7),

  ("unitType", "B", 1),
  ("buildingIdUnitWasCreated", "B", 1),

  ("unknown", "HEX", 2),

  ("unitNoFromSameBuilding", "B", 1),
  
  ("unknown", "HEX", 3),

  ("nextPacketTime", "I", 4),
  ("nextPackageType", "I", 4), # 1092
]

format1049 = [
  ("packetTime", "I", 4),
  ("packetType", "I", 4), # 1049

  ("unknown", "HEX", 11),
 
  ("buildingType", "H", 2),
  
  ("unknown", "HEX", 2),
    
  ("x", "f", 4),
  ("y", "f", 4),
  ("z", "f", 4),

  ("unknown", "HEX", 4),
    
  ("nextPacketTime", "I", 4),
  ("nextPacketType", "I", 4),
]

format1068 = [
  ("packetTime", "I", 4),
  ("packetType", "I", 4), # 1049

  ("unknown", "HEX", 7),
  
  ("x", "f", 4),
  ("y", "f", 4),
  ("z", "f", 4),

  ("nextPacketTime", "I", 4),
  ("nextPacketType", "I", 4)
]

format1043 = [
  ("packetTime", "I", 4),
  ("packetType", "I", 4),

  ("unknown", "HEX", 25),

  ("nextPacketTime", "I", 4),
  ("nextPacketType", "I", 4), # 1092
]

format1066 = [
  ("packetTime", "I", 4),
  ("packetType", "I", 4),

  ("unknown", "HEX", 15),
 
  ("nextPacketTime", "I", 4),
  ("nextPacketType", "I", 4), # 1092
]

format1054 = [
  ("packetTime", "I", 4),
  ("packetType", "I", 4),

  ("unknown", "HEX", 5),
  
  ("nextPacketTime", "I", 4),
  ("nextPacketType", "I", 4),
]

format1060 = [
  ("packetTime", "I", 4),
  ("packetType", "I", 4),

  ("unknown", "HEX", 11),

  ("nextPacketTime", "I", 4),
  ("nextPacketType", "I", 4),
]

format1002 = [
  ("packetTime", "I", 4),
  ("packetType", "I", 4),

  ("unknown", "HEX", 8),
  
  ("type1002_length", "B", 1),
   
  ("nextPacketTime", "I", 4),
  ("nextPacketType", "I", 4),
]

format1058 = [
  ("packetTime", "I", 4),
  ("packetType", "I", 4),

  ("unknown", "HEX", 5),
  
  ("type1058_length", "B", 1),
  
  ("nextPacketTime", "I", 4),
  ("nextPacketType", "I", 4),
]

format1051 = [
  ("packetTime", "I", 4),
  ("packetType", "I", 4),

  ("unknown", "HEX", 62),

  ("nextPacketTime", "I", 4),
  ("nextPacketType", "I", 4),
]

format1052 = [
  ("packetTime", "I", 4),
  ("packetType", "I", 4),

  ("unknown", "HEX", 5),

  ("nextPacketTime", "I", 4),
  ("nextPacketType", "I", 4),
]

format1044 = [
  ("packetTime", "I", 4),
  ("packetType", "I", 4),

  ("unknown", "HEX", 11),

  ("nextPacketTime", "I", 4),
  ("nextPacketType", "I", 4),
]

format1045 = [
  ("packetTime", "I", 4),
  ("packetType", "I", 4),
 
  ("unknown", "HEX", 17),
  
  ("nextPacketTime", "I", 4),
  ("nextPacketType", "I", 4),
]

format1078 = [
  ("packetTime", "I", 4),
  ("packetType", "I", 4),

  ("unknown", "B", 1),
  ("unknown", "B", 1),
 
  ("unknown", "HEX", 60),

  ("nextPacketTime", "I", 4),
  ("nextPacketType", "I", 4),
]

format1067 = [
  ("packetTime", "I", 4),
  ("packetType", "I", 4),

  ("unknown", "HEX", 11),

  ("nextPacketTime", "I", 4),
  ("nextPacketType", "I", 4),
]

format1065 = [
  ("packetTime", "I", 4),
  ("packetType", "I", 4),

  ("unknown", "HEX", 11),

  ("nextPacketTime", "I", 4),
  ("nextPacketType", "I", 4),
]

format1053 = [
  ("packetTime", "I", 4),
  ("packetType", "I", 4),

  ("unknown", "HEX", 11),

  ("nextPacketTime", "I", 4),
  ("nextPacketType", "I", 4),
]

format1069 = [
  ("packetTime", "I", 4),
  ("packetType", "I", 4),

  ("unknown", "HEX", 19),

  ("nextPacketTime", "I", 4),
  ("nextPacketType", "I", 4),
]

format1074 = [
  ("packetTime", "I", 4),
  ("packetType", "I", 4),

  ("unknown", "HEX", 5),

  ("nextPacketTime", "I", 4),
  ("nextPacketType", "I", 4),
]

format1038 = [
  ("packetTime", "I", 4),
  ("packetType", "I", 4),

  ("unknown", "B", 1),
    
  ("unknown", "I", 4),
  ("unknown", "I", 4),
  ("unknown", "I", 4),
  ("unknown", "I", 4),
  
  ("x", "f", 4),
  ("y", "f", 4),
  ("z", "f", 4),

  ("unknown", "I", 4),
  ("unknown", "I", 4),

  ("nextPacketTime", "I", 4),
  ("nextPacketType", "I", 4),
]

format1042 = [
  ("packetTime", "I", 4),
  ("packetType", "I", 4),

  ("unknown", "B", 1),

  ("unknown", "I", 4),
  ("unknown", "I", 4),
  ("unknown", "I", 4),
  ("unknown", "I", 4),
  
  ("unknown", "I", 4),
  ("unknown", "I", 4),
  ("unknown", "I", 4),

  ("nextPacketTime", "I", 4),
  ("nextPacketType", "I", 4),
] 

format1062 = [
  ("packetTime", "I", 4),
  ("packetType", "I", 4),

  ("unknown", "B", 1),
  ("unknown", "B", 1),
  ("unknown", "B", 1),
  
  ("unknown", "I", 4),
  ("unknown", "I", 4),

  ("nextPacketTime", "I", 4),
  ("nextPacketType", "I", 4),
] 

format1061 = [
  ("packetTime", "I", 4),
  ("packetType", "I", 4),

  ("unknown", "B", 1),
  ("unknown", "B", 1),
  ("unknown", "B", 1),
  
  ("unknown", "I", 4),
  ("unknown", "I", 4),
  ("unknown", "I", 4),
  ("unknown", "I", 4),
  
  ("nextPacketTime", "I", 4),
  ("nextPacketType", "I", 4),
] 

format1072 = [
  ("packetTime", "I", 4),
  ("packetType", "I", 4),

  ("unknown", "B", 1),
  
  ("unknown", "I", 4),
  ("unknown", "I", 4),
  ("unknown", "I", 4),
  ("unknown", "I", 4),
  
  ("unknown", "I", 4),
  ("unknown", "I", 4),
  
  ("nextPacketTime", "I", 4),
  ("nextPacketType", "I", 4),
] 

but there are likely more.

A full length replay file reads as follows:

Show full log
=== ../../data/2023-11-23 21-38-27-china-moving-around.rep ===
> header
0; 303; nextPacketType; I; 4; 1097; 
0; 299; packetTime; I; 4; 0; 
0; 303; packetType; I; 4; 1097; unknown
0; 317; unknown; HEX; 14; 0000000002000102010000000001; 
0; 321; nextPacketTime; I; 4; 0; 
0; 325; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 1
1; 378; packetTime; I; 4; 1; 
1; 382; packetType; I; 4; 1095; unknown
1; 396; unknown; HEX; 14; 02000000020001020157c7b03600; 
1; 400; nextPacketTime; I; 4; 1; 
1; 404; nextPacketType; I; 4; 1097; 
1; 400; packetTime; I; 4; 1; 
1; 404; packetType; I; 4; 1097; unknown
1; 418; unknown; HEX; 14; 0200000002000102010200000001; 
1; 422; nextPacketTime; I; 4; 1; 
1; 426; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 100
101; 6122; packetTime; I; 4; 101; 
101; 6126; packetType; I; 4; 1095; unknown
101; 6140; unknown; HEX; 14; 020000000200010201f67f5bf300; 
101; 6144; nextPacketTime; I; 4; 101; 
101; 6148; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 73
174; 10305; packetTime; I; 4; 174; 
174; 10309; packetType; I; 4; 1003; unknown
174; 10317; unknown; HEX; 8; 0200000001020101; 
174; 10321; nextPacketTime; I; 4; 174; 
174; 10325; nextPacketType; I; 4; 1001; 
174; 10321; packetTime; I; 4; 174; 
174; 10325; packetType; I; 4; 1001; unknown
174; 10339; unknown; HEX; 14; 02000000020201030101d1000000; 
174; 10343; nextPacketTime; I; 4; 174; 
174; 10347; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 27
201; 11882; packetTime; I; 4; 201; 
201; 11886; packetType; I; 4; 1095; unknown
201; 11900; unknown; HEX; 14; 0200000002000102011eb2544b00; 
201; 11904; nextPacketTime; I; 4; 201; 
201; 11908; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 57
258; 15153; packetTime; I; 4; 258; 
258; 15157; packetType; I; 4; 1049; create_building
258; 15168; unknown; HEX; 11; 0200000003000106010101; 
258; 15170; buildingType; H; 2; 1994; 
258; 15172; unknown; HEX; 2; 0000; 
258; 15176; x; f; 4; 879.3244018554688; 
258; 15180; y; f; 4; 434.00408935546875; 
258; 15184; z; f; 4; 18.75; 
258; 15188; unknown; HEX; 4; db0f49bf; 
258; 15192; nextPacketTime; I; 4; 258; 
258; 15196; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 43
301; 17643; packetTime; I; 4; 301; 
301; 17647; packetType; I; 4; 1095; unknown
301; 17661; unknown; HEX; 14; 020000000200010201b66d21c000; 
301; 17665; nextPacketTime; I; 4; 301; 
301; 17669; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 100
401; 23365; packetTime; I; 4; 401; 
401; 23369; packetType; I; 4; 1095; unknown
401; 23383; unknown; HEX; 14; 0200000002000102015420cf7500; 
401; 23387; nextPacketTime; I; 4; 401; 
401; 23391; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 100
501; 29087; packetTime; I; 4; 501; 
501; 29091; packetType; I; 4; 1095; unknown
501; 29105; unknown; HEX; 14; 02000000020001020175fec37500; 
501; 29109; nextPacketTime; I; 4; 501; 
501; 29113; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 100
601; 34809; packetTime; I; 4; 601; 
601; 34813; packetType; I; 4; 1095; unknown
601; 34827; unknown; HEX; 14; 0200000002000102019a81c66400; 
601; 34831; nextPacketTime; I; 4; 601; 
601; 34835; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 100
701; 40531; packetTime; I; 4; 701; 
701; 40535; packetType; I; 4; 1095; unknown
701; 40549; unknown; HEX; 14; 0200000002000102015d296f2e00; 
701; 40553; nextPacketTime; I; 4; 701; 
701; 40557; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 100
801; 46253; packetTime; I; 4; 801; 
801; 46257; packetType; I; 4; 1095; unknown
801; 46271; unknown; HEX; 14; 02000000020001020158f301db00; 
801; 46275; nextPacketTime; I; 4; 801; 
801; 46279; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 100
901; 51975; packetTime; I; 4; 901; 
901; 51979; packetType; I; 4; 1095; unknown
901; 51993; unknown; HEX; 14; 02000000020001020178efd33500; 
901; 51997; nextPacketTime; I; 4; 901; 
901; 52001; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 100
1001; 57697; packetTime; I; 4; 1001; 
1001; 57701; packetType; I; 4; 1095; unknown
1001; 57715; unknown; HEX; 14; 020000000200010201daed59ce00; 
1001; 57719; nextPacketTime; I; 4; 1001; 
1001; 57723; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 100
1101; 63419; packetTime; I; 4; 1101; 
1101; 63423; packetType; I; 4; 1095; unknown
1101; 63437; unknown; HEX; 14; 020000000200010201dbc287b700; 
1101; 63441; nextPacketTime; I; 4; 1101; 
1101; 63445; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 35
1136; 65436; packetTime; I; 4; 1136; 
1136; 65440; packetType; I; 4; 1049; create_building
1136; 65451; unknown; HEX; 11; 0200000003000106010101; 
1136; 65453; buildingType; H; 2; 1994; 
1136; 65455; unknown; HEX; 2; 0000; 
1136; 65459; x; f; 4; 827.8157958984375; 
1136; 65463; y; f; 4; 503.10394287109375; 
1136; 65467; z; f; 4; 18.75; 
1136; 65471; unknown; HEX; 4; db0f49bf; 
1136; 65475; nextPacketTime; I; 4; 1136; 
1136; 65479; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 65
1201; 69180; packetTime; I; 4; 1201; 
1201; 69184; packetType; I; 4; 1095; unknown
1201; 69198; unknown; HEX; 14; 020000000200010201e040546000; 
1201; 69202; nextPacketTime; I; 4; 1201; 
1201; 69206; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 100
1301; 74902; packetTime; I; 4; 1301; 
1301; 74906; packetType; I; 4; 1095; unknown
1301; 74920; unknown; HEX; 14; 020000000200010201658ae35a00; 
1301; 74924; nextPacketTime; I; 4; 1301; 
1301; 74928; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 100
1401; 80624; packetTime; I; 4; 1401; 
1401; 80628; packetType; I; 4; 1095; unknown
1401; 80642; unknown; HEX; 14; 020000000200010201d9670fa100; 
1401; 80646; nextPacketTime; I; 4; 1401; 
1401; 80650; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 100
1501; 86346; packetTime; I; 4; 1501; 
1501; 86350; packetType; I; 4; 1095; unknown
1501; 86364; unknown; HEX; 14; 0200000002000102013f37eca400; 
1501; 86368; nextPacketTime; I; 4; 1501; 
1501; 86372; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 100
1601; 92068; packetTime; I; 4; 1601; 
1601; 92072; packetType; I; 4; 1095; unknown
1601; 92086; unknown; HEX; 14; 020000000200010201c44f9c2500; 
1601; 92090; nextPacketTime; I; 4; 1601; 
1601; 92094; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 100
1701; 97790; packetTime; I; 4; 1701; 
1701; 97794; packetType; I; 4; 1095; unknown
1701; 97808; unknown; HEX; 14; 02000000020001020152b963d900; 
1701; 97812; nextPacketTime; I; 4; 1701; 
1701; 97816; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 56
1757; 101004; packetTime; I; 4; 1757; 
1757; 101008; packetType; I; 4; 1049; create_building
1757; 101019; unknown; HEX; 11; 0200000003000106010101; 
1757; 101021; buildingType; H; 2; 1994; 
1757; 101023; unknown; HEX; 2; 0000; 
1757; 101027; x; f; 4; 881.4688720703125; 
1757; 101031; y; f; 4; 563.9083251953125; 
1757; 101035; z; f; 4; 18.75; 
1757; 101039; unknown; HEX; 4; db0f49bf; 
1757; 101043; nextPacketTime; I; 4; 1757; 
1757; 101047; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 44
1801; 103551; packetTime; I; 4; 1801; 
1801; 103555; packetType; I; 4; 1095; unknown
1801; 103569; unknown; HEX; 14; 02000000020001020156d3bba000; 
1801; 103573; nextPacketTime; I; 4; 1801; 
1801; 103577; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 100
1901; 109273; packetTime; I; 4; 1901; 
1901; 109277; packetType; I; 4; 1095; unknown
1901; 109291; unknown; HEX; 14; 020000000200010201843ca6e600; 
1901; 109295; nextPacketTime; I; 4; 1901; 
1901; 109299; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 100
2001; 114995; packetTime; I; 4; 2001; 
2001; 114999; packetType; I; 4; 1095; unknown
2001; 115013; unknown; HEX; 14; 0200000002000102014e5fa71800; 
2001; 115017; nextPacketTime; I; 4; 2001; 
2001; 115021; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 100
2101; 120717; packetTime; I; 4; 2101; 
2101; 120721; packetType; I; 4; 1095; unknown
2101; 120735; unknown; HEX; 14; 02000000020001020116fedcdd00; 
2101; 120739; nextPacketTime; I; 4; 2101; 
2101; 120743; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 100
2201; 126439; packetTime; I; 4; 2201; 
2201; 126443; packetType; I; 4; 1095; unknown
2201; 126457; unknown; HEX; 14; 020000000200010201eaa1bd6f00; 
2201; 126461; nextPacketTime; I; 4; 2201; 
2201; 126465; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 100
2301; 132161; packetTime; I; 4; 2301; 
2301; 132165; packetType; I; 4; 1095; unknown
2301; 132179; unknown; HEX; 14; 020000000200010201e4a4647600; 
2301; 132183; nextPacketTime; I; 4; 2301; 
2301; 132187; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 39
2340; 134406; packetTime; I; 4; 2340; 
2340; 134410; packetType; I; 4; 1049; create_building
2340; 134421; unknown; HEX; 11; 0200000003000106010101; 
2340; 134423; buildingType; H; 2; 1994; 
2340; 134425; unknown; HEX; 2; 0000; 
2340; 134429; x; f; 4; 936.6387329101562; 
2340; 134433; y; f; 4; 496.9786682128906; 
2340; 134437; z; f; 4; 18.750030517578125; 
2340; 134441; unknown; HEX; 4; db0f49bf; 
2340; 134445; nextPacketTime; I; 4; 2340; 
2340; 134449; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 61
2401; 137922; packetTime; I; 4; 2401; 
2401; 137926; packetType; I; 4; 1095; unknown
2401; 137940; unknown; HEX; 14; 020000000200010201e5ef0ce200; 
2401; 137944; nextPacketTime; I; 4; 2401; 
2401; 137948; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 100
2501; 143644; packetTime; I; 4; 2501; 
2501; 143648; packetType; I; 4; 1095; unknown
2501; 143662; unknown; HEX; 14; 020000000200010201d728b2ba00; 
2501; 143666; nextPacketTime; I; 4; 2501; 
2501; 143670; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 100
2601; 149366; packetTime; I; 4; 2601; 
2601; 149370; packetType; I; 4; 1095; unknown
2601; 149384; unknown; HEX; 14; 0200000002000102013621aafb00; 
2601; 149388; nextPacketTime; I; 4; 2601; 
2601; 149392; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 100
2701; 155088; packetTime; I; 4; 2701; 
2701; 155092; packetType; I; 4; 1095; unknown
2701; 155106; unknown; HEX; 14; 0200000002000102014ae85e3200; 
2701; 155110; nextPacketTime; I; 4; 2701; 
2701; 155114; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 100
2801; 160810; packetTime; I; 4; 2801; 
2801; 160814; packetType; I; 4; 1095; unknown
2801; 160828; unknown; HEX; 14; 020000000200010201b5599a6300; 
2801; 160832; nextPacketTime; I; 4; 2801; 
2801; 160836; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 30
2831; 162542; packetTime; I; 4; 2831; 
2831; 162546; packetType; I; 4; 1049; create_building
2831; 162557; unknown; HEX; 11; 0200000003000106010101; 
2831; 162559; buildingType; H; 2; 1996; 
2831; 162561; unknown; HEX; 2; 0000; 
2831; 162565; x; f; 4; 985.654541015625; 
2831; 162569; y; f; 4; 611.353271484375; 
2831; 162573; z; f; 4; 18.75; 
2831; 162577; unknown; HEX; 4; e4cb16c0; 
2831; 162581; nextPacketTime; I; 4; 2831; 
2831; 162585; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 70
2901; 166571; packetTime; I; 4; 2901; 
2901; 166575; packetType; I; 4; 1095; unknown
2901; 166589; unknown; HEX; 14; 0200000002000102016a98b70800; 
2901; 166593; nextPacketTime; I; 4; 2901; 
2901; 166597; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 100
3001; 172293; packetTime; I; 4; 3001; 
3001; 172297; packetType; I; 4; 1095; unknown
3001; 172311; unknown; HEX; 14; 0200000002000102013819f9bd00; 
3001; 172315; nextPacketTime; I; 4; 3001; 
3001; 172319; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 100
3101; 178015; packetTime; I; 4; 3101; 
3101; 178019; packetType; I; 4; 1095; unknown
3101; 178033; unknown; HEX; 14; 0200000002000102016322b26400; 
3101; 178037; nextPacketTime; I; 4; 3101; 
3101; 178041; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 100
3201; 183737; packetTime; I; 4; 3201; 
3201; 183741; packetType; I; 4; 1095; unknown
3201; 183755; unknown; HEX; 14; 020000000200010201c6fc1b2300; 
3201; 183759; nextPacketTime; I; 4; 3201; 
3201; 183763; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 100
3301; 189459; packetTime; I; 4; 3301; 
3301; 189463; packetType; I; 4; 1095; unknown
3301; 189477; unknown; HEX; 14; 020000000200010201170480f200; 
3301; 189481; nextPacketTime; I; 4; 3301; 
3301; 189485; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 19
3319; 190564; packetTime; I; 4; 3319; 
3319; 190568; packetType; I; 4; 1068; move_order
3319; 190575; unknown; HEX; 7; 02000000010601; 
3319; 190579; x; f; 4; 1058.4107666015625; 
3319; 190583; y; f; 4; 566.7073974609375; 
3319; 190587; z; f; 4; 18.75; 
3319; 190591; nextPacketTime; I; 4; 3320; 
3319; 190595; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 81
3401; 195208; packetTime; I; 4; 3401; 
3401; 195212; packetType; I; 4; 1095; unknown
3401; 195226; unknown; HEX; 14; 0200000002000102018cf2401000; 
3401; 195230; nextPacketTime; I; 4; 3401; 
3401; 195234; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 20
3420; 196370; packetTime; I; 4; 3420; 
3420; 196374; packetType; I; 4; 1068; move_order
3420; 196381; unknown; HEX; 7; 02000000010601; 
3420; 196385; x; f; 4; 1077.4031982421875; 
3420; 196389; y; f; 4; 589.8775634765625; 
3420; 196393; z; f; 4; 18.75; 
3420; 196397; nextPacketTime; I; 4; 3421; 
3420; 196401; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 44
3464; 198905; packetTime; I; 4; 3464; 
3464; 198909; packetType; I; 4; 1068; move_order
3464; 198916; unknown; HEX; 7; 02000000010601; 
3464; 198920; x; f; 4; 1081.6837158203125; 
3464; 198924; y; f; 4; 538.4765625; 
3464; 198928; z; f; 4; 18.750030517578125; 
3464; 198932; nextPacketTime; I; 4; 3465; 
3464; 198936; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 36
3501; 200984; packetTime; I; 4; 3501; 
3501; 200988; packetType; I; 4; 1095; unknown
3501; 201002; unknown; HEX; 14; 0200000002000102010321c24000; 
3501; 201006; nextPacketTime; I; 4; 3501; 
3501; 201010; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 27
3527; 202545; packetTime; I; 4; 3527; 
3527; 202549; packetType; I; 4; 1068; move_order
3527; 202556; unknown; HEX; 7; 02000000010601; 
3527; 202560; x; f; 4; 1100.65673828125; 
3527; 202564; y; f; 4; 603.249755859375; 
3527; 202568; z; f; 4; 18.75; 
3527; 202572; nextPacketTime; I; 4; 3528; 
3527; 202576; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 73
3601; 206733; packetTime; I; 4; 3601; 
3601; 206737; packetType; I; 4; 1095; unknown
3601; 206751; unknown; HEX; 14; 02000000020001020173a127cf00; 
3601; 206755; nextPacketTime; I; 4; 3601; 
3601; 206759; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 12
3612; 207439; packetTime; I; 4; 3612; 
3612; 207443; packetType; I; 4; 1068; move_order
3612; 207450; unknown; HEX; 7; 02000000010601; 
3612; 207454; x; f; 4; 1100.667724609375; 
3612; 207458; y; f; 4; 522.099365234375; 
3612; 207462; z; f; 4; 18.75; 
3612; 207466; nextPacketTime; I; 4; 3613; 
3612; 207470; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 88
3701; 212482; packetTime; I; 4; 3701; 
3701; 212486; packetType; I; 4; 1095; unknown
3701; 212500; unknown; HEX; 14; 020000000200010201711d2c3500; 
3701; 212504; nextPacketTime; I; 4; 3701; 
3701; 212508; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 6
3706; 212846; packetTime; I; 4; 3706; 
3706; 212850; packetType; I; 4; 1068; move_order
3706; 212857; unknown; HEX; 7; 02000000010601; 
3706; 212861; x; f; 4; 1133.1949462890625; 
3706; 212865; y; f; 4; 604.4608154296875; 
3706; 212869; z; f; 4; 18.75; 
3706; 212873; nextPacketTime; I; 4; 3707; 
3706; 212877; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 94
3801; 218231; packetTime; I; 4; 3801; 
3801; 218235; packetType; I; 4; 1095; unknown
3801; 218249; unknown; HEX; 14; 020000000200010201195f2afd00; 
3801; 218253; nextPacketTime; I; 4; 3801; 
3801; 218257; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 48
3848; 220989; packetTime; I; 4; 3848; 
3848; 220993; packetType; I; 4; 1068; move_order
3848; 221000; unknown; HEX; 7; 02000000010601; 
3848; 221004; x; f; 4; 1114.20458984375; 
3848; 221008; y; f; 4; 506.9040222167969; 
3848; 221012; z; f; 4; 18.75; 
3848; 221016; nextPacketTime; I; 4; 3849; 
3848; 221020; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 52
3901; 223980; packetTime; I; 4; 3901; 
3901; 223984; packetType; I; 4; 1095; unknown
3901; 223998; unknown; HEX; 14; 020000000200010201c752c18700; 
3901; 224002; nextPacketTime; I; 4; 3901; 
3901; 224006; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 100
4001; 229702; packetTime; I; 4; 4001; 
4001; 229706; packetType; I; 4; 1095; unknown
4001; 229720; unknown; HEX; 14; 02000000020001020189d0075600; 
4001; 229724; nextPacketTime; I; 4; 4001; 
4001; 229728; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 22
4022; 230978; packetTime; I; 4; 4022; 
4022; 230982; packetType; I; 4; 1068; move_order
4022; 230989; unknown; HEX; 7; 02000000010601; 
4022; 230993; x; f; 4; 1140.5; 
4022; 230997; y; f; 4; 539.5341796875; 
4022; 231001; z; f; 4; 18.75; 
4022; 231005; nextPacketTime; I; 4; 4023; 
4022; 231009; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 78
4101; 235451; packetTime; I; 4; 4101; 
4101; 235455; packetType; I; 4; 1095; unknown
4101; 235469; unknown; HEX; 14; 020000000200010201f47a721a00; 
4101; 235473; nextPacketTime; I; 4; 4101; 
4101; 235477; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 31
4131; 237240; packetTime; I; 4; 4131; 
4131; 237244; packetType; I; 4; 1068; move_order
4131; 237251; unknown; HEX; 7; 02000000010601; 
4131; 237255; x; f; 4; 1136.5455322265625; 
4131; 237259; y; f; 4; 479.217529296875; 
4131; 237263; z; f; 4; 18.75; 
4131; 237267; nextPacketTime; I; 4; 4132; 
4131; 237271; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 69
4201; 241200; packetTime; I; 4; 4201; 
4201; 241204; packetType; I; 4; 1095; unknown
4201; 241218; unknown; HEX; 14; 020000000200010201a7367cef00; 
4201; 241222; nextPacketTime; I; 4; 4201; 
4201; 241226; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 35
4235; 243217; packetTime; I; 4; 4235; 
4235; 243221; packetType; I; 4; 1068; move_order
4235; 243228; unknown; HEX; 7; 02000000010601; 
4235; 243232; x; f; 4; 1172.026123046875; 
4235; 243236; y; f; 4; 501.6689147949219; 
4235; 243240; z; f; 4; 18.750030517578125; 
4235; 243244; nextPacketTime; I; 4; 4236; 
4235; 243248; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 65
4301; 246949; packetTime; I; 4; 4301; 
4301; 246953; packetType; I; 4; 1095; unknown
4301; 246967; unknown; HEX; 14; 02000000020001020178eb69f900; 
4301; 246971; nextPacketTime; I; 4; 4301; 
4301; 246975; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 29
4329; 248624; packetTime; I; 4; 4329; 
4329; 248628; packetType; I; 4; 1068; move_order
4329; 248635; unknown; HEX; 7; 02000000010601; 
4329; 248639; x; f; 4; 1171.5723876953125; 
4329; 248643; y; f; 4; 452.74993896484375; 
4329; 248647; z; f; 4; 18.750030517578125; 
4329; 248651; nextPacketTime; I; 4; 4330; 
4329; 248655; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 71
4401; 252698; packetTime; I; 4; 4401; 
4401; 252702; packetType; I; 4; 1095; unknown
4401; 252716; unknown; HEX; 14; 0200000002000102016a410c6300; 
4401; 252720; nextPacketTime; I; 4; 4401; 
4401; 252724; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 72
4473; 256824; packetTime; I; 4; 4473; 
4473; 256828; packetType; I; 4; 1049; create_building
4473; 256839; unknown; HEX; 11; 0200000003000106010101; 
4473; 256841; buildingType; H; 2; 1999; 
4473; 256843; unknown; HEX; 2; 0000; 
4473; 256847; x; f; 4; 1204.402099609375; 
4473; 256851; y; f; 4; 444.2294921875; 
4473; 256855; z; f; 4; 18.750030517578125; 
4473; 256859; unknown; HEX; 4; e4cb16c0; 
4473; 256863; nextPacketTime; I; 4; 4473; 
4473; 256867; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 28
4501; 258459; packetTime; I; 4; 4501; 
4501; 258463; packetType; I; 4; 1095; unknown
4501; 258477; unknown; HEX; 14; 020000000200010201dcb4eec400; 
4501; 258481; nextPacketTime; I; 4; 4501; 
4501; 258485; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 100
4601; 264181; packetTime; I; 4; 4601; 
4601; 264185; packetType; I; 4; 1095; unknown
4601; 264199; unknown; HEX; 14; 02000000020001020153d6b52000; 
4601; 264203; nextPacketTime; I; 4; 4601; 
4601; 264207; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 100
4701; 269903; packetTime; I; 4; 4701; 
4701; 269907; packetType; I; 4; 1095; unknown
4701; 269921; unknown; HEX; 14; 020000000200010201046b1dab00; 
4701; 269925; nextPacketTime; I; 4; 4701; 
4701; 269929; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 28
4728; 271521; packetTime; I; 4; 4728; 
4728; 271525; packetType; I; 4; 1068; move_order
4728; 271532; unknown; HEX; 7; 02000000010601; 
4728; 271536; x; f; 4; 1179.9105224609375; 
4728; 271540; y; f; 4; 408.66510009765625; 
4728; 271544; z; f; 4; 18.750030517578125; 
4728; 271548; nextPacketTime; I; 4; 4729; 
4728; 271552; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 72
4801; 275652; packetTime; I; 4; 4801; 
4801; 275656; packetType; I; 4; 1095; unknown
4801; 275670; unknown; HEX; 14; 02000000020001020108c5e81e00; 
4801; 275674; nextPacketTime; I; 4; 4801; 
4801; 275678; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 36
4836; 277726; packetTime; I; 4; 4836; 
4836; 277730; packetType; I; 4; 1068; move_order
4836; 277737; unknown; HEX; 7; 02000000010601; 
4836; 277741; x; f; 4; 1210.1002197265625; 
4836; 277745; y; f; 4; 405.0931396484375; 
4836; 277749; z; f; 4; 18.75; 
4836; 277753; nextPacketTime; I; 4; 4837; 
4836; 277757; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 64
4901; 281401; packetTime; I; 4; 4901; 
4901; 281405; packetType; I; 4; 1095; unknown
4901; 281419; unknown; HEX; 14; 020000000200010201b62d7c6900; 
4901; 281423; nextPacketTime; I; 4; 4901; 
4901; 281427; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 16
4916; 282335; packetTime; I; 4; 4916; 
4916; 282339; packetType; I; 4; 1068; move_order
4916; 282346; unknown; HEX; 7; 02000000010601; 
4916; 282350; x; f; 4; 1235.2591552734375; 
4916; 282354; y; f; 4; 455.221923828125; 
4916; 282358; z; f; 4; 18.75; 
4916; 282362; nextPacketTime; I; 4; 4917; 
4916; 282366; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 71
4987; 286409; packetTime; I; 4; 4987; 
4987; 286413; packetType; I; 4; 1068; move_order
4987; 286420; unknown; HEX; 7; 02000000010601; 
4987; 286424; x; f; 4; 1206.6641845703125; 
4987; 286428; y; f; 4; 492.7896423339844; 
4987; 286432; z; f; 4; 18.75; 
4987; 286436; nextPacketTime; I; 4; 4988; 
4987; 286440; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 13
5001; 287177; packetTime; I; 4; 5001; 
5001; 287181; packetType; I; 4; 1095; unknown
5001; 287195; unknown; HEX; 14; 02000000020001020118c4b29d00; 
5001; 287199; nextPacketTime; I; 4; 5001; 
5001; 287203; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 91
5091; 292386; packetTime; I; 4; 5091; 
5091; 292390; packetType; I; 4; 1068; move_order
5091; 292397; unknown; HEX; 7; 02000000010601; 
5091; 292401; x; f; 4; 1166.9615478515625; 
5091; 292405; y; f; 4; 468.2948303222656; 
5091; 292409; z; f; 4; 18.750030517578125; 
5091; 292413; nextPacketTime; I; 4; 5092; 
5091; 292417; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 9
5101; 292926; packetTime; I; 4; 5101; 
5101; 292930; packetType; I; 4; 1095; unknown
5101; 292944; unknown; HEX; 14; 0200000002000102019e60479e00; 
5101; 292948; nextPacketTime; I; 4; 5101; 
5101; 292952; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 97
5197; 298477; packetTime; I; 4; 5197; 
5197; 298481; packetType; I; 4; 1068; move_order
5197; 298488; unknown; HEX; 7; 02000000010601; 
5197; 298492; x; f; 4; 1171.6199951171875; 
5197; 298496; y; f; 4; 414.0716247558594; 
5197; 298500; z; f; 4; 18.75; 
5197; 298504; nextPacketTime; I; 4; 5198; 
5197; 298508; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 3
5201; 298675; packetTime; I; 4; 5201; 
5201; 298679; packetType; I; 4; 1095; unknown
5201; 298693; unknown; HEX; 14; 020000000200010201add77f2000; 
5201; 298697; nextPacketTime; I; 4; 5201; 
5201; 298701; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 100
5301; 304397; packetTime; I; 4; 5301; 
5301; 304401; packetType; I; 4; 1095; unknown
5301; 304415; unknown; HEX; 14; 020000000200010201f20559b200; 
5301; 304419; nextPacketTime; I; 4; 5301; 
5301; 304423; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 13
5313; 305160; packetTime; I; 4; 5313; 
5313; 305164; packetType; I; 4; 1068; move_order
5313; 305171; unknown; HEX; 7; 02000000010601; 
5313; 305175; x; f; 4; 1221.3785400390625; 
5313; 305179; y; f; 4; 414.43890380859375; 
5313; 305183; z; f; 4; 18.75; 
5313; 305187; nextPacketTime; I; 4; 5314; 
5313; 305191; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 69
5382; 309120; packetTime; I; 4; 5382; 
5382; 309124; packetType; I; 4; 1068; move_order
5382; 309131; unknown; HEX; 7; 02000000010601; 
5382; 309135; x; f; 4; 1243.1805419921875; 
5382; 309139; y; f; 4; 458.0826721191406; 
5382; 309143; z; f; 4; 18.75; 
5382; 309147; nextPacketTime; I; 4; 5383; 
5382; 309151; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 18
5401; 310173; packetTime; I; 4; 5401; 
5401; 310177; packetType; I; 4; 1095; unknown
5401; 310191; unknown; HEX; 14; 020000000200010201a2af65ce00; 
5401; 310195; nextPacketTime; I; 4; 5401; 
5401; 310199; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 48
5448; 312931; packetTime; I; 4; 5448; 
5448; 312935; packetType; I; 4; 1068; move_order
5448; 312942; unknown; HEX; 7; 02000000010601; 
5448; 312946; x; f; 4; 1213.29150390625; 
5448; 312950; y; f; 4; 490.86627197265625; 
5448; 312954; z; f; 4; 18.750030517578125; 
5448; 312958; nextPacketTime; I; 4; 5449; 
5448; 312962; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 52
5501; 315922; packetTime; I; 4; 5501; 
5501; 315926; packetType; I; 4; 1095; unknown
5501; 315940; unknown; HEX; 14; 0200000002000102011063351100; 
5501; 315944; nextPacketTime; I; 4; 5501; 
5501; 315948; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 31
5531; 317711; packetTime; I; 4; 5531; 
5531; 317715; packetType; I; 4; 1068; move_order
5531; 317722; unknown; HEX; 7; 02000000010601; 
5531; 317726; x; f; 4; 1175.124755859375; 
5531; 317730; y; f; 4; 466.09600830078125; 
5531; 317734; z; f; 4; 18.75; 
5531; 317738; nextPacketTime; I; 4; 5532; 
5531; 317742; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 69
5601; 321671; packetTime; I; 4; 5601; 
5601; 321675; packetType; I; 4; 1095; unknown
5601; 321689; unknown; HEX; 14; 020000000200010201f2b336a700; 
5601; 321693; nextPacketTime; I; 4; 5601; 
5601; 321697; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 16
5616; 322605; packetTime; I; 4; 5616; 
5616; 322609; packetType; I; 4; 1068; move_order
5616; 322616; unknown; HEX; 7; 02000000010601; 
5616; 322620; x; f; 4; 1175.591796875; 
5616; 322624; y; f; 4; 416.2645568847656; 
5616; 322628; z; f; 4; 18.75; 
5616; 322632; nextPacketTime; I; 4; 5617; 
5616; 322636; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 84
5701; 327420; packetTime; I; 4; 5701; 
5701; 327424; packetType; I; 4; 1095; unknown
5701; 327438; unknown; HEX; 14; 02000000020001020173622a0600; 
5701; 327442; nextPacketTime; I; 4; 5701; 
5701; 327446; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 19
5720; 328525; packetTime; I; 4; 5720; 
5720; 328529; packetType; I; 4; 1049; create_building
5720; 328540; unknown; HEX; 11; 0200000003000106010101; 
5720; 328542; buildingType; H; 2; 1999; 
5720; 328544; unknown; HEX; 2; 0000; 
5720; 328548; x; f; 4; 1140.25244140625; 
5720; 328552; y; f; 4; 351.80487060546875; 
5720; 328556; z; f; 4; 18.750030517578125; 
5720; 328560; unknown; HEX; 4; e4cb16c0; 
5720; 328564; nextPacketTime; I; 4; 5720; 
5720; 328568; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 81
5801; 333181; packetTime; I; 4; 5801; 
5801; 333185; packetType; I; 4; 1095; unknown
5801; 333199; unknown; HEX; 14; 020000000200010201c2c4037600; 
5801; 333203; nextPacketTime; I; 4; 5801; 
5801; 333207; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 100
5901; 338903; packetTime; I; 4; 5901; 
5901; 338907; packetType; I; 4; 1095; unknown
5901; 338921; unknown; HEX; 14; 020000000200010201cae6ce4400; 
5901; 338925; nextPacketTime; I; 4; 5901; 
5901; 338929; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 67
5967; 342744; packetTime; I; 4; 5967; 
5967; 342748; packetType; I; 4; 1068; move_order
5967; 342755; unknown; HEX; 7; 02000000010601; 
5967; 342759; x; f; 4; 1115.7027587890625; 
5967; 342763; y; f; 4; 379.3682861328125; 
5967; 342767; z; f; 4; 18.75; 
5967; 342771; nextPacketTime; I; 4; 5968; 
5967; 342775; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 33
6001; 344652; packetTime; I; 4; 6001; 
6001; 344656; packetType; I; 4; 1095; unknown
6001; 344670; unknown; HEX; 14; 0200000002000102016602d79800; 
6001; 344674; nextPacketTime; I; 4; 6001; 
6001; 344678; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 67
6067; 348493; packetTime; I; 4; 6067; 
6067; 348497; packetType; I; 4; 1068; move_order
6067; 348504; unknown; HEX; 7; 02000000010601; 
6067; 348508; x; f; 4; 1109.6578369140625; 
6067; 348512; y; f; 4; 357.1688232421875; 
6067; 348516; z; f; 4; 18.75; 
6067; 348520; nextPacketTime; I; 4; 6068; 
6067; 348524; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 33
6101; 350401; packetTime; I; 4; 6101; 
6101; 350405; packetType; I; 4; 1095; unknown
6101; 350419; unknown; HEX; 14; 020000000200010201ba9ed9f200; 
6101; 350423; nextPacketTime; I; 4; 6101; 
6101; 350427; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 99
6199; 356066; packetTime; I; 4; 6199; 
6199; 356070; packetType; I; 4; 1068; move_order
6199; 356077; unknown; HEX; 7; 02000000010601; 
6199; 356081; x; f; 4; 1110.8883056640625; 
6199; 356085; y; f; 4; 320.04876708984375; 
6199; 356089; z; f; 4; 18.75; 
6199; 356093; nextPacketTime; I; 4; 6200; 
6199; 356097; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 1
6201; 356150; packetTime; I; 4; 6201; 
6201; 356154; packetType; I; 4; 1095; unknown
6201; 356168; unknown; HEX; 14; 020000000200010201cd13826b00; 
6201; 356172; nextPacketTime; I; 4; 6201; 
6201; 356176; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 52
6252; 359136; packetTime; I; 4; 6252; 
6252; 359140; packetType; I; 4; 1068; move_order
6252; 359147; unknown; HEX; 7; 02000000010601; 
6252; 359151; x; f; 4; 1150.348876953125; 
6252; 359155; y; f; 4; 315.34521484375; 
6252; 359159; z; f; 4; 18.75; 
6252; 359163; nextPacketTime; I; 4; 6253; 
6252; 359167; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 45
6297; 361728; packetTime; I; 4; 6297; 
6297; 361732; packetType; I; 4; 1068; move_order
6297; 361739; unknown; HEX; 7; 02000000010601; 
6297; 361743; x; f; 4; 1171.896728515625; 
6297; 361747; y; f; 4; 362.6346435546875; 
6297; 361751; z; f; 4; 18.75; 
6297; 361755; nextPacketTime; I; 4; 6298; 
6297; 361759; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 3
6301; 361926; packetTime; I; 4; 6301; 
6301; 361930; packetType; I; 4; 1095; unknown
6301; 361944; unknown; HEX; 14; 0200000002000102017b863c4a00; 
6301; 361948; nextPacketTime; I; 4; 6301; 
6301; 361952; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 60
6360; 365368; packetTime; I; 4; 6360; 
6360; 365372; packetType; I; 4; 1068; move_order
6360; 365379; unknown; HEX; 7; 02000000010601; 
6360; 365383; x; f; 4; 1148.9449462890625; 
6360; 365387; y; f; 4; 391.63104248046875; 
6360; 365391; z; f; 4; 18.750030517578125; 
6360; 365395; nextPacketTime; I; 4; 6361; 
6360; 365399; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 40
6401; 367675; packetTime; I; 4; 6401; 
6401; 367679; packetType; I; 4; 1095; unknown
6401; 367693; unknown; HEX; 14; 0200000002000102018ae2769600; 
6401; 367697; nextPacketTime; I; 4; 6401; 
6401; 367701; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 29
6429; 369350; packetTime; I; 4; 6429; 
6429; 369354; packetType; I; 4; 1068; move_order
6429; 369361; unknown; HEX; 7; 02000000010601; 
6429; 369365; x; f; 4; 1114.32421875; 
6429; 369369; y; f; 4; 368.2062072753906; 
6429; 369373; z; f; 4; 18.75; 
6429; 369377; nextPacketTime; I; 4; 6430; 
6429; 369381; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 71
6501; 373424; packetTime; I; 4; 6501; 
6501; 373428; packetType; I; 4; 1095; unknown
6501; 373442; unknown; HEX; 14; 02000000020001020128d61d9400; 
6501; 373446; nextPacketTime; I; 4; 6501; 
6501; 373450; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 26
6526; 374928; packetTime; I; 4; 6526; 
6526; 374932; packetType; I; 4; 1068; move_order
6526; 374939; unknown; HEX; 7; 02000000010601; 
6526; 374943; x; f; 4; 1113.5240478515625; 
6526; 374947; y; f; 4; 319.5191345214844; 
6526; 374951; z; f; 4; 18.75; 
6526; 374955; nextPacketTime; I; 4; 6527; 
6526; 374959; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 74
6600; 379173; packetTime; I; 4; 6600; 
6600; 379177; packetType; I; 4; 1068; move_order
6600; 379184; unknown; HEX; 7; 02000000010601; 
6600; 379188; x; f; 4; 1155.16357421875; 
6600; 379192; y; f; 4; 313.2953796386719; 
6600; 379196; z; f; 4; 18.75; 
6600; 379200; nextPacketTime; I; 4; 6601; 
6600; 379204; nextPacketType; I; 4; 1095; 
6601; 379200; packetTime; I; 4; 6601; 
6601; 379204; packetType; I; 4; 1095; unknown
6601; 379218; unknown; HEX; 14; 020000000200010201e0de92d200; 
6601; 379222; nextPacketTime; I; 4; 6601; 
6601; 379226; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 52
6652; 382186; packetTime; I; 4; 6652; 
6652; 382190; packetType; I; 4; 1068; move_order
6652; 382197; unknown; HEX; 7; 02000000010601; 
6652; 382201; x; f; 4; 1167.3843994140625; 
6652; 382205; y; f; 4; 358.6735534667969; 
6652; 382209; z; f; 4; 18.75; 
6652; 382213; nextPacketTime; I; 4; 6653; 
6652; 382217; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 48
6701; 384949; packetTime; I; 4; 6701; 
6701; 384953; packetType; I; 4; 1095; unknown
6701; 384967; unknown; HEX; 14; 020000000200010201666ba7b200; 
6701; 384971; nextPacketTime; I; 4; 6701; 
6701; 384975; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 2
6702; 385085; packetTime; I; 4; 6702; 
6702; 385089; packetType; I; 4; 1068; move_order
6702; 385096; unknown; HEX; 7; 02000000010601; 
6702; 385100; x; f; 4; 1174.520751953125; 
6702; 385104; y; f; 4; 412.6291809082031; 
6702; 385108; z; f; 4; 18.75; 
6702; 385112; nextPacketTime; I; 4; 6703; 
6702; 385116; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 57
6759; 388361; packetTime; I; 4; 6759; 
6759; 388365; packetType; I; 4; 1068; move_order
6759; 388372; unknown; HEX; 7; 02000000010601; 
6759; 388376; x; f; 4; 1177.7589111328125; 
6759; 388380; y; f; 4; 456.8465270996094; 
6759; 388384; z; f; 4; 18.75; 
6759; 388388; nextPacketTime; I; 4; 6760; 
6759; 388392; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 41
6801; 390725; packetTime; I; 4; 6801; 
6801; 390729; packetType; I; 4; 1095; unknown
6801; 390743; unknown; HEX; 14; 02000000020001020166efb02000; 
6801; 390747; nextPacketTime; I; 4; 6801; 
6801; 390751; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 13
6813; 391488; packetTime; I; 4; 6813; 
6813; 391492; packetType; I; 4; 1068; move_order
6813; 391499; unknown; HEX; 7; 02000000010601; 
6813; 391503; x; f; 4; 1201.8739013671875; 
6813; 391507; y; f; 4; 483.1646423339844; 
6813; 391511; z; f; 4; 18.750030517578125; 
6813; 391515; nextPacketTime; I; 4; 6814; 
6813; 391519; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 39
6852; 393738; packetTime; I; 4; 6852; 
6852; 393742; packetType; I; 4; 1068; move_order
6852; 393749; unknown; HEX; 7; 02000000010601; 
6852; 393753; x; f; 4; 1234.98583984375; 
6852; 393757; y; f; 4; 463.9742431640625; 
6852; 393761; z; f; 4; 18.750030517578125; 
6852; 393765; nextPacketTime; I; 4; 6853; 
6852; 393769; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 46
6898; 396387; packetTime; I; 4; 6898; 
6898; 396391; packetType; I; 4; 1068; move_order
6898; 396398; unknown; HEX; 7; 02000000010601; 
6898; 396402; x; f; 4; 1216.192138671875; 
6898; 396406; y; f; 4; 412.9944152832031; 
6898; 396410; z; f; 4; 18.75; 
6898; 396414; nextPacketTime; I; 4; 6899; 
6898; 396418; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 2
6901; 396528; packetTime; I; 4; 6901; 
6901; 396532; packetType; I; 4; 1095; unknown
6901; 396546; unknown; HEX; 14; 020000000200010201b0ea63b400; 
6901; 396550; nextPacketTime; I; 4; 6901; 
6901; 396554; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 100
7001; 402250; packetTime; I; 4; 7001; 
7001; 402254; packetType; I; 4; 1095; unknown
7001; 402268; unknown; HEX; 14; 020000000200010201c517c17d00; 
7001; 402272; nextPacketTime; I; 4; 7001; 
7001; 402276; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 57
7057; 405521; packetTime; I; 4; 7057; 
7057; 405525; packetType; I; 4; 1068; move_order
7057; 405532; unknown; HEX; 7; 02000000010601; 
7057; 405536; x; f; 4; 1178.870849609375; 
7057; 405540; y; f; 4; 411.89923095703125; 
7057; 405544; z; f; 4; 18.750030517578125; 
7057; 405548; nextPacketTime; I; 4; 7058; 
7057; 405552; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 43
7101; 407999; packetTime; I; 4; 7101; 
7101; 408003; packetType; I; 4; 1095; unknown
7101; 408017; unknown; HEX; 14; 020000000200010201bb40d94300; 
7101; 408021; nextPacketTime; I; 4; 7101; 
7101; 408025; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 32
7132; 409845; packetTime; I; 4; 7132; 
7132; 409849; packetType; I; 4; 1068; move_order
7132; 409856; unknown; HEX; 7; 02000000010601; 
7132; 409860; x; f; 4; 1169.398193359375; 
7132; 409864; y; f; 4; 463.97430419921875; 
7132; 409868; z; f; 4; 18.75; 
7132; 409872; nextPacketTime; I; 4; 7133; 
7132; 409876; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 68
7201; 413748; packetTime; I; 4; 7201; 
7201; 413752; packetType; I; 4; 1095; unknown
7201; 413766; unknown; HEX; 14; 0200000002000102013b0bfde500; 
7201; 413770; nextPacketTime; I; 4; 7201; 
7201; 413774; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 5
7206; 414055; packetTime; I; 4; 7206; 
7206; 414059; packetType; I; 4; 1049; create_building
7206; 414070; unknown; HEX; 11; 0200000003000106010101; 
7206; 414072; buildingType; H; 2; 1996; 
7206; 414074; unknown; HEX; 2; 0000; 
7206; 414078; x; f; 4; 1163.6678466796875; 
7206; 414082; y; f; 4; 557.0765380859375; 
7206; 414086; z; f; 4; 18.75; 
7206; 414090; unknown; HEX; 4; e4cb16c0; 
7206; 414094; nextPacketTime; I; 4; 7206; 
7206; 414098; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 95
7301; 419509; packetTime; I; 4; 7301; 
7301; 419513; packetType; I; 4; 1095; unknown
7301; 419527; unknown; HEX; 14; 0200000002000102017f48b17600; 
7301; 419531; nextPacketTime; I; 4; 7301; 
7301; 419535; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 100
7401; 425231; packetTime; I; 4; 7401; 
7401; 425235; packetType; I; 4; 1095; unknown
7401; 425249; unknown; HEX; 14; 020000000200010201699fbff800; 
7401; 425253; nextPacketTime; I; 4; 7401; 
7401; 425257; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 100
7501; 430953; packetTime; I; 4; 7501; 
7501; 430957; packetType; I; 4; 1095; unknown
7501; 430971; unknown; HEX; 14; 0200000002000102018d0dd39c00; 
7501; 430975; nextPacketTime; I; 4; 7501; 
7501; 430979; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 100
7601; 436675; packetTime; I; 4; 7601; 
7601; 436679; packetType; I; 4; 1095; unknown
7601; 436693; unknown; HEX; 14; 0200000002000102013783e5ec00; 
7601; 436697; nextPacketTime; I; 4; 7601; 
7601; 436701; nextPacketType; I; 4; 1092; 
> repetitions of 1092: 100
7701; 442397; packetTime; I; 4; 7701; 
7701; 442401; packetType; I; 4; 1095; unknown
7701; 442415; unknown; HEX; 14; 0200000002000102014818075200; 
7701; 442419; nextPacketTime; I; 4; 7701; 
7701; 442423; nextPacketType; I; 4; 1092; 
> Made it to
3607720 of 3607824 (100.00%)

We can create more replay files where we do additional things in the game and see which new packetTypes appear when parsing the replay files.

Implementation in OpenSAGE

Some time later I’ve discovered OpenSAGE and the Replay-Parser implementation there.

In OpenSAGE the building type ids and unit ids appear to be derived directly from the INI-Configuration-Files.

The bytes between the unitIds and the packetType have meaning. There the chunks have the same header I’ve discovered:

But followed by

So looking at the unit creation packet, it can be parsed as:

# 32-bit "TimeCode" (in OpenSage/ReplayChunkHeader.cs)
164236, ('packetTime', 'I', 4) = 2812
# 32-bit "OrderType"
164240, ('packetType', 'I', 4) = 1047

# 32-bit "Number"
164241, ('is_2', 'B', 1) = 2
164242, ('is_0', 'B', 1) = 0
164243, ('is_0', 'B', 1) = 0
164244, ('is_0', 'B', 1) = 0

# 8-bit "numUniqueArgumentTypes" = 1 (in OpenSage/ReplayChunk.cs)
164245, ('is_1', 'B', 1) = 1
# 8-bit ArgumentType = 0, type is Integer
164246, ('is_0', 'B', 1) = 0
# 8-bit ArgumentCount = 2, so there are two Integers in the packet
164247, ('is_2', 'B', 1) = 2

# first Integer
164248, ('unitType', 'B', 1) = 123 -- Gla Rebel
164249, ('buildingIdUnitWasCreated', 'B', 1) = 5
164250, ('is_0', 'B', 1) = 0
164251, ('is_0', 'B', 1) = 0

# second Integer
164252, ('incrementingUnitNumber', 'B', 1) = 1
164253, ('is_0', 'B', 1) = 0
164254, ('is_0', 'B', 1) = 0
164255, ('is_0', 'B', 1) = 0

# next packet TimeCode
164259, ('nextPacketTime', 'I', 4) = 2812
164263, ('nextPackageType', 'I', 4) = 1092

Conclusion

There is a lot more to uncover in the replay files than I’ve shown here. Definitely have a look at the replay parser in the OpenSAGE project as it is more advanced.