なんかプロペラ機組みたいな、という気分になったのでタミヤの1/72のマスタングを買ってきました。きっかけの一つになったのが「トップガン・マーヴェリック」です。マーヴェリックが趣味でいじってる自家用飛行機がこれなのです。
F-14でもF/A-18でもなく、あさっての方向に影響を受けております。トム・クルーズがノーヘルでそこら辺を乗り回していたバイク(カワサキニンジャH2R)も気になっていますが、まあそれは今回は置いといて。
続きを読む
プログラム、電子工作、動画など、自分で作ったもの
なんかプロペラ機組みたいな、という気分になったのでタミヤの1/72のマスタングを買ってきました。きっかけの一つになったのが「トップガン・マーヴェリック」です。マーヴェリックが趣味でいじってる自家用飛行機がこれなのです。
F-14でもF/A-18でもなく、あさっての方向に影響を受けております。トム・クルーズがノーヘルでそこら辺を乗り回していたバイク(カワサキニンジャH2R)も気になっていますが、まあそれは今回は置いといて。
続きを読む
ハセガワの1/72 F-117 ナイトホークのプラモを組みました。
こんなの。全長30cmくらいあって、けっこうデカいです。なんというか、黒いズワイガニみたいな感じ。
続きを読む
ここ一年半くらいで色々買いました。色々買った店をまとめていきます。
続きを読む
8月はあと、積んであった零式(機動警察パトレイバー)と、駿河屋で買ったEntry Gradeのガンダムを作りました。
零式は最近出たMODEROIDの方じゃなくて、古いバンダイの方ですね。
この辺りからスミ入れは、タミヤのスミ入れ塗料(エナメル塗料)を使い始めました。ちょっとくさいんだけど、ガンダムマーカーより流し込むのが楽しいんですよねえ。
続きを読む
これは、オイルランプの灯りに照らされながら、未来世紀ブラジルのポスターの前でサタデーナイトしているHGガンダム。
続きを読む
去年(2021年)の夏くらいから色々とプラモデルを作っているのです。
最初に作ったのはHGのガンダムのスターターセット。ガンダムマーカーつきのやつ。
本当はEntry Gradeのガンダムで始めたかったんですが、この頃店になかなか置いてなかったんですよね。今は逆にEntry Gradeのガンダムとストライクガンダムばっかり並んでるんだけど。
続きを読む
解析というほど大げさなものではありませんが……
続きを読む
Google colaboratoryは時間経つとファイルや環境が消されてしまうため、自分用に覚え書き。
一応18禁的な内容(文字だけですが)を含むので、若干閲覧注意。
※この記事は2019/04/06現在のものです。Googleの事なのでメニューの名前だとか前提としている環境だとはしょっちゅう変わると思われます
続きを読む
聖闘士星矢に続いて、ポートピアのテキスト部分を抜き出してみました。
ポートピア連続殺人事件のバイナリイメージと、Python3系の実行環境が必要となります。
portopia.pyとかいう名前でコードを保存して、
python portopia.py portopia.nes(バイナリファイル名) |
とかいう感じで実行して下さい。
portopia.nes_dic.txt(辞書ファイル)
portopia.nes.txt(辞書を適応した変換後のテキストファイル)
の2ファイルができあがります。
辞書ファイルにはよく使われる単語(登場人物の名前や証拠品、地名など)とか、言い回し(「あやしい」「いました。」「それいじょうのことは」など)、コマンド名などが収納されていて、テキスト部分の容量を節約するのに一役買っているようです。
単語辞書やテキストエリアの開始/終了アドレスなどは決め打ちで書いてるので、もしROMにバージョン違いがあったら、正常動作しないかもしれません。
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 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | import sys argvs = sys.argv argc = len(argvs) for i, s in enumerate(argvs): print('%d:%s' % (i, s)) if (argc < 2): print('Usage:>python %s [nesfile]' %argvs[0]) quit() str_after = \ '0123456789あいうえおか'\ 'きくけこさしすせそたちつてとなに'\ 'ぬねのはひふへほまみむめもやゆよ'\ 'らりるれろわをんッロハカウゃゅょ'\ 'っべイスタナフホマヤラー゛゜、。'\ '「‥!?・…→↓ヒ#*Aトアンリ' offset = 0x00 def str2dic(dics, string, offset): for i, s in enumerate(string): dics[offset + i] = s dics = {} str2dic(dics, str_after, offset) del dics[0x57] dics[0xfb] = '(間)' dics[0xfd] = '(人/アイテム名)' dics[0xfe] = '\n' dics[0xff] = ' ' kana_dic = { 0x4c:['かきくけこさしすせそたちつてとはひふへほ'\ 'カキクケコサシスセソタチツテトハヒフヘホ',\ 'がぎぐげござじずぜぞだぢづでどばびぶべぼ'\ 'ガギグゲゴザジズゼゾダヂヅデドバビブベボ'], 0x4d:['はひふへほハヒフヘホ', 'ぱぴぷぺぽパピプペポ'] } with open(argvs[1], 'rb') as f: read_data = f.read() #単語辞書の作成 dic_word = {} dic_begin = 0x60 dic_end = 0xea dic_address_from = 0x3e9e dic_address_to = 0x44bd tmp = '' i = dic_begin for c in read_data[dic_address_from:dic_address_to]: if c in kana_dic.keys() and len(tmp) > 0: #濁音・半濁音変換 if tmp[-1] in kana_dic[c][0]: j = kana_dic[c][0].find(tmp[-1]) tmp = tmp[0:-1] + kana_dic[c][1][j] elif c in dics: tmp += dics[c] else: dic_word[i] = tmp i += 1 tmp = '' #単語辞書ファイル出力 with open(argvs[1] + '_dic.txt', 'w') as f: for k, v in dic_word.items(): f.write("%04X[%s]\n" %(k, v)) #単語辞書を変換表に反映 for i in range(dic_begin, dic_end+1): dics[i] = dic_word[i] text_begin = 0xd92 text_end = dic_address_from #素のテキストと辞書の該当単語を変換 with open(argvs[1] + '.txt', 'w') as f: tmp = '' hexs = '' is_bracket = False for i,c in enumerate(read_data[text_begin:text_end]): if (len(tmp) == 0): address = i + text_begin if c in kana_dic.keys() and len(tmp) > 0: #濁音・半濁音変換 if tmp[-1] in kana_dic[c][0]: j = kana_dic[c][0].find(tmp[-1]) tmp = tmp[0:-1] + kana_dic[c][1][j] elif c in dics: hexs += '%02X' % c t = dics[c] # if c in range(dic_begin, dic_end) and c not in range(0xd1,0xea): # t = '{%x:%s}' % (c, dics[c]) tmp += t if '「' in dics[c]: is_bracket = True elif len(tmp) > 1: if is_bracket: tmp += '」' f.write("0x%x\n%s\n%s\n" % (address, hexs, tmp)) tmp = hexs = '' is_bracket = False else: tmp = hexs = '' |
ファミコン版「聖闘士星矢 黄金伝説」のテキスト部分を引っこ抜く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容量を削っているので、この聖闘士星矢のようにベタのテキストデータをそのまま埋めるような贅沢な使い方は珍しいかもしれませんが。
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 = '' |