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

📄 battle_event.c

📁 石器时代2.0完整版源代码.已经加入新功能. 在REDHAT9下GCC3.4编译成功.
💻 C
📖 第 1 页 / 共 5 页
字号:
	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 _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;	if( per < 0 ) per = 1;	if( per > 10000 ) per = 10000;	return (int)per;}static int BATTLE_CounterCalc( int attackindex, int defindex ){	int Df_Dex, At_Dex, Work, root = 1;	float per, Big, Small, wari, divpara = gCounterPara;	At_Dex = CHAR_getWorkInt( attackindex, CHAR_WORKFIXDEX );	Df_Dex = CHAR_getWorkInt( defindex, CHAR_WORKFIXDEX );	if( CHAR_getInt( attackindex, CHAR_WHICHTYPE ) == CHAR_TYPEENEMY		&& CHAR_getInt( defindex, CHAR_WHICHTYPE ) == CHAR_TYPEPET	){		divpara = 10;		root = 0;	}else 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_TYPEPLAYER		&& CHAR_getInt( defindex, CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER	){		divpara = 10;		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)( (double)sqrt( Work ) );	}else{		per = (float)( Work);	}	per *= wari;	return per;}static int BATTLE_CriticalCheck( int attackindex, int defindex ){	if( CHAR_getInt( attackindex, CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER ){		return BATTLE_CriticalCheckPlayer( attackindex, defindex );	}else{		return BATTLE_CriticalCheckPlayer( attackindex, defindex );	}}static int BATTLE_CriDamageCalc( int attackindex, int defindex ){	int damage = 0;	damage = BATTLE_DamageCalc( attackindex, defindex );	damage += CHAR_getWorkInt( defindex, CHAR_WORKDEFENCEPOWER )		* (float)CHAR_getInt( attackindex, CHAR_LV ) 		/ (float)CHAR_getInt( defindex, CHAR_LV ) 		* 0.5;	return damage;}static int BATTLE_GuardianCheck( int attackindex, int defindex ){	int GuardianIndex, Guardian, battleindex;	int DefSide = 0, i, DefNo;	//char szBuffer[256]="";	battleindex = CHAR_getWorkInt( attackindex, CHAR_WORKBATTLEINDEX );	DefNo = BATTLE_Index2No( battleindex, defindex );	i = DefNo;	if( i >= SIDE_OFFSET ){		i -= SIDE_OFFSET;		DefSide = 1;	}	if( BattleArray[battleindex].Side[DefSide].Entry[i].guardian == -1 ){		return -1;	}	Guardian = BattleArray[battleindex].Side[DefSide].Entry[i].guardian;// Terry add fix 使用舍已为人技能时,若攻击使用此技能的人client会当	if(Guardian == DefNo) return -1;// end	GuardianIndex = BATTLE_No2Index( battleindex, Guardian );	if( CHAR_CHECKINDEX( GuardianIndex ) == FALSE )return -1;	if( CHAR_getFlg( GuardianIndex, CHAR_ISDIE ) == TRUE )return -1;	if( CHAR_getWorkInt( GuardianIndex, CHAR_WORKBATTLEFLG ) & CHAR_BATTLEFLG_GUARDIAN ){	}else{		return -1;	}	if( CHAR_getWorkInt( GuardianIndex, CHAR_WORKSLEEP ) > 0	|| CHAR_getWorkInt( GuardianIndex, CHAR_WORKCONFUSION ) > 0	|| CHAR_getWorkInt( GuardianIndex, CHAR_WORKPARALYSIS ) > 0	|| CHAR_getWorkInt( GuardianIndex, CHAR_WORKSTONE ) > 0	|| CHAR_getWorkInt( GuardianIndex, CHAR_WORKBARRIER ) > 0	|| GuardianIndex == attackindex	){		//snprintf( szBuffer, sizeof(szBuffer),		//	"(%s)想要守住(%s)可是没成功\。",		//	CHAR_getUseName( GuardianIndex ),		//	CHAR_getUseName( defindex )		//);		//BATTLE_BroadCast( battleindex, szBuffer,		//	(DefNo >= 10)? CHAR_COLORGRAY : CHAR_COLORPURPLE ) ;		return -1;	}	if( BATTLE_IsThrowWepon(		CHAR_getItemIndex( attackindex, CHAR_ARM ) ) == TRUE	){		//snprintf( szBuffer, sizeof(szBuffer),		//	"(%s)想要守住(%s)可是没成功\。",		//	CHAR_getUseName( GuardianIndex ),		//	CHAR_getUseName( defindex )		//);		//BATTLE_BroadCast( battleindex, szBuffer,		//	(DefNo >= 10)? CHAR_COLORGRAY : CHAR_COLORPURPLE ) ;		return -1;	}	//snprintf( szBuffer, sizeof(szBuffer),	//	"(%s)护住了(%s)。",	//	CHAR_getUseName( GuardianIndex ),	//	CHAR_getUseName( defindex )	//);	//BATTLE_BroadCast( battleindex, szBuffer,	//	(DefNo >= 10)? CHAR_COLORGRAY : CHAR_COLORPURPLE ) ;	return Guardian;}static int BATTLE_DamageWakeUp( int battleindex, int defindex ){	int bid;	char szBuffer[256]="";	CHAR_setInt( defindex, CHAR_DAMAGECOUNT,		CHAR_getInt( defindex, CHAR_DAMAGECOUNT ) +1 );	if( CHAR_getWorkInt( defindex, CHAR_WORKSLEEP ) > 0 ){		CHAR_setWorkInt( defindex, CHAR_WORKSLEEP, 0 );		bid = BATTLE_Index2No( battleindex, defindex );		//sprintf( szBuffer, "(%s)被击中跳了起来。\n", 		//	CHAR_getUseName( defindex ) );		//BATTLE_BroadCast( battleindex, szBuffer,		//	(bid >= 10)? CHAR_COLORGRAY : CHAR_COLORPURPLE ) ;

⌨️ 快捷键说明

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