FC2ブログ
TOP > 一から始めるAI講座~第14回:スキルを使ってみよう~
 ← 狩人?踊り子? | TOP | 火山1コンプリート

リストマーク 一から始めるAI講座~第14回:スキルを使ってみよう~ 

【重要】新しいBlogに移転していますあるネットゲーマーの日常
前回はTraceAI関数の使い方を中心に、
スキルのIDを調べる方法を見ていきました

今回はそのIDを元に、自動でスキルを使う方法を見ていきましょう
・・・といっても、これもデフォルトAIの応用ですけどね

  ~2章~ 攻撃パターンを改造する

 2-5:スキルでGO!

前回調べたスキルID、実は鳥のムーンライトのものでした
コードに一見無意味な数字を埋め込むのはよろしくないので、
定数を定義してしまいましょう


------------------------------------------
-- skill id
------------------------------------------
S_MOONLIT = 8009
------------------------------------------


こうなれば、後は簡単
スキルを使うための関数は用意されていましたね

 SkillObject (MyID,MySkillLevel,MySkill,MyEnemy)

OnATTACK_ST関数でのこの記述は、
クライアントから送られた情報を元に決まっていましたが、
このスキルとレベルを書き換えれば、
自由にスキルを使えることになります

そこで、以下のようにしてみました


function  OnATTACK_ST ()

  TraceAI ("OnATTACK_ST")
  
  if (true == IsOutOfSight(MyID,MyEnemy)) then  -- ENEMY_OUTSIGHT_IN
    MyState = IDLE_ST
    TraceAI ("ATTACK_ST -> IDLE_ST")
    return
  end

  if (MOTION_DEAD == GetV(V_MOTION,MyEnemy)) then -- ENEMY_DEAD_IN
    MyState = IDLE_ST
    TraceAI ("ATTACK_ST -> IDLE_ST")
    return
  end

-- 主人を見失ったか?
  local max_dis = 10 -- 主人との最大距離
  local dis = GetDistanceFromOwner(MyID)
  if (dis > max_dis) then  -- 主人から離れた?
    MoveToOwner (MyID) -- 主人のそばへ
    MyState = FOLLOW_ST -- 追尾状態へ
    MyEnemy = 0 -- 敵を初期化
    TraceAI ("CHASE_ST -> FOLLOW_ST : MASTER_OUTSIGHT_IN")
    return
  end
    
  if (false == IsInAttackSight(MyID,MyEnemy)) then -- ENEMY_OUTATTACKSIGHT_IN
    MyState = CHASE_ST
    MyDestX, MyDestY = GetV (V_POSITION,MyEnemy);
    Move (MyID,MyDestX,MyDestY)
    TraceAI ("ATTACK_ST -> CHASE_ST : ENEMY_OUTATTACKSIGHT_IN")
    return
  end
  
  if (MySkill == 0) then
    SkillObject (MyID,5,S_MOONLIT,MyEnemy)
    Attack (MyID,MyEnemy)
  else
    SkillObject (MyID,MySkillLevel,MySkill,MyEnemy)
    MySkill = 0
  end
  TraceAI ("ATTACK_ST -> ATTACK_ST : ENERGY_RECHARGED_IN")
  return


end


一行加えるだけで、攻撃時に必ずスキルを使うようになります
ついでに、以前に改造した、離れすぎないようにする修正を、
攻撃時にも加えておきました

しかし、これでは問題があります
このままではSPが枯渇するまでスキルを使い続け、
いざと言う時にスキルが使えなくなります

そこで、SPを使いすぎないように修正してみました


  if (MySkill == 0) then
    local my_sp
    my_sp = GetV (V_SP,MyID)/GetV (V_MAXSP,MyID)
    if (my_sp > 0.5) then

      SkillObject (MyID,5,S_MOONLIT,MyEnemy)
    else
      Attack (MyID,MyEnemy)
    end
  else
    SkillObject (MyID,MySkillLevel,MySkill,MyEnemy)
    MySkill = 0
  end


ポイントはmy_spです
現在のSPと最大SPを計算し、
50%以上残っている時だけスキルを使うようにしました

これでだいぶましになりましたが、まだ問題があります

例えば、HP600の敵に対しスキルで500与えたとすると、
HPの残りは100ですが、SPが残っていれば、
またスキルを使ってしまいます

こういう場合は通常攻撃して欲しいので、さらに修正してみました


  if (MySkill == 0) then
    local my_sp
    local ememy_hp
    my_sp = GetV (V_SP,MyID)/GetV (V_MAXSP,MyID)
    ememy_hp = GetV (V_HP,MyEnemy)/GetV (V_MAXHP,MyEnemy)
    if (my_sp > 0.5 and ememy_hp > 0.5) then
      SkillObject (MyID,5,S_MOONLIT,MyEnemy)
    else
      Attack (MyID,MyEnemy)
    end
  else
    SkillObject (MyID,MySkillLevel,MySkill,MyEnemy)
    MySkill = 0
  end


SPの計算と同じ原理で、敵のHPを計算し、
相手のHPが半分以上残っている時だけスキルを使うようにしました


以上、スキルの使い方を見てきましたが、
今回の修正はあくまで鳥の場合であって、
他のホムには使えません

ですが、以前にも書いたように、
大事なのは考え方のプロセスであって、
他のホムのスキルについても同じように改造できるはずです
自分のホムにあった形で、いろいろ試してみてください

次回は別な形でスキルの使い方をみていきます
[2006.04.10(Mon) 09:44] ホムンクルスAI考察Trackback(0) | Comments(0)
↑TOPへ


 ← 狩人?踊り子? | TOP | 火山1コンプリート

COMMENT

COMMENT POST











管理者にだけ表示

Trackback

この記事のURL:
http://parrot.blog21.fc2.com/tb.php/260-f5cf7dc2
 ← 狩人?踊り子? | TOP | 火山1コンプリート

プロフィール

Categories

Recent Entries

Recent Comments

Archives

AdSense

Calander

ブログ内検索

RO Search

Links

Copylights

Amazon