« 2007年11月 | メイン | 2008年01月 »

2007年12月30日

●PerlでONS バイトコード私見3で正規表現ものの…2

ある程度解析出来たらPerlスクリプトへ。

%0a%07%00%00%00%f4%01%0c%07%00%ec%ff%00%00%f4
%01%0a%08%00%00%00%ff%ff%04%08%00<23>%e6%00%00
%00...

で、太字部分は
『7番の画像を F4 01(500) m秒で EC FF (-20 ※1) だけ移動』
という命令だと解釈したとします。
これを中の数値が変動することを考えて正規表現で表すと

%0c%[0-9a-f][0-9a-f]%00%[0-9a-f][0-9a-f]%[0-9a-f][0-9a-f]%00%00%[0-9a-f][0-9a-f]%[0-9a-f][0-9a-f]※2

ついで前後に区切り記号※3を入れて置換してみる。

$line =~ s/(%0c%[0-9a-f][0-9a-f]%00%[0-9a-f][0-9a-f]%[0-9a-f][0-9a-f]%00%00%[0-9a-f][0-9a-f]%[0-9a-f][0-9a-f])/:$1:/g;

…と進めるわけですが、頭から処理するわけではなく全文に対して置換処理を行っているので
どうしても誤爆が出てしまいます。
例えば短い処理だと %02%[0-9a-f][0-9a-f]%00 だけで画像x番の消去という制御だったりします。
しかしこれを単に s/(%02%[0-9a-f][0-9a-f]%00)/:$1:/g; とすると、
%0c%02%00%00%14%00%00%f4%01 という先ほどの画像移動命令にもマッチし、結果

%0c
%02%00%00
%14%00%00%f4%01

という意味をなさない記述になってしまいます。
そこで正規表現のおまけに言語が付いているPerl※4の本領発揮、
正規表現の先読み・後読み機能を駆使して例外パターンを排除していきます。

詳しくはこちら様を参考に。


先読み (?=pattern)
s/(%02%[0-9a-f][0-9a-f]%00)(?=%02)/:$1:/g;
→ 後に%02がある %02%[0-9a-f][0-9a-f]%00

これを s/(%02%[0-9a-f][0-9a-f]%00)(%02)/:$1:$2/g; としてもそこでは同じ結果ですが、
%02%07%00%02%08%00 の様に連続している場合、次の処理が%08から始まりマッチしません。

否定的先読み (?!pattern)
s/(%02%[0-9a-f][0-9a-f]%00)(?!%02)/:$1:/g;
→ 同様に、後に%02がない同上

(?!%00)%[0-9a-f][0-9a-f] とすると、%00以外の%…となります。
マッチの位置が移動しないことに注意。これに限らず、ゼロ幅の~読みと言います。

後読み (?<=pattern) ※5
s/(?<=%0a)(%02%[0-9a-f][0-9a-f]%00)/:$1:/g;
→ 前に%0aがある %02%[0-9a-f][0-9a-f]%00

否定的後読み (?<!pattern) ※5
s/(?<!%0a)(%02%[0-9a-f][0-9a-f]%00)/:$1:/g;
→ 前に%0aがない %02%[0-9a-f][0-9a-f]%00

あとは、グルーピングによる "or" 処理もよく使います。
%(0a|0c) → %0aか%0cのどちらか
その際は (?:pattern1|pattern2) とすると後方参照が行われないのでPerlに優しいかも。

否定的後読みと組み合わせて
s/(?<!%0a|%0c)(%02%[0-9a-f][0-9a-f]%00)/:$1:/g; としたり。
日本語でおkだと 前に%0aも%0cもない%02…となります。

参考
/(?<=hoge)(?!hoge)(.+?)(?=hoge)/
この場合、『hogeに挟まれたhoge以外の文字列』がマッチして$1に入る


とまあ、バイナリを全文置換していくと畢竟こうした例外的なマッチングが増えるので、
解析がある程度終わった後は nsc.pl ※6 でのNスク化処理をしながら
誤爆で置換されていたりと使われなかった行をデバッグ用ファイルに書き出し、
同時にotbk.pl ※7 へ対処する置換処理を組み込んでやってました。

最終的には制御コード一つに対してこんな感じに(二例ですが)

