--サンドバッグ用ai
--しなうす式/20220706check

require("function_pun_strage.lua")
head_req_list()

function main()
--シード生成、スレッド生成、base_states設定
	set_seedthreadstates()
--キャラ確認
	char_calling()
--ステージが 核融合炉心部 だと超反応モードに
	set_printsabot()

while true do
--スレッド外初期化
	while_top()

--●どちらかが体力無くなったら待機
	if interbattle_condi()==true then
		interbattle_exe()
--▼開幕行動▼
	elseif kaimaku_condi()==true then
		kaimaku_exe()
--▼移動起き上がり
	elseif my_act==97 or my_act==98 then --基本：画面端より遠ざかる。中央では相手から遠ざか…りたいが、設置技警戒のため、相手側に移動起き上がり。
		movedgetup_exe()

--▼簡易受け身▼：攻撃ないし回避いずれの目的であってもリカバリーポイントは限られるが、そういうことはさておき実装したもの
	elseif recovery_condi()==true then
		recovery_exe()

--▼台風になった時、フラグに従って「緋想の剣」を使用
	elseif y==0 and my_act<=10 and card_check(14) and flag_kishitu==1 then
		print("天候フラグＯＮ　⇒　「緋想の剣」使用");
		card_use(14);

--▼台風▼：近接状態からの強引な状況変更を行う行動。スペカなど使用。
	elseif react_rejecttaihu_condi()==true then
		react_rejecttaihu_exe()

--▼起き攻め▼
	elseif setplay_ongetup_condi()==true then
		setplay_ongetup_exe()
--▼ＨＪＣ▼
	--地上HJC
	elseif hjc_ground_condi()==true then
		hjc_ground_exe()
	--空中HJC
	elseif hjc_air_condi()==true then
		hjc_air_exe()

--▼反応行動
--反応：下段
	elseif 	react_lowattack_condi()==true then
		react_lowattack_exe()
--反応：地対空
	elseif react_g2a_condi()==true then
		react_g2a_exe()
--反応：低空飛翔
	elseif react_lowj6d_condi()==true then
		react_lowj6d_exe()
--上空追いかけ
	elseif ueoikake_condi()==true then
		ueoikake_exe()
--霊撃 or 霊撃札
	elseif reigeki_condi()==true then 
		print("拒否行動：霊撃　⇒　可能ならば使用");
		card_use(0)
		
--▼グレイズ：相手行動に対する反射or一定距離内のオブジェクト感知▼
--モーション反応グレイズ
	elseif
	graze_condition_xrange()==true and
	hidamenozoku()==true and 
	my_air<=0 and my_rei>=0 then--近距離時のグレイズ。のさばらせておくと、誤結界の原因となる。ガードの硬直間際ならok
		print("check 1 -> graze act X Range");
		graze_action_xrange()
			
--▼ ガード行動：簡易ガードルーチン▼
--▼ ガード反撃、龍魚の羽衣 13
	elseif hagoromo_1st_condi()==true or hagoromo_condi()==true then
		hagoromo_exe()

--回避結界
	elseif kekkai_condi()==true then
		kekkai_exe()

--▼ 宵越しの銭 12
	elseif yoikoshi_1st_condi()==true or yoikoshi_condi()==true then
		yoikoshi_exe()

--▼汎用中下段ガード
--基本は行動に対して後退入れ込み。下段のみ抽出して反応。通常射撃も同じく下段で受ける(けどメンドウだから今回は省き)。フラグを抜けてくるものは別個に対応
	elseif lowattack_aflags_condi()==true then
		guard_backexpectlowattack_exe()
	elseif overheadattack_aflags_condi()==true then
		guard_backoverheadattack_exe()
--下段判定をフィルタ
	elseif lowattack_flaged_condi()==true then
		guard_backexpectlowattack_exe()
--フラグを抜けてくるものをフィルタ
	elseif lowattack_unflaged_condi()==true then
		guard_backexpectlowattack_exe()
--屈状態では低空昇り攻撃には立てない
	elseif notstand_overhead_upjump_condi()==true then
		guard_backexpectlowattack_exe()
--以下、何もフィルタされなかった場合、立ちガード
	elseif guard_pun_condi()==true then
		guard_backoverheadattack_exe()

--[[▼オブジェが至近距離の場合、着地直前にｈｊを仕込む、タッチ＆ゴーグレイズ
	elseif touchandgo_00_condi() then
		touchandgo_00_exe()
--オブジェが至近距離の場合、ガードの前に、離陸
	elseif touchandgo_01_condi() then
		touchandgo_01_exe()
	elseif touchandgo_02_condi() then
		touchandgo_02_exe()
--]]
--オブジェが至近距離の場合、空中から地上へ飛翔　※咲夜：２D：120.0以上、３D：84.9以上必要
	elseif graze_pun_condi()==true then
		graze_pun_exe()
		
