th105_ai.zip/document.txt
・th105_ai超簡易ドキュメント
・ルール
スクリプトはLua言語です、基本的な仕様は全てLua言語に準拠します。
緋想天を発見した段階でiniで指定された方法でaiを読み込み実行します。
起動後始めて緋想天が対戦モードになった時、main関数が実行されます。
その後、対戦中ならばyield関数が呼ばれるたびに1フレームだけ待機します。
対戦中で無いならば、対戦中になるまでyieldから制御は返りません。
main関数が終了すると本体プログラムも終了します。
・大まかな流れ
初期化処理を一番外側に書く
メインルーチンをmain関数として定義する。
1ループごとにyield関数を呼んでやる。
・文法
こちらをお読みください。
http://sugarpot.sakura.ne.jp/yuno/html/lua51_manual_ja.html
・設定ファイル
アプリケーションと同じディレクトリに存在するSwrAddr.ini、th105_ai.ini、dev.iniを起動時に自動で読み込みます。
iniファイルが存在しなかった場合は内部的に保持しているデフォルト値が使われます。
また全てのiniは読み込む順番以外は等価であり、SwrAddr.ini→th105_ai.ini→dev.iniの順で読み込まれます。
同じ設定項目が複数回指定された場合は最後に指定したもののみが有効になります。
原則として配布にはth105_ai.iniのみが含まれるので、書き換えられて困る設定はdev.iniに記載することで
全て上書きでも設定が消えずにすむようになります。
詳しい設定内容についてはth105_ai.iniを参照してください。
・Luaライブラリ
標準ライブラリのうちbase、string、table、math、debug、io、osが使用可能です。
以下、本家と仕様が違う関数とその詳細
os.execute:
os.exit:
os.getenv:
os.remove:
os.rename:
os.setlocale:
os.tmpname:
io.popen:
使用できません
io.open:
ファイル名の指定に文字列が使えず、代わりに数値指定が出来ます。
その場合に開かれるファイル名は「script_data/数字.dat」となります
fp = io.open(12345);--script_data/12345.datを開く
io.input:
io.output:
io.lines
io.openと同じく文字列指定が出来ず、代わりに数値指定が行えるようになっています。
それ以外の機能に関しては変わりありません。
require:
module:
package.requireとpackage.moduleにリネームされています。
それとは別にrequire関数が存在しますが、一切関係はありません。
・キー指定子
th105_aiにおいて、「キー」と行ったらこれをさします。以下一覧表
キー 数値 定数
UP 0 ACT_UP
DOWN 1 ACT_DOWN
LEFT 2 ACT_LEFT
RIGHT 3 ACT_RIGHT
A(格闘) 4 ACT_A
B(弱射撃) 5 ACT_B
C(強射撃) 6 ACT_C
D(飛翔) 7 ACT_D
AB(カード送り) 8 ACT_AB
BC(カード使用) 9 ACT_BC
DOWN+LEFT 10 ACT_DLEFT
DOWN+RIGHT 11 ACT_DRIGHT
UP+LEFT 12 ACT_ULEFT
UP+RIGHT 13 ACT_URIGHT
・対象指定子
本プログラムにおいて、プレイヤーを指定する際に使う値です。以下一覧表
0 自分 TAG_MY
1 相手 TAG_ENEMY
・フレーム
本プログラムにおける最小単位時間、16ms(約1/60秒)です。
緋想天における最小単位時間が同じ16msであるための仕様です。
・API
yield()
処理を本体プログラム側に返し、前回のyield実行から数えて1フレーム経つまで待機します。
環境変数群の更新もここで行われます。
create_thread関数により作成されたスレッドが存在する場合のみ、そちらへ処理が移行します。
その場合、プログラムの待機と次変数の更新は全てのスレッドからyieldが呼ばれた後になります
dash()
front方向へダッシュします、frontのキーがONのまま制御が返ります。
既にダッシュ中の場合は何もしません。
ダッシュ状態になるか、120フレーム経過した場合に処理が戻ります。
key_reset()
全てのキーをOFF(離す)にします。
key_off(key)
指定したキーをOFFにします。
方向キーを指定した場合、逆側の方向キーもOFFになります。
key_on(key)
指定したキーをONにします、既にONの場合は何もしません。
方向キーを指定した場合、逆側の方向キーはOFFになります。
key_event2(key1,key2)
二つのキーを同時に押してから離します。
6A等といったコマンド用です。
入力が反映されたかのチェックは行わず、必ず4フレーム後に制御が返ります。
key_event(key)
一つのキーを押してから離します。
入力が反映されたかのチェックは行わず、必ず4フレーム後に制御が返ります。
dattack()
dash,key_event,key_resetを一括して行います。
wait(time)
指定回数だけyieldを実行します。
require(filename)
指定ファイルをaiスクリプトと認識し実行します。
相対パスを指定した場合、関数外に記述した場合はファイル位置から
関数内に記述した場合は定義ファイルを特定できないためth105_ai.exeからの相対になります。
そのため、関数内での使用は非推奨です。
ver0.72より、iniのStartupAIの機能がdaialog以外使用可能になりました。
これにより
require("対%c2ガード.ai")--相手がアリスなら対aliceガード.aiを読み込む
といったコードが使用可能です
置き換え文字一覧表:
id %C %c
0 霊夢 reimu
1 魔理沙 marisa
2 咲夜 sakuya
3 アリス alice
4 パチュリー patchouli
5 妖夢 youmu
6 レミリア remilia
7 幽々子 yuyuko
8 紫 yukari
9 萃香 suika
10 優曇華 udonge
11 文 aya
12 小町 komachi
13 衣玖 iku
14 天子 tenshi
get_skill_lv(player,skill_id)
player(0で自分、1で相手)の指定ID(0〜11、skill.txtのIDとは違います)のスキルのLvを取得します。
指定IDのスキルが存在しないもしくは使用不能時は-1、デフォルト技は0
スキルカードによりLvが上がっている場合は1〜4が返ります。
疎雨時でも習得Lvが返る為、Lv判断に使う場合は天候判断と併用してください。
get_card_id(player,num)
player(0で自分、1で相手)の指定枚数目のスペルのIDを取得します。
numには1枚目を0として0〜4を指定できます。
カードゲージが溜まっていない、もしくは0〜4以外を指定した場合には-1が返ります。
set_key_delay(delay)
delayで指定されたフレームだけキー入力が遅れて送られるようになります(1フレーム=1/60秒)
この命令により設定されているdelayは環境変数key_delayから知ることができます、初期値は0です。
この命令によりdelayが以前より多くなった場合、その差の間は何の入力も送られません。
例:
set_key_delay(0);
key_on(front);
set_key_delay(20);
key_off(front);
このコードを実行した場合、1/3秒間相手に向かって歩き続けます。
逆に以前よりも短くなった場合、すでに送られた入力は入力時のdelayにあわせて実行されます。
例:
set_key_delay(0);
key_on(front);
set_key_delay(20);
key_off(front);
set_key_delay(10);
key_event(ACT_A);
このコードを実行した場合、1/6秒間歩いてから6Aになります。
set_data_delay(delay)
delayで指定されたフレームだけ環境変数enemy_actとenemy_frame遅れて送られるようになります(1フレーム=1/60秒)
この命令により設定されているdelayは環境変数data_delayから知ることができます、初期値は0です。
この命令を実行した場合、以前指定されていたdelayに関わらずdelayフレームの間はenemy_actとenemy_frameを読んでも0が返ります。
get_obj_data(player,num)
指定プレイヤーのnum個目のオブジェクト(射撃の弾や人形など)のid、x座標、y座標、HP、画像ID、フレーム数、x速度、y速度、固有識別子を取得します。
固有識別子はオブジェクトごとの固有の数値であり、オブジェクトを一意に特定するために使用します。
別のオブジェクトが同じ識別子を持つことはありません。
使用例:
id,ox,oy,hp,img,frame,oxs,oys,oid = get_obj_data(TAG_MY,0);
set_weather_delay(delay)
極光時に発現する天候効果がわかるようになるまでの時間を設定します。
時間は緋想天の気質カウンター依存で、
1000-weather_delay>weather_timeが真のときだけ読めるようになります。
それ以外のときはweatherにアクセスしても極光を示す14が帰ります。
get_card_cost(player,num)
指定プレイヤーのnum枚目のカードのコストを返します。
この関数は曇天の影響を受けません、曇天の-1を使用したい場合はget_card_cost2を使ってください。
get_card_cost2(player,num)
曇天の影響を受けるget_card_cost。
weather_delayの影響も受けるため、AIスクリプト上でweatherを参照して計算した場合と完全に等価に機能する。
get_opt_xy(player,num)
指定プレイヤーのnum+1個目の付属物の座標を返します
妖夢の半霊、アリスのC射人形、小町の爆破可能霊魂が取得できます。
使用例:
--付属物の全座標を出力する
local i = 0;
while(true)do
ox,oy = get_opt_xy(TAG_MY,i);
if(ox==nil)then break; end
print(i,ox,oy);
i = i+1;
end
command(string)
コマンド入力記法に似た簡易言語によるキー入力を行います。
22Bや236Cなどといった文字列を与えることで簡単にコマンド技の実行が可能です。
また(30)などと書くことで指定フレームだけ待つ作業をはさむことが出来ます。
例:
command("AA(10)A(5)236B(50)236B");
これでAAA>236B>236Bという行動を行いします(カッコ内の数字はコマンド技ごとに調整する必要があります)
※この命令はツールスレ内の有志によって開発されていたSetInput関数を基に試験的に実装されたものです。
そのため仕様が大きく変更される恐れがあり、使用は推奨されません。
安定使用が目的の方はSetInput関数を別途入手してお使いください。
get_deck_list()
自分のデッキリストを取得します。
20枚全て順不同(緋想天依存)で渡されます、テーブルの形ではありません。
deck = {get_deck_list(0)};
という形で使えばdeck[1〜20]に格納できます。
また、あくまでデッキリストであり、まだ引いていないカードではありません。
プラクティスで2P側に設定した場合読むことは出来ません。
get_key_stat(n)
キー指定子nがONならば1、OFFならば0が返ります。
斜めキー(n>=10)の指定は出来ません。
get_key_map()
キー指定子0〜9のON/OFFをまとめて取得します。
テーブルではなく10個の返り値として戻ります。
get_real_key_stat(n)
緋想天のキーコンフィグに関係なく、指定キーのON/OFFを取得します。
Win32APIのGetKeyStateをluaから呼べる機能です、なので入出力の仕様はhttp://msdn.microsoft.com/ja-jp/library/cc364676.aspxに準拠します。
VK_F10 = 121;
if(get_real_key_stat(VK_F10)<0)then
--F10が押されていたときの処理
end
このように使います。
純粋なAIとしてではなく、プラクティス用やデバッグ用に使うことが出来ます。
create_thread(name)
nameという名称の関数をマイクロスレッドとして実行します。
関数を直に渡しても、関数名を渡しても動作します。
実行順は登録された順です、順序の変更手段はありません。
使用例:
function a()
while true do
key_event(ACT_A);
yield();
end
end
function ab()
while true do
key_event(ACT_AB);
yield();
end
end
function main()
create_thread("a");
create_thread("ab");
while true do
yield();
end
end
0.71bの修正により、create_threadした時点で指定関数を退避するようになりました。
そのため、create_thread時点で関数が定義されていない場合はエラーします。
get_special_data(player,n)
指定プレイヤーの固有な設定値を取得します。
指定プレイヤーが該当しないキャラクターの場合は-1が返ります。
以下一覧表
n 取得できる値
0 咲夜の世界の残りフレーム数
1 時符「プライベートスクウェア」の残りフレーム数
2 「夢想天生」の残りフレーム数
3 魂符「幽明の苦輪」および魂魄「幽明求聞持聡明の法」の残りフレーム数
4 体力回復の残りフレーム数
5 儀符「オーレリーズサン」の残りフレーム数
6 火水木金土符「賢者の石」の残りフレーム数
7 生薬「国士無双の薬」の適用数
8 「夢想天生」の点灯数(7以上にも増えます)
9 非想「非想非非想の剣」の残りフレーム数(playerは使用した側を指定します)
10 気符「無念無想の境地」の残りフレーム数
11 フィールドウルトラレッドの残りフレーム数(相手がフィールド内にいる限り、残りフレーム10〜25で固定)
12 フィールドウルトラバイオレット(相手がフィールド内にいる限り、残りフレーム15〜65で固定)
13 水符「ジェリーフィッシュプリンセス」の残りフレーム数
14 水符「ジェリーフィッシュプリンセス」の残りHP
15 鬼神「ミッシングパープルパワー」の残りフレーム数
16 毒煙幕「瓦斯織物の玉」の残りフレーム数
※
時符「咲夜特性ストップウォッチ」は範囲内キャラのhitstopを1にし続けるスペルカードのため、ここでは識別できません。
get_obj_attackarea(player,num,n)
指定プレイヤーのnum個目のオブジェクトの攻撃判定を示す四角形のn個目を返します。
返り値は四角形の頂点をあらわす左、上、右、下の順で四つの値です。
例:
left,top,right,bottom = get_obj_attackarea(TAG_MY,0,0);--自分の0個目のオブジェクトの0個目の攻撃判定を取得
get_attackarea(player,n)
指定プレイヤーの攻撃判定を示す四角形のn個目を返します。
get_obj_hitarea(player,num,n)
指定プレイヤーのnum個目のオブジェクトの食らい判定を示す四角形のn個目を返します。
get_hitarea(player,n)
指定プレイヤーの食らい判定を示す四角形のn個目を返します。
get_correction(player,flag)
指定プレイヤーが相手にflagの特殊補正を与えているか判別します。
その特殊補正がかかっている場合はtrue、かかっていない場合はfalseが返ります。
最後に与えた攻撃に関する情報が取得されるので、ヒット確認処理と併用して使用してください。
flagの詳細は環境変数my_correctionを参照してください。
例:
if(get_correction(0,32))then
--カウンターヒットしたときの処理
end
・環境変数
グローバル変数の扱いでyield関数を呼ぶたびに更新される変数群です。
緋想天から情報を得る主な手段となります。
環境変数一覧:
front
相手が居る方向、常に2(ACT_LEFT)か3(ACT_RIGHT)の値をとります。
相手との位置から判別するため、振り向く前などコマンドが逆になることがあります。
back
frontの逆、相手が居ない方向を常に指します。
u_front
相手がいる方向+ACT_UPと同義であるキー指定子の値をとります。
d_front
相手がいる方向+ACT_DOWNと同義であるキー指定子の値をとります。
u_back
u_frontの逆のキー指定子の値をとります。
d_back
d_frontと逆のキー指定子の値をとります。
dis
相手とのx方向の距離、math.floor(math.abs(x-ex))の返り値と常に同じ数値になります。
dis_x
disと同じです。
dis_y
相手とのy方向の距離、math.floor(math.abs(y-ey))の返り値と常に同じ数値になります。
dis2
相手とのxy含めた距離です。math.floor(math.sqrt(dis_x*dis_x+dis_y*dis_y))の返り値と常に同じ数値になります。
my_act
自分の現在モーションです。
具体的に何のモーションか知りたい場合はmotion.txt&skill.txtをご覧ください
enemy_act
相手のモーションです
weather
天候です。極光時に限り一定時間すると極光ではなく実際に発動している天候効果の番号が返るようになります。
set_weather_delayを設定することで効果が判明する時間を設定できます。
以下対応表
0:快晴
1:霧雨
2:曇天
3:蒼天
4:雹
5:花曇
6:濃霧
7:雪
8:天気雨
9:疎雨
10:風雨
11:晴嵐
12:川霧
13:台風
14:極光
16:なし
my_char
自分のキャラです、以下対応表
0:霊夢
1:魔理沙
2:咲夜
3:アリス
4:パチュリー
5:妖夢
6:レミリア
7:幽々子
8:紫
9:萃香
10:優曇華
11:文
12:小町
13:衣玖
14:天子
enemy_char
相手のキャラです。
my_hp
自分のHPです、最大10000
enemy_hp
相手のHPです。
my_rei
自分の霊力です、霊力球一個当り200、最大で1000になります。
enemy_rei
相手の霊力です。
my_rmax
自分の最大霊力値です、最大1000で一つ割れるごとに200減ります。
enemy_rmax
相手の最大霊力値です。
my_spell
自分のスペルカードゲージの量です、一枚当り500で最大2500です。
enemy_spell
相手のスペルカードゲージの量です。
my_combo
自分のコンボヒット数です、別の攻撃がヒットするまで前回のコンボヒット数を指し続けます。
enemy_combo
相手のコンボヒット数です。
my_dam
自分の合計コンボ与ダメージです。
enemy_dam"
相手の合計コンボ与ダメージです。
my_limit
自分の与リミットです。
enemy_limit
相手の与リミットです。
my_rate
自分の与レートです。
enemy_rate
相手の与レートです。
x
自分の現在X座標です。
ex
相手の現在X座標です。
y
自分の現在Y座標です。
ey
相手の現在Y座標です。
obj_dis
自分に最も近い敵ダメージ判定の位置です。
現在はX座標のみを基準に算出しているため、頭上を飛び越える射撃にも反応します。
obj_dis2
自分に最も近い敵オブジェクトの位置です。
my_obj_n
現在存在している自分のオブジェクト数です。
enemy_obj_n
現在存在している相手のオブジェクト数です。
my_card
自分の1枚目のカードIDです。
具体的なカードIDはspell.txtよskill.txtを読んでください。
enemy_card
相手の1枚目のカードIDです。
my_air
自分の空中ダッシュ回数です、これが2(風雨ならば3)の場合空中ダッシュが使用できない状態です。
enemy_air
相手の空中ダッシュ回数です。
my_frame
自分がそのモーションをはじめてからの経過フレーム数です。
立ちや歩きなど継続して行える行動の場合は4バイトの限界まで増え続けます。
enemy_frame
相手がそのモーションを始めてからの経過フレーム数です。
key_delay
set_key_delayで指定できるdelay(キー入力の遅延フレーム数)です。
このフレーム数だけkey_eventやkey_onなどといったすべてのキー入力命令の実行が遅れます。
ここに代入してもset_key_delayと同様の効果があります。
data_delay
set_data_delayで指定できるdelay(相手状態取得遅延フレーム数)です。
このフレーム数だけenemy_actとenemy_frameの取得が遅れます。
ここに代入してもset_data_delayと同様の効果があります。
battle_time
対戦開始してからの経過フレーム数です。
緋想天依存のため、動作環境によりyield一回ごとに必ず+1するわけではありません。
そのため動作目安としても使うことができます。
i = 0;
while true do
print(battle_time-i);
i = i+1;
yield();
end
このコードを動かして、表示されている数字が変わらないのが理想の環境です。
is_card_use
一枚目のカードが使用可能であれば真、そうでないならば偽が格納されます。
weather_time
気質カウンター(天候表示部分で増減している数字)を10倍した値です。
天候無しのときは増加し、天候ありのときは減少していきます。
0未満になること、および1000以上になることはありません。
weather2
天気の予報です。
気質発現中はweather2と同様の働きをしますが、極光時はweather_delayに関係なく常に14が返ります。
weather_delay
極光時に天候効果がわかるようになるまでの時間です。
1000-weather_delay>weather_timeになるとweatherから該当する天候の数値が読めるようになります。
初期値は300、set_weather_delay関数を用いることで変えることができます。
この変数に代入を行ってもset_weather_delayと同様の効果があります。
my_dir
自分が左を向いているときは-1、右を向いているときは1が格納されます。
enemy_dir
相手が左を向いているときは-1、右を向いているときは1が格納されます。
is_dir_front
自分が向いている方向に敵が居る場合は真、そうでないならば偽が格納されます。
my_hitstop
打撃攻撃を当てた、もしくは被弾した時に起こる硬直フレーム数が格納されます。
咲夜特製ストップウォッチなど、一部特殊技でもこの値が使用されることがあります。
enemy_hitstop
相手の硬直フレーム数です。
my_xspeed
自分のx方向の速度です。
緋想天内部から取得しているので、my_x差分から計算するよりも1フレーム早く情報を取得できます。
enemy_xspeed
相手のx方向の速度です。
my_yspeed
自分のy方向の速度です。
my_xspeedと同じく、緋想天内部から取得しています。
enemy_yspeed
相手のy方向の速度です。
my_img
自分の現在表示されているキャラ画像のIDです。
enemy_img
相手の現在表示されているキャラ画像のIDです。
my_hitarea_n
自分の食らい判定を示す四角形の個数です
enemy_hitarea_n
相手の食らい判定を示す四角形の個数です
my_attackarea_n
自分の攻撃判定を示す四角形の個数です。
enemy_attackarea_n
相手の攻撃判定を示す四角形の個数です。
my_correction
自分が最後に相手に与えた特殊補正のフラグです。
以下の数字を足した値が設定されます。
特殊補正名 数値
Rift Attack 1
Smash Attack 2
Border Resist 4
Chain Arts 8
Chain Spell 16
Counter Hit 32
例:
吹き飛び属性もちの攻撃を当ててカウンターヒットした場合、2+32で34が格納される。
enemy_correction
相手が最後に自分に与えた特殊補正のフラグです。