$line =~ s/(?<!%1f%[0-9A-Fa-f][0-9A-Fa-f])(?<!%1f%[0-9A-Fa-f][0-9A-Fa-f]%[0-9A-Fa-f][0-9A-Fa-f])(?<!(?:%1e|%0a|%0c|%58|%bc|%ee))(%02%0[0-9A-Fa-f]%00)/:$1:/g;
$line =~ s/(?<!(?:%0a|%0c))((?:%07|%06)(?:%00%00%00|%ff%ff%ff|%00%f0%ff|%cc%00%00)(?!%00%00)%[0-9A-Fa-f][0-9A-Fa-f]%[0-9A-Fa-f][0-9A-Fa-f])/:$1:/g;

興味がある人はおとボクコンバータの otbk.pl 内サブルーチン parag ※8を覗いてみてください。
ちなみにアリスマの解析自体は大体終わっているのですが、バイトコードが一新されているので
全処理に対して改めて同様の置換を行う必要があったりあったりします。
気力が沸いたら手を付けようと…。SEVEN.NETを(略

このようにしてバイトコードの整形が終われば(というかほぼ並列ですが)、
後は吉里吉里などと同様に(まあ命令は読めませんが)Nスクへと移植処理をしていきます。

と、こんなあたりでgdgdで読みにくいバイトコード私見終了。
もしもご覧になられて何かしらの参考にして頂けたら望外の極みであります。※9

※1,リトルエンディアンで補数で符号が云々 0xEC - ( 256 - 0xFF ) * 256 = -20
※2,ハッシュでもある"%"はスカラコンテキスト中では評価されません。ほ
※3, @list = split(/:/,$data) で":"を区切りに配列化→改行付きで出力しています。
※4,あるあ…ねーよ
※5,現在の?Perlでは上記参考サイト様とは少し表記が違います。
※6,バイトコード形式のコンバータでは 似非ダンプスクリプトとNスク化スクリプトを分けています。
※7,おとボクの場合、otbk.pl が似非ダンプ、 nsc.pl でNスク化処理を。
※8,paragraphの略と思われる。いまいち実情にあってない。
※9,直訳するとありがとうございました。

2007年12月29日

●PerlでONS バイトコード私見2

続き…の前に。
バイトコードの場合、私は一度似非バイナリダンプ(アドレス無視なので似非)として
一度全バイトを16進数でテキストに落としてから処理をしています。 → かにしのでの似非ダンプスクリプト
当然ながら始めは整形が全くされてないので、解析しながら改行を入れていきます。

例)かにしの
改行前(テキストエディタで途中を折り返し表示)
%00%26%00%00%00%01%03%e6%03%00%00%14%00
%00%00%00%00%03%01%e4%03%00%01%00%00%82
%e8%03%00...
↓
改行後
%00%26%00%00
%00%01%03%e6%03%00%00%14%00%00%00%00
%00%03%01%e4%03%00%01%00%00%82%e8%03%00

こんな感じ。
※しかし"%"はなんなのか? いえ16進表記の"x"の替わりと思ってください…。
 あまり意味はないのですがアルファベット以外で区切りたかったのです。

では昨日の続きでおとボク、とはいえ詳細な手順を書いても自己満足に過ぎないので簡単に。
まずは通しで増えていく数値があったので、そこを頭とみなして区切ってみました。

my $foo = $data;
LABEL:for ( my $i = 0 ; $i <= 65535 ; $i++ ){    #0から
	my $var = sprintf("%04x",$i);       #10進数→16進数に  ex.500→0x01f4
	$var =~ /([0-9A-Fa-f][0-9A-Fa-f])([0-9A-Fa-f][0-9A-Fa-f])/;
	my $num = "\%$2\%$1";            #リトルエンディアンで ex.0x01f4→F4 01
	$foo =~ /(.*?)$num(.*)/ or last LABEL;  # ex.%f4%01 がなければ終了
	my $res = $1;                 #あればそこで区切り
	$foo = $2;                    #残りを次のループへ
	$result .= "$res<$i>";
}

区切った結果、どうもこの通番はメッセージの番号を表しているようだと気づき、次の手がかりに。
メッセージ部分では単純に上から番号を割り振っている様子。
その番号のメッセージが立ち絵ならば、その前後は立ち絵表示のコード、
台詞ならば台詞の…といった具合で進めていきました。
なお 64(100) や F4 01(500) など切りの良い数値は時間や拡大率などで頻出するため要チェック。
16進計算が出来る電卓をディスプレイの隅に置いておくと便利かも。

