AA>追撃に移る判定を
if my_act==321 and is_dir_front then
if(enemy_act>=88 and enemy_act<=89)
and(my_hitstop>=3 and my_hitstop<=4)
then
〜
else return;--
end
end
とか変更すれば、一応やってくれます。
else --以上の条件に当てはまらない場合、歩きによる接近あるいは離脱。
if ((x<270 and my_dir==-1) or (x>1010 and my_dir==1)) and my_act<=10 then
key_on(front);
elseif ((x>=440 and my_dir==-1) or (x<=800 and my_dir==1)) and my_act<=10 then
dash();
else
key_on(back);
end
end
else --以上の条件に当てはまらない場合、歩きによる接近あるいは離脱。
key_reset();
if y==0 and ((x<270 and my_dir==-1) or (x>1010 and my_dir==1)) and my_act<=10 and enemy_act==89 and enemy_yspeed>0 and ey>30 then
key_on(front);
elseif y==0 and ((x>=440 and my_dir==-1) or (x<=800 and my_dir==1)) and my_act<=10 and enemy_act==89 and enemy_yspeed>0 and ey>30 then
key_event2(ACT_D,front);
elseif y==0 and not((x<270 and my_dir==-1) or (x>1010 and my_dir==1)) and not((x>=440 and my_dir==-1) or (x<=800 and my_dir==1)) and my_act<=10 and enemy_act==89 and enemy_yspeed>0 and ey>30 then
key_on(back);
end
end
再現方法として、yieldを呼ばずに無限ループさせ続ける方法があります。
例:
a = get_card_id(0,0);
while true do
if(a~=get_card_id(0,0))then
print(get_card_id(0,0));
end
end
上記コードはyieldを呼んでいない為、本来であれば何も表示しないはずですが
実際にはカード回せばいくらでも表示されてしまいます。
(このコードはCPUパワーを大量に浪費します、実行する場合は注意)
紫用AI(電車狂い)の方へ
ver090926 を AIManager から起動したところ、以下のエラーが出ました
PANIC: 基本行動_暫定.ai:84: attempt to compare number with table
どうやら 1P で AI を起動したときのみエラーが出るようです
ご確認ください
AIの内容は、以下の通り、
▼===============▼
function main()
while true do
print(1,math.floor(x*100)/100,get_attackarea(0,0));
print(2,math.floor(ex*100)/100,get_hitarea(1,0));
yield();
end
end
▲===============▲
「test.aiに書いたfunctionは動くのに、requireでインクルードしたfunction.aiに書いてあるfunctionが動かないことがある」
attempt to call global "関数"と言われるので、関数が定義されてないことになっているのだとは思うのですが・・・動いたり動かなかったりで原因が特定できませんでした。
どなたか分かる方、教えて頂きたいです。
プログラム風味にあらわすなら
a = 10
function main()
print a
end
は
global["a"] = 10
function main()
print global["a"]
end
と、置きかえられているかのように動作する。
こう考えるとわかりやすいかと思います。
要するに、「a」は単なる文字列で、実際に使う時に存在すれば問題ないということです。
(既にある条件文...) and ((get_special_data(1,10)<=5 or get_special_data(1,13)<=5) or ((get_special_data(1,10)>5 or get_special_data(1,13)>5) and dis>=400)) then
以下攻撃とかetc...
・オブジェクトからJFPを探す関数
function search_JFP()
true_obj_n = 0;
for enemy_obj_tagNo=0,enemy_obj_n-1,1 do
if enemy_obj_act[enemy_obj_tagNo]==856 then
JFP_No = enemy_obj_tagNo
true_obj_n = true_obj_n+1;
end
end
if true_obj_n==1 then
return true;
else
return false;
end
end
・obj_dataの分離
for tag1=0,enemy_obj_n-1,1 do
enemy_obj_act[tag1],enemy_obj_x[tag1],enemy_obj_y[tag1],enemy_obj_hp[tag1],enemy_obj_img[tag1],enemy_obj_frame[tag1],enemy_obj_xspeed[tag1],enemy_obj_yspeed[tag1],enemy_obj_id[tag1],enemy_obj_attackarea_n[tag1],enemy_obj_hit_n[tag1] = get_obj_data(0,tag1);
end
・JFPの耐久値計算(関数の必要なし)
function calculation_JFP_hp()
if search_JFP()==true then
if enemy_obj_hp[JFP_No]==0 then
JFP_hp = 3001
elseif enemy_obj_hp[JFP_No]~=0 then
JFP_hp = 3001-(65536-enemy_obj_hp[JFP_No])
end
else
JFP_hp = 0;
end
end
という訳で
((enemy_char==13 and search_ryujin_no_ikari()==false) or (enemy_char==4 and search_JFP()==false) or (enemy_char==14 and get_special_data(0,10)<=20))
と書かれている部分を全て
(enemy_char~=13 or enemy_char~=4 or enemy_char~=14 or (enemy_char==13 and search_ryujin_no_ikari()==false) or (enemy_char==4 and search_JFP()==false) or (enemy_char==14 and get_special_data(0,10)<=20))
とか置換すれば、取り敢えずですがみょんな棒立ちは無くなりました。
・ end が足りてない。
→多分不足してるのは5行目の if に対しての end だから、15行目の end の後にもう一つ end が必要
・スペース入れたいときは半角スペースかタブで。コメントアウトしていない場所で全角使っちゃダメ
・yield();をwhile true do 〜 end の間で一回呼び出さないと非想天則側にAIが情報(各種レバー、ボタン操作)を送ってくれない.
→endの直前にyield();を挟む
・ACT_Dに変数が入ってないからnilを代入してることになってる。
普段のAIでは予め
Error: [string "C:〜URL略〜"]:1517: unexpected symbol near 'then'
Error: [string "C:〜URL略〜."]:1517: unexpected symbol
Error:require(C:〜URL略〜01_marisa_main_EXAM.ai)
syntax error(構文エラーが発生しました)