|
9 | 9 | inputBuffer = ctypes.create_string_buffer(inputFile.read())[:-1]
|
10 | 10 | inputFile.close()
|
11 | 11 |
|
12 |
| -blockCount = math.ceil((0x2040 + len(inputBuffer)) / 0x2000) |
13 |
| - |
14 |
| -# Create header |
15 |
| -headerBuffer = ctypes.create_string_buffer(0x40) |
16 |
| -struct.pack_into(">L", headerBuffer, 0x00, 0x47384D45) # game code |
17 |
| -struct.pack_into(">H", headerBuffer, 0x04, 0x3031) # maker code |
18 |
| -struct.pack_into(">B", headerBuffer, 0x06, 0xFF) # unused |
19 |
| -struct.pack_into(">B", headerBuffer, 0x07, 2) # banner flags (RGB5A3) |
20 |
| -struct.pack_into("32s", headerBuffer, 0x08, sys.argv[2].encode()) # filename |
21 |
| -struct.pack_into(">L", headerBuffer, 0x28, 0) # modified time |
22 |
| -struct.pack_into(">L", headerBuffer, 0x2C, 0) # image offset |
23 |
| -struct.pack_into(">H", headerBuffer, 0x30, 2) # icon format |
24 |
| -struct.pack_into(">H", headerBuffer, 0x32, 3) # animation speed (1 icon for 12 frames) |
25 |
| -struct.pack_into(">B", headerBuffer, 0x34, 4) # permissions |
26 |
| -struct.pack_into(">B", headerBuffer, 0x35, 0) # copy counter |
27 |
| -struct.pack_into(">H", headerBuffer, 0x36, 0) # first block number |
28 |
| -struct.pack_into(">H", headerBuffer, 0x38, blockCount) # block count |
29 |
| -struct.pack_into(">H", headerBuffer, 0x3A, 0xFF) # unused |
30 |
| -struct.pack_into(">L", headerBuffer, 0x3C, 0x2000) # comment address |
31 |
| - |
32 | 12 | # Load banner and icon
|
33 | 13 | bannerFile = open(sys.argv[5], "rb")
|
34 | 14 | bannerBuffer = ctypes.create_string_buffer(bannerFile.read())[:-1]
|
|
51 | 31 | fileInfoBuffer = ctypes.create_string_buffer(0x200 - 0x40)
|
52 | 32 | struct.pack_into(">L", fileInfoBuffer, 0, len(inputBuffer))
|
53 | 33 |
|
54 |
| - |
55 | 34 | # Pad to block boundary
|
56 |
| -paddingLength = blockCount * 0x2000 - (len(bannerBuffer) + len(iconBuffer) + len(commentBuffer) + len(fileInfoBuffer) + len(inputBuffer)) |
| 35 | +fileLength = len(bannerBuffer) + len(iconBuffer) + len(commentBuffer) + len(fileInfoBuffer) + len(inputBuffer) |
| 36 | +blockCount = math.ceil(fileLength / 0x2000) |
| 37 | +paddingLength = blockCount * 0x2000 - fileLength |
57 | 38 | paddingBuffer = ctypes.create_string_buffer(paddingLength)
|
58 | 39 |
|
59 |
| -outputFilename = os.path.splitext(os.path.splitext(inputFilename)[0])[0] + ".gci" |
| 40 | +# Create header |
| 41 | +headerBuffer = ctypes.create_string_buffer(0x40) |
| 42 | +struct.pack_into(">L", headerBuffer, 0x00, 0x47384D45) # game code |
| 43 | +struct.pack_into(">H", headerBuffer, 0x04, 0x3031) # maker code |
| 44 | +struct.pack_into(">B", headerBuffer, 0x06, 0xFF) # unused |
| 45 | +struct.pack_into(">B", headerBuffer, 0x07, 2) # banner flags (RGB5A3) |
| 46 | +struct.pack_into("32s", headerBuffer, 0x08, sys.argv[2].encode()) # filename |
| 47 | +struct.pack_into(">L", headerBuffer, 0x28, 0) # modified time |
| 48 | +struct.pack_into(">L", headerBuffer, 0x2C, 0) # image offset |
| 49 | +struct.pack_into(">H", headerBuffer, 0x30, 2) # icon format |
| 50 | +struct.pack_into(">H", headerBuffer, 0x32, 3) # animation speed (1 icon for 12 frames) |
| 51 | +struct.pack_into(">B", headerBuffer, 0x34, 4) # permissions |
| 52 | +struct.pack_into(">B", headerBuffer, 0x35, 0) # copy counter |
| 53 | +struct.pack_into(">H", headerBuffer, 0x36, 0) # first block number |
| 54 | +struct.pack_into(">H", headerBuffer, 0x38, blockCount) # block count |
| 55 | +struct.pack_into(">H", headerBuffer, 0x3A, 0xFF) # unused |
| 56 | +struct.pack_into(">L", headerBuffer, 0x3C, 0x2000) # comment address |
| 57 | + |
| 58 | +outputFilename = os.path.splitext(inputFilename)[0] + ".gci" |
60 | 59 | outputFile = open(outputFilename, "wb")
|
61 | 60 | outputFile.write(bytearray(headerBuffer))
|
62 | 61 | outputFile.write(bytearray(bannerBuffer))
|
|
0 commit comments