さてメッセージの箇所が分かったので、実プレイとも照らし合わせながら似非バイナリを整形します。
手動である程度解析・整形が出来たならば、次はPerlで整形用のスクリプトを組んでみる段階へ。ぞく。

(やっぱり等幅フォントが反映されない…orz)

2007年12月28日

●PerlでONS バイトコード私見1

~ 吉里吉里のようにシナリオファイルがそのまま人間に理解出来るタイプではなく、
バイトコードで記述されている場合における私なりの移植方法まとめ ~

※ 素人のざれ言ですと予防線ぺたぺた。用語なんかも割と適当です。
※ 以前にも少し触れましたが、場合別にもう少しまとめてみたく。
※ ちなみに暗号化は展開ツールやメッセージローダ等で既に復号されているとします。
復号、メッセージ抽出についてはnota様の解析補助汎用チェッカー・方法論が多大な参考になると思います。
ここではあくまで復号してメッセージは出たけど、制御コードはそれ以上弄りようがないものが対象。
※ ダンプしたもの、引用の範囲内ということで勘弁願います。


さて、私の場合とっかかりは基本的にバイナリエディタでシナリオファイルを眺めるだけです。
何かしらの法則性を見つけるまでただただ。いや、デバッガとかよう使えないです…。
エディタはフリーのStirlingを使用していますが、眺めるだけなのであまり機能は使ってません。

ここで面倒なのが、元々はバイトコードを上からガリガリ処理する仕様なので
一々制御文ごとに区切りを設けていないものが多いこと。
もしアドレスやら特定の文字列やら番号やらで明確に区切られていると非常に助かります。

例)こんにゃく
01 00 00 (略) 1A 00 00 00 02 00 00 (略) 1A 00 00 00 
03 00 00 (略) 1A 00 00 00 04 …
 
1A 00 00 00 で終了し、次の制御文が通し番号付きで開始している
またメッセージ部分がシナリオスクリプトの中にそのまま記述されている場合は その付近の制御コードなどが比較的楽に推測できます。 分からなくても台詞で実プレイと照らし合わせればいいですしね。
例)Bullet Butlers
05 00 00 45 00 50 00 81 40 83 43 83 93 83 4F 83   ...E.P. イングリ
8A 83 62 83 68 82 CD 88 EA 93 78 82 CD 82 BB 82    ッドは一度はそれ
EA 82 F0 8B 91 82 F1 82 BE 82 AA 81 41 8F 5D 8E    を拒んだが、従者
D2 82 CC 90 E0 93 BE 82 C9 89 9E 82 B6 81 41 82    の説得に応じ、そ
BB 82 CC 90 67 82 F0 90 B9 8C 95 82 C5 8A D1 82    の身を聖剣で貫い
A2 82 BD 81 42 5F 72 06 04 00 01 00 0D 00 73 65    た。_r.......se 
5C 53 45 66 30 30 37 2E 6F 67 76 06 05 00 01 00   \SEf007.ogv..... 
00 00 00 02 0E 00 00 00 01 00 02 00 04 00 00 0C   ................ 
00 65 5C 45 56 48 4F 30 34 2E 6D 67 72 02 01 04   .e\EVHO04.mgr...

06 04 で始まるのが効果音だと推測出来る

問題なのは、特に制御の区切りがなく、そしてメッセージが制御コードと切り分けられているタイプです。

例) おとボク

