chuyiwen_gmsv/npc/npc_petracepet.c

292 lines
8.9 KiB
C
Raw Normal View History

2016-12-24 08:45:52 +08:00
#include "version.h"
#include <string.h>
#include "char.h"
#include "object.h"
#include "char_base.h"
#include "npcutil.h"
#include "lssproto_serv.h"
#include "handletime.h"
#ifdef _PETRACE
#include "npc_petracepet.h"
2017-01-13 23:37:03 +08:00
#define PETRACEPET_WAIT_LOOPTIME 30000 // 30秒
#define PETRACEPET_SHOWWIN_LOOPTIME 10000 // 10秒
2016-12-24 08:45:52 +08:00
static void NPC_PetRacePet_Walk(int meindex);
static int NPC_PetRacePetSetPoint(int meindex, char *argstr);
enum
{
NPC_WORK_STATE = CHAR_NPCWORKINT1,
NPC_WORK_MASTER = CHAR_NPCWORKINT2,
NPC_WORK_ROUTEPOINT = CHAR_NPCWORKINT3,
NPC_WORK_ROUTETOX = CHAR_NPCWORKINT4,
NPC_WORK_ROUTETOY = CHAR_NPCWORKINT5,
NPC_WORK_WAITFLAG = CHAR_NPCWORKINT6,
NPC_WORK_FLOOR = CHAR_NPCWORKINT7,
NPC_WORK_X = CHAR_NPCWORKINT8,
NPC_WORK_Y = CHAR_NPCWORKINT9,
NPC_WORK_DIR = CHAR_NPCWORKINT10,
NPC_WORK_STOPX = CHAR_NPCWORKINT11,
NPC_WORK_STOPY = CHAR_NPCWORKINT12,
};
enum
{
NPC_State_Wait,
NPC_State_Run,
NPC_State_ShowWin,
};
int raceflag=0;
BOOL NPC_PetRacePetInit( int meindex )
{
char argstr[NPC_UTIL_GETARGSTR_BUFSIZE];
char buf[256];
int showstopx, showstopy;
int routenum = 0, i = 0;
NPC_Util_GetArgStr(meindex, argstr, sizeof(argstr));
for (i = 1; i <= routenum; i++)
{
char routetostring[64];
snprintf(routetostring, sizeof(routetostring), "routeto");
if (NPC_Util_GetStrFromStrWithDelim(argstr, routetostring, buf, sizeof(buf)) == NULL)
{
print("Init_npcracepet: Didn't set route\n");
return FALSE;
}
}
showstopx = NPC_Util_GetNumFromStrWithDelim(argstr, "showstopx");
showstopy = NPC_Util_GetNumFromStrWithDelim(argstr, "showstopy");
if (showstopx < 0 || showstopx > 100 || showstopy < 0 || showstopy > 100)
return FALSE;
CHAR_setInt(meindex, CHAR_WHICHTYPE, CHAR_PETRACEPET);
CHAR_setWorkInt(meindex, NPC_WORK_STATE, NPC_State_Wait);
CHAR_setWorkInt(meindex, NPC_WORK_ROUTEPOINT, 2);
CHAR_setWorkInt(meindex, NPC_WORK_WAITFLAG, 1);
CHAR_setWorkInt(meindex, NPC_WORK_FLOOR, CHAR_getInt(meindex, CHAR_FLOOR));
CHAR_setWorkInt(meindex, NPC_WORK_X, CHAR_getInt(meindex, CHAR_X));
CHAR_setWorkInt(meindex, NPC_WORK_Y, CHAR_getInt(meindex, CHAR_Y));
CHAR_setWorkInt(meindex, NPC_WORK_DIR, CHAR_getInt(meindex, CHAR_DIR));
CHAR_setWorkInt(meindex, NPC_WORK_STOPX, showstopx);
CHAR_setWorkInt(meindex, NPC_WORK_STOPY, showstopy);
CHAR_setInt(meindex, CHAR_LOOPINTERVAL, PETRACEPET_WAIT_LOOPTIME);
NPC_PetRacePetSetPoint(meindex, argstr);
return TRUE;
}
void NPC_PetRacePetTalked( int meindex , int talkerindex , char *szMes , int color )
{
}
void NPC_PetRacePetLoop( int meindex)
{
switch(CHAR_getWorkInt(meindex, NPC_WORK_STATE))
{
case NPC_State_Wait:
{
if (CHAR_getWorkInt(meindex, NPC_WORK_WAITFLAG) == 0)
{
char argstr[NPC_UTIL_GETARGSTR_BUFSIZE];
NPC_Util_GetArgStr(meindex, argstr, sizeof(argstr));
CHAR_setWorkInt(meindex, NPC_WORK_ROUTEPOINT, 2);
NPC_PetRacePetSetPoint(meindex, argstr);
CHAR_setInt(meindex, CHAR_LOOPINTERVAL, PETRACEPET_WAIT_LOOPTIME);
CHAR_setInt(meindex, CHAR_DIR, CHAR_getWorkInt(meindex, NPC_WORK_DIR));
CHAR_warpToSpecificPoint(meindex,
CHAR_getWorkInt(meindex, NPC_WORK_FLOOR),
CHAR_getWorkInt(meindex, NPC_WORK_X),
CHAR_getWorkInt(meindex, NPC_WORK_Y));
CHAR_setWorkInt(meindex, NPC_WORK_WAITFLAG, 1);
}
}
break;
case NPC_State_Run:
{
int interval = 50;
int random = 0;
if (CHAR_getWorkInt(meindex, NPC_WORK_ROUTETOX) <= CHAR_getWorkInt(meindex, NPC_WORK_STOPX)
&& CHAR_getWorkInt(meindex, NPC_WORK_ROUTETOY) >= CHAR_getWorkInt(meindex, NPC_WORK_STOPY))
random = 3;
else
random = RAND(0, 8);
2017-01-13 23:37:03 +08:00
if (random == 0) // 攻击
2016-12-24 08:45:52 +08:00
{
int rands = RAND(0, 3);
interval = 1500;
CHAR_sendAction(meindex, 0, FALSE);
if (rands == TRUE)
{
char tmpbuf[256];
int floor = CHAR_getInt(meindex, CHAR_FLOOR);
int master = CHAR_getWorkInt(meindex, NPC_WORK_MASTER);
int randomi = RAND(1, 9);
if (randomi == 1)
2017-01-13 23:37:03 +08:00
snprintf(tmpbuf, sizeof(tmpbuf), "哦~看来%s好像发威了唷",
2016-12-24 08:45:52 +08:00
CHAR_getChar(meindex, CHAR_NAME));
else if (randomi == 2)
2017-01-13 23:37:03 +08:00
snprintf(tmpbuf, sizeof(tmpbuf), "%s使出了奋力的一击",
2016-12-24 08:45:52 +08:00
CHAR_getChar(meindex, CHAR_NAME));
else if (randomi == 3)
2017-01-13 23:37:03 +08:00
snprintf(tmpbuf, sizeof(tmpbuf), "咦...%s发怒了",
2016-12-24 08:45:52 +08:00
CHAR_getChar(meindex, CHAR_NAME));
if (randomi > 0 && randomi < 4)
CHAR_talkToFloor(floor, master, tmpbuf, CHAR_COLORWHITE);
}
}
2017-01-13 23:37:03 +08:00
else if (random == 1) // 晕倒
2016-12-24 08:45:52 +08:00
{
int rands = RAND(0, 3);
interval = 2500;
CHAR_sendAction(meindex, 2, FALSE);
if (rands == TRUE)
{
char tmpbuf[256];
int floor = CHAR_getInt(meindex, CHAR_FLOOR);
int master = CHAR_getWorkInt(meindex, NPC_WORK_MASTER);
int randomi = RAND(1, 9);
if (randomi == 1)
2017-01-13 23:37:03 +08:00
snprintf(tmpbuf, sizeof(tmpbuf), "%s好像晕倒了呢...",
2016-12-24 08:45:52 +08:00
CHAR_getChar(meindex, CHAR_NAME));
else if (randomi == 2)
2017-01-13 23:37:03 +08:00
snprintf(tmpbuf, sizeof(tmpbuf), "%s受伤了吗",
2016-12-24 08:45:52 +08:00
CHAR_getChar(meindex, CHAR_NAME));
else if (randomi == 3)
2017-01-13 23:37:03 +08:00
snprintf(tmpbuf, sizeof(tmpbuf), "嘿...%s晕倒後又勇敢的爬起来了",
2016-12-24 08:45:52 +08:00
CHAR_getChar(meindex, CHAR_NAME));
if (randomi > 0 && randomi < 4)
CHAR_talkToFloor(floor, master, tmpbuf, CHAR_COLORWHITE);
}
}
2017-01-13 23:37:03 +08:00
else if (random == 2) // 站立
2016-12-24 08:45:52 +08:00
{
interval = 500;
CHAR_sendAction(meindex, 3, FALSE);
}
2017-01-13 23:37:03 +08:00
else // 一般
2016-12-24 08:45:52 +08:00
interval = RAND(20, 100);
NPC_PetRacePet_Walk(meindex);
CHAR_setInt(meindex, CHAR_LOOPINTERVAL, interval);
}
break;
case NPC_State_ShowWin:
{
int action = RAND(0, 11);
CHAR_sendAction(meindex, action, FALSE);
CHAR_setInt(meindex, CHAR_LOOPINTERVAL, PETRACEPET_SHOWWIN_LOOPTIME);
}
break;
default:
break;
}
}
static void NPC_PetRacePet_Walk(int meindex)
{
POINT start, end;
int dir, i;
start.x = CHAR_getInt(meindex, CHAR_X);
start.y = CHAR_getInt(meindex, CHAR_Y);
end.x = CHAR_getWorkInt(meindex, NPC_WORK_ROUTETOX);
end.y = CHAR_getWorkInt(meindex, NPC_WORK_ROUTETOY);
if (start.x == end.x && start.y == end.y)
{
char argstr[NPC_UTIL_GETARGSTR_BUFSIZE];
NPC_Util_GetArgStr(meindex, argstr, sizeof( argstr));
CHAR_setWorkInt(meindex, NPC_WORK_ROUTEPOINT,
CHAR_getWorkInt(meindex, NPC_WORK_ROUTEPOINT) + 1);
if (NPC_PetRacePetSetPoint(meindex, argstr) == FALSE)
{
2017-01-13 23:37:03 +08:00
// 到达目的地後,初始状态
2016-12-24 08:45:52 +08:00
char tmpbuf[256];
int masterindex = CHAR_getWorkInt(meindex, NPC_WORK_MASTER);
int petgoal = CHAR_getWorkInt(masterindex, CHAR_NPCWORKINT9);
int floor = CHAR_getInt(masterindex, CHAR_FLOOR);
if (CHAR_getWorkInt(masterindex, CHAR_NPCWORKINT8) == 0)
{
CHAR_warpToSpecificPoint(meindex, 7005,42,44);
CHAR_setWorkInt(masterindex, CHAR_NPCWORKINT8, meindex);
CHAR_sendAction(meindex, 3, FALSE);
2017-01-13 23:37:03 +08:00
snprintf(tmpbuf, sizeof(tmpbuf), "首先到达目的地的是...%s",
2016-12-24 08:45:52 +08:00
CHAR_getChar(meindex, CHAR_NAME));
raceflag++;
}
else
{
if(raceflag == 1)
{
2017-01-13 23:37:03 +08:00
//将宠物送回到指定的坐标
2016-12-24 08:45:52 +08:00
CHAR_warpToSpecificPoint(meindex, 7005,43,47);
2017-01-13 23:37:03 +08:00
snprintf(tmpbuf, sizeof(tmpbuf), "接着到达目的地的是...%s",
2016-12-24 08:45:52 +08:00
CHAR_getChar(meindex, CHAR_NAME));
raceflag++;
}
else
{
2017-01-13 23:37:03 +08:00
//完成最后一个宠物的传送,初始化
2016-12-24 08:45:52 +08:00
CHAR_warpToSpecificPoint(meindex, 7005,45,44);
2017-01-13 23:37:03 +08:00
snprintf(tmpbuf, sizeof(tmpbuf), "最后到达目的地的是...%s",
2016-12-24 08:45:52 +08:00
CHAR_getChar(meindex, CHAR_NAME));
raceflag=0;
}
}
CHAR_setWorkInt(meindex, NPC_WORK_STATE, NPC_State_ShowWin);
CHAR_setInt(meindex, CHAR_LOOPINTERVAL, 500);
CHAR_setWorkInt(meindex, NPC_WORK_WAITFLAG, 0);
CHAR_setWorkInt(masterindex, CHAR_NPCWORKINT9, petgoal + 1);
CHAR_talkToFloor(floor, masterindex, tmpbuf, CHAR_COLORWHITE);
return;
}
else
return;
}
dir = NPC_Util_getDirFromTwoPoint(&start, &end);
end.x = CHAR_getInt(meindex, CHAR_X);
end.y = CHAR_getInt(meindex, CHAR_Y);
for(i = 0; i < 100; i++)
{
if (dir < 0)
dir = RAND(0, 7);
dir = NPC_Util_SuberiWalk(meindex, dir);
if (dir >= 0 && dir <= 7) break;
}
if (dir >= 0 && dir <= 7)
{
int result = 0;
result = CHAR_walk(meindex, dir, 0);
}
}
static int NPC_PetRacePetSetPoint(int meindex, char *argstr)
{
2017-01-13 23:37:03 +08:00
// 寻找下一步 x , y
2016-12-24 08:45:52 +08:00
char buf[4096], buf2[256], buf3[256];
int ret;
char routetostring[64];
snprintf(routetostring, sizeof(routetostring), "routeto");
if (NPC_Util_GetStrFromStrWithDelim(argstr, routetostring, buf, sizeof(buf)) == NULL)
{
print("SetPoint_npcracepet: Didn't set route %s\n", routetostring);
return FALSE;
}
ret = getStringFromIndexWithDelim(buf, ";",
CHAR_getWorkInt(meindex, NPC_WORK_ROUTEPOINT), buf2, sizeof(buf2));
if (ret == FALSE) return FALSE;
ret = getStringFromIndexWithDelim(buf2, ",", 1, buf3, sizeof(buf3));
if (ret == FALSE) return FALSE;
CHAR_setWorkInt(meindex, NPC_WORK_ROUTETOX, atoi(buf3));
ret = getStringFromIndexWithDelim(buf2, ",", 2, buf3, sizeof(buf3));
if (ret == FALSE) return FALSE;
CHAR_setWorkInt(meindex, NPC_WORK_ROUTETOY, atoi(buf3));
return TRUE;
}
#endif