API/関数

Last-modified: 2021-02-07 (日) 09:23:17

AIツールから緋想天/非想天則のキャラクターを操作したり、
環境変数では取得できない特殊な情報を取るための関数群です。

 

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スクリプトと認識し実行します。
相対パスを指定した場合、関数外に記述した場合はファイル位置から
関数内に記述した場合は定義ファイルを特定できないため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
8yukari
9萃香suika
10優曇華udonge
11aya
12小町komachi
13衣玖iku
14天子tenshi

get_skill_lv(player,skill_id)

player(0で自分、1で相手)の指定ID(0~11、スキルのカード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,attack_n,hit_n,fflags,aflags = get_obj_data(TAG_MY,0);

id等の具体的な情報はこちら(現在情報募集中)

set_weather_delay(delay)

極光時に発現する天候効果がわかるようになるまでの時間を設定します。
時間は気質カウンター依存で、

	1000 - weather_delay > weather_time;

が真のときだけ読めるようになります。
それ以外のときはweatherにアクセスしても極光を示す値が帰ります。

get_card_cost(player,num)

指定プレイヤーのnum枚目のカードのコストを返します。
この関数は曇天の影響を受けません、曇天による影響を受けたあとの値が必要である場合は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から呼べる機能です、なので入出力の仕様は MSDNの情報 に準拠します。

	VK_F10 = 121;
	if (get_real_key_stat(VK_F10) < 0)
	then
		--F10が押されていたときの処理
	end

このように使います。
純粋なAIとしてではなく、プラクティス用やデバッグ用に使うことが出来ます。

create_thread(name[, param1, param2...])

nameという名称の関数に0個以上の引数を与えてマイクロスレッドとして実行します。
関数を直に渡しても、関数名を渡しても動作します。
引数が対象の関数より多かった場合は読み捨てられ、少なかった場合は足りない部分にnilが渡された物として動作します(Lua言語自体の仕様)
実行順は登録された順です、順序の変更手段はありません。

使用例:

	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 push(button)
		while (true)
		do
			key_event(button);
			yield();
		end
	end
	function main()
		create_thread("a");
		create_thread("ab");
		create_thread(push, ACT_BC);
		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フィールドウルトラレッドの残りフレーム数(相手がフィールド内にいる限り、残りフレーム3で固定)。使用可
12フィールドウルトラバイオレット(相手がフィールド内にいる限り、残りフレーム3で固定)。使用可
13水符「ジェリーフィッシュプリンセス」の残りフレーム数。使用不可
14水符「ジェリーフィッシュプリンセス」の残りHP。使用不可
15鬼神「ミッシングパープルパワー」の残りフレーム数
16毒煙幕「瓦斯織物の玉」の残りフレーム数。使用不可
17制御棒の使用枚数
18天狗団扇の使用枚数
19身代わり人形の使用枚数
20グリモワールの使用枚数
21三粒の水滴使用個数(無敵中は3、無敵中再使用でも3のまま、効果終了後は0)
22三粒の水滴による無敵時間残りフレーム数
23竜星による無敵時間残りフレーム数
24神奈子ゲージ使用可能までの残フレーム数
25諏訪子ゲージ使用可能までの残フレーム数
26長視「赤月下(インフレアドムーン)」の残フレーム数
27ダイアモンドハードネスの残フレーム数

※時符「咲夜特性ストップウォッチ」は範囲内キャラのhitstopを1にし続けるスペルカードのため、ここでは識別できません。

非想天則には未対応です。 ver0.88より利用できるようになりました。

get_obj_attackarea(player,num,n)

指定プレイヤーのnum個目のオブジェクトの攻撃判定を示す四角形のn個目を返します。
返り値は四角形の頂点をあらわす左、上、右、下の順で四つの値です。
例:

	--自分の0個目のオブジェクトの0個目の攻撃判定を取得
	left, top, right, bottom = get_obj_attackarea(TAG_MY,0,0);

get_attackarea(player,n)

指定プレイヤーの攻撃判定を示す四角形のn個目を返します。
補足1:返り値はget_obj_attackareaと同様に左、上、右、下の順
補足2:返り値にはキャラの速度による偏差がかかる。ゲーム上の仕様なのか値を取得する上での誤差なのかは不明。

get_obj_hitarea(player,num,n)

指定プレイヤーのnum個目のオブジェクトの食らい判定を示す四角形のn個目を返します。

補足:値を取得できない。バグかどうかは不明。エラー文面は以下の通り。

attempt to call global 'get_obj_hitarea' (a nil value)

get_hitarea(player,n)

指定プレイヤーの食らい判定を示す四角形のn個目を返します。
補足1:返り値はget_obj_attackareaと同様に左、上、右、下の順

get_correction(player,flag)

指定プレイヤーが相手にflagの特殊補正を与えているか判別します。
その特殊補正がかかっている場合は true 、かかっていない場合は false が返ります。
最後に与えた攻撃に関する情報が取得されるので、ヒット確認処理と併用して使用してください。
flagの詳細は環境変数my_correctionを参照してください。

例:

	if (get_correction(0,32))
	then
		--カウンターヒットしたときの処理
	end

get_version()

AI本体のバージョンを文字列として取得します。
”ver0.86a”といった形式で返る為、利用には別途処理が必要な場合もあります。

get_fflags(player, flag)

指定プレイヤーの攻撃に関わらないフラグを取得します。
指定フラグがたっている場合はtrue、それ以外の場合はfalseが返ります。
flagの詳細は環境変数my_fflagsを参照してください。

例:

	if(get_fflags(0,4))then
		--空中にいる時の処理
	end

get_aflags(player, flag)

指定プレイヤーの攻撃関連フラグを取得します。
指定フラグがたっている場合はtrue、それ以外の場合はfalseが返ります。
flagの詳細は環境変数my_aflagsを参照してください。

例:

	if(get_fflags(1,1))then
		--下段攻撃された時の処理
	end