summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoryenatch <yenatch@gmail.com>2015-06-28 23:50:50 -0700
committeryenatch <yenatch@gmail.com>2015-06-28 23:53:49 -0700
commit9c4fb6a6a4b0d63c5c165aefb95cbe5c0d9fdace (patch)
tree2334e1c59c5167eccbef6454922748b384aa43a0
parente2c2e20f93f43848542362a5deee677e88f9507d (diff)
Add a script to convert project-specific graphics.
This is an alternative to terrible hacks like filename metadata, and might combat submodule bloat.
-rw-r--r--Makefile11
m---------extras0
-rw-r--r--gfx.py101
3 files changed, 107 insertions, 5 deletions
diff --git a/Makefile b/Makefile
index f6407e70f..e9a324c9c 100644
--- a/Makefile
+++ b/Makefile
@@ -7,7 +7,7 @@ MD5 := md5sum -c --quiet
.SECONDEXPANSION:
poketools := extras/pokemontools
-gfx := $(PYTHON) $(poketools)/gfx.py
+gfx := $(PYTHON) gfx.py
includes := $(PYTHON) $(poketools)/scan_includes.py
@@ -79,12 +79,13 @@ pngs:
find . -iname "*.[12]bpp" -exec touch {} +
find . -iname "*.lz" -exec touch {} +
-%.2bpp: %.png ; @$(gfx) 2bpp $<
-%.1bpp: %.png ; @$(gfx) 1bpp $<
-%.lz: % ; @$(gfx) lz $<
+%.2bpp: %.png ; $(gfx) 2bpp $<
+%.1bpp: %.png ; $(gfx) 1bpp $<
+%.lz: % ; $(gfx) lz $<
-%.pal: ;
+%.pal: %.2bpp ;
+gfx/pics/%/normal.pal gfx/pics/%/bitmask.asm gfx/pics/%/frames.asm: gfx/pics/%/front.2bpp ;
%.bin: ;
%.blk: ;
%.tilemap: ;
diff --git a/extras b/extras
-Subproject 46492bd9075313a52622cc585fe7b2ca404cbdc
+Subproject bf76a6b84a2f57edbcd01d6b2841cb813b2afce
diff --git a/gfx.py b/gfx.py
new file mode 100644
index 000000000..fd48da339
--- /dev/null
+++ b/gfx.py
@@ -0,0 +1,101 @@
+"""Supplementary scripts for graphics conversion."""
+
+import os
+import argparse
+
+from extras.pokemontools import gfx
+
+
+# Graphics with inverted tilemaps that aren't covered by filepath_rules.
+pics = [
+ 'gfx/shrink1',
+ 'gfx/shrink2',
+]
+
+def filepath_rules(filepath):
+ """Infer attributes of certain graphics by their location in the filesystem."""
+ args = {}
+
+ filedir, filename = os.path.split(filepath)
+ name, _, ext = filename.partition('.') # os.path.splitext only takes the last '.'
+
+ if 'gfx/pics/' in filedir:
+ if name == 'front':
+ args['pal_file'] = os.path.join(filedir, 'normal.pal')
+ args['pic'] = True
+ args['animate'] = True
+ elif name == 'back':
+ args['pal_file'] = os.path.join(filedir, 'shiny.pal')
+ args['pic'] = True
+
+ elif 'gfx/trainers' in filedir:
+ args['pic'] = True
+
+ elif os.path.join(filedir, name) in pics:
+ args['pic'] = True
+
+ if args.get('pal_file'):
+ args['palout'] = args['pal_file']
+
+ if args.get('pic'):
+ if ext == 'png':
+ w, h = gfx.png.Reader(filepath).asRGBA8()[:2]
+ w = min(w/8, h/8)
+ args['pic_dimensions'] = w, w
+ return args
+
+
+def to_1bpp(filename, **kwargs):
+ filename, name, ext = gfx.try_decompress(filename)
+ if ext == '.1bpp': pass
+ elif ext == '.2bpp': gfx.export_2bpp_to_1bpp(filename, **kwargs)
+ elif ext == '.png': gfx.export_png_to_1bpp(filename, **kwargs)
+
+def to_2bpp(filename, **kwargs):
+ filename, name, ext = gfx.try_decompress(filename)
+ if ext == '.1bpp': gfx.export_1bpp_to_2bpp(filename, **kwargs)
+ elif ext == '.2bpp': pass
+ elif ext == '.png': gfx.export_png_to_2bpp(filename, **kwargs)
+
+def to_png(filename, **kwargs):
+ filename, name, ext = gfx.try_decompress(filename)
+ if ext == '.1bpp': gfx.export_1bpp_to_png(filename, **kwargs)
+ elif ext == '.2bpp': gfx.export_2bpp_to_png(filename, **kwargs)
+ elif ext == '.png': pass
+
+def compress(filename, **kwargs):
+ data = open(filename, 'rb').read()
+ lz_data = gfx.Compressed(data).output
+ open(filename + '.lz', 'wb').write(bytearray(lz_data))
+
+def decompress(filename, **kwargs):
+ lz_data = open(filename, 'rb').read()
+ data = gfx.Decompressed(lz_data).output
+ name, ext = os.path.splitext(filename)
+ open(name, 'wb').write(bytearray(data))
+
+
+methods = {
+ '2bpp': to_2bpp,
+ '1bpp': to_1bpp,
+ 'png': to_png,
+ 'lz': compress,
+ 'unlz': decompress,
+}
+
+def main(method_name, filenames=None):
+ if filenames is None: filenames = []
+ for filename in filenames:
+ args = filepath_rules(filename)
+ method = methods.get(method_name)
+ if method: method(filename, **args)
+
+def get_args():
+ ap = argparse.ArgumentParser()
+ ap.add_argument('method_name')
+ ap.add_argument('filenames', nargs='*')
+ args = ap.parse_args()
+ return args
+
+if __name__ == '__main__':
+ main(**get_args().__dict__)