⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 char_walk.c

📁 石器时代8.0服务端完整源代码。可以直接编译
💻 C
📖 第 1 页 / 共 3 页
字号:
			}
		}

		par = ENCOUNT_getEncountPercentMax( charaindex, of,ox,oy);
		if( par != -1 ) {
			if( CHAR_getWorkInt( charaindex, CHAR_WORKENCOUNTPROBABILITY_MAX) != par ){
				flg = TRUE;
				CHAR_setWorkInt( charaindex, CHAR_WORKENCOUNTPROBABILITY_MAX, par);
			}
		}
		// Arminius 7.12 login announce
		/*
		{
		  int enfd = getfdFromCharaIndex( charaindex );
		  if (CONNECT_get_announced(enfd)==0) {
		    // Robin 0720
		    //AnnounceToPlayer(charaindex);
		    AnnounceToPlayerWN( enfd );
		    CONNECT_set_announced(enfd,1);
		  }
		}
		*/
		// Arminius 6.22 check Encounter
		// Nuke 0622: Provide No Enemy function
		{
		  int enfd = getfdFromCharaIndex( charaindex );
		  int eqen = getEqNoenemy( enfd );	// Arminius 7.2: Ra's amulet
		  int noen = getNoenemy(enfd);

          // Arminius 7.31 cursed stone
          if (getStayEncount(enfd)>0) {
#ifdef _ESCAPE_RESET // 恶宝解除後逃跑时间重新归零
			  CHAR_setWorkInt( charaindex, CHAR_WORKLASTESCAPE, 0);
#endif
			  clearStayEncount(enfd);
		  }
		  //print("\n enfd=%d,eqen=%d,noen=%d", enfd, eqen, noen);

		  // Arminius 7.2 Ra's amulet
		  if (eqen>=200) {
		    noen=1;
		  } else if (eqen>=120) {
		    if ((ff==100)||(ff==200)||(ff==300)||(ff==400)||(ff==500)) noen=1;
		  } else if (eqen>=80) {
		    if ((ff==100)||(ff==200)||(ff==300)||(ff==400)) noen=1;
		  } else if (eqen>=40) {
		    if ((ff==100)||(ff==200)) noen=1;
		  }


		  //print("\n noen=%d", noen);
		  if (noen==0) {
	        int maxep = CHAR_getWorkInt(charaindex, CHAR_WORKENCOUNTPROBABILITY_MAX);
		    int minep = CHAR_getWorkInt(charaindex, CHAR_WORKENCOUNTPROBABILITY_MIN);
		    int cep = CONNECT_get_CEP(enfd);

#ifdef _PROFESSION_SKILL			// WON ADD 人物职业技能
			int temp=0;
			int p_cep = CHAR_getWorkInt(charaindex, CHAR_ENCOUNT_FIX);
			if( p_cep != 0 ){
				if( CHAR_getWorkInt( charaindex, CHAR_ENCOUNT_NUM) < (int)time(NULL) ){
					CHAR_talkToCli( charaindex, -1, "技能效用结束。", CHAR_COLORYELLOW);
					CHAR_setWorkInt( charaindex, CHAR_ENCOUNT_FIX, 0);
					CHAR_setWorkInt( charaindex, CHAR_ENCOUNT_NUM, 0);
				}
				temp = cep * (100 + p_cep ) / 100;
			}else{
				temp = cep;
			}
#endif

		    if (cep<minep) cep=minep;
		    if (cep>maxep) cep=maxep;
		    if (CHAR_getWorkInt(charaindex,CHAR_WORKBATTLEMODE)==BATTLE_CHARMODE_NONE) {
				int entflag;
				entflag=1;
				{
					int objindex,index;
					OBJECT obj;
					for ( obj = MAP_getTopObj( ff, fx, fy); obj; obj = NEXT_OBJECT( obj)) {
						objindex = GET_OBJINDEX( obj);
						if (OBJECT_getType( objindex) == OBJTYPE_CHARA) {
							int etype;
							index = OBJECT_getIndex( objindex);
							if (!CHAR_CHECKINDEX( index)) continue;
							if( CHAR_getInt( index, CHAR_WHICHTYPE) == CHAR_TYPENPCENEMY &&
								CHAR_getWorkInt( index, CHAR_WORKEVENTTYPE) == CHAR_EVENT_ENEMY )	{
								CHAR_setInt( charaindex, CHAR_X, ox);
								CHAR_setInt( charaindex, CHAR_Y, oy);
								lssproto_XYD_send( getfdFromCharaIndex(charaindex),
								CHAR_getInt( charaindex, CHAR_X ),
								CHAR_getInt( charaindex, CHAR_Y ),
								CHAR_getInt( charaindex, CHAR_DIR ) );
								break;
							}
							etype = CHAR_getWorkInt( index, CHAR_WORKEVENTTYPE);
							if (etype!=CHAR_EVENT_NONE) {
								if (etype==CHAR_EVENT_WARP) entflag=0;
							}
						}
					}
				}


#ifdef _PROFESSION_SKILL			// WON ADD 人物职业技能
			  if( rand()%120 < temp ){
#else			
		      if (rand()%120<cep){	// Arminius 6.28 lower encounter prob.
#endif
					if (entflag) {
#ifdef _Item_MoonAct
						if( getEqRandenemy( enfd) > 0 )	{
							int Rnum=0;
							int RandEnemy = getEqRandenemy( enfd);
							Rnum = RAND(0,100);
							if( Rnum > RandEnemy )	{
#endif
								//encounter!!
								cep = minep;
								lssproto_EN_recv(enfd,
								CHAR_getInt(charaindex,CHAR_X),
								CHAR_getInt(charaindex,CHAR_Y));
#ifdef _Item_MoonAct
							}
						}else{
								cep = minep;
								lssproto_EN_recv(enfd,
								CHAR_getInt(charaindex,CHAR_X),
								CHAR_getInt(charaindex,CHAR_Y));
						}
#endif
					}
		      } else {
		        if (cep<maxep) cep++;
		      }
		    }
		    CONNECT_set_CEP(enfd, cep);
		  }
		}
		if( CHAR_getWorkInt( charaindex, CHAR_WORKPARTYMODE )!= CHAR_PARTY_CLIENT ){
			CHAR_setFlg( charaindex, CHAR_ISWARP, 0);
		}
    }
    else if( CHAR_getInt( charaindex, CHAR_WHICHTYPE ) == CHAR_TYPEPET ||
    		CHAR_getInt( charaindex, CHAR_WHICHTYPE) == CHAR_TYPEBUS	
#ifdef _GAMBLE_ROULETTE	
			|| CHAR_getInt( charaindex, CHAR_WHICHTYPE) == CHAR_GAMBLEROULETTE 
#endif
#ifdef _PETRACE
			|| CHAR_getInt(charaindex, CHAR_WHICHTYPE) == CHAR_PETRACEPET
#endif
	)	{
		CHAR_setWorkInt( charaindex, CHAR_WORKACTION, -1 );
		if( CHAR_getWorkInt( charaindex, CHAR_WORKBATTLEMODE ) == BATTLE_CHARMODE_NONE ){
			CHAR_sendCharaAtWalk( charaindex, of,ox,oy,CHAR_getDX(dir), CHAR_getDY(dir));
		}
	    {
	        int     opt[2] = { ox, oy};
	        CHAR_sendWatchEvent( CHAR_getWorkInt(charaindex,
	                                             CHAR_WORKOBJINDEX),
	                             CHAR_ACTWALK,opt,2,TRUE );
	    }
    }
    if( retvalue == CHAR_WALKSUCCESSED ) {
		if( CHAR_getWorkInt( charaindex, CHAR_WORKBATTLEMODE )	== BATTLE_CHARMODE_NONE ){
			CHAR_sendCDCharaAtWalk( charaindex, of,ox,oy,
									CHAR_getDX(dir), CHAR_getDY(dir));
		}
	}
    return retvalue;
}

