Network Subfiles

From SC4D Encyclopaedia
Revision as of 08:12, 29 January 2023 by Memo (talk | contribs) (→‎Structure: transposition of terrain triangles)
Jump to navigation Jump to search

This page pertains to the format of the Network Subfiles within the Savegame files. These files have Type IDs 6A0F82B2 (Network Index), C9C05C6E (Network Subfile 1) and CA16374F (Network Subfile 2). They can be viewed using the SC4 Savegame Explorer, but not edited. These subfiles were decoded by RippleJet and completed by smf_16.

Network Index Subfile (6A0F82B2)

Description

This index file contains a list of all network tiles, with links to the two network files where the records can be found.

Network Index Subfile Structure

Network Index Subfile Body

DWORD	Subfile Size in bytes
DWORD	CRC
DWORD	Memory address
WORD	Major Version  (0x0007 for built cities, but 0x0003 for Maxis' own, unbuilt cities)
DWORD	City Tile Count  (4096, 16384 or 65536 depending on city size)
DWORD	Count of Network Tiles  (0 for a new city)
   DWORD	Tile Number  (See Appendix 1.1 for more information)
   DWORD	Link: Memory address
   DWORD	Link: Subfile Type ID
   DWORD	Count of blocks  (either 0 or 10)
      DWORD	Block Number (first one is 0, last one is 9)
      DWORD	Count  (anything between 0-16. Number of byte blocks)
         BYTE×8   	Unknown block of bytes. Small numbers < 10
   DWORD        Count of pointers to follow
      DWORD     Memory address of automata
      DWORD     Type ID of automata. Seen 0x896e75af (cSC4Pedestrian), 0x4a416254 (cSC4TrainCard),
                0x896e714a (cSC4Vehicle), 0xaa9f4a3d (cSC4Bus) and 0x4a5b69ed (cSC4TrailerVehicle).
                Other automata might exist as well, refer to all Type ids in Savegames.
   BYTE	Unknown  (always 0x00)
   DWORD	Unknown  (Seen 0 and 2)
   DWORD	Unknown  (Only seen 2)
   DWORD	Unknown  (Seen 0 and 4)
   FLOAT32	Unknown  (Small values, e.g. 0.0, 2.0, 5.0, 6.0, 8.0)
   WORD	Unknown  (0 or 1)
   WORD	Unknown  (0 or 1)
   WORD	Unknown  (0 or 1)
   WORD	Unknown  (0 or 1)
   FLOAT32	Unknown  (Small values, e.g. 0.0, 2.0, 5.0, 6.0, 8.0)
   WORD	Unknown  (0 or 1)
   WORD	Unknown  (0 or 1)
   WORD	Unknown  (0 or 1)
   WORD	Unknown  (0 or 1)
   FLOAT32	Unknown  (Small values, e.g. 0.0, 2.0, 5.0, 6.0, 8.0)
   WORD	Unknown  (0 or 1)
   WORD	Unknown  (0 or 1)
   WORD	Unknown  (0 or 1)
   WORD	Unknown  (0 or 1)
   FLOAT32	Unknown  (Small values, e.g. 0.0, 2.0, 5.0, 6.0, 8.0)
   WORD	Unknown  (0 or 1)
   WORD	Unknown  (0 or 1)
   WORD	Unknown  (0 or 1)
   WORD	Unknown  (0 or 1)
   WORD	Unknown  (always 0)
   DWORD	Count of blocks to follow
       DWORD    Block number
       BYTEx4   4 Unknown bytes (perhaps a float? Values don't make sense though).
       WORD     Unknown (only seen 0x00)
DWORD	Count of network intersections (such as + and T intersections) in city
   DWORD	Link: Memory address
   DWORD	Link: Subfile Type ID of a network subfile
   BYTE	Unknown  (only seen 0x00)
   DWORD	Unknown  (only seen 0x00000000)

      # The values below seem to indicate what directions are enabled on this 
      # network. That's why they are repeated 4 times for west, north, east 
      # and south.
      DWORD    Count of meaningful blocks of bytes to follow. Note that there
               are **always** 3 blocks, regardless of the value of this DWORD, 
               but if the count is for example 2, then the last block contains 
               garbage data, probably due to uninitialized memory that hasn't 
               been consumed by the game. Hence can be 0, 1, 2 or 3.
      BOOLEAN  Unknown (either 0 or 1)

         # Repeat 3 times, regardless of count above.
         BYTEx2   Unknown. Often 0, but on developed cities other values have 
                  been observed as well. Might be uninitialized garbage data.
         BYTEx2   Unknown. 0xc0 0x40 for road intersections, 0x00 0x41 for 
                  intersections with avenues. 0x00 0x00 for rail intersections.
                  Might be flags that indicate what changes of direction are 
                  possible. (i.e. none for rail).

DWORD   Count of transit-enabled lot tiles to follow
   WORD         Z tile
   WORD         X tile
   DWORD        Unknown (always 0x00000001)
   DWORD        Memory address of network tile
   DWORD        Type ID of network (0xc9c05c6e)
DWORD	Unknown  (only seen 0x00000000)
DWORD	Unknown  (only seen 0x00000000)
DWORD	Tile X  (63, 127 or 255 for a new city, smaller for built up cities, probably max coordinate that ever has had a network)
DWORD	Tile Z  (63, 127 or 255 for a new city, smaller for built up cities, probably max coordinate that ever has had a network)
FLOAT32	Unknown  (Small value. 0.00 for a new city)
BOOLEAN	Unknown  (always 1, true)
FLOAT32	Unknown  (Small value. 0.00 for a new city)
BOOLEAN	Unknown  (always 1, true)
DWORD	Count of blocks to follow  (Does not appear if version = 0x0003)
   DWORD         Memory address
   DWORD         Type ID of network (seen 0xc9c05c6e and 0x49c1a034).
   DWORD         Count of DWORDs to follow (only seen 0x00000000 though)
       DWORD     Unknown (never seen, but assumed, see below)
   WORD          Unknown (all kinds of values, change when saving without doing anything)
   DWORD         Count of DWORDs to follow
       DWORD     Unknown, might as well be 4 bytes
   WORD          Unknown (all kinds of values, change when saving without doing anything)
   DWORD         Count of DWORDs to follow
       DWORD     Unknown, might as well be 4 bytes
   WORD          Unknown (all kinds of values, change when saving without doing anything)
   DWORD         Count of DWORDs to follow
       DWORD     Unknown, might as well be 4 bytes
   WORD          Unknown (all kinds of values, change when saving without doing anything)

Appendix 1.1

Tile numbering starts in the NW corner, which is tile number 0x00000000.

  • Tile number 0x00000001 is to the east of that tile.
  • In a small city, the first tile in the second row is 0x00000040.
  • In a medium city, the first tile in the second row is 0x00000080.
  • In a large city, the first tile in the second row is 0x00000100.
  • In a small city, the last tile in the last row is 0x00000FFF.
  • In a medium city, the last tile in the last row is 0x00003FFF.
  • In a large city, the last tile in the last row is 0x0000FFFF.


Network Subfile 1 (C9C05C6E)

Structure

Network Subfile 1 Body

List of texture-based network tiles consisting of records of the form:

DWORD	Record Size
DWORD	CRC
DWORD	Memory
WORD	Version Major  (0x0008)
WORD	Version Minor  (0x0004)
WORD	Zot Bytes  (Always 0x0000)
BYTE	0x00
BYTE	Appearance Flag  (Always 0x05)  (See Appendix 2.2 for more information)
DWORD	0xC772BF98  (always the same)
BYTE	Min Tract X Coordinate  (normally between 0x40 and 0x7F)
BYTE	Min Tract Z Coordinate  (normally between 0x40 and 0x7F)
BYTE	Max Tract X Coordinate  (normally between 0x40 and 0x7F)
BYTE	Max Tract Z Coordinate  (normally between 0x40 and 0x7F)
WORD	X Tract Size (power of 2)  (only seen 0x0002 ... 2² = 4 tiles)
WORD	Z Tract Size (power of 2)  (only seen 0x0002 ... 2² = 4 tiles)
DWORD	Count of Properties
    SGPROP    	SaveGame Properties, repeated Count times  (See Appendix 2.1 for more information)
DWORD	Group ID  (always 0x00000000)
DWORD	Type ID  (always 0x00000000)
DWORD	Instance ID  (always 0x00000000)
BYTE	Unknown Flag (0 or 1)
FLOAT32	X Coordinate
FLOAT32	Y Coordinate
FLOAT32	Z Coordinate

    # Next follows 4 times a data structure that contains information for
    # drawing a texture.
    3 x FLOAT32  (x, y, z) coordinates of the vertex
    2 x FLOAT32  (u, v) coordinates for texture mapping
    4 x BYTE     (r, g, b, a) values indicating a color (always #dedbddff).

DWORD	TextureID / PathID
BYTE	Wealth texture  (See Appendix 2.6)
BYTES×2	Unknown  (0, 0)
BYTE	Base texture  (See Appendix 2.7)
BYTE	Unknown  (8 if base texture is present, 0 otherwise?)
BYTE	Orientation  (See Appendix 2.3 for more information)
BYTES×2	Unknown  (Small values)
Byte	Flag for crossings (1 = crossings of two networks, 0 = single network)
    BYTE	Network Type  (See Appendix 2.4 for more information)
    BYTE	Connection, West  (See Appendix 2.5 for more information)
    BYTE	Connection, North  (See Appendix 2.5 for more information)
    BYTE	Connection, East  (See Appendix 2.5 for more information)
    BYTE	Connection, South  (See Appendix 2.5 for more information)
BYTE    Unknown (seen 0x02 and about 100 more bytes to follow for roads with retaining walls))
BYTES×3	Unknown  (Small values)
FLOAT32	Xmin
FLOAT32	Xmax
FLOAT32	Ymin
FLOAT32	Ymax
FLOAT32	Zmin
FLOAT32	Zmax
BYTE	Unknown  (1 or 2 or 0)
BYTE	0xa0 if road is constructed, 0xe0 if still to be constructed (also 0xa4, 0xa8 appear)
BYTE	Unknown  (Always 0)
BYTE	0x16 if road is constructed, 0x06 if still to be constructed
DWORD×4	Unknown  (All 0)
DWORD	Unknown  (often 2 or 1, but also 5,...)
DWORD	Unknown  (0x00000000)

Appendix 2.1 - Structure of SGPROP (SaveGame Properties)

DWORD   Property Name Value
DWORD	Property Name Value  (doubled for some unknown reason)
DWORD	0x00000000
BYTE	Data Type, 01=UInt8, 02=UInt16, 03=UInt32, 07=SInt32, 08=SInt64, 09=Float32, 0B=Boolean
BYTE	KeyType, 0x00 = 0 reps, 0x80 = more than 0 reps
WORD	0x0000
DWORD	Rep Count  (this one appears only if KeyType = 0x80)
    DATA	Property Value (repeated Rep Count times, type according to Data Type)

SaveGame Properties

Properties known to appear on network tiles are listed below (See also the Prop Subfile).

0x4835C6A6 (Boolean) = Unknown (1?)
0x4835C6A7 (UInt32×2) = TE-Lot network flags:
    DWORD - Unknown (0?)
    DWORD - Flags (0xSSEENNWW) (0x00000000 if custom path is used)
0x4835C6A9 (UInt32) = TE-Lot custom path IID
0x4835C6AA (Byte) = Bitmask for Onewayroad directions:
    0b00000001 - Edge West: direction West to East
    0b00000010 - Edge West: direction East to West
    0b00000100 - Edge North: direction North to South
    0b00001000 - Edge North: direction South to North
    0b00010000 - Edge East: direction West to East
    0b00100000 - Edge East: direction East to West
    0b01000000 - Edge South: direction North to South
    0b10000000 - Edge South: direction South to North
0x4835C6AB (UInt32) = Unknown (some flags related to puzzle pieces?)
0xAA24AE57 (UInt32) = Unknown (0?)

Appendix 2.2 - Apperance Flag (offset 0x0013)

    0x01 (00000001b) - Network that appears in the game (if this is off, the network has been deleted)
    0x02 (00000010b) - ? (unused)
    0x04 (00000100b) - ? (always on)
    0x08 (00001000b) - ? (unused)
    0x40 (01000000b) - The network is burnt
    0x80 (10000000b) - ? (unused)

Appendix 2.3 - Orientation

    0x00 = North
    0x01 = East
    0x02 = South
    0x03 = West
    0x80 = North, mirrored
    0x81 = East, mirrored
    0x82 = South, mirrored
    0x83 = West, mirrored

Appendix 2.4 - Network Type

    0x00 = Road
    0x01 = Rail
    0x02 = Elevated Highway
    0x03 = Street
    0x04 = Pipe
    0x05 = Powerline
    0x06 = Avenue
    0x07 = Subway
    0x08 = Lightrail
    0x09 = Monorail
    0x0a = Onewayroad
    0x0b = Dirtroad
    0x0c = Ground Highway

Appendix 2.5 - Connections

The Network Flags are denoted in octal representation in RUL files:

0x00 = 0o00 (no connection)
0x01 = 0o01 (diagonal left)
0x02 = 0o02 (orthogonal)
0x03 = 0o03 (diagonal right)
0x04 = 0o04 (median)
0x09 = 0o11 (blend left)
0x0b = 0o13 (blend right)
0x11 = 0o21 (diagonal switch left)
0x13 = 0o23 (diagonal switch right)
...
0x32 = 0o62 (wye)
...

Appendix 2.6 - Wealth Textures

0 = default texture
1 = grass/low density (wealth textures 0x10, 0x20, 0x30)
4 = medium/high density (wealth textures 0x40, 0x50, 0x60)
7 = I-ag/landfill (wealth texture 0x70)

Appendix 2.7 - Base textures

0x00 = none
0x10 = pavement $
0x20 = pavement $$
0x30 = pavement $$$
0x40 = dirt

Network Subfile 2 (CA16374F)

This subfile contains network tiles related to the subway network.

Network Subfile 2 Structure

List of records of the form:

Network Subfile 2 Body

DWORD	Record Size
DWORD	CRC
DWORD	Memory
WORD	Version Major  (0x0002)
WORD	Version Minor  (0x0003)
WORD	Version ?  (0x0008)
WORD	Version ?  (0x0004)
WORD	Zot Bytes  (Always 0x0000)
BYTE	0x00
BYTE	Appearance Flag  (Always 0x05)  (See Appendix 2.2 for more information)
DWORD	0xC772BF98  (always the same)
BYTE	Min Tract X Coordinate  (normally between 0x40 and 0x7F)
BYTE	Min Tract Z Coordinate  (normally between 0x40 and 0x7F)
BYTE	Max Tract X Coordinate  (normally between 0x40 and 0x7F)
BYTE	Max Tract Z Coordinate  (normally between 0x40 and 0x7F)
WORD	X Tract Size (power of 2)  (only seen 0x0002 ... 2² = 4 tiles)
WORD	Z Tract Size (power of 2)  (only seen 0x0002 ... 2² = 4 tiles)
DWORD	Count of Properties  (I've only seen 0x00000000)
    SGPROP    	SaveGame Properties, repeated Count times  (See Appendix 2.1 for more information)
DWORD	Group ID  (always 0x00000000)
DWORD	Type ID  (always 0x00000000)
DWORD	Instance ID  (always 0x00000000)
BYTE	Unknown  (Always 0x05)
FLOAT32	Unknown  (Normally 0, -1 or 1)
FLOAT32	Unknown  (Normally 0)
FLOAT32	Unknown  (Normally 0, -1 or 1)
FLOAT32	Unknown  (Normally 0)
FLOAT32	Unknown  (Normally 1)
FLOAT32	Unknown  (Normally 0)
FLOAT32	Unknown  (Normally 0, -1 or 1)
FLOAT32	Unknown  (Normally 0)
FLOAT32	Unknown  (Normally 0, -1 or 1)
FLOAT32	Xmax
FLOAT32	Ymax
FLOAT32	Zmax
FLOAT32	Xmin
FLOAT32	Ymin
FLOAT32	Zmin
FLOAT32	Unknown  (Normally 0)
FLOAT32	Unknown  (Normally 0)
DWORD	Unknown  (Always 0xFF000000)
FLOAT32	X Coordinate
FLOAT32	Y Coordinate
FLOAT32	Z Coordinate
FLOAT32	Unknown  (Normally 0)
FLOAT32	Unknown  (Normally 1)
DWORD	Unknown  (Always 0xFF000000)
FLOAT32	X Coordinate
FLOAT32	Y Coordinate
FLOAT32	Z Coordinate
FLOAT32	Unknown  (Normally 1)
FLOAT32	Unknown  (Normally 1)
DWORD	Unknown  (Always 0xFF000000)
FLOAT32	X Coordinate
FLOAT32	Y Coordinate
FLOAT32	Z Coordinate
FLOAT32	Unknown  (Normally 1)
FLOAT32	Unknown  (Normally 0)
DWORD	Unknown  (Always 0xFF000000)
DWORD	TextureID / PathID
BYTES×5	Unknown  (Small values)
BYTE	Orientation  (See Appendix 2.3 for more information)
BYTES×3	Unknown  (Small values)
BYTE	Network Type  (See Appendix 2.4 for more information)
BYTE	Connection, West  (See Appendix 2.5 for more information)
BYTE	Connection, North  (See Appendix 2.5 for more information)
BYTE	Connection, East  (See Appendix 2.5 for more information)
BYTE	Connection, South  (See Appendix 2.5 for more information)
BYTES×4	Unknown  (Small values)
FLOAT32	Xmin
FLOAT32	Xmax
FLOAT32	Ymin
FLOAT32	Ymax
FLOAT32	Zmin
FLOAT32	Zmax
BYTE	Unknown  (Always 128)
BYTE	Unknown  (Always 32)
BYTE	Unknown  (Always 0)
BYTE	Unknown  (Seen 16-21)
DWORD×4	Unknown  (All 0)
DWORD	Unknown  (Always 50)
DWORD	Unknown  (0x00000000)
WORD	Unknown  (0x0000)
FLOAT32	Unknown  (Normally 1)
DWORD	Number of extra blocks  (0, 1, 2 or 3)

# Below follow 5 arrays defining the sides of the hole. If an array is empty, there is
# no texture to be rendered at that side (typically for straight sections). Order is
# west, north, east, south, bottom.
DWORD	Count  (Either 0 or 4)
   3 x FLOAT32  (x, y, z) coordinates of the vertex
   2 x FLOAT32  (u, v) coordinates for texture mapping (normally 0, 0.75 or 1)
   4 x BYTE     (r, g, b, a) values indicating a color (either #ffffffff or #ffffff80).
DWORD	Count  (Either 0 or 4)
   3 x FLOAT32  (x, y, z) coordinates of the vertex
   2 x FLOAT32  (u, v) coordinates for texture mapping (normally 0, 0.75 or 1)
   4 x BYTE     (r, g, b, a) values indicating a color (either #ffffffff or #ffffff80).
DWORD	Count  (Either 0 or 4)
   3 x FLOAT32  (x, y, z) coordinates of the vertex
   2 x FLOAT32  (u, v) coordinates for texture mapping (normally 0, 0.75 or 1)
   4 x BYTE     (r, g, b, a) values indicating a color (either #ffffffff or #ffffff80).
DWORD	Count  (Either 0 or 4)
   3 x FLOAT32  (x, y, z) coordinates of the vertex
   2 x FLOAT32  (u, v) coordinates for texture mapping (normally 0, 0.75 or 1)
   4 x BYTE     (r, g, b, a) values indicating a color (either #ffffffff or #ffffff80).
DWORD	Count  (Either 0 or 4)
   3 x FLOAT32  (x, y, z) coordinates of the vertex
   2 x FLOAT32  (u, v) coordinates for texture mapping (normally 0, 0.75 or 1)
   4 x BYTE     (r, g, b, a) values indicating a color (either #ffffffff or #ffffff80).

DWORD	Unknown  (Always 0x00000000)

# Next follow 16 floats, representing the values of the transformation matrix for the model
#  | a b c d |
#  | d e f g |
#  | h i j k |
#  | l m n o |
# d, g and k are the translation components and are set to the position *in the city*.
16 x FLOAT32

DWORD	X Tile
DWORD	Z Tile
BOOLEAN	Unknown  (Always 0)
BOOLEAN	Unknown  (Either 0 or 1, false or true)
BOOLEAN	Unknown  (Either 0 or 1, false or true)
FLOAT32	Y Coordinate
FLOAT32	Y Coordinate
FLOAT32	Y Coordinate
FLOAT32	Y Coordinate
FLOAT32	Y Coordinate
DWORD	0xCA16374F  (Subfile ID)
DWORD	0x00000000  (always the same)

Prebuilt Network Subfile (0x49c1a034)

The prebuilt network subfile contains all model-based network tiles with a prefabricated model, such as elevated highways and monorail.

Structure

List of records of the form:

DWORD    Size
DWORD    CRC
DWORD    Memory
WORD     Major version (0x0004)
WORD     Minor version (0x0008)
BYTE     Zot (0x04)
DWORD    Unknown (always 0x000000)
BYTE     Appearance flag (0x05)
DWORD    Unknown (always 0xc772bf98)
BYTE	 Min Tract X Coordinate  (normally between 0x40 and 0x7F)
BYTE	 Min Tract Z Coordinate  (normally between 0x40 and 0x7F)
BYTE	 Max Tract X Coordinate  (normally between 0x40 and 0x7F)
BYTE	 Max Tract Z Coordinate  (normally between 0x40 and 0x7F)
WORD	 X Tract Size (power of 2)  (only seen 0x0002 ... 2² = 4 tiles)
WORD	 Z Tract Size (power of 2)  (only seen 0x0002 ... 2² = 4 tiles)
DWORD	 Count of Properties
    SGPROP    	SaveGame Properties, repeated Count times
DWORD	 Group ID of Network Model Exemplar (see Appendix 4.1)
DWORD	 Type ID of Network Model Exemplar (0x6534284a)
DWORD	 Instance ID of Network Model Exemplar
BYTE	 Unknown Flag (0 or 1)
FLOAT32	 X Coordinate
FLOAT32	 Y Coordinate
FLOAT32	 Z Coordinate

    # Next follows 4 times a data structure that contains information for
    # drawing a texture.
    3 x FLOAT32  (x, y, z) coordinates of the vertex
    2 x FLOAT32  (u, v) coordinates for texture mapping
    4 x BYTE     (r, g, b, a) values indicating a color (always #dedbddff).

DWORD	TextureID / PathID
BYTE	Wealth texture  (See Appendix 2.6)
BYTES×2	Unknown  (0, 0)
BYTE	Base texture  (See Appendix 2.7)
BYTE	Unknown  (8 if base texture is present, 0 otherwise?)
BYTE    Orientation
Byte	Flag for crossings (1 for crossings of two networks, 0 for single network)
    BYTE	Network Type  (See Appendix 2.4 for more information)
    BYTE	Connection, West  (See Appendix 2.5 for more information)
    BYTE	Connection, North  (See Appendix 2.5 for more information)
    BYTE	Connection, East  (See Appendix 2.5 for more information)
    BYTE	Connection, South  (See Appendix 2.5 for more information)
BYTE    Unknown (seen 0x02 and about 100 more bytes to follow for roads with retaining walls))
BYTES×3	Unknown  (Small values)
FLOAT32	Xmin
FLOAT32	Xmax
FLOAT32	Ymin
FLOAT32	Ymax
FLOAT32	Zmin
FLOAT32	Zmax
BYTEx3	Unknown
BYTE	Unknown (0b00000001 seems to be set if terrain triangles are transposed)
DWORD×4	Unknown (apparently always 0x00000000)
BYTE	Unknown (seen 0x02, 0x64, 0xa0)
DWORD×6	Unknown (apparently always 0x00000000)
DWORD	pillar ID (if non-zero, it is followed by a block):
    FLOAT32	pillar rotation
    FLOAT32	pillar offset X
    FLOAT32	pillar offset Y
    FLOAT32	pillar offset Z

Appendix 4.1 - Network Model Exemplars

For a list of Group IDs, see Model Exemplar.