mirror of
https://gitlab.com/xCrystal/pokecrystal-board.git
synced 2024-11-16 11:27:33 -08:00
Add a script to convert project-specific graphics.
This is an alternative to terrible hacks like filename metadata, and might combat submodule bloat.
This commit is contained in:
parent
e2c2e20f93
commit
9c4fb6a6a4
11
Makefile
11
Makefile
@ -7,7 +7,7 @@ MD5 := md5sum -c --quiet
|
|||||||
.SECONDEXPANSION:
|
.SECONDEXPANSION:
|
||||||
|
|
||||||
poketools := extras/pokemontools
|
poketools := extras/pokemontools
|
||||||
gfx := $(PYTHON) $(poketools)/gfx.py
|
gfx := $(PYTHON) gfx.py
|
||||||
includes := $(PYTHON) $(poketools)/scan_includes.py
|
includes := $(PYTHON) $(poketools)/scan_includes.py
|
||||||
|
|
||||||
|
|
||||||
@ -79,12 +79,13 @@ pngs:
|
|||||||
find . -iname "*.[12]bpp" -exec touch {} +
|
find . -iname "*.[12]bpp" -exec touch {} +
|
||||||
find . -iname "*.lz" -exec touch {} +
|
find . -iname "*.lz" -exec touch {} +
|
||||||
|
|
||||||
%.2bpp: %.png ; @$(gfx) 2bpp $<
|
%.2bpp: %.png ; $(gfx) 2bpp $<
|
||||||
%.1bpp: %.png ; @$(gfx) 1bpp $<
|
%.1bpp: %.png ; $(gfx) 1bpp $<
|
||||||
%.lz: % ; @$(gfx) lz $<
|
%.lz: % ; $(gfx) lz $<
|
||||||
|
|
||||||
|
|
||||||
%.pal: ;
|
%.pal: %.2bpp ;
|
||||||
|
gfx/pics/%/normal.pal gfx/pics/%/bitmask.asm gfx/pics/%/frames.asm: gfx/pics/%/front.2bpp ;
|
||||||
%.bin: ;
|
%.bin: ;
|
||||||
%.blk: ;
|
%.blk: ;
|
||||||
%.tilemap: ;
|
%.tilemap: ;
|
||||||
|
2
extras
2
extras
@ -1 +1 @@
|
|||||||
Subproject commit 46492bd9075313a52622cc585fe7b2ca404cbdcd
|
Subproject commit bf76a6b84a2f57edbcd01d6b2841cb813b2afce4
|
101
gfx.py
Normal file
101
gfx.py
Normal file
@ -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__)
|
Loading…
Reference in New Issue
Block a user