/* AI有一些基本屬性可以用SetAIAttrib設定 SetAIAttrib(id, attrib, value); AI 有四個行為狀態 1. Search 2. Lock 3. Pre-Attack 4. Attack 每種可以在_InitAI的時候用SetAIBehavior設定 SetAIBehavior(id, "type", typenum, rate, ...); 記得最後要call UpdateAIAttrib(id), 重新算機率 AI_SEARCH_FOLLOW最後一個參數要給follow的character id AI_SEARCH_PATROL的patrol點就放在SetAIAttrib裡面設好,Behavior不再設 */ // 範例: void CE01_InitAI(int id) { int cid = GetPlayerChara(); SetAIAttrib(id, AI_PATROL_POINT, 0, 1, 3); // 設巡邏點 SetAIAttrib(id, AI_LOOK_RANGE, 500); // 視線距離,預設200 SetAIAttrib(id, AI_LOOK_ANGLE, 360); // 視線角度,預設180度 SetAIAttrib(id, AI_ATTACK_RATE, 50); // 攻擊機率(0 ~ 100),機率預設50 SetAIAttrib(id, AI_ATTACK_RANGE, 100); // 攻擊範圍,預設80 SetAIAttrib(id, AI_DEFENSE_RATE, 10); // 防禦機率(0 ~ 100),機率預設50 SetAIAttrib(id, AI_CHIFLARE_RATE, 50); // 氣爆機率,機率預設0 SetAIAttrib(id, AI_ROLLING_RATE, 50); // AI被打倒後是否滾動的機率,機率預設0 SetAIAttrib(id, AI_DEMON_RATE, 20); // AI魔化機率,預設為0 SetAIAttrib(id, AI_DASH_RATE, 50); // 速移機率(0 ~ 100),機率預設50 SetAIAttrib(id, AI_WALKSPECIALLINK, 0); // 是否可以走特殊的link,預設0 SetAIAttrib(id, AI_ATTACK_STRING, "X+Y", ">X"); // AI亂數攻擊時會使用的按鍵,預設為上左右X,上左右Y SetAIAttrib(id, AI_MOVE_SPEED, 1); // AI走路速度,(0.0 ~ 1.0), 預設1.0f, 巡邏速度不受此限制 SetAIAttrib(id, AI_LEAVE_RANGE, 500); // 跟follow的人距離多遠,預設200 SetAIAttrib(id, AI_THINK_SPEED, 100); // from 10 to 100 SetAIAttrib(id, AI_BREAK_DEFENSE, 100); // from 0 to 100 SetAIAttrib(id, AI_SUPERATTACK_RATE, 100); // from 0 to 100 SetAIAttrib(id, AI_COUNTERATTACK_RATE, 100); // from 0 to 100 // 連招設定 SetAIAttrib(id, AI_COMBO_RATE, 1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9); // 雙刺 SetAIAttrib(id, AI_COMBO_RATE, 2, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9); // 匕首 // SetAIAttrib(id, AI_COMBO_RATE, 3, 0, 1, 2, 2, 3, 4, 5, 6, 7, 8, 9); // 劍 SetAIAttrib(id, AI_COMBO_RATE, 4, 0, 1, 2, 3, 5, 6, 7, 8, 9); // 槍 // SetAIAttrib(id, AI_COMBO_RATE, 5, 0, 1, 2, 2, 3, 4, 5, 6, 7, 8, 9); // 刀 // SetAIAttrib(id, AI_COMBO_RATE, 6, 0, 1, 2, 2, 3, 4, 5, 6, 7, 8, 9); // 錘 // SetAIAttrib(id, AI_COMBO_RATE, 7, 0, 1, 2, 2, 3, 4, 5, 6, 7, 8, 9); // 指虎 // SetAIAttrib(id, AI_COMBO_RATE, 8, 0, 1, 2, 2, 3, 4, 5, 6, 7, 8, 9); // 武士刀 // SetAIAttrib(id, AI_COMBO_RATE, 9, 0, 1, 2, 2, 3, 4, 5, 6, 7, 8, 9); // 忍者刀 // SetAIBehavior(id, AI_STATE_SEARCH, AI_SEARCH_IDLE, 100); // id, type, num, rate SetAIBehavior(id, AI_STATE_SEARCH, AI_SEARCH_RANDOMRUN, 100); // id, type, num, rate SetAIBehavior(id, AI_STATE_SEARCH, AI_SEARCH_FOLLOW, 100, cid); SetAIBehavior(id, AI_STATE_SEARCH, AI_SEARCH_PATROL, 100); SetAIBehavior(id, AI_STATE_LOCK, AI_LOCK_NEAREST_TARGET, 50); // SetAIBehavior(id, AI_STATE_LOCK, AI_LOCK_ONE_TARGET, 50, player); SetAIBehavior(id, AI_STATE_PREATTACK, AI_ATTACKMOVE_DIRECT, 50); // SetAIBehavior(id, AI_STATE_PREATTACK, AI_ATTACKMOVE_NOMOVE, 50); SetAIBehavior(id, AI_STATE_PREATTACK, AI_ATTACKMOVE_SHIFTMOVE, 50); /* SetAIBehavior(id, AI_STATE_PREATTACK, AI_ATTACKMOVE_DASH_FRONT, 50); SetAIBehavior(id, AI_STATE_PREATTACK, AI_ATTACKMOVE_FARAWAY, 50); SetAIBehavior(id, AI_STATE_PREATTACK, AI_ATTACKMOVE_DASH_BACK, 50); SetAIBehavior(id, AI_STATE_PREATTACK, AI_ATTACKMOVE_JUMP_SIDE, 50); SetAIBehavior(id, AI_STATE_PREATTACK, AI_ATTACKMOVE_JUMP, 50); SetAIBehavior(id, AI_STATE_PREATTACK, AI_ATTACKMOVE_MOVE_SIDE, 50); */ SetAIBehavior(id, AI_STATE_ATTACK, AI_ATTACK_RANDOM, 50); SetAIBehavior(id, AI_STATE_ATTACK, AI_ATTACK_COMBO, 50); // SetAIBehavior(id, AI_STATE_ATTACK, AI_ATTACK_DEFENSE, 50); UpdateAIBehavior(id); } //ChangeBehavior是在script當中改變AI的狀態, 目前是改變Search的狀態. //達成目標後會回到原本Search的行為狀態 //範例: ChangeBehavior(id, AI_SEARCH_INIT); // 回到初始狀態,用機率選擇一種search方式 ChangeBehavior(id, AI_SEARCH_IDLE); ChangeBehavior(id, AI_SEARCH_RANDOMRUN); ChangeBehavior(id, AI_SEARCH_PATROL, 21, 30, 10); // 有給patrol point就會蓋掉SetAIAttrib設的, // 沒給patrol point就根據先前設的 ChangeBehavior(id, AI_SEARCH_FOLLOW, cid); // 一定要給follow target的id啊 //AIPerform是用來叫AI做一些比較即時,小的動作,例如跳,打,轉面向,做某pose...之類的 //一樣達成目標之後會回到原本的行為狀態 //範例: AIPerform(aid, AI_PERFORM_NONE); // 把perform清掉 AIPerform(aid, AI_PERFORM_IDLE, time); // 原地idle幾秒 AIPerform(aid, AI_PERFORM_IDLELOOK, time); // 原地idle亂看個幾秒 AIPerform(aid, AI_PERFORM_MOVETO, 11); // 移動到某處 AIPerform(aid, AI_PERFORM_MOVETOCHARA, cid); // 直接移動到某個chara的位置 AIPerform(aid, AI_PERFORM_DODGE); // 逃跑 AIPerform(aid, AI_PERFORM_FACETO, cid); // 轉向某個id指向的人or item AIPerform(aid, AI_PERFORM_ATTACK, "X"); // 後面的字串是叫AI按什麼鍵: ^v<>XY AIPerform(aid, AI_PERFORM_POSE, num, time); // 做幾號pose,時間多久 AIPerform(aid, AI_PERFORM_JUMP); AIPerform(aid, AI_PERFORM_DOUBLEJUMP); AIPerform(aid, AI_PERFORM_DEFEND); AIPerform(aid, AI_PERFORM_CHICHARGING); AIPerform(aid, AI_PERFORM_LIFT); AIPerform(aid, AI_PERFORM_CHALLENGE); AIPerform(aid, AI_PERFORM_LOCK); AIPerform(aid, AI_PERFORM_UNLOCK); AIPerform(aid, AI_PERFORM_DROPITEM); AIPerform(aid, AI_PERFORM_DROPWEAPON); AIPerform(aid, AI_PERFORM_DROPDART); AIPerform(aid, AI_PERFORM_USEITEM); //另外有幾個Query function: // return AI跟某人物的距離 float Distance(aid, charaid); // AI是否到達某終點,後面是點的index int IsReachPoint(aid, point); /* AI 更新 SetAIBehavior(id,...); 最後call重新算機率可以call UpdateAIAttrib(id) or UpdateAIBehavior(id); 沒什麼原因,只是後面的名字比較切合實際,做的事都一樣,把rate分配從0-100 如果要AI根據環境的狀況改變Behavior的機率, 想要清掉之前SetAIBehavior的設定 可以call ClearAIAllBehavior(id) or ClearAIBehavior(id, "keyword"); */ ClearAIAllBehavior(id); //是把四個state全部的behavior機率通通設成0 ClearAIBehavior(id, AI_STATE_SEARCH); //是設search state的behavior機率通通設成0 ClearAIBehavior(id, AI_STATE_LOCK); //是設lock state的behavior機率通通設成0 ClearAIBehavior(id, AI_STATE_PREATTACK); //是設preattack state的behavior機率通通設成0 ClearAIBehavior(id, AI_STATE_ATTACK); //是設attack state的behavior機率通通設成0 // 範例: if(/* enemy is too far away, then change search type from follow to idle */) { ClearAIBehavior(id, AI_STATE_SEARCH); SetAIBehavior(id, AI_STATE_SEARCH, AI_SEARCH_IDLE, 100); ClearAIBehavior(id, AI_STATE_ATTACK); // 只清attack state的behavior SetAIBehavior(id, AI_STATE_ATTACK, AI_ATTACK_COMBO, 100); SetAIBehavior(id, AI_STATE_ATTACK, AI_ATTACK_RANDOM, 100); UpdateAIBehavior(id); } /* 如果只有設search state的機率,其他都沒有設,AI就只會待在search這個state, 不會去lock, preattack, attack */ // 範例 if(/* reset some behaviors */) { ClearAIAllBehavior(id); SetAIBehavior(id, AI_STATE_SEARCH, AI_SEARCH_IDLE, 100); SetAIBehavior(id, AI_STATE_LOCK, AI_LOCK_NEAREST_TARGET, 100); SetAIBehavior(id, AI_STATE_PREATTACK, AI_ATTACKMOVE_DIRECT, 100); UpdateAIBehavior(id); // 好像忘了些什麼... // 因為沒有設attack的behavior,之前又通通清掉了,所以此AI根本不會進attack state // 所以他就不會做attack動作,頂多移動到你旁邊而已 } /* 每隻AI都可以有自己的update callback function 命名為XXXX_UpdateAI(int id) */ // 範例 void CE01_UpdateAI(int id) { AIPerform(id, AI_PERFORM_JUMP); } /* update callback不會每個frame都call,跟think的時間相同 */