「Bomber丸World」に関する日記(4)

<前 次>

TEPOLとZTB

デジカメは見つけたんですが使い方がわからず分子模型の写真は取れませんでした。
有機化学のセットだったので金属結晶はほとんど作れないようでした。

今日はNeoMuplのランダム演奏時のスキップ率を実装しました。
それ以外で実装するかどうかは未定です。
もしかしたらオプションで決めるようにするかもしれません。

Luaのほうはというと、変数への代入も案外あっさりできて、ついでにテーブルの新規作成とかも作ってしまって、ガベージコレクションの様子を確認したりもしました。
基本的にLuaでは細かいプログラムをたくさん同時並列的に動かすのでガベージコレクションは何も設定しなくても事実上分散して行われます。
5.1の意味があまりないです。

PVDとかCVDとか

またまた突然ですが学習帳を更新しました。
薄膜の成長様式などについてですよ。
尻切れなのはまあつまらない事情からです。

Luaは、ただいまLuaの変数にC++から代入する簡単な方法を模索しているところですが、スタックの操作でどうやったら変数に値を書き込めるのか、まだ未知の部分があります。

#include &quot;LUA\lua.h&quot; // ClassView によって追加されました。

http://www.water.sannet.ne.jp/sowwa/
の日本語化パッチを5.1.2に使ってなんとか日本語対応できないかと試みていましたが、結果は失敗に終わりました。
やっぱり5.0系列と5.1系列ではそれなりに違いがあるようでした。
一応 http://hammm.dw.land.to/lua/ の日本語化パッチで文字列リテラルの日本語対応(つまり"ソース"を正しく表示できるなど)は可能だったのでしておきました。
変数名はともかく文字列に使えるかどうかは利便性に大きく関わりますからね。

で、ちょっとそれとは別に、lua_Stateの扱いについて考えていました。
ラッパークラスであるCBWLuaに全て管理を任せてLuaに対する操作は全てCBWLua経由で、と思っていたのですが、CBWLuaから実行したプログラムでもどんどんCBWLuaの管轄外のlua_Stateを作ることができてしまうので、CBWLuaではlua_Stateを管理しきれないのです。
つまり、動き始めたのがCBWLuaによるlua_Stateだったとしても、実行するうちに勝手に新しいlua_Stateが作られて、それが実行されてゆくと、CBWLuaによるlua_Stateが実行されているのにもかかわらず実際に動いているのはそれから派生した別のlua_Stateだったりするのです。
これで何が困るかといえば、グローバル環境は親玉(CBWLuaによるlua_State)も子分(派生したlua_State)も共通なのですが、スタックは別々で、今すぐ必要になるデータとかは大抵スタックに積まれているのです。
だから、CBWLuaにlua_Stateを一括管理させていると、子分のスタックが見られなくて、大事なところで親分が何もわからないということになるのです。
だから、スタックに関する部分はLuaAPIを直接使ってもらうことにして、CBWLuaが扱うのはグローバル環境と子分の作成など、どのlua_Stateがやっても同じになる用事だけにしておきました。

それなので、さっそくグローバル環境に関する関数を、ということで、特定の変数の値を得る関数を作ってみました。
ただ単にグローバル変数を得るだけでなく、可変引数を用いて複雑なテーブルの中身なども得られるようにしてみました。
この関数とほぼ同じものをWikiにも掲載しておきました。

で、そんなこんなで色々やってると突然リンカエラーが。
何があったのかと思って調べていたらVC++が勝手にヘッダファイルのインクルードをextern "C"の外に出していることが判明しました(中に入れておかないとエラーが出る)。
IDEって時々余計なことをして見つかりにくいエラーを混入してしまうのが困り者ですね。

TGBBS削除機能

Lua、Bomber丸World上で動かすのに成功しました!
コネコベーダーの動きをコルーチンで制御しています。
実際のプログラムをWiki上にアップしているので是非ご覧ください!

あと、今日はTGBBSの削除機能を実装しました。
ただ、実際に消しているわけではなく削除済みフラグを立てているだけなので後から復活することもできます。

子ルーチン

就職の面接の結果が出ました。
内定、だそうです。

で、Lua、とりあえずコルーチンを動かすことには成功しました。
まだまだLuaの変数を見たりすることができないので本当に意図したとおりに動いているのかはわかりませんが、とりあえずエラーは出ていないようです。

昨日描いていたいずみさんの絵ができました。
一応24歳です。
24歳ですってば!
年齢半分ぐらいに見えるかもしれないけど!!

1180709513.png

いずみさんの絵

Lua、コルーチンを扱うクラスを作りました。
母体となるLuaクラスから作って、コルーチンが終了したら自分で勝手にdeleteします。
そして、コルーチンが無限ループだった利したら母体のLuaクラスの消滅時に一緒に消滅します。
あと、単純にLuaの関数をラップするだけの関数も大量に作ったりしてました。

そして今日は久しぶりに絵も描いていたり。
いずみさんもうすぐ描けそうなんで明日アップします。