制御コード部分 (ファイル前半) 00 14 00 00 00 F4 01 0A 06 00 00 00 F4 01 0C 06 ................ 00 EC FF 00 00 F4 01 09 00 23 00 08 0A 09 00 00 .........#...... 00 FF FF 04 09 00 24 00 00 00 00 00 0A 09 00 64 ......$........d 00 F4 01 09 14 25 00 00 26 00 00 27 00 14 28 00 .....%..&..'..(. 00 29 00 08 0A 08 00 00 00 FF FF 04 08 00 2A 00 .)............*. 00 00 00 00 0A 08 00 64 00 F4 01 09 14 2B 00 00 .......d.....+.. 2C 00 14 2D 00 00 2E 00 0A 08 00 00 00 F4 01 14 ,..-............ 2F 00 00 30 00 00 31 00 0A 09 00 00 00 F4 01 02 /..0..1......... 06 00 02 07 00 02 08 00 08 0A 08 00 00 00 FF FF ................
メッセージ部分 (ファイル後半) E9 88 A5 8E 41 82 CD 82 A0 82 AD 82 DC 82 C5 82 挨拶はあくまでも E0 97 44 82 B5 82 AD 81 41 97 44 89 EB 82 C9 81 優しく、優雅に。 42 00 73 74 62 30 30 5F 00 53 54 43 30 30 30 30 .stb00_.STC0000 00 8F 97 90 B6 93 6B 81 75 82 A8 81 63 82 A8 82 .女生徒「お…おは CD 82 E6 82 A4 82 B2 82 B4 82 A2 82 DC 82 B7 81 ようございます、 41 82 A8 8E 6F 82 B3 82 DC 81 76 00 73 74 63 30 お姉さま」.stc0 30 5F 00 53 54 44 30 30 30 30 00 8F 97 90 B6 93 0_.STD0000.女生徒 6B 81 75 82 A8 91 81 82 A4 82 B2 82 B4 82 A2 82 「お早うございま DC 82 B7 81 63 82 A8 8E 6F 82 B3 82 DC 81 63 81 す…お姉さま…… 63 81 76 00 4D 49 5A 30 30 30 30 00 90 90 95 E4 」.MIZ0000.瑞穂

ひたすら謎のバイトコードとひたすらただのテキストがそれぞれ羅列されています。きゅう。続く。

(CSSが上手く行かないので弄り中。ローカルだとちゃんと等幅で表示されるのに)

2007年12月27日

●カメラを買いました

こういうblogなんかやっていると、ついつい色々欲しいと口走ってしまいます。
でも買う買う詐欺はよくありません。

ということで本日ようやくまともに写真が撮れるモノを購入したので、いつかのエントリーその後。

G線上の魔王 → 再延期を見越して予約しなかったという英断。
アリスマチック → りっちゃんルート終了。予想外なキャラでしたがこれもまた。移植関連はまた別に
こんにゃく → 冒頭シーンのみ延々繰り返しプレイ。いい加減まともに進めよう…。
+やるきばこ2 → 貴子さんシナリオの後はひたすらきゃらスタ。現在300位前後をうろちょろしてます。負

これ以外にもお勧めして頂いた物など買いたいのですがなかなか余裕がなくて申し訳もなく。
iPod touch は今回はお見送りして、いずれ出るPPC(PDAorスマートフォン)の方に注力しようかと。
アリスマも動きますし!し~くるさんやポケ妹さまのあれやこれやにも期待ですし!他力本願ですし
あと青山ゆかりゲーとしてお勧めの2本は両方DL購入出来るみたいなので、これは時間を作りたいです。

ちなみにまた最後にちょっとショット。今日中古で見つけたのをゲットです。
完品じゃないのですが、これがもの凄いお買い得でした。

ばばん

(付属品) ○説明書 ○箱 ○UMD ×カメラ
しめて280円也。
おとボク小説はどこに行っても品切れだったのが帰りの駅中本屋に置いてありました。偉いぞJR

…写真は今日別に買った IXY DIGITAL 10 で取りました。

2007年12月19日

●こんにゃく とんとん

前回の続きです。音割れ些少軽減

拡大処理は大体再現できたと思います。
スクリプトでは画面(800x600)における拡大の中心点を指定しているようなので、
表示されている全スプライトに対して

表示先中心x/y座標 = 拡大の中心点 - ( 拡大の中心点 - ( 画像の座標 + 画像サイズ / 2 ) ) * 倍率
で drawsp2 しています。
bgcopy → drawbg で一気にやると処理が連続する際に困ったことに。

これで通常パートの演出関係はある程度終わったのですが、フラグ・ルート関係は依然さっぱり。
まだ進行状態30%という感じです。早い、早すぎるよHerbasさん
optipng等のPNG最適化は試してみたいですが、7時間超か…。

2007年12月16日

●こんにゃく おりおり

冒頭部分。オチはありません。音質悪し
拡大処理どうしよう。

シナリオ進行部分は現在絶賛ノータッチ中

2007年12月13日

●こんにゃく編 その1 進捗たんたん

立ち絵関連の処理はほぼ完了。
簡単にONSへ乗せてみる。

次は背景関連かな。

2007年12月08日

●PerlでONS こんにゃく編 その0 進捗ようよう

と、いうことでアレやアレはのアレ?

