|
早在1~2年前就准备不用官方自带的ai来让怪物进行行动,不过奈何当时技术有限没有深入下去,只是草草
预留了几个文件来确定怪物ai和思路。最近有时间写东西的时候重新写然后把怪物ai底层逻辑按照官方ai原本的意思复写出来了。
本质上其实是ap附加,然后ap执行经过字符串拼接后的函数名称。按照特定的逻辑进行执行后模拟的ai
当然除了一些细致的问题外,整体上是完全可以套用这一套nut的ai,本意是可以直接照抄官方的lua ai
除此之外还可以额外扩展其他的nut类ai,因为后面版本的怪物多了相当多的设定,也就要相当多的扩展判断。
(nut版本的ai是支持怪物的[init cool time]标签,和韧性条判断,此外ai还支持单独的堆栈存储器操作。)
sq_RunScript("monster/ai_nut/ai_value.nut");
sq_RunScript("monster/ai_nut/ai_def.nut");
//gal_AIPattern_GetTarget(obj)
//AI_isNotStay(obj)
//AI_isStay(obj)
//AI_checkRandomIsPresent(v)
//gal_AIPattern_isTargetArea(obj,frontX,backX,upY,downY)
//gal_AIPattern_isInCoolTime(obj,id)
//gal_AIPattern_GetVar(obj,stringName)
//gal_AIPattern_SetVar(obj,stringName,value)
//gal_AIPattern_getHpRate(obj)
//gal_AIPattern_getHp(obj)
//gal_AIPattern_GetAttackIndex(obj)
//gal_AIPattern_isNetralizeState(obj)
//gal_AIPattern_GetAIThinkOffset(obj)
//gal_AIPattern_SetAIThinkOffset(obj,v)
//gal_AIPattern_TargetIsBack(obj)
//gal_AIPattern_getRandom(minv,maxv)
//gal_AIPattern_GetTarget(obj)
//gal_AIPattern_getTargetXPos(obj) //Y or Z
//gal_AIPattern_getXPos(obj) //Y or Z
//gal_AIPattern_getToughnessEnegryValue(obj) //獲得韌性條
//gal_AIPattern_isLockToughness(obj)
//gal_AIPattern_getLimitToughnessValue(obj)
//this is sample File
//將函數后的1000改成怪物在lst的id即可調用。為函數體進行拼接完成
//選擇目標 是生物
function gal_AINutPattern_SelectTargetType_1000(target)
{
if (target.isObjectType(OBJECTTYPE_ACTIVE))
return true;
return false;
}
//不使用優先目標
function gal_AINutPattern_IsFristTarget_1000(target)
{
return null;
}
//技能cd,返回值
function gal_AINutPattern_MonsterCoolTime_1000(ids)
{
local coolVector = [
10000,
10001,
15002,
15003,
30004,
20005,
30006,
20007,
60008,
120009,
10,
60011,
30012];
return coolVector[ids];
}
//技能初始cd,返回值
function gal_AINutPattern_InitMonsterCoolTime_1000(ids)
{
local coolVector = [
3000,
3001,
5002,
5003,
10004,
15005,
5006,
40007,
08,
60009,
10,
30011,
15012];
return coolVector[ids];
}
//gal_forceSetStateSendPacket(obj,attackIndex)
//怪物ai主邏輯思路
function gal_AINutPattern_Action_1000(obj)
{
if (AI_isNotStay(obj))
return -1;
return -1;
local target = gal_AIPattern_GetTarget(obj);
//堆棧器
if (gal_AIPattern_GetVar(obj,0) == 0)
{
gal_AIPattern_SetVar(obj,0,1)
return 34;
//bakal skasa incoming effect
}
if (gal_AIPattern_isTargetArea(obj,800,100,200,200))
{
if (!gal_AIPattern_isInCoolTime(obj,0))
{
//gal_forceSetStateSendPacket(obj,55);
return 0;//set 0 attack action
}
}
if (gal_AIPattern_isTargetArea(obj,800,100,200,200))
{
if (!gal_AIPattern_isInCoolTime(obj,1))
{
gal_forceSetStateSendPacket(obj,155);//免控狀態設定
return -1;
}
}
return -1;
}
//思考間隔
function gal_AINutPattern_ThinkTerm_1000(obj)
{
return 300;
}
//目標選擇間隔
function gal_AINutPattern_DestingTerm_422215(obj)
{
return 1000;
}
//視野
function gal_AINutPattern_MonsterSight_1000(obj)
{
return 10000;
}
最后实现效果倒是和ai写的没什么两样,但是台服的ai实在是太狗屎了,所以必须要改变的……
不过这样有很多的思路都不需要act去参与,比如怪物开场动画,怪物分成了多阶段。完完全全可以由
ai来进行处理(因为支持了存储器操作了。可以把阶段和开场动画flag存进存储器里)
https://www.bilibili.com/video/BV1jM411o7Bp/?vd_source=b607a3e5384ea9d7b12ac837b1ce01fe
怪物ai是拿nut写的。当然只是测试使用。 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|