lua_Alloc

yaneSDKのメモリ管理にあわせるためにアロケート関数をyaneSDKの機能を使う方法で実装したらエラーが出たので標準のアロケート関数に戻しました。
あとはWikiの内容を充実させながらちょこちょことBomber丸World用のLuaクラスを作っていました。

今日はこの日記PHPで既に書いた日記に対して編集操作を行ったときにタグが無条件でエスケープされてしまうバグを修正しました。
この修正はTGdiaryにも反映するので次の更新はTGdiaryのバージョンアップとなります。

Lua5.1リファレンスマニュアル

う~ん、Luaの、C側での関数リファレンスも見つけたので、うちのWikiの存在意義が半分ぐらいなくなってしまったようです…。
まあ、関連性の深い関数などをすぐに参照できるというのがうちのWikiの強みだったりするし、順を追って発展させていくチュートリアルなどもあればまた存在価値というのは高めていけそうですが。

で、Bomber丸WorldにLuaを組み込むほうもわりとそれなりにでき始めています。
まあ、lua_openしてloadしてcloseするクラスを作ってそれが今のところエラーを起こしていないというところなんですが。

WME

WindowsMediaEncoderをインストールしてみました。
画面の取り込みもできるのでまた再びふにゃさんのプレイ動画を作れそうです。
あれと比べてどの程度よくなるのか、または悪くなるのかはわかりませんが、とりあえず使うだけ使ってみました。
まあ、画質はそれなり、ウィンドウ枠まで録画されるのが鬱陶しいのですが、録画後に長い変換処理がないというのと、音も一応取れているらしいところはよいかもしれません。

Lua組み込みWikiはとりあえずユーザーが使える全ての関数と変数の型と定数のページは作り終えました。
中身はありませんけどね。

Lua組み込みWiki

組み込みはちょっとてこずってます。
Lua言語の文法やら使い方に関してはまあまあわかりやすいんですが、組み込むC側のリファレンスがないのです。
優れたプログラムをLuaで組んでもCから呼び出せなければ意味がないのです。
網羅的に解説しているサイトが全然見当たらないのです。
もういいです。自分で作ります。

Luaを組み込んでみる