シナリオファイルをバイナリエディタで眺めること幾星霜、
ようやっと通常パート(絵・音・文)の目処だけは立ったような感じです。
ただし選択パートとかフラグとかは全然なので、途中で頓挫する可能性が結構あります。

運良く頓挫しないにしても再現すべき処理が多いためいつ終わるのやら。現在移植度10%くらい?
そのためまたメモついでに記事数を稼ぎながらのんびりと進行していこうかと。
時々放置して衝動的に別のものを始める可能性もかなりあります。
実はアレやアレやのアレとか全然関係ないソレも同時進行だったり。
とはいえこっち以上に全然進んでませんが、詰まったらとりあえず次へ

・独り言にしてメモ
多分0x0001260からスクリプト開始。その後は行?番号がついてるのでそこで改行。
バイナリだとどこで分けるかが一番大変なので、こうやって明確に示して貰えると大分楽になる。
その後の処理も1個ずつ潰していけるし。バイトコードの整形全般について一度まとめてみよう。
コードの種別は行のラストっぽい。台詞・効果音・立ち絵・立ち絵消去・背景・立ち絵移動等を確認
シナリオファイル後部メッセージは1から割り当て。台詞・効果音済み
立ち絵、背景、音楽等は config/xxx.dat で定義。コード内の数値で呼び出し。立ち絵・背景済み
ただし重ね合わせは移動処理等がめんどくさいのでmasaemonさんの合成ツールを前提に…。大感謝
あ、音声ファイルがなんだか展開出来ない?西側はやだなぁ
拡大演出はある程度再現出来るかも。
場所選択パートはどうなってるのかな。うん、またにしよう
カスタマイズも頑張らないと。REQUIEMからおとボクへのフィードバックもあるしエンドレス。
何回やっても何回やっても3度目のしょうたが倒せない。勇者のくせになまいきだ。

2007年12月03日

●REQUIEM ~レクイエム~ コンバータ for ONScripter

ONScripter用に『REQUIEM ~レクイエム~』(c)CLOCK UP様 のシナリオを劣化移植するスクリプト

12/3)
えーと…アレやアレはどーしたんだ第二弾?


いえ、作家の綾守竜樹氏が今春お亡くなりになっていたことを今更ながら知りまして
氏がライターを務めたこの作品を衝動買い&衝動移植してしまいました。

18禁ラノベ風小説というアレなジャンルですが、氏の描写力や教養・思想背景には感服することしきり。
ってあと勿論その凄いエロに。
○○生時代に秘密の図書館で寄贈作品を読んでからのファンでしたので、早逝に残念でなりません。
ご冥福をお祈りします。


改めて『REQUIEM』、ハードコア・ミッションスクール恋愛ADVです。異論不可。
ネットで漁ってみると概ねシナリオは好評価(嗜好に大きく左右されます)なのですが
システムが補って逆に不足が出来るというか余って憎さ百倍な感じに酷いとのこと。

ともあれ起動してみる。
→ 重い。固まる。落ちる。2Dなのに酔いそう。セーブデータが消える(らしい)。うーん…。
追悼の意を表して移植を、とかいう以前にまず自分でプレイするために移植する必要があったという。

長くなるので以下箇条書き
・過剰な演出はぶっちぎり。
・データ展開には WESTSIDEお楽しみCD収録ツール推奨となっております。
・ただし一応”アーカイブカッター、のようなもの”が付属。自己責任でご利用下さい。体験版未対応。
 →体験版の解凍ツールをしーくるさんが作ってくださいました。感謝しつつこちらより。
・ノベルモードのバックログ音声調整が一番大変でした。
・でもセーブ・ロードは相変わらずNスクデフォルトです。
・シーン回想はシーン名が付いて親切設計…ほら、最初から100%だし?
・システムカスタマイズ時、PSPで起動後すぐは文章が重なって表示される。
 →texecの後にrepaint で一応は解決。微妙に重くなるかもしれません。おとボクなどでも。
・ちなみに今月『REQUIEM』廉価版発売予定です。いろんな意味で気にしない。
・瀬里香かわいいよ瀬里香、と見せかけてエレーヌ。

req_20071203a.rar(微細修正うp)
12/7 a:ちょこっと修正。本家NScripterでもある程度動く様に?…いかにいい加減か。

おまけ
EXEでGUIな皮を被ったただのPerlスクリプト。起動遅。使途は上出同梱のものと変わりません。
”REQUIEM アーカイブカッター、のようなもの GUI版”