「聖闘士星矢 黄金伝説」のテキストを抜き出すpythonコード

ファミコン版「聖闘士星矢 黄金伝説」のテキスト部分を引っこ抜くpythonのコードを書きました。
実行には「聖闘士星矢 黄金伝説」を引っこ抜いたバイナリファイルと、python3の実行環境が必要です。
Ubuntu Linux14上のpython3.4.3でしかテストしていませんが、ファイル操作をしているだけなので、他の環境でも多分動くでしょう。

以下のコードを”ss.py”とかそんなファイル名で保存して、

python ss.py ss.nes(聖闘士星矢のバイナリファイル名)

と実行すると、”ss.nes.txt”というテキストファイルが出来上がります。

テキストの内容は、
(ROM中の番地)
(該当するバイナリ)
(変換したテキスト)
の3つで1つの組み合わせになっています。


最初の方は意味不明ですが(これはどうやって取り除いたものか……)、

このあたりは解読可能ですね。

6~21行目の変換後文字のマップと、39行目のelif(改行コード)、42行目のelif(多分表情などを変えている制御文字)あたりをいじくれば、他のゲームにも応用が効きます。
もっとも、たいていの場合はもっと制御文字を使ってROM容量を削っているので、この聖闘士星矢のようにベタのテキストデータをそのまま埋めるような贅沢な使い方は珍しいかもしれませんが。

ss.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import sys
 
argvs = sys.argv
argc = len(argvs)
 
str_after = \
'0123456789あいうえおか'\
'きくけこさしすせそたちつてとなに'\
'ぬねのはひふへほまみむめもやゆよ'\
' ■■■らりるれろわをんぁぃぅぇ'\
'ぉっゃゅょアイウエオカキクケコサ'\
'シスセソタチツテトナニヌネノハヒ'\
'フヘホマミムメモヤユヨラリルレロ'\
'ワヲンァィゥェォッャュョ゛゜、ー'\
'?!・‥ABCDEFGHIJKL'\
'MNOPQRSTUVWXYZ/「'\
'」()%×           '\
'がぎぐげござじずぜぞだぢづでどば'\
'びぶべぼぱぴぷぺぽ       '\
'ガギグゲゴザジズゼゾダヂヅデドバ'\
'ビブベボパピプペポ'
 
if (argc < 2):
    print('Usage:>python %s [nesfile]' %argvs[0])
    quit()
 
with open(argvs[1], 'rb') as f:
    read_data = f.read()
 
with open(argvs[1] + '.txt', 'w') as f:
    str = ''
    hexs = ''
    for i,c in enumerate(read_data):
        if c > 0 and c < len(str_after):
            if (len(str) == 0):
                address = i
            hexs += '%02X' % c
            str += str_after[c]
        elif c == 0xfe:
            hexs += '%02X' % c
            str += '\n'
        elif c >= 0xe0 and c <= 0xef:
            hexs += '%02X' % c
            str += hex(c)
        elif len(str) > 5:
            f.write("0x%x" % address + "\n")
            f.write(hexs + "\n")
            hexs = ''
            f.write(str + "\n")
            str = ''
        else:
            hexs = ''
            str = ''

コメントを残す