Added ability names, basic string decoder

This commit is contained in:
Luke Hubmayer-Werner 2017-04-02 14:37:53 +09:30
parent 2ce03a4011
commit 7922925efe
1 changed files with 38 additions and 3 deletions

View File

@ -109,7 +109,7 @@ class FF5Reader(QMainWindow):
glyph_sprites_jp_small = generate_glyphs(ROM_jp, 0x11F000) glyph_sprites_jp_small = generate_glyphs(ROM_jp, 0x11F000)
glyph_sprites_jp_large = generate_glyphs_large(ROM_jp, 0x03E800) glyph_sprites_jp_large = generate_glyphs_large(ROM_jp, 0x03E800)
glyph_sprites_kanji = generate_glyphs_large(ROM_jp, 0x1BD000, 0x1AA) # Kanji are unchanged in EN version glyph_sprites_kanji = generate_glyphs_large(ROM_jp, 0x1BD000, 0x1AA) # Kanji are unchanged in EN version
#glyph_sprites_jp_dialogue = {i:v for i, v in chain(enumerate(glyph_sprites_jp_large[0x20:0xEB]), enumerate(glyph_sprites_kanji, 0x1E00))}
global zone_names global zone_names
zone_names = make_string_img_list(0x107000, 2, 0x100, start_str=0x270000, start_jp_str=0x107200, indirect=True, large=True) zone_names = make_string_img_list(0x107000, 2, 0x100, start_str=0x270000, start_jp_str=0x107200, indirect=True, large=True)
items = make_string_img_list(0x111380, 9, 256) items = make_string_img_list(0x111380, 9, 256)
@ -117,6 +117,8 @@ class FF5Reader(QMainWindow):
more_magics = make_string_img_list(0x111E8A, 9, 73) more_magics = make_string_img_list(0x111E8A, 9, 73)
enemy_names = make_string_img_list(0x200050, 10, 0x180, 0x105C00, 8) enemy_names = make_string_img_list(0x200050, 10, 0x180, 0x105C00, 8)
job_names = make_string_img_list(0x115600, 8, 22) job_names = make_string_img_list(0x115600, 8, 22)
ability_names = make_string_img_list(0x116200, 8, 33)
battle_commands = make_string_img_list(0x201150, 7, 0x60, 0x115800, 5)
dialogue = make_string_img_list(0x2013F0, 3, 0x900, start_jp=0x082220, len_jp=2, start_str=0x0, start_jp_str=0x0A0000, indirect=True, large=True, macros_en=const.Dialogue_Macros_EN, macros_jp=const.Dialogue_Macros_JP) dialogue = make_string_img_list(0x2013F0, 3, 0x900, start_jp=0x082220, len_jp=2, start_str=0x0, start_jp_str=0x0A0000, indirect=True, large=True, macros_en=const.Dialogue_Macros_EN, macros_jp=const.Dialogue_Macros_JP)
zone_structure = [("NPC Layer", 2, None), zone_structure = [("NPC Layer", 2, None),
@ -226,30 +228,61 @@ class FF5Reader(QMainWindow):
strings_tab.addTab(make_table(imglist_headers, more_magics, row_labels=False), "More Magics") strings_tab.addTab(make_table(imglist_headers, more_magics, row_labels=False), "More Magics")
strings_tab.addTab(make_table(imglist_headers, enemy_names, row_labels=False), "Enemy Names") strings_tab.addTab(make_table(imglist_headers, enemy_names, row_labels=False), "Enemy Names")
strings_tab.addTab(make_table(imglist_headers, job_names, row_labels=False), "Job Names") strings_tab.addTab(make_table(imglist_headers, job_names, row_labels=False), "Job Names")
strings_tab.addTab(make_table(imglist_headers, ability_names, row_labels=False), "Ability Names")
strings_tab.addTab(make_table(imglist_headers, battle_commands, row_labels=False), "Battle Commands")
strings_tab.addTab(make_table(imglist_headers, zone_names, True, scale=1), "Zone Names") strings_tab.addTab(make_table(imglist_headers, zone_names, True, scale=1), "Zone Names")
strings_tab.addTab(make_table(imglist_headers+['JP address'], dialogue, scale=1), "Dialogue") strings_tab.addTab(make_table(imglist_headers+['JP address'], dialogue, scale=1), "Dialogue")
self.string_decoder = QWidget()
self.decoder_input = QLineEdit()
self.decoder_input.returnPressed.connect(self._string_decode)
self.decoder_layout = QVBoxLayout()
self.decoder_layout.addWidget(self.decoder_input)
self.string_decoder.setLayout(self.decoder_layout)
strings_tab.addTab(self.string_decoder, "String Decoder")
layout = QHBoxLayout() layout = QHBoxLayout()
layout.addWidget(self.tabwidget) layout.addWidget(self.tabwidget)
self.main_widget = QWidget(self) self.main_widget = QWidget(self)
self.main_widget.setLayout(layout) self.main_widget.setLayout(layout)
self.main_widget.setMinimumSize(800,600)
self.setCentralWidget(self.main_widget) self.setCentralWidget(self.main_widget)
self.show() self.show()
def _string_decode(self):
string = ''.join(self.decoder_input.text().split())
if len(string) % 1:
string += '0'
bytelist = [int(string[i:i+2], 16) for i in range(0, len(string), 2)]
tups = make_string_img_small(bytes(bytelist))
print(tups[0])
img = QLabel()
img.setPixmap(tups[1])
self.decoder_layout.addWidget(img)
self.decoder_input.setText('')
class Canvas: class Canvas:
def __init__(self, rows, columns, color=bg_trans): def __init__(self, rows, columns, color=bg_trans):
self.image = QImage(8*rows, 8*columns, QImage.Format_ARGB32_Premultiplied) self.image = QImage(8*rows, 8*columns, QImage.Format_ARGB32_Premultiplied)
self.image.fill(color) self.image.fill(color)
self.painter = QtGui.QPainter(self.image) self.painter = QtGui.QPainter(self.image)
self.max_x = 1
self.max_y = 1
def __del__(self): def __del__(self):
del self.painter del self.painter
def draw_pixmap(self, row, column, pixmap): def draw_pixmap(self, row, column, pixmap):
self.painter.drawPixmap(row*8, column*8, pixmap) self.painter.drawPixmap(row*8, column*8, pixmap)
if row > self.max_x:
self.max_x = row
if column > self.max_y:
self.max_y = column
def pixmap(self): def pixmap(self, trim=False):
if trim:
return QPixmap.fromImage(self.image.copy(0, 0, self.max_x*8+8, self.max_y*8+8))
return QPixmap.fromImage(self.image) return QPixmap.fromImage(self.image)
def parse_struct(rom, offset, structure): def parse_struct(rom, offset, structure):
@ -273,6 +306,7 @@ def make_enemy_sprites(rom):
pal_offset = ((((rom[0x14B182+e_id]&0x03)<<8)| rom[0x14B183+e_id]) << 4) + 0x0ED000 # For whatever reason this is big endian pal_offset = ((((rom[0x14B182+e_id]&0x03)<<8)| rom[0x14B183+e_id]) << 4) + 0x0ED000 # For whatever reason this is big endian
pal_size = 16 if triplane else 32 pal_size = 16 if triplane else 32
palette = generate_palette(rom, pal_offset, pal_size) palette = generate_palette(rom, pal_offset, pal_size)
palette[0] = 0
layout_id = rom[0x14B184+e_id] layout_id = rom[0x14B184+e_id]
boss_layout = bool(rom[0x14B182+e_id]&0x80) boss_layout = bool(rom[0x14B182+e_id]&0x80)
if boss_layout: if boss_layout:
@ -291,7 +325,7 @@ def make_enemy_sprites(rom):
tile_offset += bytes_per_tile tile_offset += bytes_per_tile
# TODO: Shadow stuff # TODO: Shadow stuff
sprites.append(sprite.pixmap()) sprites.append(sprite.pixmap(True))
return sprites return sprites
def make_character_battle_sprites(rom): def make_character_battle_sprites(rom):
@ -527,6 +561,7 @@ def make_pixmap_table(items, cols=16, scale=4):
item = items[i] item = items[i]
lab = QLabel() lab = QLabel()
lab.setPixmap(item.scaled(item.size() * scale)) lab.setPixmap(item.scaled(item.size() * scale))
lab.setAlignment(QtCore.Qt.AlignCenter)
table.setCellWidget(i // cols, i % cols, lab) table.setCellWidget(i // cols, i % cols, lab)
table_size_to_contents(table) table_size_to_contents(table)
return table return table