/*------------------------------------------------------------
 * 平乓仿互汹仁[
 * 娄醒
 *  index   int     Char匹及index
 *  dir     int       轾
 *  mode    int     0卅日汹仁[1卅日  轾鳖晶[
 * 忒曰袄
 *  CHAR_WALKRET
 ------------------------------------------------------------*/
CHAR_WALKRET CHAR_walk( int index, int dir, int mode)
{
    CHAR_WALKRET ret;
    BOOL (*prewalk)(int , int* , int* );
    void (*postwalk)(int);
    if( !CHAR_CHECKINDEX( index ) )return CHAR_WALKSYSTEMERROR;

    if( CHAR_getFlg(index,CHAR_ISDIE) ) return CHAR_WALKDIE;

    VALIDATEDIR(dir);
    prewalk = (BOOL(*)(int,int*,int*))
        CHAR_getFunctionPointer(index, CHAR_WALKPREFUNC);

    if( prewalk != NULL )
        if( prewalk(index,&dir,&mode) == FALSE )	{
            return CHAR_WALKPREWALK;
		}

    if( mode == 0 )
        ret = CHAR_walk_move( index, dir );
    else
        ret = CHAR_walk_turn( index, dir );
    postwalk = (void(*)(int))
        CHAR_getFunctionPointer(index,CHAR_WALKPOSTFUNC);

    if( postwalk != NULL )
        postwalk(index);

    return ret;
}


