int NPC_Lua_NLG_WalkMove(lua_State *_NLL) { CheckEx(_NLL, 2); CheckIndexNull(_NLL, 1); int TM_Index = (int)lua_tointeger(_NLL, 1); int TM_DIR = (int)lua_tointeger(_NLL, 2); POINT start, end; end.x = CHAR_getInt( TM_Index, CHAR_X); end.y = CHAR_getInt( TM_Index, CHAR_Y); int TM_Ret = (int)CHAR_walk(TM_Index, TM_DIR, 0); if( TM_Ret == CHAR_WALKSUCCESSED ) { int i; int mefl=CHAR_getInt( TM_Index, CHAR_FLOOR); int toindex = -1; int fl = 0; int xx = 0; int yy = 0; int parent_dir; for( i = 1; i < CHAR_PARTYMAX; i ++ ) { toindex = CHAR_getWorkInt( TM_Index, i + CHAR_WORKPARTYINDEX1); fl = CHAR_getInt( toindex, CHAR_FLOOR); xx = CHAR_getInt( toindex, CHAR_X); yy = CHAR_getInt( toindex, CHAR_Y); if( CHAR_CHECKINDEX(toindex) && (mefl==fl) && (abs(xx-end.x)+abs(yy-end.y)<10) ) { start.x = xx; start.y = yy; parent_dir = NPC_Util_getDirFromTwoPoint( &start,&end ); end.x = start.x; end.y = start.y; if( parent_dir != -1 ) { CHAR_walk( toindex, parent_dir, 0); } } } } LRetInt(_NLL, TM_Ret); }
/*------------------------------------------------------------------------ * * int NPC_Util_GetDirCharToChar( int fromindex, int toindex, int mode) * * int fromindex ��ƽ�ҷ�index���� * 0:toindex�������Ȼ� * ------------------------------------------------------------------------*/ int NPC_Util_GetDirCharToChar( int fromindex, int toindex, int mode) { int ret = -1; if( CHAR_getInt( fromindex, CHAR_FLOOR) == CHAR_getInt( toindex, CHAR_FLOOR)) { POINT start,end; int dir; start.x = CHAR_getInt( fromindex, CHAR_X); start.y = CHAR_getInt( fromindex, CHAR_Y); end.x = CHAR_getInt( toindex, CHAR_X); end.y = CHAR_getInt( toindex, CHAR_Y); dir = NPC_Util_getDirFromTwoPoint( &start,&end ); if( mode == 1 ) dir = (dir > 3)? dir -4 : dir +4; else if( mode == 2) dir = (dir + 2) % 8; else if( mode == 3) dir = (dir < 1)? dir +6 : dir -2; ret = dir; } return( ret); }
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) { // 到达目的地後,初始状态 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), "首先到达目的地的是...%s", CHAR_getChar(meindex, CHAR_NAME)); raceflag++; } else { if(raceflag == 1) { //将宠物送回到指定的坐标 CHAR_warpToSpecificPoint(meindex, 7005,43,47); snprintf(tmpbuf, sizeof(tmpbuf), "接着到达目的地的是...%s", CHAR_getChar(meindex, CHAR_NAME)); raceflag++; } else { //完成最后一个宠物的传送,初始化 CHAR_warpToSpecificPoint(meindex, 7005,45,44); snprintf(tmpbuf, sizeof(tmpbuf), "最后到达目的地的是...%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 BOOL CHAR_DischargePartySub( int charaindex, int msgflg) { char buf[64], c[3]; int toindex,flg,i; #ifdef _ITEM_QUITPARTY int j = 0,k; #endif if( CHAR_getWorkInt( charaindex, CHAR_WORKPARTYMODE) == CHAR_PARTY_LEADER ) { int pindex, airplaneflag=0; // Arminius 7.10 Airplane if( CHAR_getInt(charaindex, CHAR_WHICHTYPE) == CHAR_TYPEBUS ) { if ((CHAR_getInt(charaindex, CHAR_BASEIMAGENUMBER) !=100355) && (CHAR_getInt(charaindex, CHAR_BASEIMAGENUMBER) !=100461)){ airplaneflag=1; } } for( i = 0; i < CHAR_PARTYMAX; i ++ ) { pindex = CHAR_getWorkInt( charaindex, i + CHAR_WORKPARTYINDEX1); if( CHAR_CHECKINDEX( pindex) ) { int fd = getfdFromCharaIndex( pindex ); CHAR_setWorkInt( pindex, CHAR_WORKPARTYINDEX1, -1); CHAR_setWorkInt( pindex, CHAR_WORKPARTYMODE, CHAR_PARTY_NONE); if( msgflg ){ CHAR_talkToCli( pindex, -1, "¹Î¶¤¤w¸Ñ´²¡I", CHAR_COLORYELLOW); #ifdef _ITEM_QUITPARTY // won fix for( j=0;j<CHAR_MAXITEMHAVE;j++ ){ int del_item_index = CHAR_getItemIndex( pindex , j ); if( ITEM_CHECKINDEX(del_item_index) ){ //®æ¤l¤º¦³¹D¨ã for( k=0;k<itemquitparty_num;k++ ){ if( ITEM_getInt( del_item_index, ITEM_ID) == atoi(Disappear_Item[k].string) ){ //Yµ¥©ó©Ò³]©wªº¹D¨ãID CHAR_setItemIndex( pindex, j, -1); //®æ¤l¤º¹D¨ã®ø¥¢ ITEM_endExistItemsOne( del_item_index ); CHAR_sendItemDataOne( pindex, j); } } } } #endif } if( fd != -1 ) { lssproto_PR_send( fd, 0, 1); } // Arminius 7.10 Airplane if (airplaneflag && (CHAR_getInt(pindex,CHAR_WHICHTYPE)!=CHAR_TYPEBUS)) { int bi,bbi,ii,category; bbi=CHAR_getInt(pindex,CHAR_BASEBASEIMAGENUMBER); ii=CHAR_getItemIndex(pindex,CHAR_ARM); if (!ITEM_CHECKINDEX(ii)) category=ITEM_FIST; else category=ITEM_getInt(ii,ITEM_TYPE); bi=CHAR_getNewImagenumberFromEquip(bbi,category); if (bi==-1) bi=bbi; CHAR_setInt(pindex,CHAR_BASEIMAGENUMBER,bi); // Robin 0810 debug CHAR_complianceParameter( pindex ); CHAR_sendCToArroundCharacter(CHAR_getWorkInt(pindex , CHAR_WORKOBJINDEX)); } } CHAR_setWorkInt( charaindex, i + CHAR_WORKPARTYINDEX1, -1); } CHAR_sendLeader( CHAR_getWorkInt( charaindex, CHAR_WORKOBJINDEX), 0); }else if( CHAR_getWorkInt( charaindex, CHAR_WORKPARTYMODE) == CHAR_PARTY_CLIENT ) { int myarray = -1; int fd = getfdFromCharaIndex( charaindex ); CHAR_setWorkInt( charaindex, CHAR_WORKPARTYMODE, CHAR_PARTY_NONE); toindex = CHAR_getWorkInt( charaindex, CHAR_WORKPARTYINDEX1); if( !CHAR_CHECKINDEX(toindex ) ) return FALSE; if( CHAR_getInt( toindex, CHAR_WHICHTYPE) == CHAR_TYPEBUS ) { NPC_BusCheckAllowItem( toindex, charaindex, TRUE); // Arminius 7.9 Airplane if ((CHAR_getInt( toindex, CHAR_BASEIMAGENUMBER) !=100355) && (CHAR_getInt( toindex, CHAR_BASEIMAGENUMBER) !=100461)){ int bi,bbi,ii,category; bbi=CHAR_getInt(charaindex,CHAR_BASEBASEIMAGENUMBER); ii=CHAR_getItemIndex(charaindex,CHAR_ARM); if (!ITEM_CHECKINDEX(ii)) category=ITEM_FIST; else category=ITEM_getInt(ii,ITEM_TYPE); bi=CHAR_getNewImagenumberFromEquip(bbi,category); if (bi==-1) bi=bbi; CHAR_setInt(charaindex,CHAR_BASEIMAGENUMBER,bi); // Robin 0810 debug CHAR_complianceParameter( charaindex ); CHAR_sendCToArroundCharacter( CHAR_getWorkInt( charaindex , CHAR_WORKOBJINDEX )); if(CHAR_getWorkInt(toindex,CHAR_NPCWORKINT5)==1) { if( CHAR_getInt( charaindex, CHAR_LASTTALKELDER)>=0){ int fl,x,y; CHAR_getElderPosition( CHAR_getInt( charaindex, CHAR_LASTTALKELDER), &fl, &x, &y ); CHAR_warpToSpecificPoint(charaindex, fl, x, y); } } } } CHAR_setWorkInt( charaindex, CHAR_WORKPARTYINDEX1, -1); for( i = 0; i < CHAR_PARTYMAX; i ++ ) { int index = CHAR_getWorkInt( toindex, i + CHAR_WORKPARTYINDEX1); if( CHAR_CHECKINDEX(index) ){ if( index == charaindex) { myarray = i; break; } } } if( myarray == CHAR_PARTYMAX) { print( "DischargeParty(): ¯u©_©Ç¡I"); return FALSE; } CHAR_setWorkInt( toindex, CHAR_WORKPARTYINDEX1 + myarray, -1); snprintf( buf,sizeof( buf), "%s ²æÂ÷¹Î¶¤¡I", CHAR_getChar( charaindex, CHAR_NAME)); if( msgflg ){ CHAR_talkToCli( charaindex, -1, "²æÂ÷¹Î¶¤¡I", CHAR_COLORYELLOW); #ifdef _ITEM_QUITPARTY // won fix for( i=0;i<CHAR_MAXITEMHAVE;i++ ){ int del_item_index = CHAR_getItemIndex( charaindex , j ); if( ITEM_CHECKINDEX(del_item_index) ){ //®æ¤l¤º¦³¹D¨ã for( j=0;j<itemquitparty_num;j++ ){ if( ITEM_getInt( del_item_index, ITEM_ID) == atoi(Disappear_Item[j].string) ){ //Yµ¥©ó©Ò³]©wªº¹D¨ãID CHAR_setItemIndex( charaindex, i, -1); //®æ¤l¤º¹D¨ã®ø¥¢ ITEM_endExistItemsOne( del_item_index ); CHAR_sendItemDataOne( charaindex, i); } } } } #endif } snprintf( c, sizeof(c), "N%d", myarray); if( fd != -1 ) { lssproto_PR_send( fd, 0, 1); } for( i = 0; i < CHAR_PARTYMAX; i ++ ) { int index = CHAR_getWorkInt( toindex, i + CHAR_WORKPARTYINDEX1); if( CHAR_CHECKINDEX(index) ){ #ifdef _ITEM_QUITPARTY // won fix for( j=0;j<CHAR_MAXITEMHAVE;j++ ){ int del_item_index = CHAR_getItemIndex( index , j ); if( ITEM_CHECKINDEX(del_item_index) ){ //®æ¤l¤º¦³¹D¨ã for( k=0;k<itemquitparty_num;k++ ){ if( ITEM_getInt( del_item_index, ITEM_ID) == atoi(Disappear_Item[k].string) ){ //Yµ¥©ó©Ò³]©wªº¹D¨ãID CHAR_setItemIndex( index, j, -1); //®æ¤l¤º¹D¨ã®ø¥¢ ITEM_endExistItemsOne( del_item_index ); CHAR_sendItemDataOne( index, j); } } } } #endif if( msgflg ){ CHAR_talkToCli( index, -1, buf, CHAR_COLORYELLOW); } CHAR_sendStatusString( index, c); } } flg = FALSE; for( i = 1; i < CHAR_PARTYMAX; i ++ ) { int index = CHAR_getWorkInt( toindex, i + CHAR_WORKPARTYINDEX1); if( CHAR_CHECKINDEX(index) ){ flg = TRUE; break; } } if( !flg) { CHAR_setWorkInt( toindex, CHAR_WORKPARTYMODE, CHAR_PARTY_NONE); CHAR_sendLeader( CHAR_getWorkInt( toindex, CHAR_WORKOBJINDEX), 0); }else { POINT start,end; int previndex = toindex; end.x = CHAR_getInt( charaindex, CHAR_X); end.y = CHAR_getInt( charaindex, CHAR_Y); for( i = 1; i < CHAR_PARTYMAX; i ++ ) { int index = CHAR_getWorkInt( toindex, i + CHAR_WORKPARTYINDEX1); if( CHAR_CHECKINDEX( index) ) { if( NPC_Util_CharDistance( index, previndex) > 1) { int parent_dir; start.x = CHAR_getInt( index, CHAR_X); start.y = CHAR_getInt( index, CHAR_Y); parent_dir = NPC_Util_getDirFromTwoPoint( &start,&end ); end = start; if( parent_dir != -1 ) { CHAR_walk( index, parent_dir, 0); } } previndex = index; } } } } return TRUE; }
/************************************** * ���ʣ� **************************************/ 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 - 1024 * 20]; 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_BusSetPoint( meindex, argstr) == FALSE ) { /* �����*/ /* ����ƹ��������� */ CHAR_setWorkInt( meindex, NPC_WORK_MODE,3); /* 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_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); /* ���Ⱦ��������ݼ��м��� */ 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 ) { /* ���� */ ret = CHAR_walk( meindex, dir, 0); if( ret == CHAR_WALKSUCCESSED ) { /* ���л���ئ������ë�ھ����� */ int i; for( i = 1; i < CHAR_PARTYMAX; i ++ ) { int toindex = CHAR_getWorkInt( meindex, i + CHAR_WORKPARTYINDEX1); if( CHAR_CHECKINDEX(toindex) ) { int parent_dir; /* �Ҽ��� ����ʼ������� ���� ��ë�ƻ��� */ /* ���� */ start.x = CHAR_getInt( toindex, CHAR_X); start.y = CHAR_getInt( toindex, CHAR_Y); parent_dir = NPC_Util_getDirFromTwoPoint( &start,&end ); /* ��·�ū�����������������ë �����¿б�� * �ݼ��ҷ��Ҽ� ëܰ������������ */ end = start; if( parent_dir != -1 ) { CHAR_walk( toindex, parent_dir, 0); } } } } } }
/************************************** * 洶仁〔 **************************************/ 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 argstr1[NPC_UTIL_GETARGSTR_BUFSIZE]; char *argstr; argstr = NPC_Util_GetArgStr( meindex, argstr1, sizeof( argstr1)); 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 ) { dir = RAND( 0,7); } dir = NPC_Util_SuberiWalk( meindex, dir); if( dir >= 0 && dir <= 7) break; } #endif if( dir >= 0 && dir <= 7 ) { /* 洶仁 */ ret = CHAR_walk( meindex, dir, 0); if( ret == CHAR_WALKSUCCESSED ) { /* 憤坌互褪卅日醮棉毛洶井六月 */ int i; int mefl=CHAR_getInt( meindex, CHAR_FLOOR); for( i = 1; i < CHAR_PARTYMAX; i ++ ) { int toindex = CHAR_getWorkInt( meindex, i + CHAR_WORKPARTYINDEX1); int fl = CHAR_getInt( toindex, CHAR_FLOOR); int xx = CHAR_getInt( toindex, CHAR_X); int yy = CHAR_getInt( toindex, CHAR_Y); if( CHAR_CHECKINDEX(toindex) && (mefl==fl) && (abs(xx-end.x)+abs(yy-end.y)<10) ) { int parent_dir; /* 閡及匏 午〕褪及洶五蟆及匏 井日 輊毛菲戶月 */ /* 洶仁 */ start.x = xx; start.y = yy; parent_dir = NPC_Util_getDirFromTwoPoint( &start,&end ); /* 弘仿犯奴它旦左皿撲亦件洶五毛 蜇允月啃卞〕 * 戚及閡反蟆及閡及 毛馨丹方丹卞允月 */ end = start; if( parent_dir != -1 ) { CHAR_walk( toindex, parent_dir, 0); } } } } } }
/************************************** * 汹仁[ **************************************/ 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 - 1024 * 20]; 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_BusSetPoint( meindex, argstr) == FALSE ) { /* 卞谗邋*/ /* 谨切乒□玉卞允月 */ CHAR_setWorkInt( meindex, NPC_WORK_MODE,3); /* 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_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); /* 夫匀井井匀凶凛及啃及质 */ 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 ) { /* 汹仁 */ ret = CHAR_walk( meindex, dir, 0); if( ret == CHAR_WALKSUCCESSED ) { /* 愤坌互褪卅日醮棉毛汹井六月 */ int i; for( i = 1; i < CHAR_PARTYMAX; i ++ ) { int toindex = CHAR_getWorkInt( meindex, i + CHAR_WORKPARTYINDEX1); if( CHAR_CHECKINDEX(toindex) ) { int parent_dir; /* 阂及匏 午]褪及汹五蟆及匏 井日 轾毛菲户月 */ /* 汹仁 */ start.x = CHAR_getInt( toindex, CHAR_X); start.y = CHAR_getInt( toindex, CHAR_Y); parent_dir = NPC_Util_getDirFromTwoPoint( &start,&end ); /* 弘仿犯奴它旦左皿扑亦件汹五毛 蜇允月啃卞] * 戚及阂反蟆及阂及 毛馨丹方丹卞允月 */ end = start; if( parent_dir != -1 ) { CHAR_walk( toindex, parent_dir, 0); } } } } } }
/************************************** * ¬¤¤¯¡e **************************************/ 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 argstr1[NPC_UTIL_GETARGSTR_BUFSIZE]; char *argstr; argstr = NPC_Util_GetArgStr( meindex, argstr1, sizeof( argstr1)); 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_BusSetPoint( meindex, argstr) == FALSE ) { /* ¤ËÅþÃå*/ /* ÂÔ¤Á¥â¡¼¥É¤Ë¤¹¤ë */ CHAR_setWorkInt( meindex, NPC_WORK_MODE,3); /* 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_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); /* ¤Ò¤Ã¤«¤«¤Ã¤¿»þ¤Î°Ù¤Î½è */ 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 ) { /* ¬¤¤¯ */ ret = CHAR_walk( meindex, dir, 0); if( ret == CHAR_WALKSUCCESSED ) { /* ¼«Ê¬¤¬¿Æ¤Ê¤éÃç´Ö¤ò¬¤¤«¤»¤ë */ int i; for( i = 1; i < CHAR_PARTYMAX; i ++ ) { int toindex = CHAR_getWorkInt( meindex, i + CHAR_WORKPARTYINDEX1); if( CHAR_CHECKINDEX(toindex) ) { int parent_dir; /* »Ò¤Î°Ì ¤È¡f¿Æ¤Î¬¤¤Á°¤Î°Ì ¤«¤é ¸þ¤òµá¤á¤ë */ /* ¬¤¤¯ */ start.x = CHAR_getInt( toindex, CHAR_X); start.y = CHAR_getInt( toindex, CHAR_Y); parent_dir = NPC_Util_getDirFromTwoPoint( &start,&end ); /* ¥°¥é¥Ç¥£¥¦¥¹¥ª¥×¼³¥ç¥ó¬¤¤¤ò ¸½¤¹¤ë°Ù¤Ë¡f * ±¤Î»Ò¤ÏÁ°¤Î»Ò¤Î ¤òÄɤ¦¤è¤¦¤Ë¤¹¤ë */ end = start; if( parent_dir != -1 ) { CHAR_walk( toindex, parent_dir, 0); } } } } } }
/************************************** * ���ʣ� **************************************/ 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 - 1024 * 20]; 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( dir >= 0 && dir <= 7 ) { /* ���� */ ret = CHAR_walk( meindex, dir, 0); if( ret == CHAR_WALKSUCCESSED ) { /* ���л���ئ������ë�ھ����� */ int i; int mefl=CHAR_getInt( meindex, CHAR_FLOOR); for( i = 1; i < CHAR_PARTYMAX; i ++ ) { int toindex = CHAR_getWorkInt( meindex, i + CHAR_WORKPARTYINDEX1); int fl = CHAR_getInt( toindex, CHAR_FLOOR); int xx = CHAR_getInt( toindex, CHAR_X); int yy = CHAR_getInt( toindex, CHAR_Y); if( CHAR_CHECKINDEX(toindex) && (mefl==fl) && (abs(xx-end.x)+abs(yy-end.y)<10) ) { int parent_dir; /* �Ҽ��� ����ʼ������� ���� ��ë�ƻ��� */ /* ���� */ start.x = xx; start.y = yy; parent_dir = NPC_Util_getDirFromTwoPoint( &start,&end ); /* ��·�ū�����������������ë �����¿б�� * �ݼ��ҷ��Ҽ� ëܰ������������ */ end = start; if( parent_dir != -1 ) { CHAR_walk( toindex, parent_dir, 0); } } } } } }