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

📄 battle_event.c

📁 石器时代8.0服务端完整源代码。可以直接编译
💻 C
📖 第 1 页 / 共 5 页
字号:
		flg = TRUE;#ifdef _PROFESSION_SKILL			// WON ADD 人物职业技能		// 回避技能升级		if( (CHAR_getInt( defindex, CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER) ){			PROFESSION_SKILL_LVEVEL_UP( defindex, "PROFESSION_AVOID" );		} #endif	}else{		flg = FALSE;	}	return flg;}static int	BATTLE_AttrCalc(		int My_Fire,		int My_Water,		int My_Earth,		int My_Wind,		int My_None,		int Vs_Fire,		int Vs_Water,		int Vs_Earth,		int Vs_Wind,		int Vs_None){	int iRet = 0;	My_Fire = My_Fire * Vs_None * AJ_UP			+ My_Fire * Vs_Fire * AJ_SAME			+ My_Fire * Vs_Water * AJ_DOWN			+ My_Fire * Vs_Earth * AJ_SAME			+ My_Fire * Vs_Wind * AJ_UP;	My_Water = My_Water * Vs_None * AJ_UP			+ My_Water * Vs_Fire * AJ_UP			+ My_Water * Vs_Water * AJ_SAME			+ My_Water * Vs_Earth * AJ_DOWN			+ My_Water * Vs_Wind * AJ_SAME;	My_Earth = My_Earth * Vs_None * AJ_UP			+ My_Earth  * Vs_Fire * AJ_SAME			+ My_Earth * Vs_Water * AJ_UP			+ My_Earth * Vs_Earth * AJ_SAME			+ My_Earth * Vs_Wind * AJ_DOWN;	My_Wind = My_Wind * Vs_None * AJ_UP			+ My_Wind  * Vs_Fire * AJ_DOWN			+ My_Wind * Vs_Water * AJ_SAME			+ My_Wind * Vs_Earth * AJ_UP			+ My_Wind * Vs_Wind * AJ_SAME;	My_None = My_None * Vs_None * AJ_SAME			+ My_None * Vs_Fire * AJ_DOWN			+ My_None * Vs_Water * AJ_DOWN			+ My_None * Vs_Earth * AJ_DOWN			+ My_None * Vs_Wind * AJ_DOWN;	iRet = (My_Fire + My_Water + My_Earth + My_Wind + My_None) ;	return (iRet * D_ATTR);}static void BATTLE_GetAttr( int charaindex, int *T_pow ){#ifdef _BATTLE_NEWPOWER#else	int petindex = BATTLE_getRidePet( charaindex );        if( petindex == -1 ){#endif		T_pow[0] = CHAR_getWorkInt( charaindex, CHAR_WORKFIXEARTHAT );		T_pow[1] = CHAR_getWorkInt( charaindex, CHAR_WORKFIXWATERAT );		T_pow[2] = CHAR_getWorkInt( charaindex, CHAR_WORKFIXFIREAT );		T_pow[3] = CHAR_getWorkInt( charaindex, CHAR_WORKFIXWINDAT );/*		*pAt_Fire = CHAR_getWorkInt( charaindex, CHAR_WORKFIXFIREAT );		*pAt_Water = CHAR_getWorkInt( charaindex, CHAR_WORKFIXWATERAT );		*pAt_Earth = CHAR_getWorkInt( charaindex, CHAR_WORKFIXEARTHAT );		*pAt_Wind = CHAR_getWorkInt( charaindex, CHAR_WORKFIXWINDAT );*/#ifdef _BATTLE_NEWPOWER#else	}else	{    // Robin 0727 when Ride Pet#endif#ifdef _BATTLE_NEWPOWER#else		T_pow[0] = ( CHAR_getWorkInt( charaindex, CHAR_WORKFIXEARTHAT )			+ CHAR_getWorkInt( petindex, CHAR_WORKFIXEARTHAT )) /2;		T_pow[1] = ( CHAR_getWorkInt( charaindex, CHAR_WORKFIXWATERAT )			+ CHAR_getWorkInt( petindex, CHAR_WORKFIXWATERAT )) /2;		T_pow[2] = ( CHAR_getWorkInt( charaindex, CHAR_WORKFIXFIREAT )			+ CHAR_getWorkInt( petindex, CHAR_WORKFIXFIREAT )) /2;		T_pow[3] = ( CHAR_getWorkInt( charaindex, CHAR_WORKFIXWINDAT )			+ CHAR_getWorkInt( petindex, CHAR_WORKFIXWINDAT )) /2;/*		*pAt_Fire = ( CHAR_getWorkInt( charaindex, CHAR_WORKFIXFIREAT )			+ CHAR_getWorkInt( petindex, CHAR_WORKFIXFIREAT )) /2;		*pAt_Water = ( CHAR_getWorkInt( charaindex, CHAR_WORKFIXWATERAT )			+ CHAR_getWorkInt( petindex, CHAR_WORKFIXWATERAT )) /2;		*pAt_Earth = ( CHAR_getWorkInt( charaindex, CHAR_WORKFIXEARTHAT )			+ CHAR_getWorkInt( petindex, CHAR_WORKFIXEARTHAT )) /2;		*pAt_Wind = ( CHAR_getWorkInt( charaindex, CHAR_WORKFIXWINDAT )			+ CHAR_getWorkInt( petindex, CHAR_WORKFIXWINDAT )) /2;*/	}#endif#ifdef _PROFESSION_ADDSKILL 		//加上结界        //T_pow[0] += T_pow[0]*( (CHAR_getWorkInt( charaindex, CHAR_WORKFIXEARTHAT_BOUNDARY )>>16&0x0000ffff) /100 );		//T_pow[1] += T_pow[1]*( (CHAR_getWorkInt( charaindex, CHAR_WORKFIXWATERAT_BOUNDARY )>>16&0x0000ffff) /100 );		//T_pow[2] += T_pow[2]*( (CHAR_getWorkInt( charaindex, CHAR_WORKFIXFIREAT_BOUNDARY )>>16&0x0000ffff) /100 );		//T_pow[3] += T_pow[3]*( (CHAR_getWorkInt( charaindex, CHAR_WORKFIXWINDAT_BOUNDARY )>>16&0x0000ffff) /100 );#endif	#ifdef _SUIT_TWFWENDUM	T_pow[0] = (T_pow[0]+CHAR_getWorkInt( charaindex, CHAR_WORK_EA ))>100?100:(T_pow[0]+CHAR_getWorkInt( charaindex, CHAR_WORK_EA ));	T_pow[1] = (T_pow[1]+CHAR_getWorkInt( charaindex, CHAR_WORK_WR ))>100?100:(T_pow[1]+CHAR_getWorkInt( charaindex, CHAR_WORK_EA ));	T_pow[2] = (T_pow[2]+CHAR_getWorkInt( charaindex, CHAR_WORK_FI ))>100?100:(T_pow[2]+CHAR_getWorkInt( charaindex, CHAR_WORK_EA ));	T_pow[3] = (T_pow[3]+CHAR_getWorkInt( charaindex, CHAR_WORK_WI ))>100?100:(T_pow[3]+CHAR_getWorkInt( charaindex, CHAR_WORK_EA ));#endif	{		int i, renum=ATTR_MAX;		for( i=0; i<4; i++)	{			if( T_pow[ i] < 0 ) T_pow[ i] = 0;			renum -= T_pow[ i];		}		if( renum < 0 ) renum = 0;		T_pow[ 4] = renum;	}/*	if( *pAt_Fire < 0 ) *pAt_Fire = 0;	if( *pAt_Water < 0 ) *pAt_Water = 0;	if( *pAt_Earth < 0 ) *pAt_Earth = 0;	if( *pAt_Wind < 0 ) *pAt_Wind = 0;	*pAt_None = ATTR_MAX - *pAt_Fire - *pAt_Water - *pAt_Earth - *pAt_Wind;	if( *pAt_None < 0 )*pAt_None = 0;*/}float BATTLE_FieldAttAdjust(	int battleindex,	int pAt_Fire,	int pAt_Water,	int pAt_Earth,	int pAt_Wind){#define AJ_BOTTOM (0.5)#define AJ_PLUS   (0.5)	int att;	float power, a_pow;	att = BattleArray[battleindex].field_att;	a_pow = (float)(BattleArray[battleindex].att_pow);	switch( att ){	case BATTLE_ATTR_EARTH:		power = AJ_BOTTOM + (pAt_Earth) * a_pow * 0.01 * 0.01 * AJ_PLUS;		break;	case BATTLE_ATTR_WATER:		power = AJ_BOTTOM + (pAt_Water) * a_pow * 0.01 * 0.01 * AJ_PLUS ;		break;	case BATTLE_ATTR_FIRE:		power = AJ_BOTTOM + (pAt_Fire) * a_pow * 0.01 * 0.01 * AJ_PLUS ;		break;	case BATTLE_ATTR_WIND:		power = AJ_BOTTOM + (pAt_Wind) * a_pow * 0.01 * 0.01 * AJ_PLUS ;		break;	default:		power = AJ_BOTTOM;		break;	}	return power;}static int BATTLE_AttrAdjust(	int attackindex,	int defindex,	int damage){	int At_pow[5]={0,0,0,0,0}; //地水火风	int Dt_pow[5]={0,0,0,0,0};	int i;	float At_FieldPow, Df_FieldPow;#ifdef _BATTLE_PROPERTY	int (*loopfunc)(int,int,int*,int*,int)=NULL;#endif	BATTLE_GetAttr( attackindex, At_pow);	BATTLE_GetAttr( defindex, Dt_pow);#ifdef _PSKILL_MDFYATTACK	if( CHAR_getWorkInt( attackindex, CHAR_WORKBATTLECOM1) == BATTLE_COM_S_MDFYATTACK )	{		int MKind=-1, MODS=0;		MKind = CHAR_GETWORKINT_LOW( attackindex, CHAR_WORKBATTLECOM4);		MODS = CHAR_GETWORKINT_HIGH( attackindex, CHAR_WORKBATTLECOM4);				for( i=0; i<5; i++)	{			At_pow[ i] = 0;		}		if( MKind >= 0 && MKind <= 4 ){			At_pow[ MKind] = MODS;			At_pow[ 4] = 0;		}	}#endif#ifdef _BATTLE_PROPERTY	loopfunc =(int(*)(int,int,int*,int*,int))CHAR_getFunctionPointer( attackindex, CHAR_BATTLEPROPERTY);	if( loopfunc ){		loopfunc( attackindex, defindex, &damage, At_pow, 5);	}#endif#ifdef _BATTLE_PROPERTY	loopfunc = NULL;	loopfunc =(int(*)(int,int,int*,int*,int))CHAR_getFunctionPointer( defindex, CHAR_BATTLEPROPERTY);	if( loopfunc ){		loopfunc( defindex, attackindex, &damage, Dt_pow, 5);	}#endif	At_FieldPow = BATTLE_FieldAttAdjust(		CHAR_getWorkInt( attackindex, CHAR_WORKBATTLEINDEX ), At_pow[ 2], At_pow[ 1], At_pow[ 0], At_pow[ 3] );	Df_FieldPow = BATTLE_FieldAttAdjust(		CHAR_getWorkInt( defindex, CHAR_WORKBATTLEINDEX ), Dt_pow[ 2], Dt_pow[ 1], Dt_pow[ 0], Dt_pow[ 3] );	for( i=0; i<5; i++)	{		At_pow[ i] *= damage;	}/*	At_Fire *= damage;	At_Water *= damage;	At_pow[0] *= damage;	At_Wind *= damage;	At_none *= damage;*/	damage = BATTLE_AttrCalc(//火2水1第0封3		At_pow[ 2], At_pow[ 1], At_pow[ 0], At_pow[ 3], At_pow[ 4],		Dt_pow[ 2], Dt_pow[ 1], Dt_pow[ 0], Dt_pow[ 3], Dt_pow[ 4] );	damage *= (At_FieldPow / Df_FieldPow);	return damage;}int BATTLE_GuardAdjust( int damage ){	int Rand = RAND( 1, 100 );	if( Rand <= 25 ){		damage *= 0.00;	}else{		if( Rand <= 50 ){			damage *= 0.10;		}else{			if( Rand <= 70 ){				damage *= 0.20;			}else{				if( Rand <= 85 ){					damage *= 0.30;				}else{					if( Rand <= 95 ){						damage *= 0.40;					}else{						damage *= 0.50;					}				}			}		}	}	return damage;}//计算伤害值int BATTLE_DamageCalc( int attackindex, int defindex ){	float attack, defense;	int damage = 0;	int attackpet = BATTLE_getRidePet( attackindex );	int defpet = BATTLE_getRidePet( defindex );		// Robin 0727 Ride Pet	if( attackpet == -1 )	{		attack = CHAR_getWorkInt( attackindex, CHAR_WORKATTACKPOWER );	}else	{		attack = BATTLE_adjustRidePet3A( attackindex, attackpet, CHAR_WORKATTACKPOWER, ATTACKSIDE );	}		if( defpet == -1 )	{#ifdef _BATTLE_NEWPOWER			defense = CHAR_getWorkInt( defindex, CHAR_WORKDEFENCEPOWER ) * 0.70;#else			defense = CHAR_getWorkInt( defindex, CHAR_WORKDEFENCEPOWER ) * 0.45;			defense += CHAR_getWorkInt( defindex, CHAR_WORKQUICK ) * 0.2;			defense += CHAR_getWorkInt( defindex, CHAR_WORKFIXVITAL ) * 0.1;#endif		}else	{#ifdef _BATTLE_NEWPOWER			defense = BATTLE_adjustRidePet3A( defindex, defpet, CHAR_WORKDEFENCEPOWER, DEFFENCESIDE ) * 0.70;#else			defense = BATTLE_adjustRidePet3A( defindex, defpet, CHAR_WORKDEFENCEPOWER, DEFFENCESIDE ) * 0.45;			defense += BATTLE_adjustRidePet3A( defindex, defpet, CHAR_WORKQUICK, DEFFENCESIDE ) * 0.20;			defense += CHAR_getWorkInt( defindex, CHAR_WORKFIXVITAL ) * 0.05;	#endif		}#ifdef _MAGIC_SUPERWALL //铁壁防御		if( CHAR_getWorkInt( defindex, CHAR_MAGICSUPERWALL ) > 0 ){			float def = (float)(CHAR_getWorkInt( defindex, CHAR_OTHERSTATUSNUMS ));			def = (def + rand()%20)/100;			defense += defense * def;		}#endif#ifdef _NPCENEMY_ADDPOWER //修改怪物的能力值		if( CHAR_getInt( defindex, CHAR_WHICHTYPE ) == CHAR_TYPEENEMY )	{			defense += (defense*(rand()%10)+2)/100;		}		if( CHAR_getInt( attackindex, CHAR_WHICHTYPE ) == CHAR_TYPEENEMY )	{			attack += (attack*(rand()%10)+2)/100;		}#endif	if( CHAR_getWorkInt( defindex, CHAR_WORKSTONE ) > 0 ) defense *= 2.0;#ifdef _PETSKILL_REGRET	//无装备防御	if( CHAR_getWorkInt( attackindex, CHAR_WORKBATTLECOM1 ) == BATTLE_COM_S_REGRET		|| CHAR_getWorkInt( attackindex, CHAR_WORKBATTLECOM1 ) == BATTLE_COM_S_REGRET2 )		defense = CHAR_getWorkInt(defindex,CHAR_WORKFIXTOUGH);#endif#ifdef _EQUIT_NEGLECTGUARD //忽视目标防御力%	if( CHAR_getWorkInt(  attackindex, CHAR_WORKNEGLECTGUARD) > 1 ) {		float defp = (float)CHAR_getWorkInt(  attackindex, CHAR_WORKNEGLECTGUARD);		defp = 1 - (defp/100);		defense = defense*defp;	}#endif	if( defense <= attack && attack < (defense * 8.0/7.0)   ){		damage = (int)(RAND( 0, attack * D_16 ));	}else	if( defense > attack ){		damage = (int)(RAND( 0, 1 ));	}else	if( attack >= (defense * 8/7)   ){		float K0;		K0 = RAND( 0, attack*D_8 ) - attack*D_16;		damage = (int)(( (attack - defense )*DAMAGE_RATE ) + K0);	}	//四属性	damage = BATTLE_AttrAdjust( attackindex, defindex, damage );#ifdef _PROFESSION_ADDSKILL 	{		//四属结界		if( ((CHAR_getWorkInt( defindex, CHAR_WORKFIXEARTHAT_BOUNDARY )>>16) & 0x0000ffff) > 0 ){			if( CHAR_getWorkInt( attackindex, CHAR_WORKFIXEARTHAT ) > 0 )				damage -= damage*(float)((CHAR_getWorkInt( attackindex, CHAR_WORKFIXEARTHAT )/200.0)); 		}else if( ((CHAR_getWorkInt( defindex, CHAR_WORKFIXWATERAT_BOUNDARY )>>16) & 0x0000ffff) > 0 ){			if( CHAR_getWorkInt( attackindex, CHAR_WORKFIXWATERAT ) > 0 )				damage -= damage*(float)((CHAR_getWorkInt( attackindex, CHAR_WORKFIXWATERAT )/200.0));		}else if( ((CHAR_getWorkInt( defindex, CHAR_WORKFIXFIREAT_BOUNDARY )>>16) & 0x0000ffff) > 0 ){			if( CHAR_getWorkInt( attackindex, CHAR_WORKFIXFIREAT ) > 0 )				damage -= damage*(float)((CHAR_getWorkInt( attackindex, CHAR_WORKFIXFIREAT )/200.0));		}else if( ((CHAR_getWorkInt( defindex, CHAR_WORKFIXWINDAT_BOUNDARY )>>16) & 0x0000ffff) > 0 ){			if( CHAR_getWorkInt( attackindex, CHAR_WORKFIXWINDAT ) > 0 )				damage -= damage*(float)((CHAR_getWorkInt( attackindex, CHAR_WORKFIXWINDAT )/200.0));		}		//T_pow[1] += T_pow[1]*( (CHAR_getWorkInt( charaindex, CHAR_WORKFIXWATERAT_BOUNDARY )>>16&0x0000ffff) /100 );		//T_pow[2] += T_pow[2]*( (CHAR_getWorkInt( charaindex, CHAR_WORKFIXFIREAT_BOUNDARY )>>16&0x0000ffff) /100 );		//T_pow[3] += T_pow[3]*( (CHAR_getWorkInt( charaindex, CHAR_WORKFIXWINDAT_BOUNDARY )>>16&0x0000ffff) /100 );	}#endif#ifdef _ADD_DEAMGEDEFC //额外伤害 & 附加攻击	{		int apower, dpower, otherpower;		apower = CHAR_getWorkInt( attackindex, CHAR_WORKOTHERDMAGE);		dpower = CHAR_getWorkInt( defindex, CHAR_WORKOTHERDEFC);		otherpower = RAND( apower*0.3, apower) - RAND( dpower*0.3, dpower);		if( otherpower != 0 )	{			damage += otherpower;		}	}	if( damage < 0 )		damage = 0;#endif		return damage;}static int BATTLE_CriticalCheckPlayer( int attackindex, int defindex ){	int At_Dex, At_Luck = 0, At_Kiryoku = 0, At_Soubi = 0;	int At_SoubiIndex, Df_Dex, root = 1;	float per, Work, Big, Small, wari, divpara = gCriticalPara;	// WON REM 	//if( gWeponType == ITEM_BOW )return 0;	At_Dex = CHAR_getWorkInt( attackindex, CHAR_WORKFIXDEX );	Df_Dex = CHAR_getWorkInt( defindex, CHAR_WORKFIXDEX );	if( CHAR_getInt( attackindex, CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER ){		At_Luck = CHAR_getWorkInt( attackindex, CHAR_WORKFIXLUCK );	}	At_SoubiIndex = CHAR_getItemIndex( attackindex, CHAR_ARM );	At_Kiryoku = CHAR_getInt( attackindex, CHAR_MP );	if( ITEM_CHECKINDEX( At_SoubiIndex ) == TRUE ){		At_Soubi = ITEM_getInt( At_SoubiIndex, ITEM_CRITICAL );	}	if( CHAR_getInt( attackindex, CHAR_WHICHTYPE ) == CHAR_TYPEPET	&&  CHAR_getInt( defindex, CHAR_WHICHTYPE ) == CHAR_TYPEENEMY){		Df_Dex *= 0.8;	}else	if( CHAR_getInt( attackindex, CHAR_WHICHTYPE ) == CHAR_TYPEENEMY	&&  CHAR_getInt( defindex, CHAR_WHICHTYPE ) == CHAR_TYPEPET){		divpara = 10.0;		root = 0;	}else	if( CHAR_getInt( attackindex, CHAR_WHICHTYPE ) != CHAR_TYPEPLAYER	&&  CHAR_getInt( defindex, CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER){		divpara = 10.0;		root = 0;	}else		if( CHAR_getInt( attackindex, CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER		&&  CHAR_getInt( defindex, CHAR_WHICHTYPE ) != CHAR_TYPEPLAYER){			Df_Dex *= 0.6;		}	if( At_Dex >= Df_Dex ){		Big = At_Dex;		Small = Df_Dex;		wari = 1.0;	}else{		Big = Df_Dex;		Small = At_Dex;		if( Big <= 0 ){			wari = 0.0;		}else{			wari = Small / Big;		}	}	Work = ( Big - Small ) / divpara;	if( Work <= 0 ) Work = 0;	if( root == 1 ){		per = (float)( sqrt( (double)Work ) ) + At_Soubi * 0.5;	}else{		per = (float)Work + At_Soubi * 0.5;	}	per *= wari;	per += At_Luck ;	per *= 100;

⌨️ 快捷键说明

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