?? 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 + -