趣味だからこそ出来ること

一個前の記事の説明にすらなってない理由で開発滞らせていたわけですが、実はさらに開発が遅くなりそうなことを思いついていたり。

知ってる人は知っているだろうけど、実はth105_aiには初期版から脈々と受け継がれているバグがあって処理の内容に関係なく常に落ちる可能性を秘めていたりする。
その理由が実数→整数の変換処理で、これは緋想天と完全同期をしないためにどうやっても回避できない(と思っている)。

で、今まで起こさない方法がなかったので放置していたわけですが、逆に「例外起きても問題なく進められればいい」という新境地に踏み込んでみたく……
具体的にいうと
1:ai周辺データの退避
2:小数点演算フラグの初期化(不正演算時点で壊れてしまい、以降の処理に影響が出るため)
3:不正な実数のクリア
4:ai周辺データの復帰
こういう処理を例外処理内で行ってしまおうという話。

文として書くとすごく簡単そうだけど、実際にやる場合は全てレジスタ経由で読み書きすることになるのでかなり大変な予定。
幸い、例外処理中のみC言語の構造体としてレジスタにアクセスできるためアセンブラを書く必要はないが、大変なことにはかわりなさそう。

まだ脳内マップなので実現できるかも不明なわけですが、例外を根絶できるかもと考えれば挑戦してみる価値はあるはず。
ほんと、こういうことが出来るからC言語使うのは止められない。

追記:
例外を回避できない理由を書き忘れた。
その壊れたデータを参照した時点で例外するので、IFで検地しようとしてもその時点で例外を吐いてどうしようもありません。
int*キャストからごにょごにょで多少検地できてますが完璧には無理、ということで上の話になったわけです。

停滞中?

徹夜で緋想天したり、東方の新作情報に興奮してネットの海をさまよったり
そんなこんなで三日間バグとり以外何もやってないという話。

今更になって236コマンド出るようになってネット対戦が楽しくてしょうがないとか遅すぎるだろうと小一時間
未だに誤爆率5割超えてるし、練習ですら623コマンド出ませんけどね。
世の中には23623641236とか鬼畜コマンドが普通な格ゲーもあるそうで、自分では到底理解できそうもありません、うん。

