--#####汎用サブルーチン集#####
--#目次
--#
--#set_preact()
--#　直前行動管理用
--#　　引数：無し　戻り値：無し
--#　　　マルチスレッド化推奨。手動で配列の値を取り出して使います。
--#　　　別途、変数calmcheck（0で無効、1で有効）を設定しておくと、
--#　　　静状態（ニュートラル、前進、後退、しゃがみ）を同一行動と見なします。
--#
--#check_velocity()
--#　移動速度算出用
--#　　引数：無し　戻り値：無し
--#　　　マルチスレッド化推奨。手動で値を取り出して使います。
--#
--#get_have_card(player,card_id)
--#　カード所持数確認
--#　　引数（0もしくは1，カードID）　戻り値：カード所持数
--#　　　player(0で自分、1で相手)の手札をチェックして指定IDのカード所持数を返します。
--#
--#use_card(card_id)
--#　指定したカードを使う
--#　　引数（カードID）　戻り値：無し
--#　　　コマンド入力系ルーチン。目的のカードまで手札を回して使用します。
--#
--#-----*****	追加	*****
--#use_card2(card_id)
--#　指定したカードを2を押しながら(スキルを発動させずに)使う
--#　　引数（カードID）　戻り値：無し
--#　　　コマンド入力系ルーチン。目的のカードまで手札を回して使用します。
--#
--#set_card(card_id)
--#　指定したカードを1枚目にセットする。
--#　　引数（カードID）　戻り値：無し
--#　　　コマンド入力系ルーチンから変数設定系に変わりました。指定したカードを1枚目にセットします。
--#　　　get_have_card(0,card_id)を使うので注意。
--#　　　pass_card()とセットで使います。
--#
--#escape_card(card_id)
--#　カードを逃がす（可能なら2枚目にセットする）
--#　　引数（カードID）　戻り値：無し
--#　　　コマンド入力系ルーチンから変数設定系に変わりました。指定したカードを1枚目から外します。雪から守ったりフェイントに使ったり
--#　　　get_have_card(0,card_id)を使うので注意。
--#　　　pass_card()とセットで使います。
--#
--#pass_card()
--#　カードを回す。マルチスレッド化推奨
--#　　引数：無し　戻り値：無し
--#　　set_card、escape_cardで指定したカードを実際に所定の位置まで送る
--#
--#get_dis_backwall()
--#　後ろの壁からの距離を求める
--#　　引数：無し　戻り値：壁からの距離
--#　　　後ろの壁からの距離（密着時40？）を返します。
--#
--#get_dis_frontwall()
--#　前の壁までの距離を求める
--#　　引数：無し　戻り値：前の壁までの距離
--#　　　前の壁までの距離を返します。
--#
--#get_skill_lv2(player,skill_id)
--#　疎雨を加味したレベルを返す
--#　　引数（0もしくは1，カードID）　戻り値：スキルLv
--#　　デフォルトのスキルLv取得を拡張。使い方は同じです。
--#
--#button_reset()
--#　コマンド入力補助関数。key_reset()のカスタム版。
--#　　引数：無し　戻り値：無し
--#　　　方向キーはそのままで、ボタンのみOFF(離す)にします。
--#
--#BtoN(value)
--#　真偽（比較結果等）を0か1の数値で返す
--#　　引数（比較等の真偽で結果の返る物、変数、返り値のある関数など）　戻り値：0もしくは1
--#　　　真偽値を計算に使えるように数値に変えて返します。
--#

--新規配列定義
my_preact = {0,0,0};
enemy_preact = {0,0,0};
my_preframe = {0,0,0};
enemy_preframe = {0,0,0};
my_preact_name = {0,0,0};
enemy_preact_name = {0,0,0};
my_movecontact = {};
enemy_movecontact = {};
my_x = {};
enemy_x = {};
my_y = {};
enemy_y = {};


--グローバル変数定義
set_card_id = nil;
escape_card_id = nil;

my_vel_x=0;
my_vel_y=0;
enemy_vel_x=0;
enemy_vel_y=0;