MifuminScriptが完成するかどうかの不安もあるので、とりあえずLuaを一度Bomber丸Worldに組み込んでみることにしました。
はむ氏の空想具現化プログラミング(http://hammm.blog21.fc2.com/)にあったS-JISが使えるものを使ってます。
とりあえずライブラリのコンパイルとヘッダファイルのインクルードまではうまくいったようです。
そういえば、Bomber丸Worldに何かフリーフォントでも組み込んで使ってみようかと思ったのですが、再配布可能なものでよさそうなものがなかったので諦めました。

たんたんと

突然ですがふにゃさん更新しました。
これからの追加要素はそれなりに時間がかかりそうなので間が空き過ぎないようにとりあえず現状をアップしたというわけです。

Bomber丸WorldのBGM「山の音楽家」をちょっと思いつきでいじってました。
今までのが曲の進行が淡々としすぎていたため、ノートオンベロシティを編集してメリハリを付けてみたのです。

1180018669.mid

新しいヘッドホン

今日新しいヘッドホンを買ってきました。
これまでに3つ壊れたので今回は丈夫そうなのを選びました。
特に頭にかぶせる部分のプラスチック部品が割れてしまいやすかったので材質重視で、力のかかる部分にあまりプラスチックが使われていないものにしました。

TGBBSの新規スレッド作成処理ができました。
ただし、表示処理がまだできていないためアップはしていません。
表示処理自体はGBBSとほぼ同じにしようと思っています。

Bomber丸Worldのテスト用プログラムをデモ版としてWikiにいくつかアップしました。
できたできたといっていながら、どこまでできたのか周りの人にはわかりにくいので、他の人のマシンで動くかどうかのテストもかねて、みんなに一部分でも見てもらうことにしたのです。
これでおそらくプログラム担当は私一人になるんでしょうね。
あと、このソフトは複数人での開発にしたいため、何らかの形でネットワークでつなげてファイルを常に最新に保つ方法を考えています。

見つかりません。病室は存在しないか、場所を間違えています。

スクリプトのことについてですが、よく考えたらこのスクリプトは任意の位置で一時停止できなければ役に立たないので、途中で止めることが困難なツリー構造から実行する形式は見直す必要があるかもしれません。
そうなればツリーのノード本位な今の設計も根本的に見直す必要があり、今度は大幅な変更が来るかもしれません。

で、今日はスクリプト自体は特に触らなかったので、TGBBSの開発を始めてみました。
ファイル形式などはまだ決まっていませんが、ユーザーから受け取るべきデータはほぼ決まりきっているので、投稿フォームから先に作り始めています。
しかし…フォームの位置がランダムに入れ替わるというのは少し面倒かもしれませんね…。
迷惑書き込み対策になるかどうかも未知数だし…。

Bomber丸Worldの施設の一つとして、病院というものを考えてみました。
元々4と死を結び付けない文化なので、3階と5階の間には4階があって病室になっています。
ただ、死とは関係なく、少しおかしい病室になっています。

大雑把な計画

スクリプト講座、本当は配列について書こうと思っていたのですが、順番が悪いのと、パーサについてうまい考えが浮かんだので、急遽予定を変更してパーサの話にしてしまいました。

で、そのスクリプトを使う予定のBomber丸Worldですが、このままのペースでいくと、社会人になるまでに完成しそうにないので、ちょっとスケジュールを決めて期間内に終わるように考えたいです。
とりあえず7月中にスクリプトを作り上げ、7月末までにゲームとして動くようにして、夏休み期間を利用してテスト版を公開し、プログラムの動作チェックをしてもらえるようにしたいです。
そして翌年2月ごろまでにシナリオなども完成させて、3月末には正式公開できるようにしたいと考えています。
まあ、とてつもなく大雑把な計画ですが、なんとか頑張ってみます。

ぅあ

自作スクリプト言語が暗礁に乗り上げそうだったので昔捨てたLuaについてまた調べてました。
まず、特定の命令を呼び出すには、Luaのassert(loadstring(s))()とCのlua_callを絡めて使えば好きなLuaプログラムをCプログラムから走らせることができそうです。
そして、以前の関数を上書きすることに関しては、変数と全く同じように受け渡しができるため、クラスの継承に似たことも簡単にできてしまうようです。

フェードできたぞ

ふにゃさんのフェードプログラム、実際に組み込んでみると、多少の問題はありましたが無事組み込めました。
ファイルの場所を移動した関係でリビルドしないといけなくなったり、MIDIイベントのステータスバイトにチャンネルが載ってこなかったり、イベントを変更せずにツールを通すにはタイムスタンプを押しなおした上でDMUS_S_REQUEUEを返す必要があったり、そのあたりの細かいところでちょっと詰まってました。
ともかくこれで、眠ったときの曲の切り替えがスムーズになり、またBomber丸Worldに使うことも出来るようになりました。

すこっぷ君ガンバレー!

Bomber丸WorldのBGMのうち、通常戦闘のテーマ1の「たのしいな」を「ガンバレー!」に改題しました。
曲のイメージがかなり活発なので上記2つの曲名はやや違和感があったためです。
あと、「吐瀉物と排泄物」の出だしを変更したり。
嫌な曲名ですね。評判しだいではこちらも改題されるかもしれません。

そうそう、今日はPC98エミュレータをダウンロードして、SuperDepthのオリジナル版をやったんでした。
2番目のボスを倒すところまで行ったのはよかったのですが、その後の海面で機雷にはさまれ身動きが取れないところにビーム攻撃を食らいあっさりゲームオーバーになってしまいました。
あと、間違ってファイルを壊してしまったために遊べなくなったすこっぷ君もベクターからダウンロードしてやってみました。
エミュレータであるためうまくキー操作が伝わらず操作ミス多発でなかなか進みませんが、懐かしくて、そして楽しいです。
これらは是非Windowsにも移植してほしいのですが、SuperDepthは開発者のハードディスクが壊れて開発停止したみたいだし、SCOOPは作者さんが別のゲームのほうに行っちゃってるみたいだし、どうも望みは薄そうです。

1176562480.png

CControlCheckTool

ふにゃさんのBGMのフェード処理の改良のためIDirectMusicToolをいじったりしてました。
3月14日に書いたことの実装であり、今のところセグメントによるボリューム変更をキャッチするところができていて、それを元にツールにキャッチされないようにこっそりメッセージを送ってボリュームを変更して実際のフェードを実現するところをこれから書きます。
しつこいようだけど、Bomber丸Worldに応用する前提で作っているので、ふにゃさんに特化したものにはせず、ある程度汎用的なものにするつもりであります。

オートセーブ・オートロードのAutoTextFile

日記のメニューの過去ログとカテゴリの表示を改善しました。
IEではセキュリティエラーが出ませんし、火の狐でもちゃんと動きます(スタイルは崩れますが)。

Bomber丸Worldのほうはというと、HTML表示の最終チェックをして、Wikiにアップしておきました。
それはそうと、これを作るときに副産物でできた、エラーログを監視するためのソフト、AutoTextFileをちょっとアップしてみました。
やっつけで作った手抜きソフトなので更新履歴に入れてませんが、まあ、ログ監視とか、メモ程度なら便利なんじゃないでしょうか。

NeoMuplとかミディビとかもいじってみたいところです。

ところで今日のトップページでのちょっとした冗談、見てくれた人はどのくらいいたのかな。
やっぱり嘘の閉鎖告知は周りへの迷惑が大きいと思うので、その逆をやってみたんですよ。
あのページに書いたとおり、当分閉鎖するつもりはないです。
少なくとも来年の8月までは存続しているはずです。

<前 次>