« PDA | メイン | PSP »

2008年01月19日

●こんにゃく おーおー

・PerlMagick必須でもいいですよね?
・サイズ可変式のログは大変なので、4つ固定です。
・名前クリックでボイスリピート。
・既読ジャンプ実装。『次の選択肢まで』ではなく、その話のラストへ飛びます。確認しないので注意
・スクリプト的には約束の日~茜ルートまでいけると思います。検証未完
・タイトルで雨が降りません。虫も鳴きません。日にちも見てません。
・未実装エフェクトはいつかおいおい。エンディング周りが怖いかも。
・イベントシートとかおまけとかもおいおい、出来れば…。
・スタッフロールもどうしよう。
・たまに場面が変わっても立ち絵が残ったままになるかも知れません。
・ONS20070823版での動作を確認してます。というか今年の修正にはまだ手が届いてないだけ。
・テスト版での gloval.sav は削除してください。
・ドキュメント書くのはまた明日に…。
・ロードは見ない振り。

2008年01月14日

●こんにゃく よれよれ

なんとか移動先選択・フラグ分岐処理を実装出来ました。テスト2
これで一応は最後まで進めるはず? 一応=セーブ不能
しかしスクリプトがそろそろ訳分からなくなってきています。
あとはシステム部分だ…。

ちなみにスクリーンショットのキャラチップもそうなんですが、特にシステム用画像などは
Nスクに対応させるために元画像を加工しなければならないことが結構あるので困っています。
PerlMagick ( ImageMagick をPerlで扱うモジュール)用のスクリプトは同梱してますけど、
色々煩雑かもしれません。 # image.pl , /system(画像フォルダ)の上で実行

たとえば上のものでは上下2パターンのチップを7キャラ分横に並べているので、横に7分割した後、
縦も2分割したものを横に繋げています。(これはなくても動作します)

1a2a3a4a5a6a7a
1b2b3b4b5b6b7b みたいなイメージの画像を

1a1b,2a2b,3a3b... と7つの画像へ切り出し・連結

PerlMagickでの処理はこんな感じで?

my $image = Image::Magick->new;
( -e "./system/EventSelectChar.png") or die;
$image->Read("./system/EventSelectChar.png");
my $tate = $image->Get('base-rows');
my $yoko = $image->Get('base-columns');

for ( $i = 0 ; $i <= 6 ; $i++ ) { my $half = $image->Clone(); $half -> Crop( x=>$yoko * $i / 7 , width => $yoko / 7 , y=>$tate * 0 / 2 ,height => $tate / 2 );
my $half2 = $image->Clone(); $half2 -> Crop( x=>$yoko * $i / 7 , width => $yoko / 7 , y=>$tate * 1 / 2 ,height => $tate / 2 );
push(@$half,@$half2); my $p = $half -> Append(stack=>false); $p -> Write("./system/EventSelectChar_$i.png"); }
undef $image;

もっとも各キャラが等間隔じゃないので、よく見ると横にゴミがついてたり。
イベントシート(未実装)の各画像(約80枚が横4列×縦21列で連結)も

$hoge -> Crop( x => $yoko / 4 * ( $i % 4 ) , width => $yoko / 4 , y=>$tate / 21 * int ( $i / 4 ) ,height => $tate / 21 );

と1行(の繰り返し)で切り出せたので凄く便利。

※改めて書くのも非常に言い訳くさいそのものですが、各データはメーカー様の著作物です。
個人的利用の範囲で利用させていただいています。ましょう。

2008年01月09日

●こんにゃく ときたま

大体手順は固まってきたので、以下readme用にちょっとメモ
読み飛ばしてくださいませ。

こんにゃく

#データ展開
masaemonさんの戯画Plug-inを使わせて頂きました。
うちのものでは率が何気にというか普通に高いです。いつもありがとうございます。
私の環境だと音声だけは上手く展開出来なかったので、よそ様のツールにて。
この件でツール作者様への質問はお控え下さい。メーカー様へはもっとダメです。

アーカイブ名でフォルダを作って展開します。
画像は同じくmasaemonさん製 Create GIGA Index でインデックスを作ってから合成出力。
(なんて便利なのでしょう)
アルファブレンドはせずに。デフォルトではPNGに変換して使用しています。
また画像以外のファイル(合成用.fil.ani)は出力不要です。(system.pac 内 ani ファイルは後で使用)

