インテだけはなんとかなった(´・ω・`)
他ができません(;´Д`)
var Timer = 0;
func SCR_HEALER_TS_KEEP(self)
{
sleep(100);
buff_time = buff_time + 1;
// start log
AiLog('SCR_HEALER_TS_KEEP : Start!!!');
// declare variables
var selfAi = GetAiActor(self);
var prevTS = GetPrevTS(selfAi);
// Hold Check
SCR_AI_LIB_UNHOLD(selfAi, prevTS);
// Main Loop
while(1){
Timer = Timer;
//Buff1 Intensify
if(Timer >= 6000){
Call();
Skill(2,0);
Timer2 = Timer2+1;
Timer1 = 0;
ChangeTacticsAi(selfAi, 'TS_KEEP');
return;
}
//Buff2 Acceleration
if(Timer >= 6000){
sleep(4000);
Call();
Skill(2,3);
Timer3 = Timer3+1;
Timer2 = 0;
ChangeTacticsAi(selfAi, 'TS_KEEP');
return;
}
//Buff3 Meditation
if(Timer >= 6000){
sleep(4000);
Call();
Skill(2,4);
Timer3 = 0;
ChangeTacticsAi(selfAi, 'TS_KEEP');
return;
}
後半これです
while(1){
Timer = Timer;
//Buff1 Intensify
if(Timer >= 6000){
Call();
Skill(2,0);
Timer = Timer;
Timer = 0;
ChangeTacticsAi(selfAi, 'TS_KEEP');
return;
}
//Buff2 Acceleration
if(Timer >= 6000){
sleep(4000);
Call();
Skill(2,3);
Timer = Timer;
Timer = 0;
ChangeTacticsAi(selfAi, 'TS_KEEP');
return;
}
//Buff3 Meditation
if(Timer >= 6000){
sleep(4000);
Call();
Skill(2,4);
Timer = 0;
ChangeTacticsAi(selfAi, 'TS_KEEP');
return;
}
オレはスカバフこうしてる
var BuffTimer = 0;
func SCR_HEALER_TS_KEEP(self)
略
var job = GetJobName(selfAi);
ShowInfo(1);
// Hold Check
SCR_AI_LIB_UNHOLD(selfAi, prevTS);
// Main Loop
while(1){
BuffTimer = BuffTimer+1;
//Buff
if(BuffTimer >= 400){
if(job == 'Scout'){
if('ChangeTS' == SCR_AI_LIB_BUFF(self,selfAi)){
BuffTimer = 0;
return;
}
}
}
// User Skill Check
//Buff
func SCR_AI_LIB_BUFF(self,selfAi)
{
Call();
Skill(2,0);
sleep(4500);
Call();
Skill(2,3);
sleep(4500);
Call();
Skill(2,4);
ChangeTacticsAi(selfAi, 'TS_KEEP');
return 'ChangeTS';
}
オレはプロテクこうしてる
var gTarget = nil;
var BuffTimer = 0;
func SCR_ATTACKER_TS_KEEP(self)
略
var job = GetJobName(selfAi);
// Hold Check
SCR_AI_LIB_UNHOLD(selfAi, prevTS);
ShowInfo(1);
// Main Loop
while(1){
BuffTimer = BuffTimer+1;
//ProtectionField
if(BuffTimer >= 15){
if(job == 'Emilia' || job=='EmiliaSage'){
if('ChangeTS' == SCR_AI_LIB_PROTECTION(self,selfAi)){
BuffTimer = 0;
return;
}
}
}
// User Target Check
//ProtectionField
func SCR_AI_LIB_PROTECTION(self,selfAi)
{
Call();
Skill(2,2);
SkillOnMyPc(0);
sleep(4800);
Call();
Skill(2,2);
SkillOnMyPc(1);
sleep(4800);
Call();
Skill(2,2);
SkillOnMyPc(2);
sleep(500);
ChangeTacticsAi(selfAi, 'TS_KEEP');
return 'ChangeTS';
}
Call(); は無くてもいいかもしんない。
離れてると行き違いでかからない時ある。
でもメンドイからそのまま使ってるw
Timer = Timer
が謎すぎて意味わからん。プログラミングやったことないだろ?w
・
>>924の部分について、buff_timeをグローバル変数で定義してるとしてもその後使っていないため無駄。
・それから関数内のvarの前で計算処理入れないほうがいいはず。
・
>>926の部分について、whileの最初の処理はTimer = Timer + 1だよな?
・このAIだとTimerが6000以上になったときにインテが発動して、
Timerを0に戻しているからいつまでたってもインテしかかからないのは当たり前だろ。
if(TimerがA以上のとき){処理X→Timer初期化}
if(TimerがA以上のとき){処理Y→Timer初期化}
if(TimerがA以上のとき){処理Z→Timer初期化}
こう書いた場合条件は全て同じAなんだから処理Xしか発動しないだろ。if文の使い方勉強しなおせ。
・Callした直後にスキル発動ではCallの意味がない。Callしてからキャラが集まるまでの時間をsleepしないといけない。
1つのTimerで同じカウントの時に3つのスキル使わせようとすると、
1番最初のスキルしか使わなかった
かといって、Timerのカウントを 30 60 90 みたいにわけても
30の時点で0に戻さないとやっぱり最初のスキルだけになってしまったw
カウンターが回らないのかね…
う〜んイジンコ以下なのでオレのバフは >927−930 で妥協している…
>>928だとバフの部分に入ってからしばらくヒールがなくなってしまうので
俺は各バフを個別にLIBに記述して、KEEPの方から時間をずらして呼び出してるよ。
>>926への補足。スキル発動後にはsleepを入れたほうがたぶんいい。
>>933 君はif elseという使い方を知っているか?w
それとは別に条件を30 60 90にしたって、「Timerが○○以上」で判断してるんだから
if(Timer >= 30){ ここは30以上で発動 }
if(Timer >= 60){ ここは60以上で発動 }
if(TImer >= 90){ ここは90以上で発動 }
考えてみろ。60は30以上だし、90も30以上かつ60以上だろ。最初のしか発動しなくて当たり前だ。
>>935 おおぉGJです!ありがとう!
if else の使い方が全然意味分かんなくて、
シカトしてたからこういう結果になったんだね
使い方を勉強します マジで感謝!!
いや〜改AIって面白い… ゲームよりも面白いw
読み返してて、的外れなことかいてたかもしれん。そうだったらすまんw
なんらかの原因でバフがうまく発動できなかったとしても大して影響ないと思ってるのでこうしていた。
if(Timer == 1000){インテ}
if(Timer == 2000){アクセラ}
if(Timer > 3000){メディテ後Timer初期化}
>>936 うーんと、自動バフのところではelseはあまり必要ないんだ。(if elseってか書き方はelse ifだったスマソw)
けど、他の部分で絶対必要になってくる。基本だしね。
簡単に日本語で説明できる処理だし、説明どっかでみてくればすぐわかると思うよ。
>>938 重ね重ねほんとに感謝 モチベーション上がりました!!!
多重起動は過去に何度も出ているようにX虎はずさなかぎり無理じゃね
自動収集空中キャッチしちゃうんですがsleepいじっても意味ないですよね?
なんで意味ないと思ってるのに聞くんだ?過去のレス見たか?
反応あるまで待つのめんどいから投下してやんよ
SCR_AI_LIB_NEARITEMのPickItemの前にsleep(800)程度の休みを入れて様子を見て時間を調節しろ
いわゆるツン ですね
ありです
アク禁解除記念にリクエストくれたらどれか1つ貼るよ\(^o^)/
・GetAiIndex配列使用、キャラ変更対応版
・ヒーラーキープ解除対策(NONEに行くのを防止してKEEP維持)
・銃キャラがじりじり押されてしまう問題対策
・ビキの新スタンススキルID
・HP残量にあわせてヒーリングとキュアオール使い分け
・HP残量にあわせてヒーリングとキュアオール使い分け
947 :
945:2008/01/26(土) 15:27:17 ID:???
func SCR_AI_LIB_HEALING(self, selfAi)
{
var option = GetOption(self);
var skillId = 1003; // healing auto
var needHealFriend = GetNeedHealFriend(selfAi, option.KeepRange, 70);
if( needHealFriend != nil ){
skillId = 30114; // cure all
} else {
needHealFriend = GetNeedHealFriend(selfAi, option.KeepRange, option.Heal);
}
if( needHealFriend != nil ){
InstantHold(selfAi);
UseSkill(selfAi, needHealFriend, skillId);
if(IsSkillUsing(selfAi) == 'NO') { // failed?
UseSkill(selfAi, needHealFriend, 1003);
}
ChangeTacticsAi(selfAi, 'TS_USER_SKILL');
return 'ChangeTS';
}
}
948 :
945:2008/01/26(土) 15:29:42 ID:???
スタンスやSPの問題でキュアオールが出来なかったら通常ヒールが発動するようにしてある。
70はHP70%以下ならキュアオール使うってこと。自分のHPにあわせて適度に変更してくれ。
ノシ
gj
・ビキの新スタンススキルID
頼むww
951 :
945:2008/01/26(土) 15:52:47 ID:???
1つだって言ってんだろ。それにそれが人にモノを頼む態度か?
30321 CallTurryDog
30323 SummonHillGiant
30325 SummonArarat
30333 SummonTreasureGolem
30334 SummonTachyon
30335 SummonIronArarat
お前かわいいな
・ヒーラーキープ解除対策(NONEに行くのを防止してKEEP維持)
955 :
945:2008/01/26(土) 16:17:40 ID:???
アク禁解除ではしゃぎすぎた。自重するわ。
元のAIがなぜNONEに行ってしまうのかを理解汁。
そうすれば数行の変更でNONEに行かないようにできる。
NONEからKEEPに強制的に飛ばす方法は邪道。
死んでしまって党員にリサテでもされたら動き出して\(^o^)/
で、同じアイテムに3匹群がらないようにするのは解決したのかね?
もう面倒くさいからみんなの完成品改AIうpしようぜ!
うpすんのメンドクサイからまた今度な
不正者申告されたら音がなるようにできたりします?
AIでは無理。そういうソフトつくればできる。
俺は・・・頭の中に処理の流れはできてるがあまり必要ないのと詳しい作り方わからんのでやってないw
そっか
ソクレスthx
俺のAi 不正申告来るとBEEPなるんだけど
これって異常?
え・・・普通ならなくね?wどっちなんだろwww
いつの蔵?
自動でPOTバフ
インテとアクセラかけるにはどうすればいいんでしょう?
>>965 直前でスカバフの話題でてるんだから読めや
POTはUseItem(X,Y)で飲ませる。Xはキャラの位置(左から0,1,2)Yはアイテムショートカットの位置(左から0,1)
HP残量確認はLIBのヒールのところ読んで、どうすればいいか考えろ
>>956 理由わかる?正常AIだとそういう現象起きないんだけどなぁ・・・
自動収集をホットキーで分けたいんですが
宣告は
//AUTO GET ITEM
func SCR_AI_LIB_CHANGE_SETTING_AUTOGETITEM()
{
// declare variables
var g_auto_getItem = 0;
var g_auto_getItem = 1;
var g_auto_getItem = 2;
var g_auto_getItem = 3;
な感じでいいんですか?
969 :
968:2008/01/27(日) 07:58:04 ID:???
各TS KEEPに
// Near Item
if(0 != SCR_AI_LIB_SHOULD_I_GETITEM(selfAi)){
if('ChangeTS' == SCR_AI_LIB_NEARITEM(selfAi)){
return;
}
}
に追加
970 :
968:2008/01/27(日) 07:59:23 ID:???
//AUTO GET ITEM
func SCR_AI_LIB_CHANGE_SETTING_AUTOGETITEM()
{
// declare variables
var g_auto_getItem = 0;
var g_auto_getItem = 1;
var g_auto_getItem = 2;
var g_auto_getItem = 3;
//AUTO GET ITEM CHANGE SETTING
func SCR_AI_LIB_CHANGE_SETTING_AUTOGETITEM()
{
g_auto_getItem = g_auto_getItem + 1;
if(g_auto_getItem >= 6){
g_auto_getItem = 0;
}
SysMsg('[Setting Change]Auto Get Item Setting :: ' .. g_auto_getItem);
SysMsg('0:Disabled 1:Adjacent only 2:Leader only 3:Everyone');
}
//ASK Should I Get Near Item?
func SCR_AI_LIB_SHOULD_I_GETITEM(selfAi)
{
if(g_auto_getItem == 0 || g_auto_getItem == -1) return 0;
var job = GetJobName(selfAi);
if(g_auto_getItem == 1){
if(GetMyAtkLayer(selfAi) == 1){
return 1;
}
971 :
968:2008/01/27(日) 08:04:36 ID:???
} else if (g_auto_getItem == 2){
if(IsLeader(selfAi) == 'YES'){
return 1;
}
} else return 1;
return 0;
}
で、あとはホットキーで登録させたんですが
応答すらしません('A`)
972 :
968:2008/01/27(日) 08:07:08 ID:???
<HotKey Name="ON/OFF auto_getItem" Scp="SCR_AI_LIB_CHANGE_SETTING_AUTOGETITEM()" Key="F1" UseAlt="NO" UseCtrl="YES" UseShift="NO" OnEdit="YES" />
<HotKey Name="ON/OFF auto_getItem" Scp="SCR_AI_LIB_CHANGE_SETTING_AUTOGETITEM()" Key="F2" UseAlt="NO" UseCtrl="YES" UseShift="NO" OnEdit="YES" />
<HotKey Name="ON/OFF auto_getItem" Scp="SCR_AI_LIB_CHANGE_SETTING_AUTOGETITEM()" Key="F3" UseAlt="NO" UseCtrl="YES" UseShift="NO" OnEdit="YES" />
user.xmlのデフォ→C:〜〜〜
>>970 var g_auto_getItem = 0;
var g_auto_getItem = 1;
var g_auto_getItem = 2;
var g_auto_getItem = 3;
何度も同じ変数を定義するな。変数の定義・初期化について勉強しなおして来い。
SCR_AI_LIB_CHANGE_SETTING_AUTOGETITEM()この関数を2回定義してるのは何故?g_auto_getItemという変数をスイッチにしたいんなら、AIの冒頭でグローバル変数として定義しておけ。
SCR_AI_LIB_SHOULD_I_GETITEMで、変数定義の前に処理を入れるべきでない。
>>972 それだとどのホットキー押しても同じ関数呼び出してるのわかる?