--遠距離時のグレイズ
	elseif graze_farground_condi() then
		graze_farground_exe()
	elseif graze_farair_condi() then
		graze_farair_exe()
		
--特定状況におけるガード
	elseif guard_objgimmick_condi()==true then
		guard_backexpectlowattack_exe()
--オブジェが至近距離の場合、ガード:射撃と打撃を重ねられると、しゃがみガードしてしまう。優先順位の変更が必要
	elseif guard_objclosedis_condi()==true then
		guard_backexpectlowattack_exe()
	
--▼起き上がり直後の行動
	elseif move_soonaftergetup_condi()==true then
		move_soonaftergetup_exe()

--中距離以上からの８ｈｊ
	elseif my_rfunc>0.65 and 
	dis>=(140+11*8)*2 and 
	my_rfunc>0.65 and 
	y==0 and 
	my_act<=10 and 
	enemy_act<=5 and 
	is_dir_front==true and subs_count>=530 and nega_count ~= 1 and math.random(24)==1 then
		print("中距離以上で８ＨＪ");
		key_event2(ACT_D,ACT_UP);
--
--中距離からのダッシュ
	elseif my_rfunc>0.65 and 
	dis<=(140+11*8)*2 and 
	dis>140+11*8 and 
	my_rfunc>0.65 and 
	y==0 and 
	my_act<=10 and 
	enemy_act<=5 and 
	enemy_char~=3 and 
	is_dir_front==true and subs_count>=530 and nega_count ~= 1 and math.random(24)==1 then
		print("ダッシュ接近");
		key_event2(ACT_D,front);
--低空飛翔で接近
	elseif my_rfunc>0.65 and 
	dis<=(140+11*8)*2 and 
	dis>140+11*8 and 
	my_rfunc>0.65 and 
	y==0 and 
	my_act<=10 and 
	enemy_act<=5 and 
	enemy_char~=3 and 
	subs_count>=530 and nega_count ~= 1 and math.random(24)==1 then
		print("低空飛翔で接近",dis);
		key_resetEX();
		key_event2(ACT_D,ACT_UP);
		wait(8);
		if enemy_act<300 and not(enemy_act>=6 and enemy_act<=219) then
			key_event2(ACT_D,front);
		end