※メッセージウィンドウはそのままだと透過されませんし、下側の画像が繋がって表示されてしまいます。
 気になる方は適宜改造してください。
 参考.私がやった手順
   png2mbmp でNスク形式に変換し、下画像のα部分(右下)をその上へコピーペースト。
   高さを半分にして上部分のみに。α部分の黒を適当な灰色で塗りつぶして終了。
   …直接透過度を編集した方がどう考えても良いです。

/onscripter実行フォルダ
- /face
- /stand
- /system
- /visual
- /bgm
- /se
- /voice
+0.txt
+1.txt
+ONScripter実行用ファイル

#シナリオ変換
script.pac → script フォルダ テスト版は bin フォルダにしてください。まちがいた
config.pac → config フォルダ
system.pac 内 ani ファイル → ani フォルダ
へ展開。同梱の[ aozora.pl ao_data.pm nsc.pl size.txt base0.txt ]と同じフォルダへ配置します。

/hoge(任意)
+aozora.pl , ao_data.pm , nsc.pl , size.txt , base0.txt
- /bin
   +-Effect.bin ... 沙衣里01.bin ...
- /config
   +-BGM.dat ...
- /ani
  +-AutoModeBarButton.ani ...

aozora.pl を実行すると同じ階層に mes , bin_out , data フォルダが作成されます。
次いでそのまま nsc.pl を実行。0.txt 1.txt が作成されます。
あとは環境を揃えて ONScripter にて実行してください。


テスト用に現在出来ているところまでのファイルと今後の予定

もの
todo
・移動先選択実装・フラグ分岐実装 優先度◎
  これは当然最優先で。解析はほぼ済んだのでこれからちまちまNスクへ落とすお仕事へ。
  つまり現状ではプロローグと第1部1話までしか進めません。シナリオ自体は全部変換されていたり。

・タイトル画面 優先度◎
  うんまあ。

・システム 優先度○
  といっても色々ありますが、現状は皆無。右クリックすらありません。当然セーブロードも不可能。
  基本機能を実装した後に、段階的にシステムカスタマイズを進めていく予定です。
  セーブロードのカスタムにもそろそろ挑戦するべきでしょうか…?

・基本エフェクト 優先度○
  何が基本で何が基本じゃないかよく分かりませんけれど。
  未解析のものをプレイと照らし合わせながら。

・拡大エフェクト 優先度?
  draw命令で出来ることはある程度実装済み。ただ台詞を挟むと、特に茜登場シーンはぐちゃぐちゃ…。
  あと頑張れば出来ても、綺麗じゃなかったりスクリプトが肥大化してしまうものは様子見。
  出来ない物は想像で補いましょう。

・アニメーションエフェクト 優先度 ×~○
  現状全て未実装。種類が多いため、今後出来そうなものに絞って個別に実装していこうかと。
  effect.bin と ani ファイルで処理しているようです。ただ解析するより自作した方が早いし楽堕落

・イベントシート 優先度△
  最終的には入れたいなぁ…。

・シナリオサイズ削減 優先度△
  肥大化しています。現状既に7M近く
  移動・拡大を defsub自作命令に落とせば相当減りますが…一度に100近い変数とか管理無理ぽです。
  そうするとあとはもうあまり削るところがなかったり。むしろ増えます。
  でも0821aの本家更新と、新型PSP対応版でかなりメモリ的には余裕が出来ているのでなんとかなる?
  うーん、現金ですみません。ラベル毎読み込みはやはり現実的じゃなかったですよね。


とまあ、ということで、とにかくとりあえず現状進行度49%程度な感じでした。

2008年01月04日

●こんにゃく ぶくぶく

う、ただ単に暴走しているだけだったりします…。すみませんすみません

ともあれなんたら成分も補給したことだし、そろそろ軌道修正しないと。
今日ひがな眺めてみて、こんにゃくのルート・フラグは多分解析出来たような気がします。
ようやく登り始めたところですかね。この果てしなく遠いNスク化への坂を―(蜜柑)

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月19日

●こんにゃく とんとん

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

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

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

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

2007年12月16日

●こんにゃく おりおり

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

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

2007年12月13日

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

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

次は背景関連かな。

| 2 / 4 |