---直前行動を配列my_preact[0~3]及びenemy_preact[0~3]に格納する。
--preactNameは適宜手動入力してください。
function set_preact()	--マルチスレッド用
while true do

	if not(my_preact[0]==nil or (my_preact[0]==my_act and my_preframe[0]<=my_frame))then
--直前actと異なっていたら、もしくは同じact番号でもframeが巻き戻っていたら記録する
		if not(calmcheck==1 and my_preact[0]<5 and my_act<5)then
			if(my_preact[0]~=my_act and my_preact_name[0]==my_preact_name[1] and my_preact[0]~=my_preact[1] and my_preact_name[1]==my_preact_name[2])then
				my_preact_name[0] = nil;
			end
			for i=3,1,-1 do
				my_preact[i] = my_preact[i-1];
				my_preframe[i] = my_preframe[i-1];
				my_preact_name[i] = my_preact_name[i-1];
				my_movecontact[i] = my_movecontact[i-1];
			end			
		end
	end
	if not(enemy_preact[0]==nil or (enemy_preact[0]==enemy_act and enemy_preframe[0]<=enemy_frame))then
--直前actと異なっていたら、もしくは同じact番号でもframeが巻き戻っていたら記録する
		if not(calmcheck==1 and enemy_preact[0]<5 and enemy_act<5)then
		
print_d("");
			if(enemy_preact[0]~=enemy_act and enemy_preact_name[0]==enemy_preact_name[1] and enemy_preact[0]~=enemy_preact[1] and enemy_preact_name[1]==enemy_preact_name[2])then
				enemy_preact_name[0] = nil;
			end
			for i=3,1,-1 do
				enemy_preact[i] = enemy_preact[i-1];
				enemy_preframe[i] = enemy_preframe[i-1];
				enemy_preact_name[i] = enemy_preact_name[i-1];
				enemy_movecontact[i] = enemy_movecontact[i-1];
			end
		end
	end

	my_preact[0] = my_act;
	my_preframe[0] = my_frame;
	enemy_preact[0] = enemy_act;
	enemy_preframe[0] = enemy_frame;

--命中・ガードフラグをついでに覚えさせておく
----*****	else以下がないとずっと1のままになってしまう	*****
	if(my_act>=300 and my_act<690 and my_hitstop==enemy_hitstop and enemy_hitstop>0)then
		my_movecontact[0] = 1;
	else	----
		my_movecontact[0] = 0;	----
	end
	if(enemy_act>=300 and enemy_act<690 and my_hitstop==enemy_hitstop and my_hitstop>0)then
		enemy_movecontact[0] = 1;
	else	----
		enemy_movecontact[0] = 0;----
	end
yield();
end
end


---直前座標から移動速度を算出。瞬間移動系が凄い事になるけど気にしない。
function check_velocity()	--マルチスレッド用
while true do
	for i=2,1,-1 do
		my_x[i] = my_x[i-1];
		my_y[i] = my_y[i-1];
		enemy_x[i] = enemy_x[i-1];
		enemy_y[i] = enemy_y[i-1];
	end

	my_x[0] = x;
	my_y[0] = y;
	enemy_x[0] = ex;
	enemy_y[0] = ey;

	if(my_x[1]~=nil and my_x[0]~=nil)then
		my_vel_x = (my_x[0] - my_x[1])*my_dir;
		my_vel_y = my_y[0] - my_y[1];
		enemy_vel_x = (enemy_x[0] - enemy_x[1])*enemy_dir;
		enemy_vel_y = enemy_y[0] - enemy_y[1];
	end
yield();
end
end


---カードを持っているかどうか判定
function get_have_card(player,card_id)
	local count=0;
	for i = 0, 4 do
		if (get_card_id(player,i) == card_id) then
			count = count+1;
		end
	end
	return count;
end


---カードを使う。
function use_card(card_id)
	if (my_card == card_id) then
		key_reset();
		key_event(ACT_BC);
		yield();
	elseif (my_card ~= card_id) then
		set_card(card_id);
--		key_on(ACT_AB);
--		wait(2);
--		key_reset();
	end
end