--
--▼終端機動▼
	--▼対台風時▼：逃げ　⇒　基本後退。近すぎる場合、７ＨＪ。画面端を背にしているなら８ＨＪ。一定以上なら飛び越える。ＨＪ後、相手がすぐに追ってきたら、即座に２飛翔。
	elseif weather==13 and my_act>=208 and my_act<=212 and y<=150 and enemy_act>=208 and enemy_act<=212 and y>ey and my_air==0 and dis<=150 and ((my_dir==1 and x<=200 and x<=ex) or (my_dir==-1 and x>=1080 and ex<=x)) then
		print("台風時：相手ＨＪ確認　⇒　切り替えし飛翔");
		key_event2(ACT_D,ACT_DOWN);
	elseif weather==13 and (
		(y>=ey+150 and enemy_yspeed<=0) or 
		(y<=ey-150 and enemy_yspeed>=0) or 
		(dis_y>=200 and enemy_act>=300)
	) and dis<=120 and my_air==0 and ((my_dir==1 and x<=200 and x<=ex) or (my_dir==-1 and x>=1080 and ex<=x)) then
		print("台風時：画面端　⇒　飛び越しor潜り抜け");
		key_event2(ACT_D,front);
	elseif weather==13 and y==0 and dis<=150 and ((my_dir==1 and x<=200 and x<=ex) or (my_dir==-1 and x>=1080 and ex<=x)) then
		print("台風時：画面端に追い詰められた　⇒　８ＨＪ");
		key_event2(ACT_D,ACT_UP);
	elseif weather==13 and y>0 and dis2<=300 and my_air==0 and ((my_dir==1 and ex>=400 and x<=ex) or (my_dir==-1 and ex<=880 and ex<=x)) then
		print("台風時：空中接近　⇒　７ＨＪ");
		lvr44();
	elseif weather==13 and y==0 and dis2<=300 and ((my_dir==1 and ex>=400 and x<=ex) or (my_dir==-1 and ex<=880 and ex<=x)) then
		print("台風時：地上接近　⇒　７ＨＪ");
		key_event2(ACT_D,u_back);
	elseif weather==13 and y==0 and dis2>300 then
		print("台風時：地上非接近　⇒　後退");
		key_on(back);
	--▼通常時▼：
	elseif y>0 and dis<=120 and my_air==0 and 
	(
		(y>=ey+180 and enemy_yspeed<=0) or 
		(y<=ey-180 and enemy_yspeed>=0) or 
		(dis_y>=250 and enemy_act>=300)
	) and 
	(
		(my_dir==1 and x<=200 and x<=ex) or 
		(my_dir==-1 and x>=1080 and ex<=x)
	) then
		print("画面端＆空中　⇒　前方下へ飛翔");
		key_resetEX();
		key_event2(ACT_D,front);
	--▼終端機動２▼
	--ただ動く事で自律性を錯覚させる事が目的の機動。静止やラインの設定に大きな根拠はない。
	--霊力が一定の評価を下回った場合、実行しない。
	elseif not(enemy_act>=50 and enemy_act<180) and y==0 and my_rfunc>0.65 and subs_count>=530 and nega_count ~= 1 then
	--ランダムで静止する
		if my_act~=0 and my_act~=2 and enemy_act<=10 and math.random(128)==1 then
			key_resetEX();
			print(1)
			for i = 0,60,1 do
				yield()
				if enemy_act>10 then break end
			end
	--ライン移動
	--ダッシュ等のコマンドフラグ成立時は実行しない事で、ダッシュ等の誤爆を抑止する構造としている。
	--時間経過により周期的にラインが変化する。
		elseif dis>400 + math.floor((math.sin(math.rad(4)*battle_time))*300) and enemy_frontside>480 and x<ex and flag_my_cmd656_65==0 and flag_my_cmd454_45==0 and flag_my_cmd252_25==0 and flag_my_cmdd5d_d5==0 then
				key_on(ACT_RIGHT);
		elseif dis>400 + math.floor((math.sin(math.rad(4)*battle_time))*300) and enemy_frontside>480 and ex<x and flag_my_cmd656_65==0 and flag_my_cmd454_45==0 and flag_my_cmd252_25==0 and flag_my_cmdd5d_d5==0 then
				key_on(ACT_LEFT);
		elseif dis<350 + math.floor((math.sin(math.rad(4)*battle_time))*300) and enemy_frontside>480 and x<ex and flag_my_cmd656_65==0 and flag_my_cmd454_45==0 and flag_my_cmd252_25==0 and flag_my_cmdd5d_d5==0 then
				key_on(ACT_LEFT);
		elseif dis<350 + math.floor((math.sin(math.rad(4)*battle_time))*300) and enemy_frontside>480 and ex<x and flag_my_cmd656_65==0 and flag_my_cmd454_45==0 and flag_my_cmd252_25==0 and flag_my_cmdd5d_d5==0 then
				key_on(ACT_RIGHT);
		
		elseif enemy_dir==1 then
		print(2)
				key_resetEX();
			if air_math>20 and
			(
			(my_act==2) or 
			(my_act>=62 and my_act<=65) or
			(my_act==143 and my_frame>=4 and my_act_block==2 and math.random(2)==1) or 
			(my_act>=154 and my_act<=157) or
			(my_act>=163 and my_act<=166) 
			)then
			print(3)
				key_on(ACT_RIGHT)
			elseif 	(
			(my_act==2) or 
			(my_act>=62 and my_act<=65) or
			(my_act==143 and my_frame>=4 and my_act_block==2 and math.random(2)==1) or 
			(my_act>=154 and my_act<=157) or
			(my_act>=163 and my_act<=166) 
			)then
				key_on(ACT_DOWN)
				key_on(ACT_RIGHT)
			else
				key_on(ACT_RIGHT)
			end
		else
		print(3)
			if air_math>20 and
			(
			(my_act==2) or 
			(my_act>=62 and my_act<=65) or
			(my_act==143 and my_frame>=4 and my_act_block==2 and math.random(2)==1) or 
			(my_act>=154 and my_act<=157) or
			(my_act>=163 and my_act<=166) 
			)then
				key_on(ACT_LEFT)
			elseif	(
			enemy_dir==2 or 
			(my_act>=62 and my_act<=65) or
			(my_act==143 and my_frame>=4 and my_act_block==2 and math.random(2)==1) or 
			(my_act>=154 and my_act<=157) or
			(my_act>=163 and my_act<=166) 
			)then
				key_on(ACT_DOWN)
				key_on(ACT_LEFT)
			else
				key_on(ACT_LEFT)
			end--]]
		end
	end
	
	yield()
end
end