forked from CahootsMalone/maxis-mesh-stuff
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtabulate-mesh-names.py
80 lines (54 loc) · 2.35 KB
/
tabulate-mesh-names.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
keys = [
'SimCopter sim3d1.max',
'SimCopter sim3d2.max',
'SimCopter sim3d3.max',
'Streets sim3d1.max',
'Streets sim3d2.max',
'Streets sim3d3.max',
]
# Set appropriately before running.
filePaths = {
keys[0]: "C:/Maxis/SimCopter/geo/sim3d1.max",
keys[1]: "C:/Maxis/SimCopter/geo/sim3d2.max",
keys[2]: "C:/Maxis/SimCopter/geo/sim3d3.max",
keys[3]: "C:/Maxis/Streets/GEO/SIM3D1.max",
keys[4]: "C:/Maxis/Streets/GEO/SIM3D2.max",
keys[5]: "C:/Maxis/Streets/GEO/SIM3D3.max"
}
offsetGeomTableStart = 829 # This is stored earlier in the file, but it's always 829.
lengthGeomTableEntry = 53 # 17 + 9*4
nameTableHeadings = ["Name from Geometry Table", "Name from Object Block"]
nameTables = {}
for key in keys:
filePath = filePaths[key]
nameTable = []
with open(filePath, "rb") as file:
data = file.read()
pos = offsetGeomTableStart
# Skip "GEOM".
pos += 4
# Skip size of geometry table.
pos += 4
# Skip number of entries in geometry table (one more than number of objects).
pos +=4
objectCount = int.from_bytes(data[pos:pos+4], byteorder='little')
pos += 4
for i in range(objectCount):
entryStartOffset = 853 + lengthGeomTableEntry + i*lengthGeomTableEntry;
# Names are null-terminated. Subsequent bytes within the range allocated for the name are garbage.
nameFromTable = data[entryStartOffset:entryStartOffset+17].partition(b'\0')[0].decode("ascii", "ignore")
offsetIntoMeshTable = int.from_bytes(data[entryStartOffset+17:entryStartOffset+17+4], byteorder='little')
nameFromObjectBlock = data[offsetIntoMeshTable+24:offsetIntoMeshTable+24+88].partition(b'\0')[0].decode("ascii", "ignore")
nameTable.append([nameFromTable, nameFromObjectBlock])
nameTables[key] = nameTable
outPath = 'mesh-names.md'
with open(outPath, 'w') as out:
out.write("# Names of Meshes (SimCopter and Streets of SimCity)\n\n")
out.write("Generated by `tabulate-mesh-names.py`\n")
for key in keys:
out.write(f"\n## {key}\n\n")
out.write(" | ".join(nameTableHeadings) + '\n')
out.write("--- | ---" + '\n')
nameTable = nameTables[key]
for entry in nameTable:
out.write(f"{entry[0]} | {entry[1]}\n")