freedoom/scripts/fix-gfx-offsets
Mike Swanson 6eef9be73a use python3 only for building
Python 2 is very near end-of-life, and Python3-compatible changes to a
few scripts introduced compatibility problems with 2.7 again.  It went
unnoticed for me since my system symlinks "python" to "python3", but
it broke the build on systems where that symlink is still python2.  At
this point in time, I feel it is worth targetting modern Python and
forgetting about 2.7.
2019-09-06 14:43:50 -07:00

87 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()