----*****	追加	*****
---カードを使う。スキカ使用時にスキルを発動させない。
function use_card2(card_id)
	if (my_card == card_id) then
		key_reset();
		key_event2(ACT_DOWN,ACT_BC);
		yield();
	elseif (my_card ~= card_id) then
		set_card(card_id);
--		key_on(ACT_AB);
--		wait(2);
--		key_reset();
	end
end


---カードをセットする。
function set_card(card_id)
	if(seiran_pass_card~=nil and weather==11 and seiran_pass_card<0)then
		return false
	else
		set_card_id = card_id;
	end

--	if(my_card == card_id)then
--		key_off(ACT_AB);
--	elseif(get_have_card(0,card_id)<=0)then
--		key_off(ACT_AB);
--	elseif(my_card ~= card_id)then
--		key_event(ACT_AB);
--		wait(1);
--		key_off(ACT_AB);
--	end
end


---カードを逃がす。（可能なら2枚目にセットする）
function escape_card(card_id)
	if(seiran_pass_card~=nil and weather==11 and seiran_pass_card<0)then
		return false
	else
		escape_card_id = card_id;
	end

--	if(my_card==card_id and get_have_card(0,card_id)<math.ceil(my_spell))then
--		key_on(ACT_AB);
--		yield();
--	elseif(get_have_card(0,card_id)<=0)then
--
--	elseif(get_card_id(0,1) ~= card_id)then
--		key_on(ACT_AB);
--	end
end


---カードを送る
function pass_card()
local pass = false;	----*****	これはループの外に書きたい	*****
local card_id=nil;	----*****	他で使ってないので、localだと信じたい	*****

while true do
pass = false;
key_off(ACT_AB);

	if(escape_card_id ~= nil)then
		card_id = escape_card_id;
		set_card_id = nil;

		if(my_card==card_id and get_have_card(0,card_id)<math.ceil(my_spell))then
			key_on(ACT_AB);
			pass = true;
		elseif(get_have_card(0,card_id)<=0)then
			key_off(ACT_AB);
			escape_card_id = nil;
		elseif(get_card_id(0,1) ~= card_id)then
			key_on(ACT_AB);
			pass = true;
		end
	elseif(set_card_id ~= nil)then
		card_id = set_card_id;
		if(my_card == card_id)then
			key_off(ACT_AB);
			set_card_id = nil;
		elseif(get_have_card(0,card_id)<=0)then
			key_off(ACT_AB);
		elseif(my_card ~= card_id)then
			key_on(ACT_AB);
			pass = true;
		end
	end

	if(seiran_pass_card~=nil and weather==11 and pass == true)then
		seiran_pass_card = seiran_pass_card-1;
	end
	
yield();
end
end


---後ろの壁からの距離を求める
function get_dis_backwall()
	if(x<ex)then
		return x;
	else
		return (1280-x);
	end	
end


---前の壁までの距離を求める
function get_dis_frontwall()
	if(x>ex)then
		return x;
	else
		return (1280-x);
	end	
end


---スキルLv取得を拡張。疎雨を加味したレベルを返す。
function get_skill_lv2(player,skill_id)
	if(weather == 9 and get_skill_lv(player,skill_id)>=0)then
		return 4;
	else
		return get_skill_lv(player,skill_id);
	end
end


---方向キーはそのままで、ボタンのみOFF(離す)にする
function button_reset()
	for i=4,9 do
		key_off(i);
	end
end


---基準ダメージと比較して、CHか否かを返す。get_correction(0,32)がデフォルトで実装されたため、用済み
function get_CH(standard_damage)

	return get_correction(0,32);

--	if(enemy_act>=50 and enemy_act<=99 and my_combo==1)then
--		if(((enemy_hp+my_dam)>=2000 and my_dam>standard_damage) or ((enemy_hp+my_dam)<2000 and my_dam>standard_damage*0.9))then
--			return true;
--		end
--	end
--	
--	return false;
end


---真偽を数値に変えて返す
function BtoN(value)
	if(value==nil or value==false or value==0)then
		return 0;
	else
		return 1;
	end
end
