Merge branch 'sprites'
This commit is contained in:
@@ -270,6 +270,7 @@ jap_chars.update({
|
||||
0xE1: "ゅ",
|
||||
0xE2: "ょ",
|
||||
0xE3: "ー",
|
||||
0xE9: "ァ",
|
||||
})
|
||||
|
||||
#some of the japanese characters can probably fit into the english table
|
||||
|
@@ -1993,7 +1993,7 @@ movement_command_bases = {
|
||||
0x45: "accelerate_last",
|
||||
0x46: ["step_sleep", ["duration", DecimalParam]],
|
||||
0x47: "step_end",
|
||||
0x49: "hide_person",
|
||||
0x49: "remove_person",
|
||||
|
||||
# do these next two have any params ??
|
||||
0x4C: "teleport_from",
|
||||
@@ -2811,7 +2811,7 @@ pksv_crystal_more = {
|
||||
0x8F: ["ptpriorityjump", ["pointer", ScriptPointerLabelParam]],
|
||||
0x90: ["return"],
|
||||
0x91: ["end"],
|
||||
0x92: ["reloadandreturn"],
|
||||
0x92: ["reloadandreturn", ["which_method", SingleByteParam]],
|
||||
0x93: ["resetfuncs"],
|
||||
0x94: ["pokemart", ["dialog_id", SingleByteParam], ["mart_id", MultiByteParam]], # maybe it should be a pokemark constant id/label?
|
||||
0x95: ["elevator", ["floor_list_pointer", PointerLabelParam]],
|
||||
|
@@ -293,11 +293,8 @@ pksv_crystal = {
|
||||
}
|
||||
|
||||
#these cause the script to end; used in create_command_classes
|
||||
pksv_crystal_more_enders = [0x03, 0x04, 0x05, 0x0C, 0x51, 0x52,
|
||||
0x53, 0x8D, 0x8F, 0x90, 0x91, 0x92,
|
||||
0x9B,
|
||||
0xB2, #maybe?
|
||||
0xCC, #maybe?
|
||||
pksv_crystal_more_enders = [0x03, 0x04, 0x05, 0x0C, 0x51, 0x52, 0x53,
|
||||
0x65, 0x8D, 0x8F, 0x90, 0x91, 0x92, 0x9B,
|
||||
0x9A, # describedecoration
|
||||
]
|
||||
|
||||
|
128
extras/sym.py
128
extras/sym.py
@@ -1,54 +1,100 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# coding: utf-8
|
||||
|
||||
import os
|
||||
import sys
|
||||
import json
|
||||
|
||||
# from crystal import load_rom
|
||||
# from gbz80disasm import load_labels
|
||||
|
||||
|
||||
def make_sym_from_json(filename = '../pokecrystal.sym', j = 'labels.json'):
|
||||
# todo: delete and remake labels.json at runtime
|
||||
with open(filename, 'w') as sym:
|
||||
for label in json.load(open(j)):
|
||||
sym.write('{0:x}:{1:x} {2}\n'.format(label['bank'], label['address']%0x4000 + (0x4000 if label['bank'] else 0), label['label']))
|
||||
|
||||
|
||||
def make_sym_from_mapfile(filename = '../pokecrystal.sym', mapfile = '../mapfile.txt'):
|
||||
# todo: sort label definitions by address
|
||||
|
||||
output = ''
|
||||
# get label definitions
|
||||
with open(mapfile,'r') as map:
|
||||
labels = json.load(open(j))
|
||||
for label in labels:
|
||||
output += '{0:x}:{1:x} {2}\n'.format(label['bank'], label['address'], label['label'])
|
||||
with open(filename, 'w') as sym:
|
||||
sym.write(output)
|
||||
|
||||
|
||||
def make_json_from_mapfile(filename = 'labels.json', mapfile = '../pokecrystal.map'):
|
||||
output = []
|
||||
labels = filter_wram_addresses(read_mapfile(mapfile))
|
||||
with open(filename, 'w') as out:
|
||||
out.write(json.dumps(labels))
|
||||
|
||||
|
||||
def read_mapfile(filename = '../pokecrystal.map'):
|
||||
"""
|
||||
Scrape label addresses from an rgbds mapfile.
|
||||
"""
|
||||
|
||||
labels = []
|
||||
|
||||
with open(filename,'r') as map:
|
||||
lines = map.readlines()
|
||||
for line in lines:
|
||||
# bank #
|
||||
if 'Bank #' in line:
|
||||
cur_bank = int(line.lstrip('Bank #').strip(':\n').strip(' (HOME)'))
|
||||
|
||||
# label definition
|
||||
elif '=' in line:
|
||||
thing = line.split('=')
|
||||
spacing = ' ' * 11 # arbitrary
|
||||
addr = int(thing[0].lstrip(spacing)[1:5],16)
|
||||
|
||||
# rgbds doesn't support wram banks yet,
|
||||
# so this hack is applied instead
|
||||
if addr > 0xbfff: # 0xc000+ (wram only)
|
||||
cur_bank = 0
|
||||
if addr > 0xcfff: # 0xd000+ (wram only)
|
||||
cur_bank = 1
|
||||
|
||||
# convert to sym format (bank:addr label)
|
||||
label = thing[1].strip('\n')
|
||||
output += hex(cur_bank)[2:] + ':' + hex(addr)[2:] + ' ' + label + '\n'
|
||||
|
||||
|
||||
for line in lines:
|
||||
# bank #
|
||||
if 'Bank #' in line:
|
||||
cur_bank = int(line.lstrip('Bank #').strip(':\n').strip(' (HOME)'))
|
||||
|
||||
# label definition
|
||||
elif '=' in line:
|
||||
address, label = line.split('=')
|
||||
address = int(address.lstrip().replace('$','0x'), 16)
|
||||
label = label.strip()
|
||||
|
||||
# rgbds doesn't support ram banks yet
|
||||
bank = cur_bank
|
||||
offset = address
|
||||
if 0x8000 <= address < 0xa000:
|
||||
bank = 0
|
||||
elif 0xa000 <= address < 0xc000:
|
||||
bank = 0
|
||||
elif 0xc000 <= address < 0xd000:
|
||||
bank = 0
|
||||
elif 0xd000 <= address < 0xe000:
|
||||
bank = 0
|
||||
else:
|
||||
offset += (bank * 0x4000 - 0x4000) if bank > 0 else 0
|
||||
|
||||
labels += [{
|
||||
'label': label,
|
||||
'bank': bank,
|
||||
'address': offset,
|
||||
'offset': offset,
|
||||
'local_address': address,
|
||||
}]
|
||||
|
||||
return labels
|
||||
|
||||
def filter_wram_addresses(labels):
|
||||
filtered_labels = []
|
||||
for label in labels:
|
||||
if label['local_address'] < 0x8000:
|
||||
filtered_labels += [label]
|
||||
return filtered_labels
|
||||
|
||||
|
||||
def make_sym_from_mapfile(filename = '../pokecrystal.sym'):
|
||||
# todo: sort label definitions by address
|
||||
|
||||
output = ''
|
||||
labels = read_mapfile()
|
||||
|
||||
# convert to sym format (bank:addr label)
|
||||
for label in labels:
|
||||
output += '%.2x:%.4x %s\n' % (label['bank'], label['address'], label['label'])
|
||||
|
||||
# dump contents to symfile
|
||||
with open(filename, 'w') as sym:
|
||||
sym.write(output)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# default behavior: generate sym file from rgbds mapfile
|
||||
try: make_sym_from_mapfile()
|
||||
# if no mapfile exists, generate from labels.json
|
||||
except: make_sym_from_json()
|
||||
#if os.path.exists('../pokecrystal.sym'):
|
||||
# sys.exit()
|
||||
#elif os.path.exists('../pokecrystal.map'):
|
||||
# make_sym_from_mapfile()
|
||||
#elif os.path.exists('labels.json'):
|
||||
# make_sym_from_json()
|
||||
make_json_from_mapfile()
|
||||
|
||||
|
Reference in New Issue
Block a user