久々にハック、というかデータ解析した。リバースエンジニアリングとも言う。面白いけど疲れるね。
モノはベクトル形式ASCIIフォントのファイルである。1書体くらいなら自分で描こうかとも思ったのだが14書体もあるとちょっとね。あと、これから解析するのだが漢字フォントもあり、流石にこれは描けない。
って事で既に存在するモノをコッソリ使うために解析したワケやね。ちなみに上司にはTrueTypeフォントをVFlibというライブラリ経由で使う方法も提示してあるので、どちらの方式で行くかは上任せ。で、現状「コッソリ」で行ってくれだって(笑)。TrueTypeフォント使う方式だと字体が違っちゃうから互換性に問題が出るからねぇ…。ま、後は野となれ山となれ(笑)。
解析は歳のせいか4日間ほどかかった。時間にして12時間くらい(いかに1日のうち遊んでる時間が多いかバレるな)。今回はその記録だ。
解析のヒントになる情報は…
このテのデータは普通頭に各データへのインデックスがあってその後ろにデータ本体が来る。って事でデータのHEXダンプを見ると、$1C00の前後でアキラカに雰囲気が異なる。ちなみに$1C00を14で割ると$0200、つまり512だ。ここから1書体ぶんのインデックスレコードが512バイトと判断。また、HEXダンプの見た目(重要(笑))から1要素はダブルワードデータ(4バイト長)と判断した。つまり128ダブルワードだ。
ってな事で128ダブルワード×14書体ぶん読んで内容を見る。ちなみにそのデータ形式はこれまた見た目でエンディアンが実行環境のモノと異なる雰囲気だったので変換しつつ読む。すると頭の方にいくつか謎の数値があり、以降33ダブルワードまで内容は0だ。34からはそれなりに値が詰っている。
ここでおもむろに128−33を計算してみよう。答えは95だ。そう。1書体当りの文字数に合致する。次にこう考える。14書体目の最後の文字のインデックスがデータサイズに近ければ、「これはインデックスデータだと胸を張って言えるぜっ!」と。
さっそく該当個所の値を見る。$951Fだ。十進で38,175。ちなみにデータサイズは83,592バイトなんで半分以下の値だ。倍にしても76,350でまだ足りない。しかし、これに$1C00を足してみよう。83,518だ。近い。えへへ。
ってなワケでインデックスから実際のデータ位置を求める式は
インデックス × 2 + $1C00
とした(実際はちょっと違ってた。後述)。
とにかく文字に対するデータ位置が判ったので内容を見る。ここの解析が一番時間がかかったトコロであるし、あまりにも色々試行錯誤したので文章が変になるだろうが気にしないでほしい。
ここで問題なのは、1文字に使用されるベクトルの数なんてまちまちなんで、データ個数が判らん。って事である。ワザワザインデックスが存在するのだから固定長ではないだろう(先頭データがインデックスだという絶対的確証は無いのだが)。とりあえず次の文字のデータまで読む事にしたが、これでは最後の文字のデータ長を求めるのが面倒だ。次の書体の先頭文字との差分だもんね。
ま、その当りはとりあえず無視して。1書体目の空白文字のデータを表示してみる。この時点ではデータ単位がバイトなのかワードなのかダブルワードなのか不明だが、インデックスに2を掛ける必要があるトコロからワード単位で見る。内容は$0000,$0000で、とにかくゼロ。んー。空白文字の次は”!”なんだが、それを見るとソレナリにデータはあるが、ワード単位で見ると余りに値が大きくなる。マニュアルには漢字フォントの外字作成に関する記述があるのだが、その座標範囲は0〜31である。いくらなんでも65535も要らない。で、データはバイト単位で見る事にした。
それで見るとナカナカ良い傾向の座標値が取り出せた。がたまに100いくつとかのデータも出てくる。
ヒント情報のところにも書いたけど、ベクトルデータには座標以外にペンアップ情報も必要だ。何も考えないでデータ構造を妄想すればこれを含めて3バイトで1ベクトルデータか?って事になる。座標で1バイトまるまる使っちまうならそれもアリだが、座標は最大で31だ。つまり5ビットで済む。ってことでとりあえず座標データは下5ビットの値のみ使う事にした。残りのどこかにペンアップ情報が入ってるだろうって事で。
このデータを元に文字を描いてみたが…むぅ(涙)。サイケな線画しか描けませんな…。
色んな文字のデータを比較しているうちに、2ワード目のデータに言葉では言い表せない傾向がある事に気がついた。で、突き詰めていくと2ワード目はどうもデータ長らしい気がする。あとフォントのサンプルを見ると筆記体風のヤツで縦長のがあったりするんで5ビットじゃたりんだろうじゃあ7ビットくらい座標に使ってるかも〜って気がしてきた。
その当りを考慮して表示した座標データを描いてみると、なんと“!”に近いモノが描かれるじゃないですか。わーい。ペンアップのデータはX座標側の8ビット目のようだ。ただ「近い」だけで完璧じゃない。最初の1本のベクトルが明らかに変だし。最後の1本と思われるデータが無い。
なんだかんだで、3ワード目は文字幅の情報と判断した。理由はそのように判断するのが素直そうなので(笑)。で、足りないベクトルデータは余分に次のデータを読むとそこに該当データが存在した。つまり、先に挙げたデータ位置算出式は間違っていたようだ。修正後の式は以下の通り
インデックス × 2 + $1C04
後は元がソレと判らぬように独自形式に変換するだけである。疲れた…。ちなみにインデックス部の頭の数バイトは平均フォント幅やベース、ボトム、センター、トップなどの情報であったようだ。
次は漢字フォントデータの解析が待っている…。
話題はガラっと変わるが、CAPCOMから出ているPlayStation向けRPG「ブレス・オブ・ファイヤIV」に「ジゲンハット」という、いわゆる「かいしんのいちげき」が出やすくなるアイテムがある。そのアイテム説明の欄に「帽子のツバに秘密が…」と書かれていて思わずニヤリである。
知ってる人は知ってると思うが、これはアニメ「ルパンIII世 パート2」にある次元大介の帽子のエピソードが元ネタであろう。曰く、次元は帽子のツバで銃の狙いをつけてるって話だ。ライバルに帽子をメチャメチャにされてヘナヘナな次元がルパンに愚痴るんだよね。
って話を数日前にカミサンにして「見たいぜ!」とか思ってたら、今夜CATV(キッズステーション)で放映するルパンが、まさにその話である。むぅ、楽しみ。
そういえば、この前放送禁止用語の話をカミサンとしていて、「いざり」も放送禁止用語だというのを話した。ちょうど同じくキッズステーションの「新エースをねらえ!」を観ていたので「ひろみが自分のテニスに目覚めるシーンのセリフはどうなるのかのう…」とか話してた2日後くらいのエピソードがソレだった(ちなみに「いざってでも」は無く「はってでも」だけになっていた)。ちなみに原作に本当に「いざってでも」が有ったかは、本を手放してしまったので確認できない。記憶違いかもしれん。所有していたのは中央公論のブ厚い4巻構成のヤツね。
という事で、なんてタイムリーなCATVなんだ(笑)。
ちなみにルパンあと数時間早く放映してくれんかねぇ。「伊賀のカバ丸」の時間帯だと「新エースをねらえ!」と続けて観られて良いのだが。ルパンの「パート3」は別に観ないから今のままでいいよ…。
RPGのアイテムの説明表示にギャグかますの、元祖はなんだろうか?
自分は好きなゲームでもある事から「テイルズ・オブ・ファンタジア」(のスーファミ版)だと思うんだが。
自分も昔テストでプログラム組んだ事がある。これ(itemlist.zip、162KB)だ。
Xキーを押下するとメニューモードになる。カーソルキーで選択カーソルが動くぞ。再Xキー押下で戻る。
こーゆーテストプログラムが何気に転がりまくってる会社の仕事用個人マシンであった(いかに仕事していないかバレる)。
しかし、たまに(笑)仕事にも転用しているぞ。例えばさっき書いたベクトルフォントだが、回転させた座標求める処理はここから発掘したし。