summaryrefslogtreecommitdiff
path: root/tools/gfx.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/gfx.py')
-rwxr-xr-xtools/gfx.py267
1 files changed, 0 insertions, 267 deletions
diff --git a/tools/gfx.py b/tools/gfx.py
deleted file mode 100755
index a3d95562..00000000
--- a/tools/gfx.py
+++ /dev/null
@@ -1,267 +0,0 @@
-#!/usr/bin/env python2
-# -*- coding: utf-8 -*-
-
-"""Supplementary scripts for graphics conversion."""
-
-import os
-import argparse
-
-from pokemontools import gfx, lz
-
-
-# Graphics with inverted tilemaps that aren't covered by filepath_rules.
-pics = [
- 'gfx/shrink1',
- 'gfx/shrink2',
-]
-
-def recursive_read(filename):
- def recurse(filename_):
- lines = []
- for line in open(filename_):
- if 'include "' in line.lower():
- lines += recurse(line.split('"')[1])
- else:
- lines += [line]
- return lines
- lines = recurse(filename)
- return ''.join(lines)
-
-base_stats = None
-def get_base_stats():
- global base_stats
- if not base_stats:
- base_stats = recursive_read('data/base_stats.asm')
- return base_stats
-
-def get_pokemon_dimensions(path):
- try:
- byte = bytearray(open(path, 'rb').read())[0]
- width = byte & 0xf
- height = (byte >> 8) & 0xf
- return width, height
- except:
- return None
-
-
-def get_animation_frames(path=None, w=7, h=7, bitmask_path=None, frame_path=None):
- """Retrieve animation frame tilemaps from generated frame/bitmask data."""
- if not path:
- path = bitmask_path
- if not path:
- path = frame_path
- if not path:
- raise Exception("need at least one of path, bitmask_path or frame_path")
-
- if not bitmask_path:
- bitmask_path = os.path.join(os.path.split(path)[0], 'bitmask.asm')
- if not frame_path:
- frame_path = os.path.join(os.path.split(path)[0], 'frames.asm')
- bitmask_lines = open(bitmask_path).readlines()
- frame_lines = open(frame_path).readlines()
-
- bitmask_length = w * h
-
- bitmasks = []
- bitmask = []
- for line in bitmask_lines:
- if '\tdb ' in line:
- value = line.split('\tdb ')[1].strip().replace('%', '0b')
- value = int(value, 0)
- #print line.strip(), value, len(bitmasks), len(bitmask)
- for bit in xrange(8):
- bitmask += [(value >> bit) & 1]
- if len(bitmask) >= bitmask_length:
- bitmasks += [bitmask]
- bitmask = []
- break
- if bitmask:
- bitmasks += [bitmask]
-
- frames = []
- frame_labels = []
- i = 0
- for line in frame_lines:
- if '\tdw ' in line:
- frame_labels += [line.split('\tdw ')[1].strip()]
- else:
- for part in line.split():
- part = part.strip()
- if part in frame_labels:
- frames += [(part, i)]
- i += 1
-
- results = []
-
- for label, i in frames:
- result = []
-
- # get the bitmask and tile ids for each frame
- # don't care if we read past bounds, so just read the rest of the file
- values = []
- for line in frame_lines[i:]:
- if '\tdb ' in line:
- values += line.split('\tdb ')[1].split(';')[0].split(',')
-
- #print bitmasks
- #print values[0]
- #print int(values[0].replace('$', '0x'), 0)
- bitmask = bitmasks[int(values[0].replace('$', '0x'), 0)]
- tiles = values[1:]
- k = 0
- j = 0
- for bit in bitmask:
- if bit:
- result += [int(tiles[k].replace('$', '0x'), 0)]
- k += 1
- else:
- result += [j]
- j += 1
-
- results += [result]
-
- return results
-
-def get_animated_graphics(path, w=7, h=7, bitmask_path=None, frame_path=None):
- frames = get_animation_frames(path, w, h, bitmask_path, frame_path)
- new_path = path.replace('.animated.2bpp', '.2bpp')
- tiles = gfx.get_tiles(bytearray(open(path, 'rb').read()))
- new_tiles = tiles[:w * h]
- for frame in frames:
- for tile in frame:
- new_tiles += [tiles[tile]]
- new_graphic = gfx.connect(new_tiles)
- print new_path, list(new_graphic)
- open(new_path, 'wb').write(bytearray(new_graphic))
- return new_path
-
-def filepath_rules(filepath):
- """Infer attributes of certain graphics by their location in the filesystem."""
- args = {}
-
- filedir, filename = os.path.split(filepath)
- if filedir.startswith('./'):
- filedir = filedir[2:]
-
- name, ext = os.path.splitext(filename)
- if ext == '.lz':
- name, ext = os.path.splitext(name)
-
- pokemon_name = ''
-
- if 'gfx/pokemon/' in filedir:
- pokemon_name = filedir.split('/')[-1]
- if pokemon_name.startswith('unown_'):
- index = filedir.find(pokemon_name)
- if index != -1:
- filedir = filedir[:index + len('unown')] + filedir[index + len('unown_a'):]
- if name == 'front' or name == 'front.animated':
- 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, 'normal.pal')
- args['pic'] = True
-
- elif 'gfx/trainers' in filedir:
- args['pic'] = True
-
- elif os.path.join(filedir, name) in pics:
- args['pic'] = True
-
- elif filedir == 'gfx/tilesets':
- args['tileset'] = True
-
- if args.get('pal_file'):
- if os.path.exists(args['pal_file']):
- args['palout'] = args['pal_file']
- else:
- del 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
- elif ext == '.2bpp':
- if pokemon_name and name == 'front' or name == 'front.animated':
- w, h = get_pokemon_dimensions(filepath.replace(ext, '.dimensions')) or (7, 7)
- args['pic_dimensions'] = w, w
- elif pokemon_name and name == 'back':
- args['pic_dimensions'] = 6, 6
- else:
- args['pic_dimensions'] = 7, 7
-
- if args.get('tileset'):
- args['width'] = 128
- return args
-
-
-def to_1bpp(filename, **kwargs):
- name, ext = os.path.splitext(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)
- elif ext == '.lz':
- decompress(filename, **kwargs)
- to_1bpp(name, **kwargs)
-
-def to_2bpp(filename, **kwargs):
- name, ext = os.path.splitext(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)
- elif ext == '.lz':
- decompress(filename, **kwargs)
- to_2bpp(name, **kwargs)
-
-def to_png(filename, **kwargs):
- name, ext = os.path.splitext(filename)
- if ext == '.1bpp': gfx.export_1bpp_to_png(filename, **kwargs)
- elif ext == '.2bpp' and name.endswith('.animated'):
- w, h = kwargs.get('pic_dimensions') or (7, 7)
- new_path = get_animated_graphics(filename, w=w, h=h)
- return to_png(new_path, **kwargs)
- elif ext == '.2bpp': gfx.export_2bpp_to_png(filename, **kwargs)
- elif ext == '.png': pass
- elif ext == '.lz':
- decompress(filename, **kwargs)
- to_png(name, **kwargs)
-
-def compress(filename, **kwargs):
- data = open(filename, 'rb').read()
- lz_data = lz.Compressed(data).output
- open(filename + '.lz', 'wb').write(bytearray(lz_data))
-
-def decompress(filename, **kwargs):
- lz_data = open(filename, 'rb').read()
- data = lz.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__)