あと新作のセンスがやばい、なにがヤバイって今時アダムスキー型のUFOを大真面目に出してる。
最初ギャグか何かかと思ったが、なんか普通にSTGのシステムとも連動している様子。
さすが神主、俺たちには出来ないことを平然と(ry

とりあえず新作出る前に地のEXクリアまで行きたいところ。
いや、してはいるけどまぐれにまぐれを重ねたクリアでまだ納得いってないのですよ、うん。

Borlandの罠

本日(というよりは昨日)13時間無駄にした時の話

まずはこのコードを見てもらいたい
#include <windows.h>
#include <stdio.h>
long WINAPI exep(EXCEPTION_POINTERS *pep){
return EXCEPTION_CONTINUE_EXECUTION;
}
int main(){
SetUnhandledExceptionFilter(exep);
printf(“mainn”);
RaiseException(0x00000000,0,0,NULL);
printf(“main2n”);
return 0;
}

これはC言語からWin32APIの機能を使って例外処理を行うサンプルで
SetUnhandledExceptionFilter関数にてexepを例外処理関数に設定し、exepでは何もせず即例外位置に復帰するだけのプログラム。

ここで問題なのが、上のコードを手元のbccコンパイラでコンパイルするとINVALID DISPOSION例外を吐いて動作しないこと。

最初は何かしら必須な処理を怠ったせいかと思いサンプルコードを大量に引っ張ってきたり、関連知識がありそうな友人に片っ端から相談したが一向に原因が掴めず
最小コードをこねくり回している最中に、間違えてVCコンパイラでコンパイルしたことから原因判明。
要するに「BCCコンパイラだからエラーしている」というもの。

理由:
BCCコンパイラがmain関数前にSEH連鎖の0番に設定する関数でエラーしている。
(SEH連鎖:例外処理関連で呼ばれる関数、数珠繋ぎにいくつも設定できる)

で、OS自体が用意してくれる関数を使っているうちは問題ないのでBCCさんの独自関数にはどいてもらうことにする。
具体的にはこんなコード
#ifdef __BORLANDC__
__asm{
push EAX
mov EAX,DWORD PTR FS:[0]
mov EAX,DWORD PTR DS:[EAX]
mov DWORD PTR FS:[0],EAX
pop EAX
}
#endif
SEH連鎖1番のアドレスを取ってきて0番に上書きするだけ
ただC言語上からアクセスする方法が自分の知る範囲では存在しないのでインラインアセンブラの力を借りてます。

無料版にインラインアセンブラやらを無理やり突っ込んだものを使っているので、普通のBCC環境とは微妙に違っているのが原因か?
もし有料の最新版でも発現するバグなら割と大事だがどうだろう。
コンパイラ自体がわざわざ自家製の関数を突っ込んでいるのだから何かしら意味があるのかもしれないが、VCでは不便していないのでこのまま行くことにする。

さて、これで例外報告機能も復旧できたし、今度こそth105_aiで0.80に向けた作業に……

チート対策の穴

th105_aiの話

チート対策の影響が各所に出ていることに今更になって気が付いた。
たとえば、ファイル選択ウィンドウとか例外報告機能とか
その辺の細かい機能が色々死んでいて、しかも今まで気づかなかったという。

ファイル選択ウィンドウは既に直したのだけど、例外報告機能が割りと深刻で苦戦しそうな予感。
この様子だとあと一個や二個は問題でていそうで怖い。

0.80遠いなぁ

思い立ったが吉時

th105_aiの話

前回カウンターヒットの情報が取れていなかったことを思い出したので
記事を修正した時の勢いでさくっと解析して即バージョンアップしました。
3時間で2回VerUPとか、趣味だからこそ出来ることだよね。

こんどこそ目に見える壁は全てなくなったので、
やり残した細かい実装をさっさと終えて念願のVer0.80いくぞー!

峠は越えた?

th105_aiの話

以前からネックになっていた食らい判定の取得もようやく実装できたので、目に見える範囲で壁は全て越えた感じ。
あと残るはget_special_dataの充実ぐらいだろうか?

ひとまずの目標まで後一歩、ガンバレ自分!

追記:
そういえばヒット時のカウンターヒットやらリフトアタックなどの判別ができていなかった。
特にカウンターヒットは立ち回りに大きく影響が出るので是非とも取りたいところ。
さて、また壁が見えたのでデバッガーと戯れる日々に戻りますよ……

ネットDL

前の記事で投稿ボタンを押した瞬間に思いついたネタ

公開済みAIのリストを作っておいて、それをGUIでリスト表示
キャラ別とか推奨デッキとか強さでソートできて、GUI上の1操作だけでDL>展開>読み込みを自動で行える。
ついでに緋想天の操作も自動でやっちゃって(もちろんキーボードエミュレートで)対戦開始まで自動化するのもあり。

楽しそうだし便利そうだし、あったら盛り上がるだろうけど
具体的にどういう関数使えばGUIを実現できるのか思い浮かばないのできっと構想だけで終わる。
DL・展開・読み込み・緋想天操作の自動化は出来ると思うんだけどねぇ

実装期、整理期

th105_aiの話

出来ること・方法は多ければ多いほど良い(Perl的な)
省略できる部分は省略できた方が望ましい(Ruby的な)

で、今はできることを増やしているところ。
だから変数でいいじゃんというものが関数で実装されていたり、非常に扱いにくかったりします。
思いつく範囲で出来ないことが無くなったら、その後は可能な限り使いやすく省略可能にしていく予定。
x,yは変数名とかぶりすぎるので、さっさとmy.xとかやって参照できるようにしたいところ。
やるのは当分後だろうけどね。

ちなみに今は食らい判定を取得すべく解析作業中。
攻撃判定の取り方を他人から教えてもらったせいで知識皆無につき試行錯誤中。

一応食らい判定をあらわす四角の個数らしきものは取れたので
それを元に約二箇所に絞ったけど、コードが長すぎて読むのがだるい。
アセンブラをCコードに翻訳して半日も悩めばわかりそうだけど、もっと手っ取り早く抜けないものか。

18時間睡眠

昨日15時頃に寝て24時頃起きるつもりだったのに、目が覚めたのは9時だったという話
これを機にまっとうな生活習慣に戻せたらいいなぁと思いつつ、きっと18時ごろには寝る未来が見える。

4017行

th105_aiのソースの行数、バイト数に直すと101,986byte(Luaエンジン含まず)
開発開始が12/21なので、約2ヶ月(67行/日)でここまできたことになる。
大分早い方だとは思うけど、日に400行とか書く化け物には到底敵わない。
大学行きつつとはいえ余暇の4割ぐらいは費やしているつもりなんだけど、自分はまだまだなようで。

ところで、何を血迷ったかウィンドウなんてくっつけてしまったんだが
GUI上に機能の実装とか絶対面倒くさがってやらないとわかっているのに、何やってるんだろうね俺