📄 npc_bus.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 "npc_bus.h"
#include "handletime.h"
/*
* 田旦心凶中卅仪毛允月NPC
*/
enum {
NPC_WORK_ROUTETOX = CHAR_NPCWORKINT1, /* 升仇尺" 甄 */
NPC_WORK_ROUTETOY = CHAR_NPCWORKINT2, /* 升仇尺" 甄 */
NPC_WORK_ROUTEPOINT = CHAR_NPCWORKINT3, /* 漆窒 井 */
NPC_WORK_ROUNDTRIP = CHAR_NPCWORKINT4, /* 垫五井窖曰井 ㄟ“垫五 ㄠ“窖曰 */
NPC_WORK_MODE = CHAR_NPCWORKINT5,
NPC_WORK_CURRENTROUTE = CHAR_NPCWORKINT6,
NPC_WORK_ROUTEMAX = CHAR_NPCWORKINT7,
NPC_WORK_WAITTIME = CHAR_NPCWORKINT8,
NPC_WORK_CURRENTTIME = CHAR_NPCWORKINT9,
NPC_WORK_SEFLG = CHAR_NPCWORKINT10,
};
/* 蛐 丢永本□斥及enum */
enum {
NPC_BUS_MSG_GETTINGON,
NPC_BUS_MSG_NOTPARTY,
NPC_BUS_MSG_OVERPARTY,
NPC_BUS_MSG_DENIEDITEM,
NPC_BUS_MSG_ALLOWITEM,
NPC_BUS_MSG_LEVEL,
NPC_BUS_MSG_GOLD,
NPC_BUS_MSG_EVENT,
NPC_BUS_MSG_START,
NPC_BUS_MSG_END,
};
typedef struct {
char option[32];
char defaultmsg[128];
}NPC_BUS_MSG;
NPC_BUS_MSG busmsg[] = {
{ "msg_gettingon", "PAON!(你无法於中途加入我们唷!)"},
{ "msg_notparty", "PAPAON!!无法以团队加入唷!"},
{ "msg_overparty", "PAON!!人数已满。"},
{ "msg_denieditem", "PAPAON!!我可不要这个道具!"},
{ "msg_allowitem", "哇喔~(想要那个道具啊!)"},
{ "msglevel", "PAPAON!!你的等级还不够唷!"},
{ "msg_stone", "PAPAON!!金钱不足唷!"},
{ "msg_event", "PAON!!你无法加入唷!"},
{ "msg_start", "哇喔~(出发进行)"},
{ "msg_end", "哇喔~(到罗)"}
};
static int NPC_BusSetPoint( int meindex, char *argstr);
static void NPC_BusSetDestPoint( int meindex, char *argstr);
static BOOL NPC_BusCheckDeniedItem( int meindex, int charaindex, char *argstr);
static BOOL NPC_BusCheckLevel( int meindex, int charaindex, char *argstr);
static int NPC_BusCheckStone( int meindex, int charaindex, char *argstr);
static void NPC_BusSendMsg( int meindex, int talkerindex, int tablenum);
static int NPC_BusGetRoutePointNum( int meindex, char *argstr );
static void NPC_Bus_walk( int meindex);
#define NPC_BUS_LOOPTIME 200
/* 谨切凛棉犯白巧伙玄 */
#define NPC_BUS_WAITTIME_DEFAULT 180
#define NPC_BUS_WAITINGMODE_WAITTIME 5000
/*********************************
* 赓渝质
*********************************/
BOOL NPC_BusInit( int meindex )
{
char argstr[NPC_UTIL_GETARGSTR_BUFSIZE];
int i;
char buf[256];
int routenum;
int waittime;
int seflg;
NPC_Util_GetArgStr( meindex, argstr, sizeof( argstr));
/* 卅仃木壬中仃卅中娄醒及民尼永弁 */
routenum = NPC_Util_GetNumFromStrWithDelim( argstr, "routenum");//行驶路线数量
if( routenum == -1 ) {
print( "npcbus:nothing routenum \n");
return FALSE;
}
CHAR_setWorkInt( meindex, NPC_WORK_ROUTEMAX, routenum);
for( i = 1; i <= routenum; i ++ ) {
char routetostring[64];
snprintf( routetostring, sizeof( routetostring), "routeto%d", i);
if( NPC_Util_GetStrFromStrWithDelim( argstr, routetostring,buf, sizeof(buf))
== NULL )
{
print( "npcbus:nothing route to \n");
return FALSE;
}
}
waittime = NPC_Util_GetNumFromStrWithDelim( argstr, "waittime");
if( waittime == -1 ) waittime = NPC_BUS_WAITTIME_DEFAULT;
CHAR_setWorkInt( meindex, NPC_WORK_WAITTIME, waittime);
seflg = NPC_Util_GetNumFromStrWithDelim( argstr, "seflg");
if( seflg == -1 ) seflg = TRUE;
CHAR_setWorkInt( meindex, NPC_WORK_SEFLG, seflg);
CHAR_setInt( meindex , CHAR_WHICHTYPE , CHAR_TYPEBUS );
CHAR_setWorkInt( meindex, NPC_WORK_MODE, 0);
CHAR_setWorkInt( meindex, NPC_WORK_ROUTEPOINT, 2);
CHAR_setWorkInt( meindex, NPC_WORK_ROUNDTRIP, 0);
CHAR_setWorkInt( meindex, NPC_WORK_CURRENTROUTE, 0);
CHAR_setInt( meindex, CHAR_LOOPINTERVAL,
NPC_BUS_WAITINGMODE_WAITTIME);
/* 蜇箕及凛棉毛本永玄 */
CHAR_setWorkInt( meindex, NPC_WORK_CURRENTTIME, NowTime.tv_sec);
for( i = 0; i < CHAR_PARTYMAX; i ++) {
CHAR_setWorkInt( meindex, CHAR_WORKPARTYINDEX1 + i, -1);
}
/* 伙□玄瑁烂允月 */
{
int rev;
int r = CHAR_getWorkInt( meindex, NPC_WORK_ROUTEMAX);
CHAR_setWorkInt( meindex, NPC_WORK_CURRENTROUTE, RAND( 1, r));
//print( "route:%d\n",CHAR_getWorkInt( meindex, NPC_WORK_CURRENTROUTE));
/* 欠旦正□玄 */
rev = NPC_Util_GetNumFromStrWithDelim( argstr, "reverse");
if( rev == 1 ) {
int num = NPC_BusGetRoutePointNum( meindex, argstr);
if( num <= 0 ) {
print( "npcbus:真奇怪!\n");
return FALSE;
}
CHAR_setWorkInt( meindex, NPC_WORK_ROUTEPOINT, num-1);
CHAR_setWorkInt( meindex, NPC_WORK_ROUNDTRIP, 1);
}
/* 伙□玄毛本永玄允月 */
NPC_BusSetPoint( meindex, argstr);
/* 垫五燮毛 憎允月 */
NPC_BusSetDestPoint( meindex, argstr);
}
return TRUE;
}
/*********************************
* 仄井仃日木凶凛及质
*********************************/
void NPC_BusTalked( int meindex , int talkerindex , char *szMes ,
int color )
{
int i;
int partyflg = FALSE;
/* 皿伊奶乩□卞覆仄化分仃 杀允月 */
if( CHAR_getInt( talkerindex , CHAR_WHICHTYPE ) != CHAR_TYPEPLAYER ) {
return;
}
/* 愤坌及由□ 奴 昙菸 井升丹井譬屯月 */
for( i = 0; i < CHAR_PARTYMAX; i ++ ) {
int index = CHAR_getWorkInt( meindex, CHAR_WORKPARTYINDEX1+i);
if( CHAR_CHECKINDEX(index)){
if( index == talkerindex) {
partyflg = TRUE;
}
}
}
if( !partyflg ) {
//NPC_BusCheckJoinParty( meindex, talkerindex, TRUE);
}
else {
if( CHAR_getWorkInt( meindex, NPC_WORK_MODE) == 0 ) {
int i;
// #define NPC_BUS_DEBUGROUTINTG "routingtable:"
if( strstr( szMes, "出发" ) ||
strstr( szMes, "出发" ) ||
strstr( szMes, "Go" ) ||
strstr( szMes, "go" ))
{
CHAR_setWorkInt( meindex, NPC_WORK_MODE,1);
/* 伙□皿楮醒及裟请仄毛汹仁簧蘸卞允月 */
CHAR_setInt( meindex, CHAR_LOOPINTERVAL, NPC_BUS_LOOPTIME);
/* SE 日允 穴件乒旦及陲太 */
if( CHAR_getWorkInt( meindex, NPC_WORK_SEFLG )) {
CHAR_sendSEoArroundCharacter(
CHAR_getInt( meindex, CHAR_FLOOR),
CHAR_getInt( meindex, CHAR_X),
CHAR_getInt( meindex, CHAR_Y),
60,
TRUE);
}
/* 请 允月凛及丢永本□斥*/
for( i = 1; i < CHAR_PARTYMAX; i ++ ) {
int partyindex = CHAR_getWorkInt( meindex, CHAR_WORKPARTYINDEX1+i);
if( CHAR_CHECKINDEX( partyindex)) {
NPC_BusSendMsg( meindex, partyindex, NPC_BUS_MSG_START);
}
}
}
}
#if 0
else if( strstr( szMes, "停止" ) ||
strstr( szMes, "停止" ) ||
strstr( szMes, "stop" ) ||
strstr( szMes, "Stop" ))
{
CHAR_setWorkInt( meindex, NPC_WORK_MODE,2);
/* 伙□皿楮醒及奶件正□田伙毛聂仁允月 */
CHAR_setInt( meindex, CHAR_LOOPINTERVAL,
NPC_BUS_WAITINGMODE_WAITTIME);
/* 蜇箕及凛棉毛本永玄 */
CHAR_setWorkInt( meindex, NPC_WORK_CURRENTTIME, NowTime.tv_sec);
}
else if( strstr( szMes, NPC_BUS_DEBUGROUTINTG )) {
/* 犯田永弘迕 */
char *p = strstr( szMes,NPC_BUS_DEBUGROUTINTG);
char argstr[NPC_UTIL_GETARGSTR_BUFSIZE];
NPC_Util_GetArgStr( meindex, argstr, sizeof( argstr));
if( p) {
int a = atoi( p+strlen(NPC_BUS_DEBUGROUTINTG));
if( a <0 ) a = 1;
CHAR_setWorkInt( meindex, NPC_WORK_CURRENTROUTE, a);
}
//print( "route:%d\n",CHAR_getWorkInt( meindex, NPC_WORK_CURRENTROUTE));
/* 伙□玄毛本永玄允月 */
NPC_BusSetPoint( meindex, argstr);
}
#endif
}
}
/**************************************
* 伙□皿楮醒
**************************************/
void NPC_BusLoop( int meindex)
{
int i;
switch( CHAR_getWorkInt( meindex, NPC_WORK_MODE )) {
case 0:
/* 谨切乒□玉及凛]凛棉毛民尼永弁允月 */
/* 凛棉互烦匀凶及匹]请 允月 */
if( CHAR_getWorkInt( meindex, NPC_WORK_CURRENTTIME)
+ CHAR_getWorkInt( meindex, NPC_WORK_WAITTIME)
< NowTime.tv_sec)
{
/* SE 日允 穴件乒旦及陲太 */
if( CHAR_getWorkInt( meindex, NPC_WORK_SEFLG )) {
CHAR_sendSEoArroundCharacter(
CHAR_getInt( meindex, CHAR_FLOOR),
CHAR_getInt( meindex, CHAR_X),
CHAR_getInt( meindex, CHAR_Y),
60,
TRUE);
}
/* 请 允月凛及丢永本□斥*/
for( i = 1; i < CHAR_PARTYMAX; i ++ ) {
int partyindex = CHAR_getWorkInt( meindex, CHAR_WORKPARTYINDEX1+i);
if( CHAR_CHECKINDEX( partyindex)) {
NPC_BusSendMsg( meindex, partyindex, NPC_BUS_MSG_START);
}
}
CHAR_setWorkInt( meindex, NPC_WORK_MODE,1);
/* 伙□皿楮醒及裟请仄毛汹仁簧蘸卞允月 */
CHAR_setInt( meindex, CHAR_LOOPINTERVAL, NPC_BUS_LOOPTIME);
}
return;
case 1:
/* 汹仁 */
NPC_Bus_walk( meindex);
case 2:
/* 鞅引匀化中月乒□玉 */
/* 凛棉互烦匀凶及匹]请 允月 */
if( CHAR_getWorkInt( meindex, NPC_WORK_CURRENTTIME)
+ (CHAR_getWorkInt( meindex, NPC_WORK_WAITTIME) /3)
< NowTime.tv_sec)
{
CHAR_setWorkInt( meindex, NPC_WORK_MODE,1);
/* 伙□皿楮醒及裟请仄毛汹仁簧蘸卞允月 */
CHAR_setInt( meindex, CHAR_LOOPINTERVAL, NPC_BUS_LOOPTIME);
}
return;
case 3:
/* 谗邋仄化手]弁仿奶失件玄及 樟谨切及啃卞]
* 剂仄仇仇匹它尼奶玄毛中木化支月
*/
if( CHAR_getWorkInt( meindex, NPC_WORK_CURRENTTIME) + 3
< NowTime.tv_sec)
{
char argstr[NPC_UTIL_GETARGSTR_BUFSIZE];
NPC_Util_GetArgStr( meindex, argstr, sizeof( argstr));
/* 伙□皿楮醒及裟请仄毛赞仁允月 */
CHAR_setInt( meindex, CHAR_LOOPINTERVAL,
NPC_BUS_WAITINGMODE_WAITTIME);
/* 伙□玄瑁烂允月 */
{
int r = CHAR_getWorkInt( meindex, NPC_WORK_ROUTEMAX);
CHAR_setWorkInt( meindex, NPC_WORK_CURRENTROUTE, RAND( 1, r));
//print( "route:%d\n",CHAR_getWorkInt( meindex, NPC_WORK_CURRENTROUTE));
}
/* 垫五窖曰白仿弘 凳 */
CHAR_setWorkInt( meindex, NPC_WORK_ROUNDTRIP,
CHAR_getWorkInt( meindex, NPC_WORK_ROUNDTRIP)^1);
/* 戚禾奶件玄及譬濡 */
/* 窖曰反 溃质 */
if( CHAR_getWorkInt( meindex, NPC_WORK_ROUNDTRIP) == 1) {
/* 公及伙□玄及 嫖禾奶件玄醒毛 月 */
int num = NPC_BusGetRoutePointNum( meindex, argstr);
CHAR_setWorkInt( meindex, NPC_WORK_ROUTEPOINT, num-1);
}
else {
CHAR_setWorkInt( meindex, NPC_WORK_ROUTEPOINT,
CHAR_getWorkInt( meindex, NPC_WORK_ROUTEPOINT) +1);
}
/* 戚及禾奶件玄及甄 毛本永玄允月 */
NPC_BusSetPoint( meindex, argstr);
/* 垫五燮毛 憎允月 */
NPC_BusSetDestPoint( meindex, argstr);
/* 由□ 奴 仃月质 毛允月 */
CHAR_DischargeParty( meindex, 0);
/* 蜇箕及凛棉毛本永玄 */
CHAR_setWorkInt( meindex, NPC_WORK_CURRENTTIME, NowTime.tv_sec);
/* 乒□玉弁伉失 */
CHAR_setWorkInt( meindex, NPC_WORK_MODE, 0);
}
return;
default:
break;
}
}
/**************************************
* 汹仁[
**************************************/
static void NPC_Bus_walk( int meindex)
{
POINT start, end;
int dir;
int ret;
int 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 ) {
int add = 1;
char argstr[NPC_UTIL_GETARGSTR_BUFSIZE];
NPC_Util_GetArgStr( meindex, argstr, sizeof( argstr));
if( CHAR_getWorkInt( meindex, NPC_WORK_ROUNDTRIP ) == 1 ) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -