#include "version.h" #include #include "char.h" #include "object.h" #include "char_base.h" #include "npcutil.h" #include "readmap.h" #include "lssproto_serv.h" #include "handletime.h" #ifdef _GAMBLE_ROULETTE #include "npc_gambleroulette.h" #define _OTHER_ROUND //另一种跑法 static void Gamble_Roulette_walk( int meindex); static int Gamble_RouletteSetPoint( int meindex ); static void Find_Master( int meindex); int RunRand( int meindex, int flg ); BOOL SetEndPoint( int meindex ); void Gamble_Roulette_Reset( int meindex, int flg); void ResetDataStart( int meindex); BOOL ReadPointData( int meindex ); 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, //记录主持人index }; typedef struct tagRoulettePoint { int x; int y; int flg; }RoulettePoint; RoulettePoint PointData[]={ {-1,-1,-1},{-1,-1,-1},{-1,-1,-1},{-1,-1,-1}, }; RoulettePoint TestPointData[4*8]; #define ROULETTE_STANDBY 1500 #define ROULETTE_LOOPTIME 1000 #define ROULETTE_RUNTIME1 50 BOOL NPC_Gamble_RouletteInit( int meindex ) { char argstr[NPC_UTIL_GETARGSTR_BUFSIZE]; NPC_Util_GetArgStr( meindex, argstr, sizeof( argstr)); CHAR_setInt( meindex , CHAR_WHICHTYPE , CHAR_GAMBLEROULETTE ); //CHAR_setWorkInt( meindex, NPC_WORK_ROUTEMAX, routenum); //小猪要走几格才停 CHAR_setWorkInt( meindex, NPC_WORK_ROUTEMAX, 0); CHAR_setWorkInt( meindex, NPC_WORK_SEFLG, -1); // NPC_WORK_MODE 小猪的状态 0:等待 1:走(顺) CHAR_setWorkInt( meindex, NPC_WORK_MODE, 0); //第几个地图点 CHAR_setWorkInt( meindex, NPC_WORK_ROUTEPOINT, 0); //顺向 1 逆向 0 CHAR_setWorkInt( meindex, NPC_WORK_ROUNDTRIP, 1); //第几个路线 CHAR_setWorkInt( meindex, NPC_WORK_CURRENTROUTE, 0); //设定LOOP TIMER CHAR_setInt( meindex, CHAR_LOOPINTERVAL, ROULETTE_STANDBY); //用来记录时间点 CHAR_setWorkInt( meindex, NPC_WORK_CURRENTTIME, NowTime.tv_sec); CHAR_sendCToArroundCharacter( CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX)); if( ReadPointData( meindex) == FALSE ) return FALSE; return TRUE; } void NPC_Gamble_RouletteTalked( int meindex , int talkerindex , char *szMes , int color ) { return; } void NPC_Gamble_RouletteWindowTalked( int meindex, int talkerindex, int seqno, int select, char *data) { return; } void NPC_Gamble_RouletteLoop( int meindex) { int objmeindex = -1, index = 0, act = 0; objmeindex = CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX); switch( CHAR_getWorkInt( meindex, NPC_WORK_MODE )) { case 0: //停止时等待 为等待主持人下命令 //抓主持人index 检查主持人 是否喊开始 if( CHAR_getWorkInt( meindex, NPC_WORK_SEFLG) < 0 ) { CHAR_setWorkInt( meindex, NPC_WORK_MODE,5); }else { index = CHAR_getWorkInt( meindex, NPC_WORK_SEFLG); //CHAR_NPCWORKINT7 0 null 1 准备 2 跑 3 停 if( CHAR_getWorkInt( index, CHAR_NPCWORKINT7 ) == 2 ) { CHAR_sendCToArroundCharacter( objmeindex); CHAR_setWorkInt( meindex, NPC_WORK_MODE,1); CHAR_setInt( meindex, CHAR_LOOPINTERVAL, ROULETTE_RUNTIME1); //决定小猪走几格 CHAR_setWorkInt( meindex, NPC_WORK_ROUTEMAX, RunRand( meindex, 0 ) ); ResetDataStart( meindex);//决定进点 if( CHAR_getInt( meindex, CHAR_X) == 14 && CHAR_getInt( meindex, CHAR_Y) == 8 ) { }else { print("\n\n####################\n 小猪不在原点!![%d,%d]", CHAR_getInt( meindex, CHAR_X), CHAR_getInt( meindex, CHAR_Y) ); } }else if( CHAR_getWorkInt( index, CHAR_NPCWORKINT7 ) == 1 || ( CHAR_getWorkInt( index, CHAR_NPCWORKINT9) < 30 && CHAR_getWorkInt( index, CHAR_NPCWORKINT9) > 24 ) ) { //准备 if( CHAR_getInt( meindex, CHAR_X) == 14 && CHAR_getInt( meindex, CHAR_Y) == 8 ) { }else { CHAR_warpToSpecificPoint( meindex, CHAR_getInt( meindex, CHAR_FLOOR), 14, 8); CHAR_setInt( meindex, CHAR_X, 14); CHAR_setInt( meindex, CHAR_Y, 8); CHAR_sendCToArroundCharacter( objmeindex); } } } break; case 1: Gamble_Roulette_walk( meindex); break; case 2: break; case 3: //点归零 CHAR_setWorkInt( meindex, NPC_WORK_MODE, 0); //动作 act = CHAR_ACTATTACK; CHAR_sendWatchEvent( objmeindex, act, NULL,0, FALSE); CHAR_setWorkInt( meindex, CHAR_WORKACTION, act); CHAR_setWorkInt( meindex, NPC_WORK_ROUTEMAX, 0); CHAR_setInt( meindex, CHAR_LOOPINTERVAL, ROULETTE_STANDBY); //送人物资料给视觉范围内的人 CHAR_sendCToArroundCharacter( objmeindex); if( SetEndPoint( meindex ) == FALSE ) { print("\n not Set EndPoint !!"); } #ifdef _OTHER_ROUND #else ReadPointData( meindex); //load round data #endif //还原主持人 index = CHAR_getWorkInt( meindex, NPC_WORK_SEFLG); CHAR_setWorkInt( index, CHAR_NPCWORKINT7, 3); break; case 5: //寻找主持人 Find_Master( meindex); if( CHAR_getWorkInt( meindex, NPC_WORK_SEFLG) < 0 ) { CHAR_setInt( meindex, CHAR_LOOPINTERVAL, 0); CHAR_setWorkInt( meindex, NPC_WORK_MODE,-1); }else { CHAR_setWorkInt( meindex, NPC_WORK_MODE, 0); } break; default: //重置 错误处理 Gamble_Roulette_Reset( meindex, 0); break; } } static void Gamble_Roulette_walk( int meindex) { POINT start, end; int dir; int ret; int i,run_num = 0; int objmeindex = -1; objmeindex = CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX); 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); // loop timer分为两部分 1. 处理下一点 2. 走到下一点 if( start.x == end.x && start.y == end.y ) { #ifdef _OTHER_ROUND #else int add = 1; //如果为 NPC_WORK_ROUNDTRIP != 1 逆向 if( CHAR_getWorkInt( meindex, NPC_WORK_ROUNDTRIP ) != 1 ) { add *= -1; } CHAR_setWorkInt( meindex, NPC_WORK_ROUTEPOINT, CHAR_getWorkInt( meindex, NPC_WORK_ROUTEPOINT) +add); #endif if( Gamble_RouletteSetPoint( meindex ) == FALSE ) { #ifdef _OTHER_ROUND CHAR_setWorkInt( meindex, NPC_WORK_MODE,3); CHAR_setWorkInt( meindex, NPC_WORK_CURRENTTIME, NowTime.tv_sec); return; #else if( CHAR_getWorkInt( meindex, NPC_WORK_ROUNDTRIP ) != 1 ) { CHAR_setWorkInt( meindex, NPC_WORK_ROUTEPOINT, arraysizeof( PointData) ); //逆向 }else { CHAR_setWorkInt( meindex, NPC_WORK_ROUTEPOINT, -1); //顺向 } return; #endif }else { return; } } //-------------------------------------------------------------------- run_num = CHAR_getWorkInt( meindex, NPC_WORK_ROUTEMAX); if( run_num > 0 ){ CHAR_setWorkInt( meindex, NPC_WORK_ROUTEMAX, (run_num - 1) ); }else { #ifdef _OTHER_ROUND CHAR_setWorkInt( meindex, NPC_WORK_MODE,3); CHAR_setWorkInt( meindex, NPC_WORK_CURRENTTIME, NowTime.tv_sec); return; #else int npc_ai=0; int masterindex; masterindex = CHAR_getWorkInt( meindex, NPC_WORK_SEFLG); npc_ai = CHAR_getWorkInt( masterindex, CHAR_NPCWORKINT3); if( npc_ai > 10 ) { if( start.x == 7 && start.y == 5 ) { // 7,5 CHAR_setWorkInt( masterindex, CHAR_NPCWORKINT3, 0); }else { CHAR_setWorkInt( meindex, NPC_WORK_ROUTEMAX, 1); return; } } CHAR_setWorkInt( meindex, NPC_WORK_MODE,3); CHAR_setWorkInt( meindex, NPC_WORK_CURRENTTIME, NowTime.tv_sec); return; #endif } //-------------------------------------------------------------------- dir = NPC_Util_getDirFromTwoPoint( &start,&end ); 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); } } static void Find_Master( int meindex) { int floor, x=14, y=3; OBJECT object; floor = CHAR_getInt( meindex , CHAR_FLOOR); for( object = MAP_getTopObj( floor, x, y) ; object ; object = NEXT_OBJECT(object ) ){ int findex; int objindex = GET_OBJINDEX(object); if( !CHECKOBJECTUSE( objindex)) continue; findex = OBJECT_getIndex( objindex); if( !CHAR_CHECKINDEX( findex)) continue; if( CHAR_getInt( findex , CHAR_WHICHTYPE ) != CHAR_GAMBLEMASTER ) continue; if( CHAR_getWorkInt( findex, CHAR_NPCWORKINT8) != 10001 ) continue; CHAR_setWorkInt( meindex, NPC_WORK_SEFLG, findex) ; return; } } int RunRand( int meindex, int flg ) { #define RAND(x,y) ((x-1)+1+ (int)( (double)(y-(x-1))*rand()/(RAND_MAX+1.0)) ) int run_num1=0; int i; run_num1 = RAND( 90, 150); for( i=0; i<6; i++ ) { run_num1 += RAND( 0, 20); } return run_num1; } BOOL SetEndPoint( int meindex ) { int x,y; int master; int endpoint; master = CHAR_getWorkInt( meindex, NPC_WORK_SEFLG); if( !CHAR_CHECKINDEX( master) ) return FALSE; if( CHAR_getWorkInt( master, CHAR_NPCWORKINT7) != 2 ) { print("\n error( master,CHAR_NPCWORKINT7) != 2 "); return FALSE; } x = CHAR_getInt( meindex, CHAR_X); y = CHAR_getInt( meindex, CHAR_Y); endpoint = (x<<16)+(y<<0); CHAR_setWorkInt( master, CHAR_NPCWORKINT10, endpoint); return TRUE; } void Gamble_Roulette_Reset( int meindex, int flg) { //错误处理 int index; CHAR_setWorkInt( meindex, NPC_WORK_ROUTEMAX, 0); CHAR_setWorkInt( meindex, NPC_WORK_MODE, 0); CHAR_setInt( meindex, CHAR_LOOPINTERVAL, ROULETTE_STANDBY); index = CHAR_getWorkInt( meindex, NPC_WORK_SEFLG); if( !CHAR_CHECKINDEX( index) ) { print("\n Gamble_Roulette error: no master !!"); return; } CHAR_setWorkInt( index, CHAR_NPCWORKINT7, 3); CHAR_setWorkInt( index, CHAR_NPCWORKINT10, 0); } void ResetDataStart( int meindex ) { #define RAND(x,y) ((x-1)+1+ (int)( (double)(y-(x-1))*rand()/(RAND_MAX+1.0)) ) int Start=1; struct tagWalkStartPoint{ int x; int y; int rip; }WalkStart[]={ {7,5,1}, {7,11,0}, {22,11,1}, {22,5,0}, }; Start = RAND( 0, 3); CHAR_setWorkInt( meindex, NPC_WORK_ROUNDTRIP, WalkStart[Start].rip ); CHAR_setWorkInt( meindex, NPC_WORK_ROUTEPOINT, Start); CHAR_setWorkInt( meindex, NPC_WORK_ROUTETOX, WalkStart[Start].x ); CHAR_setWorkInt( meindex, NPC_WORK_ROUTETOY, WalkStart[Start].y ); { int i=0,k; int RIP = CHAR_getWorkInt( meindex, NPC_WORK_ROUNDTRIP); k = CHAR_getWorkInt( meindex, NPC_WORK_ROUTEPOINT); if( RIP ) { while( i < (arraysizeof( TestPointData))) { k++; if( k > 3 ) k = 0; TestPointData[i].x = PointData[k].x; TestPointData[i].y = PointData[k].y; i++; } }else { while( i < (arraysizeof( TestPointData))) { k--; if( k < 0 ) k = 3; TestPointData[i].x = PointData[k].x; TestPointData[i].y = PointData[k].y; i++; } } } #ifdef _OTHER_ROUND CHAR_setWorkInt( meindex, NPC_WORK_ROUTEPOINT, 0); #endif } BOOL ReadPointData( int meindex ) { char buf1[256], buf2[32], buf3[16]; char argstr[NPC_UTIL_GETARGSTR_BUFSIZE]; int k=1,i=0; NPC_Util_GetArgStr( meindex, argstr, sizeof( argstr)); if( NPC_Util_GetStrFromStrWithDelim( argstr, "roulette",buf1, sizeof(buf1)) == NULL ) { print("\n roulette error: not found !!"); return FALSE; } k=1; while( getStringFromIndexWithDelim( buf1, ";", k, buf2, sizeof(buf2) ) != FALSE ) { k++; if( strstr( buf2,",") == NULL ) continue; if( getStringFromIndexWithDelim( buf2, ",", 1, buf3, sizeof(buf3)) == FALSE) { return FALSE; } PointData[i].x = atoi( buf3); if( getStringFromIndexWithDelim( buf2, ",", 2, buf3, sizeof(buf3)) == FALSE) { return FALSE; } PointData[i].y = atoi( buf3); if( i > 9 ) { break; } i++; } #ifdef _OTHER_ROUND #else Gamble_RouletteSetPoint( meindex); #endif return TRUE;//arraysizeof( PointData) } static int Gamble_RouletteSetPoint( int meindex ) { #ifdef _OTHER_ROUND int i; i = CHAR_getWorkInt( meindex, NPC_WORK_ROUTEPOINT); CHAR_setWorkInt( meindex, NPC_WORK_ROUTETOX, TestPointData[i].x ); CHAR_setWorkInt( meindex, NPC_WORK_ROUTETOY, TestPointData[i].y ); i++; CHAR_setWorkInt( meindex, NPC_WORK_ROUTEPOINT, i); if( i >= arraysizeof( TestPointData) ) { return FALSE; } #else int i; i = CHAR_getWorkInt( meindex, NPC_WORK_ROUTEPOINT); if( i<0 || i>arraysizeof( PointData) -1) { return FALSE; } CHAR_setWorkInt( meindex, NPC_WORK_ROUTETOX, PointData[i].x ); CHAR_setWorkInt( meindex, NPC_WORK_ROUTETOY, PointData[i].y ); #endif {//检查路线 struct tagWalkStartPoint{ int x; int y; }WalkStart[]={ {22,5}, {7,5}, {7,11}, {22,11}, {22,5}, {7,5} }; int ch_x,ch_y; int next_x,next_y; int h; ch_x = CHAR_getInt( meindex, CHAR_X); ch_y = CHAR_getInt( meindex, CHAR_Y); for( h=1; h<5; h++) { if( ch_x == WalkStart[h].x && ch_y == WalkStart[h].y) { next_x = CHAR_getWorkInt( meindex, NPC_WORK_ROUTETOX); next_y = CHAR_getWorkInt( meindex, NPC_WORK_ROUTETOY); if( next_x == WalkStart[h+1].x && next_y == WalkStart[h+1].y) { }else if( next_x == WalkStart[h-1].x && next_y == WalkStart[h-1].y) { }else { print("\n ##############################"); print("\n ERR : [%d,%d] -> [%d,%d]",ch_x,ch_y,next_x,next_y); } break; } } } return TRUE; } #endif