ref: bd6a98531753805fda06f1261a99ed36ff20adbc
parent: 7da503ac3385335bb9fa57f1fbdaaec34b9ef1f5
parent: 78ee534e25fc7ba78469e8d8243afeb3bd14a1a3
author: Bryan Bishop <[email protected]>
date: Tue Jun 25 19:48:44 EDT 2013
Merge branch 'gfx-fixes-again' into master. Various whitespace and formatting changes.
--- a/.gitignore
+++ b/.gitignore
@@ -37,3 +37,5 @@
# some users are dumping png.py into extras/
extras/png.py
+
+*$py.class
--- a/extras/gfx.py
+++ b/extras/gfx.py
@@ -27,23 +27,23 @@
else: raise
-def hex_dump(input, debug = True):
+def hex_dump(input, debug=True):
"""
Display hex dump in rows of 16 bytes.
"""
-
+
dump = ''
output = ''
stream = ''
address = 0x00
margin = 2 + len(hex(len(input))[2:])
-
+
# dump
for byte in input:
cool = hex(byte)[2:].zfill(2)
dump += cool + ' '
if debug: stream += cool
-
+
# convenient for testing quick edits in bgb
if debug: output += stream + '\n'
@@ -52,17 +52,16 @@
chars_per_byte = 3 # '__ '
chars_per_line = bytes_per_line * chars_per_byte
num_lines = int(ceil(float(len(dump)) / float(chars_per_line)))
-
+
# top
# margin
for char in range(margin):
output += ' '
- #
for byte in range(bytes_per_line):
output += hex(byte)[2:].zfill(2) + ' '
output = output[:-1] # last space
-
+
# print hex
for line in range(num_lines):
# address
@@ -72,7 +71,7 @@
end = chars_per_line + start - 1 # ignore last space
output += dump[start:end]
address += 0x10
-
+
return output
@@ -83,7 +82,7 @@
tiles = []
tile = []
bytes_per_tile = 16
-
+
cur_byte = 0
for byte in image:
# build tile
@@ -113,7 +112,7 @@
"""
Transpose a tile arrangement along line y=x.
"""
-
+
# horizontal <-> vertical
# 00 01 02 03 04 05 00 06 0c 12 18 1e
# 06 07 08 09 0a 0b 01 07 0d 13 19 1f
@@ -122,7 +121,7 @@
# 18 19 1a 1b 1c 1d 04 0a 10 16 1c 22
# 1e 1f 20 21 22 23 05 0b 11 17 1d 23
# etc
-
+
flipped = []
t = 0 # which tile we're on
w = int(sqrt(len(tiles))) # assume square image
@@ -196,18 +195,18 @@
class Compressed:
-
+
"""
Compress 2bpp data.
"""
-
- def __init__(self, image = None, mode = 'horiz', size = None):
+
+ def __init__(self, image=None, mode='horiz', size=None):
assert image, 'need something to compress!'
image = list(image)
self.image = image
self.pic = []
self.animtiles = []
-
+
# only transpose pic (animtiles were never transposed in decompression)
if size != None:
for byte in range((size*size)*16):
@@ -221,7 +220,7 @@
self.tiles = get_tiles(self.pic)
self.tiles = transpose(self.tiles)
self.pic = connect(self.tiles)
-
+
self.image = self.pic + self.animtiles
self.end = len(self.image)
@@ -326,15 +325,15 @@
def scanRepeats(self):
"""
Works, but doesn't do flipped/reversed streams yet.
-
+
This takes up most of the compress time and only saves a few bytes
it might be more feasible to exclude it entirely.
"""
-
+
self.repeats = []
self.flips = []
self.reverses = []
-
+
# make a 5-letter word list of the sequence
letters = 5 # how many bytes it costs to use a repeat over a literal
# any shorter and it's not worth the trouble
@@ -345,7 +344,7 @@
for j in range(letters):
word.append( ord(self.image[i+j]) )
words.append((word, i))
-
+
zeros = []
for zero in range(letters):
zeros.append( 0 )
@@ -405,13 +404,13 @@
else: # no more overlaps
buffer.append(match)
else: # last match, so there's nothing to check
- buffer.append(match)
+ buffer.append(match)
matches = buffer
# remove alternating sequences
buffer = []
for match in matches:
- for i in range(6 if letters > 6 else letters):
+ for i in range(6 if letters > 6 else letters):
if match[0][i] != match[0][i&1]:
buffer.append(match)
break
@@ -422,7 +421,7 @@
def doRepeats(self):
"""doesn't output the right values yet"""
-
+
unusedrepeats = []
for repeat in self.repeats:
if self.address >= repeat[2]:
@@ -598,7 +597,7 @@
data can be fed in from rom if [start] is specified
"""
- def __init__(self, lz = None, mode = None, size = None, start = 0):
+ def __init__(self, lz=None, mode=None, size=None, start=0):
# todo: play nice with Compressed
assert lz, 'need something to compress!'
@@ -734,7 +733,7 @@
def doFlip(self):
"""
Repeat flipped bytes from 2bpp output.
-
+
eg 11100100 -> 00100111
quat 3 2 1 0 -> 0 2 1 3
"""
@@ -831,7 +830,7 @@
num_unowns = 26
unown_dex = 201
-def decompress_monster_by_id(id = 0, type = front):
+def decompress_monster_by_id(id=0, type=front):
# no unowns here
if id + 1 == unown_dex: return None
# get size
@@ -847,7 +846,7 @@
monster = Decompressed(rom, 'vert', size, address)
return monster
-def decompress_monsters(type = front):
+def decompress_monsters(type=front):
for id in range(num_monsters):
# decompress
monster = decompress_monster_by_id(id, type)
@@ -865,7 +864,7 @@
to_file(folder+filename, monster.pic)
-def decompress_unown_by_id(letter, type = front):
+def decompress_unown_by_id(letter, type=front):
# get size
if type == front:
size = sizes[unown_dex-1]
@@ -879,7 +878,7 @@
unown = Decompressed(rom, 'vert', size, address)
return unown
-def decompress_unowns(type = front):
+def decompress_unowns(type=front):
for letter in range(num_unowns):
# decompress
unown = decompress_unown_by_id(letter, type)
@@ -993,7 +992,7 @@
gfx = Decompressed( rom, mode, None, address )
to_file(filename, gfx.output)
-def decompress_all(debug = False):
+def decompress_all(debug=False):
"""
Decompress all known compressed data in baserom.
"""
@@ -1028,7 +1027,7 @@
return
-def decompress_from_address(address, mode='horiz', filename = 'de.2bpp', size = None):
+def decompress_from_address(address, mode='horiz', filename='de.2bpp', size=None):
"""
Write decompressed data from an address to a 2bpp file.
"""
@@ -1036,7 +1035,7 @@
to_file(filename, image.pic)
-def decompress_file(filein, fileout, mode = 'horiz', size = None):
+def decompress_file(filein, fileout, mode='horiz', size=None):
f = open(filein, 'rb')
image = f.read()
f.close()
@@ -1046,7 +1045,7 @@
to_file(fileout, de.pic)
-def compress_file(filein, fileout, mode = 'horiz'):
+def compress_file(filein, fileout, mode='horiz'):
f = open(filein, 'rb')
image = f.read()
f.close()
@@ -1099,7 +1098,7 @@
blue = word & 0b11111
return (red, green, blue)
-def grab_palettes(address, length = 0x80):
+def grab_palettes(address, length=0x80):
output = ''
for word in range(length/2):
color = ord(rom[address+1])*0x100 + ord(rom[address])
@@ -1228,7 +1227,7 @@
blue = word & 0b11111
alpha = 255
return ((red<<3)+0b100, (green<<3)+0b100, (blue<<3)+0b100, alpha)
-
+
def rgb_to_dmg(color):
word = (color['r'] / 8)
word += (color['g'] / 8) << 5
@@ -1556,8 +1555,8 @@
def dump_tileset_pngs():
"""
- Convert .lz format tilesets into .png format tilesets.
-
+ Convert .lz format tilesets into .png format tilesets.
+
Also, leaves a bunch of wonderful .2bpp files everywhere for your amusement.
"""
for tileset_id in range(37):
@@ -1581,7 +1580,7 @@
def expand_pic_palettes():
"""
Add white and black to palette files with fewer than 4 colors.
-
+
Pokemon Crystal only defines two colors for a pic palette to
save space, filling in black/white at runtime.
Instead of managing palette files of varying length, black
@@ -1601,7 +1600,7 @@
if __name__ == "__main__":
debug = False
-
+
argv = [None] * 5
for i, arg in enumerate(sys.argv):
argv[i] = arg
@@ -1667,7 +1666,7 @@
filein = argv[2]
fileout = argv[3]
compress_file(filein, fileout)
-
+
elif argv[1] == '2bpp-to-png':
to_png(argv[2])
--- a/extras/vba.py
+++ b/extras/vba.py
@@ -119,9 +119,9 @@
def _check_java_library_path():
"""
- Returns the value of java.library.path.
-
- The vba-clojure library must be compiled
+ Returns the value of java.library.path.
+
+ The vba-clojure library must be compiled
and linked from this location.
"""
return System.getProperty("java.library.path")
@@ -159,8 +159,8 @@
def button_combiner(buttons):
"""
- Combines multiple button presses into an integer.
-
+ Combines multiple button presses into an integer.
+
This is used when sending a keypress to the emulator.
"""
result = 0
@@ -196,8 +196,8 @@
def load_rom(path=None):
"""
- Starts the emulator with a certain ROM.
-
+ Starts the emulator with a certain ROM.
+
Defaults to rom_path if no parameters are given.
"""
if path == None:
@@ -215,8 +215,8 @@
def shutdown():
"""
- Stops the emulator. Closes the window.
-
+ Stops the emulator. Closes the window.
+
The "opposite" of this is the load_rom function.
"""
Gb.shutdown()
@@ -251,8 +251,8 @@
def _create_byte_buffer(data):
"""
- Converts data into a ByteBuffer.
-
+ Converts data into a ByteBuffer.
+
This is useful for interfacing with the Gb class.
"""
buf = ByteBuffer.allocateDirect(len(data))
@@ -266,11 +266,11 @@
def set_state(state, do_step=False):
"""
- Injects the given state into the emulator.
-
- Use do_step if you want to call step(), which also allows
- SDL to render the latest frame. Note that the default is to
- not step, and that the screen (if it is enabled) will appear
+ Injects the given state into the emulator.
+
+ Use do_step if you want to call step(), which also allows
+ SDL to render the latest frame. Note that the default is to
+ not step, and that the screen (if it is enabled) will appear
as if it still has the last state loaded. This is normal.
"""
Gb.loadState(_create_byte_buffer(state))
@@ -289,8 +289,8 @@
def save_state(name, state=None, override=False):
"""
- Saves the given state to save_state_path.
-
+ Saves the given state to save_state_path.
+
The file format must be ".sav"
(and this will be appended to your string if necessary).
"""
@@ -313,8 +313,8 @@
def load_state(name):
"""
- Reads a state from file based on name.
-
+ Reads a state from file based on name.
+
Looks in save_state_path for a file
with this name (".sav" is optional).
"""
@@ -340,8 +340,8 @@
def get_root():
"""
- Loads the root state.
-
+ Loads the root state.
+
(Or restarts the emulator and creates a new root state.)
"""
try:
@@ -397,8 +397,8 @@
def set_memory(memory):
"""
- Sets memory in the emulator.
-
+ Sets memory in the emulator.
+
Use get_memory() to retrieve the current state.
"""
Gb.writeMemory(memory)
@@ -405,8 +405,8 @@
def get_pixels():
"""
- Returns a list of pixels on the screen display.
-
+ Returns a list of pixels on the screen display.
+
Broken, probably. Use screenshot() instead.
"""
sys.stderr.write("ERROR: seems to be broken on VBA's end? Good luck. Use"
@@ -418,9 +418,9 @@
def screenshot(filename, literal=False):
"""
- Saves a PNG screenshot to the file at filename.
-
- Use literal if you want to store it in the current directory.
+ Saves a PNG screenshot to the file at filename.
+
+ Use literal if you want to store it in the current directory.
Default is to save it to screenshots/ under the project.
"""
screenshots_path = os.path.join(project_path, "screenshots/")
@@ -453,9 +453,9 @@
def set_memory_at(address, value):
"""
- Sets a byte at a certain address in memory.
-
- This directly sets the memory instead of copying
+ Sets a byte at a certain address in memory.
+
+ This directly sets the memory instead of copying
the memory from the emulator.
"""
Gb.setMemoryAt(address, value)
@@ -462,8 +462,8 @@
def press(buttons, holdsteps=1, aftersteps=1):
"""
- Press a button.
-
+ Press a button.
+
Use steplimit to say for how many steps you want to press
the button (try leaving it at the default, 1).
"""
@@ -483,8 +483,8 @@
def get_buttons():
"""
- Returns the currentButtons[0] value
-
+ Returns the currentButtons[0] value
+
(an integer with bits set for which
buttons are currently pressed).
"""
@@ -773,11 +773,11 @@
@staticmethod
def walk_through_walls():
"""
- Lets the player walk all over the map.
-
- These values are probably reset by some of the map/collision
- functions when you move on to a new location, so this needs
- to be executed each step/tick if continuous walk-through-walls
+ Lets the player walk all over the map.
+
+ These values are probably reset by some of the map/collision
+ functions when you move on to a new location, so this needs
+ to be executed each step/tick if continuous walk-through-walls
is desired.
"""
set_memory_at(0xC2FA, 0)
@@ -793,7 +793,7 @@
def nstep(steplimit=500):
"""
Steps the CPU forward and calls some functions in between each step.
-
+
(For example, to manipulate memory.) This is pretty slow.
"""
for step_counter in range(0, steplimit):
@@ -848,9 +848,9 @@
@staticmethod
def menu_select(id=1):
"""
- Sets the cursor to the given pokemon in the player's party.
-
- This is under Start -> PKMN. This is useful for selecting a
+ Sets the cursor to the given pokemon in the player's party.
+
+ This is under Start -> PKMN. This is useful for selecting a
certain pokemon with fly or another skill.
This probably works on other menus.
@@ -936,8 +936,8 @@
@staticmethod
def get_text():
"""
- Returns alphanumeric text on the screen.
-
+ Returns alphanumeric text on the screen.
+
Other characters will not be shown.
"""
output = ""