/*------------------------------------------------------------
 * 汹井六月蟆赏  [
 * 娄醒
 *  index       int         平乓仿奶件犯永弁旦
 * 忒曰袄
 *  卅仄
 ------------------------------------------------------------*/
void CHAR_walkcall( int index )
{
    char    tmp[128];
    int     dir,mode;
	int		ret;
	POINT	start,end;

    if( !CHAR_CHECKINDEX( index ) ) return;

    strcpysafe( tmp ,sizeof(tmp),
                CHAR_getWorkChar(index,CHAR_WORKWALKARRAY));

    CHAR_ctodirmode( tmp[0], &dir ,&mode );
	/* 褪卅日仪蟆卞桦赭毛筏盛仄化云仁
	 * 褪及  仁蟆及桦赭毛    卞阂互啖  允月啃
	 */
	if( CHAR_getInt( index, CHAR_WHICHTYPE) == CHAR_TYPEPLAYER ) {
		if( CHAR_getWorkInt( index, CHAR_WORKPARTYMODE ) == CHAR_PARTY_LEADER ) {
			end.x = CHAR_getInt( index, CHAR_X);
			end.y = CHAR_getInt( index, CHAR_Y);
		}
	}

	/* 汹仁 */
    ret = CHAR_walk( index , dir ,mode );

	if( mode == 0 && ret == CHAR_WALKSUCCESSED ) {
		/* 愤坌互褪卅日醮棉毛汹井六月 */
		if( CHAR_getInt( index, CHAR_WHICHTYPE) == CHAR_TYPEPLAYER ) {
		

			if( CHAR_getWorkInt( index, CHAR_WORKPARTYMODE) == CHAR_PARTY_LEADER ) {
				int	i;
				for( i = 1; i < CHAR_PARTYMAX; i ++ ) {
					int toindex = CHAR_getWorkInt( index, 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);
							
#if 1
			// Robin 0702 petFollow
			if( CHAR_getWorkInt( toindex, CHAR_WORKPETFOLLOW) != -1 ) {
					int petindex = CHAR_getWorkInt( toindex, CHAR_WORKPETFOLLOW);
					if( CHAR_CHECKINDEX(petindex) ) {
						int		parent_dir;
						/* 阂及匏  午]褪及汹五蟆及匏  井日  轾毛菲户月 */
						/* 汹仁 */
						end.x = CHAR_getInt( toindex, CHAR_X);
						end.y = CHAR_getInt( toindex, CHAR_Y);						
						start.x = CHAR_getInt( petindex, CHAR_X);
						start.y = CHAR_getInt( petindex, CHAR_Y);

						if( end.x > start.x )    end.x --;
						else if( end.x < start.x )	end.x ++;
						if( end.y > start.y )    end.y --;
						else if( end.y < start.y )	end.y ++;						
						
						parent_dir = NPC_Util_getDirFromTwoPoint( &start,&end );
						if( parent_dir != -1 ) {
							if( CHAR_walk( petindex, parent_dir, 0) == CHAR_WALKSUCCESSED )
							{
								CHAR_setWorkInt( petindex, CHAR_WORKPETFOLLOWCOUNT,
									1 + CHAR_getWorkInt( petindex, CHAR_WORKPETFOLLOWCOUNT) );
								if( CHAR_getWorkInt( petindex, CHAR_WORKPETFOLLOWCOUNT) > 1000 ){
									CHAR_setWorkInt( petindex, CHAR_WORKPETFOLLOWCOUNT, 0);
									CHAR_pickupFollowPet( toindex, petindex );
								}
								
							}
						}
					}else {
						CHAR_setWorkInt( toindex, CHAR_WORKPETFOLLOW, -1);
					}
				
			}			

#endif							
							
						}
					}
					else {
						/* 赓渝祭仄卅云允 */
						CHAR_setWorkInt( index, i+CHAR_WORKPARTYINDEX1, -1);
					}
				}
			}
#if 1
			// Robin 0702 petFollow
			if( CHAR_getWorkInt( index, CHAR_WORKPETFOLLOW) != -1 ) {
					int petindex = CHAR_getWorkInt( index, CHAR_WORKPETFOLLOW);
					if( CHAR_CHECKINDEX(petindex) ) {
						int		parent_dir;
						/* 阂及匏  午]褪及汹五蟆及匏  井日  轾毛菲户月 */
						/* 汹仁 */
						end.x = CHAR_getInt( index, CHAR_X);
						end.y = CHAR_getInt( index, CHAR_Y);						
						start.x = CHAR_getInt( petindex, CHAR_X);
						start.y = CHAR_getInt( petindex, CHAR_Y);

						if( end.x > start.x )    end.x --;
						else if( end.x < start.x )	end.x ++;
						if( end.y > start.y )    end.y --;
						else if( end.y < start.y )	end.y ++;						
						
						parent_dir = NPC_Util_getDirFromTwoPoint( &start,&end );

						//if( (end.x == start.x) && (end.x == start.y) )
						//	parent_dir = -1;						

						/* 弘仿犯奴它旦左皿扑亦件汹五毛  蜇允月啃卞]
						 * 戚及阂反蟆及阂及  毛馨丹方丹卞允月
						 */
						//print(" pdir:%d sx:%d sy:%d ex:%d ey:%d ", 
						//	parent_dir, start.x, start.y, end.x, end.y ); 
						//end = start;

						if( parent_dir != -1 ) {
							if( CHAR_walk( petindex, parent_dir, 0) == CHAR_WALKSUCCESSED )
							{
								CHAR_setWorkInt( petindex, CHAR_WORKPETFOLLOWCOUNT,
									1 + CHAR_getWorkInt( petindex, CHAR_WORKPETFOLLOWCOUNT) );
								if( CHAR_getWorkInt( petindex, CHAR_WORKPETFOLLOWCOUNT) > 1000 )
								{
									/*
									CHAR_setInt( petindex, CHAR_VARIABLEAI,
										200 + CHAR_getInt( petindex, CHAR_VARIABLEAI) );
									*/
									CHAR_setWorkInt( petindex, CHAR_WORKPETFOLLOWCOUNT, 0);
									CHAR_pickupFollowPet( index, petindex );
								}
							}
						}
					}
					else {
						/* 赓渝祭仄卅云允 */
						CHAR_setWorkInt( index, CHAR_WORKPETFOLLOW, -1);
					}
				
			}

#endif

		}
    }

    /* 99/03/09 By Kawata */
    /* walk及瑛绊}WALKARRAY互弁伉失今木化中月桦宁互丐月及匹
     * 潸曰  仄化戊疋月
     */
    strcpysafe( tmp ,sizeof(tmp),
                CHAR_getWorkChar(index,CHAR_WORKWALKARRAY));
    if( strlen( tmp) > 0 ) {
        CHAR_setWorkChar(index,CHAR_WORKWALKARRAY,&tmp[1]);
    }

    /*  凛棉毛褡户月    */
    CHAR_setWorkInt( index, CHAR_WORKWALKSTARTSEC , NowTime.tv_sec );
    CHAR_setWorkInt( index, CHAR_WORKWALKSTARTMSEC , NowTime.tv_usec );
}



