292 lines
8.8 KiB
C
292 lines
8.8 KiB
C
![]() |
#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"
|
|||
|
|
|||
|
#define PETRACEPET_WAIT_LOOPTIME 30000 // 30<33><30>
|
|||
|
#define PETRACEPET_SHOWWIN_LOOPTIME 10000 // 10<31><30>
|
|||
|
|
|||
|
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);
|
|||
|
if (random == 0) // <20><><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
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)
|
|||
|
snprintf(tmpbuf, sizeof(tmpbuf), "Ŷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>%s<><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ࡣ<EFBFBD>",
|
|||
|
CHAR_getChar(meindex, CHAR_NAME));
|
|||
|
else if (randomi == 2)
|
|||
|
snprintf(tmpbuf, sizeof(tmpbuf), "%sʹ<73><CAB9><EFBFBD>˷<EFBFBD><CBB7><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>",
|
|||
|
CHAR_getChar(meindex, CHAR_NAME));
|
|||
|
else if (randomi == 3)
|
|||
|
snprintf(tmpbuf, sizeof(tmpbuf), "<EFBFBD><EFBFBD>...%s<><73>ŭ<EFBFBD>ˣ<EFBFBD>",
|
|||
|
CHAR_getChar(meindex, CHAR_NAME));
|
|||
|
if (randomi > 0 && randomi < 4)
|
|||
|
CHAR_talkToFloor(floor, master, tmpbuf, CHAR_COLORWHITE);
|
|||
|
}
|
|||
|
}
|
|||
|
else if (random == 1) // <20>ε<EFBFBD>
|
|||
|
{
|
|||
|
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)
|
|||
|
snprintf(tmpbuf, sizeof(tmpbuf), "%s<><73><EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD>...",
|
|||
|
CHAR_getChar(meindex, CHAR_NAME));
|
|||
|
else if (randomi == 2)
|
|||
|
snprintf(tmpbuf, sizeof(tmpbuf), "%s<><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
|
|||
|
CHAR_getChar(meindex, CHAR_NAME));
|
|||
|
else if (randomi == 3)
|
|||
|
snprintf(tmpbuf, sizeof(tmpbuf), "<EFBFBD><EFBFBD>...%s<>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¸ҵ<C2B8><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ˣ<EFBFBD>",
|
|||
|
CHAR_getChar(meindex, CHAR_NAME));
|
|||
|
if (randomi > 0 && randomi < 4)
|
|||
|
CHAR_talkToFloor(floor, master, tmpbuf, CHAR_COLORWHITE);
|
|||
|
}
|
|||
|
}
|
|||
|
else if (random == 2) // վ<><D5BE>
|
|||
|
{
|
|||
|
interval = 500;
|
|||
|
CHAR_sendAction(meindex, 3, FALSE);
|
|||
|
}
|
|||
|
else // һ<><D2BB>
|
|||
|
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)
|
|||
|
{
|
|||
|
// <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD>ĵ<EFBFBD><C4B5>ᣬ<EFBFBD><E1A3AC>ʼ״̬
|
|||
|
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);
|
|||
|
snprintf(tmpbuf, sizeof(tmpbuf), "<EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD>ĵص<EFBFBD><EFBFBD><EFBFBD>...%s",
|
|||
|
CHAR_getChar(meindex, CHAR_NAME));
|
|||
|
raceflag++;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if(raceflag == 1)
|
|||
|
{
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͻص<CDBB>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
CHAR_warpToSpecificPoint(meindex, 7005,43,47);
|
|||
|
snprintf(tmpbuf, sizeof(tmpbuf), "<EFBFBD><EFBFBD><EFBFBD>ŵ<EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD>ĵص<EFBFBD><EFBFBD><EFBFBD>...%s",
|
|||
|
CHAR_getChar(meindex, CHAR_NAME));
|
|||
|
raceflag++;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4>ͣ<EFBFBD><CDA3><EFBFBD>ʼ<EFBFBD><CABC>
|
|||
|
CHAR_warpToSpecificPoint(meindex, 7005,45,44);
|
|||
|
snprintf(tmpbuf, sizeof(tmpbuf), "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD>ĵص<EFBFBD><EFBFBD><EFBFBD>...%s",
|
|||
|
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)
|
|||
|
{
|
|||
|
// Ѱ<><D1B0><EFBFBD><EFBFBD>һ<EFBFBD><D2BB> x , y
|
|||
|
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
|
|||
|
|
|||
|
|