FC2ブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

C#でウディタ用ツールを作ってみた2

生きてます。
ほったらかしですいません><
竜の迷宮の開発もストップ状態です・・・。
「ああしよう、こうしよう」というアイディアはあるのですが、手が動きません・・・。
う~む、この状況はなんとか打破したいところです。

さて、今回もウディタ用ツールの作成をしました。
前々回で紹介したDBアクセサ作成ツールを強化し、DB関連ファイルの入出力もできるようにしました。

ウディタでは複数のDB設定を一括で入出力できませんが、このツールを使えばそれが可能になります。
ウディタのBasicDataフォルダ内にある「project」ファイルを読み込み、入力したいDB設定を追加して再び「project」ファイルに出力すれば、複数のDB設定をウディタのDBに追加することができます。

これでDB関連の操作が少し楽?になる・・・はずです。
ただ、このツールでファイルを書き換えるときは、あらかじめウディタのバックアップを取っておいてくださいね。
データが壊れてしまっても私にはどうすることもできませんので。

ではではノシ

ダウンロードはこちら
スポンサーサイト

ウディタ用ファイルの解析

前回の記事、DB設定ファイルを読み込んで専用のDBアクセサコモンを生成するツールについて、どうやってDB設定ファイルを解析したのか質問がありました。
折角なので、私がDB設定ファイルを解析したときの方法をご紹介します。
これで誰か便利なウディタ用外部ツールをもっとつく(ry

これはあくまで私のやり方です。
他にもっといい方法があるかもしれないので、ここに書いてあることだけを鵜呑みにしないでください。

まず、解析用にDB設定ファイルをいくつか用意します。
ランダムに作るのではなく、比較のために「数値データ1つの場合」「文字列データ1つの場合」「複数のデータ設定がある場合」のパターンで以下のようなDB設定ファイルを用意しました。
data3.pngdata2.pngdata3.png

DB設定ファイルはバイナリ形式で保存されているようなので、そのままメモ帳などで開いてもわけのわからない記号の羅列しか表示されません。
そこで、ファイルの内容をバイナリ形式で表示してくれる「Bz」というツールを使用します。
bynary1.pngbynary2.pngbynary3.png

数値の羅列が表示されるかと思いますが、これがファイルに書き込まれているバイトデータの羅列になります。
8ビットの数値を2桁の16進数値で表示しています。
ここで情報系の用語がちょこっと出てきましたが、これらの意味くらいは知っておくのがベターです。
解析するためには、ビットや進数の知識だけでなく、データがどのようにしてメモリに書き込まれているかといった、ハードに近い知識(C言語でのメモリの読み書きがわかる程度のレベル)が必要になりますので、この時点でちんぷんかんぷんの状態では、残念ながらこのあとの解説を理解するのは難しいかもしれません。


さて、早速解析作業に移ります。

ファイル内容を解析するには、複数のファイルを比較しながら同じ所と違う所を見つけ、どうしてそうなっているのかを考察していきます。

3つのファイルの先頭4バイトはどれも、「B9 22 2D 02」というバイト列が書き込まれています。
これは固定値で、おそらくDB設定ファイルであることを識別するための識別子であると思われます。
こういった固定値はファイルの構造を知る上ではさほど重要ではないので、位置と値だけ押さえておいて他の場所の解析に移っていきます。

先頭の固定値よりもまっさきに目に付くのが、DBタイプ名、DB項目名の羅列かと思います。
どうやら、先頭固定値の少し後にDBタイプ名、さらにその後にDB項目名が番号順に並んで書き込まれているようです。
そして、もう一箇所目に付くのが、青枠で囲った箇所の「06 00 00 00」というバイト列。
DB「テスト4」には6つの項目が定義されており、他に6に関連するようなものがないことから、青枠で囲った箇所には項目の数が書き込まれていると予想されます。(試しに確認すると、テスト1、テスト2の同一箇所には「01 00 00 00」が書き込まれていることがわかります)
name.png
ここで、なぜ項目の数を「06」ではなく「06 00 00 00」と4バイトの列としたか気になるかと思います。
それはプログラミング言語でよく使われる整数型変数は32ビット(=4バイト)の大きさをもっているため、1つの整数を表すのに4バイトの数値が必要となるためです。

さて、ここで1つ気になることがあります。
数値については、今説明したように4バイトの羅列であることがわかっていますが、文字列についてはサイズが可変なので必要なバイト数がわかりません。
「そんなの見れば分かるじゃん!」と思われるかもしれませんが、実際にDB設定ファイルを読み込ませるツールを作ろうとしたとき、ファイルから読み込むのはバイトの配列ですから、文字列がどこから始まってどれだけの文字数があるのかが知りたくなるはずです。
そう考えると、どこかに文字列の大きさを書き込んでいる箇所があるのではないかと予想できます。

すると、うまい具合にDB項目名の羅列に若干の隙間があるのがわかります。
さらによく見ると、隙間の中に数値があるようです。
これを4バイトの整数と考えると、「4バイト数値+文字列」という順番で並んでいることがわかります。
そして、丁度よく4バイト整数の値と、そのあと続く文字列のバイト数が一致するので、この数値は文字列のバイト数を表しているのだと判断できます。
ここで、文字列のバイト列の最後に「00」があることがわかるかと思います。
C言語などでは文字列の最後であることを表すために、「00」の文字コードを文字列バイト列の最後に付加しますので、この最後の「00」は文字列の終端をあらわすコードであると予想されます。
stringlen.png

こう考えると、DB設定ファイルでは文字列のデータは「4バイト数値+文字列」という形式で書き込まれているとも予想することができます。
確認してみると、DBタイプ名もこの形式となっているので、この予想はほぼ確定的です。


以上までの考察で、ファイル先頭の固定値、DB項目数、DBタイプ名、DB項目名がどのようにファイルに書き込まれているのかを解析する事ができました。
これ以上やると記事が物凄い長さになるので割愛しますが、項目のタイプや特殊設定時の設定内容の定義なども同様のやり方で解析できるはずです。

ただ、これらの考察はあくまでも予想です。
いざ解析したファイルを読み書きするツールを作ったとき、この予想が外れることもあります。(DB設定ファイル解析中に一度ありました・・・)
そのときは再度解析しなおし、なぜ違っていたのかを追求していきます。
トライ&エラーの繰り返しです。

地道な作業で大変ですが、ファイルの解析がすすんでくるとだんだん楽しくなってきますので、一度挑戦してみてはいかがでしょうか?

C#でウディタ用ツールを作ってみた

ご無沙汰してます。
ウディロボです。

ブログはほとんど更新してませんが、竜の迷宮の開発はこつこつと進めています。

さて、今回は竜の迷宮からちょっと脱線して、C#でウディタ用のツールを作ってみました。
DB設定ファイル(dbtypeset)からDBのアクセサ用コモンを作成してくれるツールです。

ここでいうアクセサ用コモンとは、DB操作コマンドの代わりにDBのデータを参照・更新するコモンです。
アクセサ用コモンを使用する事で、DBを直接変更している箇所が絞られるので、DBの設定内容変更に対応しやすくなります。
また、DBのデータを加工して使用したい場合、アクセサ用コモンにその処理を追加すればいいので、DB呼び出し側にわざわざ同じ処理を書く必要がなくなります。

作成したツールがこちら↓

20111120.png

ボタンが1つあるだけの物凄くシンプルなツールです。
C#の練習がてら作成したものなので、これ以上凄いのが作れないんですけどね・・・。

使い方は簡単。
ツールにも載ってますが、ボタンを押してDB設定ファイルを選択するだけです。
すると、選択したDB設定ファイルと同じディレクトリにDBアクセサ用のコモンファイルが作成されます。

ですが、これはまだまだ未完成のプロトタイプなので、動作は不完全で制限もあります。
いずれは完成させようと思いますが、これにばかり時間もかけたくないので、適当な所で切り上げるかもしれません。

もし、興味のある方がいらっしゃいましたら、私のアップローダに上げていますので使用してみてください。
http://loda.jp/udelirobo_common/?id=31

では、これにて失礼しますノシ

ランダムダンジョン生成方法アレンジ

ご無沙汰してます。
最近あまりブログを更新してませんでしたので、生存報告を兼ねてひさびさに開発日誌を書きますね。

今回は、ランダムダンジョンの生成処理の改良について考察します。

ランダムダンジョンの生成方法はこのサイトで紹介されていますが、この方法に手を加えてダンジョンのバリエーションを増やそうと思います。

今までのように領域を分割して、その中に部屋を配置するだけだと、領域内に部屋がギッチリと詰まったようなダンジョンになります。
(赤い線が領域の分割線、青い四角が部屋、白い線が道です)
gittiri1.png

そこで、部屋を作らない領域や、他の部屋と道を繋げない領域を挿入することにします。
こうする事で、ダンジョンの形に変化を加えることができます
・・・が、1つ問題があります。

空白領域や孤立した部屋によって、ダンジョン全体が分断してしまい、主人公の初期位置と階段が壁で遮られ、次の階へ進めなくなってしまいます。
bunkatu4.png

そこで、道を連結する部屋どうしの塊を調べ、一番大きな部屋の塊のみを残すようにして、主人公と階段までたどり着けるようにします。
そのようにして作成したダンジョンがこれ。
他の小さな部屋の塊を消去したので、空白部分が大きくなってます。
kurasuta7.png

もちろん、わざと他の部屋の塊を残して、このような細かい部屋を寄せ集めたようなダンジョンにする事ができます。
bunkatu2.png

あとは、隠し部屋を作ってみたり・・・
kakusi4.png


これで、ダンジョンの形にちょっとばかしアレンジを加えることができるようになりました。
まだ未実装ですが、1つの部屋をまるまる大きな迷路としてしまったり、部屋の形を単純な四角ではなく少し変形させたりなどなど、改良アイディアはまだまだあります。
まあ、これは時間のあるときにでも実装しようと思います。

ではでは、これにて失礼。

引越し完了!

旧ブログ(http://blog.goo.ne.jp/udelirobo)からの引越しが完了しました!
まだまだ未整理な部分も多いですが、これから徐々に調整していこうと思います。
プロフィール

ウディロボ

Author:ウディロボ
FC2ブログへようこそ!

カテゴリ
最新記事
最新コメント
最新トラックバック
月別アーカイブ
リンク
検索フォーム
RSSリンクの表示
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。