/*------------------------------------------------------------
 * 汹五铵户毛瓒  允月[
 * 娄醒
 *  index           int         平乓仿    匹及奶件犯永弁旦
 *  dir             char*         轾  侬  
 *  id              int         ID
 * 忒曰袄
 *  卅仄
 ------------------------------------------------------------*/
void CHAR_walk_start(int index, int x, int y, char* dir, BOOL mapsendmode )
{

    if( !CHAR_CHECKINDEX( index ) )return;
    
    // Nuke 08/27: Stop wap
    /*
    {
       int ox, oy;
       const int     seesiz = MAP_CHAR_DEFAULTSEESIZ;
       ox = CHAR_getInt(index,CHAR_X);
       oy = CHAR_getInt(index,CHAR_Y);
       if ( ABS(x - ox) > seesiz || ABS(y - oy) > seesiz ) {
          CHAR_talkToCli(index, -1, "因座标错误而断线。", CHAR_COLORYELLOW);
          CONNECT_setCloseRequest(getfdFromCharaIndex(index) , 1);
          return;
       }
    }
    */
                                                                                                       
    

    if( CHAR_getFlg( index,CHAR_ISDIE ) )return;
    CHAR_setWorkChar( index,CHAR_WORKWALKARRAY, dir );
    CHAR_setWorkInt( index, CHAR_WORKWALKSTARTSEC , NowTime.tv_sec );
    CHAR_setWorkInt( index, CHAR_WORKWALKSTARTMSEC , NowTime.tv_usec );

    CHAR_setMyPosition( index, x, y, FALSE);
	if( mapsendmode ) {
		int ox,oy;
		char	buf[64];
		int	len;
		int	i;
		strcpysafe( buf, sizeof(buf),
				CHAR_getWorkChar( index, CHAR_WORKWALKARRAY));

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -