📄 npc_airplane.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_airplane.h"
#include "handletime.h"
/*
* 加美航空 (Made from Bus)
*/
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,
NPC_WORK_ONEWAYFLG = CHAR_NPCWORKINT11,
NPC_WORK_RUNWAVE = CHAR_NPCWORKINT13,
};
/* 蛐 丢永本□斥及enum */
enum {
NPC_AIR_MSG_GETTINGON,
NPC_AIR_MSG_NOTPARTY,
NPC_AIR_MSG_OVERPARTY,
NPC_AIR_MSG_DENIEDITEM,
NPC_AIR_MSG_ALLOWITEM,
NPC_AIR_MSG_LEVEL,
NPC_AIR_MSG_GOLD,
NPC_AIR_MSG_EVENT,
NPC_AIR_MSG_START,
NPC_AIR_MSG_END,
#ifdef _NPC_AIRDELITEM
NPC_AIR_MSG_DELITEM,
#endif
#ifdef _NPC_AIRLEVEL
NPC_AIR_MSG_MAXLEVEL,
#endif
};
typedef struct {
char option[32];
char defaultmsg[128];
}NPC_AIR_MSG;
NPC_AIR_MSG airmsg[] = {
{ "msg_gettingon", "PAON!(你无法於中途加入我们唷!)"},
{ "msg_notparty", "PAPAON!!无法以团队加入唷!"},
{ "msg_overparty", "PAON!!人数已满。"},
{ "msg_denieditem", "PAPAON!!我可不要这个道具!"},
{ "msg_allowitem", "哇喔~(想要那个道具啊!)"},
{ "msg_level", "PAPAON!!你的等级还不够唷!"},
{ "msg_stone", "PAPAON!!金钱不足唷!"},
{ "msg_event", "PAON!!你无法加入唷!"},
{ "msg_start", "哇喔~(出发进行)"},
{ "msg_end", "哇喔~(到罗)"}
#ifdef _NPC_AIRDELITEM
,{ "msg_delitem", "你没有搭乘的道具"}
#endif
#ifdef _NPC_AIRLEVEL
,{ "msg_maxlevel", "你的等级过高哦"}
#endif
};
static int NPC_AirSetPoint( int meindex, char *argstr);
static void NPC_AirSetDestPoint( int meindex, char *argstr);
static BOOL NPC_AirCheckDeniedItem( int meindex, int charaindex, char *argstr);
static BOOL NPC_AirCheckLevel( int meindex, int charaindex, char *argstr);
static int NPC_AirCheckStone( int meindex, int charaindex, char *argstr);
static void NPC_AirSendMsg( int meindex, int talkerindex, int tablenum);
static int NPC_AirGetRoutePointNum( int meindex, char *argstr );
static void NPC_Air_walk( int meindex);
#ifdef _NPC_AIRLEVEL
static BOOL NPC_AirCheckMaxLevel( int meindex, int charaindex, char *argstr);
#endif
#define NPC_AIR_LOOPTIME 100
#define NPC_AIR_WAITTIME_DEFAULT 180
#define NPC_AIR_WAITINGMODE_WAITTIME 5000
/*********************************
* 赓渝质
*********************************/
BOOL NPC_AirInit( int meindex )
{
char argstr[NPC_UTIL_GETARGSTR_BUFSIZE];
int i;
char buf[256],buf1[256];
int routenum;
int waittime;
int seflg;
int onewayflg;
NPC_Util_GetArgStr( meindex, argstr, sizeof( argstr));
/* 卅仃木壬中仃卅中娄醒及民尼永弁 */
routenum = NPC_Util_GetNumFromStrWithDelim( argstr, "routenum");
if( routenum == -1 ) {
print( "npcair: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( "npcair:nothing route to \n");
return FALSE;
}
}
//ANDY_ADD NPC_WORK_RUNWAVE
if( NPC_Util_GetStrFromStrWithDelim( argstr, "WAVE",buf1, sizeof(buf1)) == NULL ) {
CHAR_setWorkInt( meindex, NPC_WORK_RUNWAVE, 77);
}else {
CHAR_setWorkInt( meindex, NPC_WORK_RUNWAVE, atoi( buf1) );
}
waittime = NPC_Util_GetNumFromStrWithDelim( argstr, "waittime");
if( waittime == -1 ) waittime = NPC_AIR_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);
onewayflg = NPC_Util_GetNumFromStrWithDelim( argstr, "oneway");
if( onewayflg == -1 ) onewayflg = FALSE; // default
CHAR_setWorkInt( meindex, NPC_WORK_ONEWAYFLG, onewayflg);
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_AIR_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_AirGetRoutePointNum( meindex, argstr);
if( num <= 0 ) {
print( "npcairplane:真奇怪!\n");
return FALSE;
}
CHAR_setWorkInt( meindex, NPC_WORK_ROUTEPOINT, num-1);
CHAR_setWorkInt( meindex, NPC_WORK_ROUNDTRIP, 1);
}
/* 伙□玄毛本永玄允月 */
NPC_AirSetPoint( meindex, argstr);
/* 垫五燮毛 憎允月 */
NPC_AirSetDestPoint( meindex, argstr);
}
return TRUE;
}
/*********************************
* 仄井仃日木凶凛及质
*********************************/
void NPC_AirTalked( int meindex , int talkerindex , char *szMes ,
int color )
{
int i;
int partyflg = FALSE;
int npc_wave = CHAR_getWorkInt( meindex, NPC_WORK_RUNWAVE);
/* 皿伊奶乩□卞覆仄化分仃 杀允月 */
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_AirCheckJoinParty( meindex, talkerindex, TRUE);
}
else {
if( CHAR_getWorkInt( meindex, NPC_WORK_MODE) == 0 ) {
int i;
// #define NPC_AIR_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_AIR_LOOPTIME);
/* SE 日允 穴件乒旦及陲太 */
if( CHAR_getWorkInt( meindex, NPC_WORK_SEFLG )) {
//andy_reEdit NPC_WORK_RUNWAVE
CHAR_sendSEoArroundCharacter(
CHAR_getInt( meindex, CHAR_FLOOR),
CHAR_getInt( meindex, CHAR_X),
CHAR_getInt( meindex, CHAR_Y),
npc_wave,
TRUE);
}
/* 请 允月凛及丢永本□斥*/
for( i = 1; i < CHAR_PARTYMAX; i ++ ) {
int partyindex = CHAR_getWorkInt( meindex, CHAR_WORKPARTYINDEX1+i);
if( CHAR_CHECKINDEX( partyindex)) {
NPC_AirSendMsg( meindex, partyindex, NPC_AIR_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_AIR_WAITINGMODE_WAITTIME);
/* 蜇箕及凛棉毛本永玄 */
CHAR_setWorkInt( meindex, NPC_WORK_CURRENTTIME, NowTime.tv_sec);
}
else if( strstr( szMes, NPC_AIR_DEBUGROUTINTG )) {
/* 犯田永弘迕 */
char *p = strstr( szMes,NPC_AIR_DEBUGROUTINTG);
char argstr[NPC_UTIL_GETARGSTR_BUFSIZE];
NPC_Util_GetArgStr( meindex, argstr, sizeof( argstr));
if( p) {
int a = atoi( p+strlen(NPC_AIR_DEBUGROUTINTG));
if( a <0 ) a = 1;
CHAR_setWorkInt( meindex, NPC_WORK_CURRENTROUTE, a);
}
//print( "route:%d\n",CHAR_getWorkInt( meindex, NPC_WORK_CURRENTROUTE));
/* 伙□玄毛本永玄允月 */
NPC_AirSetPoint( meindex, argstr);
}
#endif
}
}
/**************************************
* 伙□皿楮醒
**************************************/
void NPC_AirLoop( int meindex)
{
int i;
int npc_wave = CHAR_getWorkInt( meindex, NPC_WORK_RUNWAVE);
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 )) {
//ANDY_reEdit
CHAR_sendSEoArroundCharacter(
CHAR_getInt( meindex, CHAR_FLOOR),
CHAR_getInt( meindex, CHAR_X),
CHAR_getInt( meindex, CHAR_Y),
npc_wave,
TRUE);
}
/* 请 允月凛及丢永本□斥*/
for( i = 1; i < CHAR_PARTYMAX; i ++ ) {
int partyindex = CHAR_getWorkInt( meindex, CHAR_WORKPARTYINDEX1+i);
if( CHAR_CHECKINDEX( partyindex)) {
NPC_AirSendMsg( meindex, partyindex, NPC_AIR_MSG_START);
}
}
CHAR_setWorkInt( meindex, NPC_WORK_MODE,1);
/* 伙□皿楮醒及裟请仄毛汹仁簧蘸卞允月 */
CHAR_setInt( meindex, CHAR_LOOPINTERVAL, NPC_AIR_LOOPTIME);
}
return;
case 1:
/* 汹仁 */
NPC_Air_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_AIR_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_AIR_WAITINGMODE_WAITTIME);
{
int r = CHAR_getWorkInt( meindex, NPC_WORK_ROUTEMAX);
CHAR_setWorkInt( meindex, NPC_WORK_CURRENTROUTE, RAND( 1, r));
}
CHAR_setWorkInt( meindex, NPC_WORK_ROUNDTRIP,
CHAR_getWorkInt( meindex, NPC_WORK_ROUNDTRIP)^1);
if( CHAR_getWorkInt( meindex, NPC_WORK_ROUNDTRIP) == 1) {
int num = NPC_AirGetRoutePointNum( 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_AirSetPoint( meindex, argstr);
NPC_AirSetDestPoint( meindex, argstr);
CHAR_DischargeParty( meindex, 0);
CHAR_setWorkInt( meindex, NPC_WORK_CURRENTTIME, NowTime.tv_sec);
if ((CHAR_getWorkInt(meindex, NPC_WORK_ONEWAYFLG) == 1) &&
(CHAR_getWorkInt(meindex, NPC_WORK_ROUNDTRIP) == 1) ){
CHAR_setInt( meindex, CHAR_LOOPINTERVAL, NPC_AIR_LOOPTIME);
CHAR_setWorkInt( meindex, NPC_WORK_MODE, 1);
} else
CHAR_setWorkInt( meindex, NPC_WORK_MODE, 0);
}
return;
default:
break;
}
}
/**************************************
* 汹仁[
**************************************/
static void NPC_Air_walk( int meindex)
{
POINT start, end;
int dir;
int ret;
int i;
int npc_wave = CHAR_getWorkInt( meindex, NPC_WORK_RUNWAVE );
/* 汹仁楮溢 */
/* 谗邋仄凶凛及质 */
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 ) {
add *= -1;
}
CHAR_setWorkInt( meindex, NPC_WORK_ROUTEPOINT,
CHAR_getWorkInt( meindex, NPC_WORK_ROUTEPOINT) +add);
if( NPC_AirSetPoint( meindex, argstr) == FALSE ) {
/* 卞谗邋*/
/* 谨切乒□玉卞允月 */
CHAR_setWorkInt( meindex, NPC_WORK_MODE,3);
/* SE 日允 穴件乒旦及陲太 */
if( CHAR_getWorkInt( meindex, NPC_WORK_SEFLG )) {
//ANDY_reEdit
CHAR_sendSEoArroundCharacter(
CHAR_getInt( meindex, CHAR_FLOOR),
CHAR_getInt( meindex, CHAR_X),
CHAR_getInt( meindex, CHAR_Y),
npc_wave,
TRUE);
}
/* 邋中凶凛及丢永本□斥*/
for( i = 1; i < CHAR_PARTYMAX; i ++ ) {
int partyindex = CHAR_getWorkInt( meindex, CHAR_WORKPARTYINDEX1+i);
if( CHAR_CHECKINDEX( partyindex)) {
NPC_AirSendMsg( meindex, partyindex, NPC_AIR_MSG_END);
}
}
/* 蜇箕及凛棉毛本永玄 */
CHAR_setWorkInt( meindex, NPC_WORK_CURRENTTIME, NowTime.tv_sec);
return;
}
else {
return;
}
}
/*-------------------------------------------------------*/
/* 汹井六月质 */
/* 轾毛菲户月 */
dir = NPC_Util_getDirFromTwoPoint( &start,&end );
/* 漆中月桦赭及谨 由□ 奴汹五匹银丹 */
end.x = CHAR_getInt( meindex, CHAR_X);
end.y = CHAR_getInt( meindex, CHAR_Y);
#if 0
/* 夫匀井井匀凶凛及啃及质 */
for( i = 0; i < 100; i ++ ) {
if( dir < 0 ) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -