freedoom/scripts/fix-gfx-offsets

88 lines
2.8 KiB
Python
Executable File

#!/usr/bin/env python3
# SPDX-License-Identifier: BSD-3-Clause
from os import path
import sys
import glob
import struct
import png
class Graphic(object):
def __init__(self, filepath):
self.filepath = filepath
self.filename = path.split(filepath)[1]
self.name = path.splitext(self.filename)[0].upper().replace("^", "\\")
self.has_offset = False
self.get_png_offset()
def get_png_offset(self):
reader = png.Reader(file=open(self.filepath, "rb"))
for chunk in reader.chunks():
if chunk[0] == "grAb":
self.xoffset, self.yoffset = struct.unpack(">II", chunk[1])
self.has_offset = True
def main():
dirname = path.split(path.abspath(__file__))[0]
graphics = []
files = []
if len(sys.argv) < 2:
print(
'This script takes the offsets stored in the "grAb" chunk of '
+ "the specified PNGs and adjusts the graphics offsets in the build_cfg file.\n"
)
print("Usage:\n\t fix-sprite-offsets <names> [names] [...]\n")
print(
"example: \n\tfix-sprite-offsets sprites/vilea1.png sprites/vileb1.png"
)
print("You can also use wildcards:")
print("\t fix-sprite-offsets sprites/vile*.png")
exit()
else:
for param in sys.argv[1:]:
files.append(dirname + "/../" + param)
for filepath in files:
if not path.isfile(filepath):
print("Could not find" + filepath + ", skipping...")
elif path.splitext(filepath)[1] == ".png":
graphics.append(Graphic(filepath))
for graphic in graphics:
if graphic.has_offset == False:
graphics.remove(graphic)
f = open(dirname + "/../buildcfg.txt", "r")
lines = f.readlines()
f.close()
newlines = []
for line in lines:
replaced_line = False
for graphic in graphics:
if graphic.has_offset is True:
thing = line.split()
if len(thing) > 0 and thing[0] == graphic.name:
new_string = "%s\t%i\t%i" % (
graphic.name,
graphic.xoffset,
graphic.yoffset,
)
comments = line.split(";")
if len(comments) > 1:
new_string += "\t;" + "".join(comments[1:])
else:
new_string += "\n"
newlines.append(new_string)
replaced_line = True
print("Updated " + graphic.name + " offsets")
break
if replaced_line is False:
newlines.append(line)
f = open(dirname + "/../buildcfg.txt", "w")
f.writelines(newlines)
f.close()
if __name__ == "__main__":
main()