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

📄 battle_event.c

📁 石器时代8.0服务端完整源代码。可以直接编译
💻 C
📖 第 1 页 / 共 5 页
字号:
	if( per < 0 ) per = 1;	if( per > 10000 ) per = 10000;#ifdef _PETSKILL_LER	// 雷尔不能被打飞	if(CHAR_getInt(defindex,CHAR_BASEBASEIMAGENUMBER) == 101813 ||		 CHAR_getInt(defindex,CHAR_BASEBASEIMAGENUMBER) == 101814) per = 0;#endif	return (int)per;}#if 0static int BATTLE_CriticalCheckEnemy(	int attackindex,	int defindex){	int At_Dex, At_Luck = 0, At_Kiryoku = 0, At_Soubi = 0;	int At_SoubiIndex, Df_Dex;	float per, Work, Big, Small, wari;	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( 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 ) / 0.13;	if( Work <= 0 ) Work = 0;	per = (float)( sqrt( (double)Work ) )		+ At_Soubi * 0.5;	per *= wari;	per += At_Luck ;	if( per < 0 ) per = 0;	if( per > 100 ) per = 100;	return (int)per;}#endifstatic 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;}#if 0static int BATTLE_CriticalCheckPet( int attackindex, int defindex ){	float per;	int iWork = 0;	per = CHAR_getInt( attackindex, CHAR_CRITIAL );	if( CHAR_getWorkInt( attackindex, CHAR_WORKBATTLECOM1 )		== BATTLE_COM_S_NOGUARD	){		iWork = CHAR_GETWORKINT_LOW( attackindex, CHAR_WORKBATTLECOM3 );		iWork = iWork & 0xFF;		if( iWork > 127 )iWork *= -1;	}	per += iWork;	if( per < 0 ) per = 0;	if( per > 100 ) per = 100;	return per;}#endifstatic 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#ifdef _PROFESSION_SKILL			// WON ADD 人物职业技能	|| CHAR_getWorkInt( GuardianIndex, CHAR_WORKDIZZY ) > 0 	// 晕眩					|| CHAR_getWorkInt( GuardianIndex, CHAR_WORKDRAGNET ) > 0 	// 天罗地网	|| CHAR_getWorkInt( GuardianIndex, CHAR_WORKINSTIGATE ) > 0 // 挑拨	#endif#ifdef _PROFESSION_ADDSKILL	|| CHAR_getWorkInt( GuardianIndex, CHAR_DOOMTIME ) > 0 //世界末日集气#endif	){		//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 ) ;		sprintf( szBuffer, "BM|%X|%X|", bid, 0 );		strcat( szBadStatusString, szBuffer );	}	return 0;}static int BATTLE_AttackSeq( int attackindex, int defindex, int *pDamage, int *pGuardian,	int opt ){	int iRet = 0, perCri = 0;	int GuardianIndex = -1,battleindex;	battleindex = CHAR_getWorkInt( attackindex, CHAR_WORKBATTLEINDEX );		// 主人打宠	if( CHAR_getInt( defindex, CHAR_WHICHTYPE ) == CHAR_TYPEPET 		&& BattleArray[battleindex].norisk == 0		&& BattleArray[battleindex].type == BATTLE_TYPE_P_vs_E){		if( CHAR_getWorkInt( defindex, CHAR_WORKPLAYERINDEX ) == attackindex ){			CHAR_PetAddVariableAi( defindex, AI_FIX_SEKKAN );	// 修正忠诚度		}	}		// 闪避	if( opt != BATTLE_COM_COMBO ){		if( BATTLE_DuckCheck( attackindex, defindex ) == TRUE ){			return BATTLE_RET_DODGE;		}#ifdef _SUIT_ADDPART3		if( CHAR_getWorkInt( defindex, CHAR_WORKDUCKPOWER) > 0 ){			if( rand()%100 < CHAR_getWorkInt( defindex, CHAR_WORKDUCKPOWER) )				return BATTLE_RET_DODGE;		}#endif	}		// 检查被攻击方有无被别人用忠犬保护	if( *pGuardian == -1 ){		*pGuardian = BATTLE_GuardianCheck( attackindex, defindex );		if( *pGuardian != -1 ){			GuardianIndex = BATTLE_No2Index( battleindex, *pGuardian );			defindex = GuardianIndex;		}	}		// 会心一击	perCri = BATTLE_CriticalCheck( attackindex, defindex );	#ifdef _PETSKILL_DAMAGETOHP	if( opt == BATTLE_COM_S_DAMAGETOHP2 ){ //暗月狂狼 (会心一击上升30%)  && CHAR_getInt( attackindex, CHAR_HP) <= CHAR_getWorkInt( attackindex, CHAR_MAXMP)*0.5		//print("\n1会心一击:%d",perCri);                 		//print("\n1攻:%d", CHAR_getWorkInt( attackindex, CHAR_WORKATTACKPOWER));		//print("\n1敏:%d", CHAR_getWorkInt( attackindex, CHAR_WORKQUICK));		perCri = perCri + (perCri*0.3); //会心一击上升30%  		CHAR_setWorkInt( attackindex, CHAR_WORKATTACKPOWER, CHAR_getWorkInt( attackindex,CHAR_WORKFIXSTR)+CHAR_getWorkInt( attackindex,CHAR_WORKFIXSTR)*0.2);//攻上升20%		CHAR_setWorkInt( attackindex, CHAR_WORKQUICK, CHAR_getWorkInt( attackindex, CHAR_WORKFIXDEX)+CHAR_getWorkInt( attackindex, CHAR_WORKFIXDEX) *0.2 );//敏上升20%		//print("\n2会心一击:%d",perCri);		//print("\n2攻:%d", CHAR_getWorkInt( attackindex, CHAR_WORKATTACKPOWER));		//print("\n2敏:%d", CHAR_getWorkInt( attackindex, CHAR_WORKQUICK));	}#endif		gCriper = perCri;	if( RAND( 1, 10000 ) < perCri ){		// WON ADD		int gWeponType = BATTLE_GetWepon( attackindex );		if( gWeponType != ITEM_BOW ){			(*pDamage) = BATTLE_CriDamageCalc( attackindex, defindex );		}else{			(*pDamage) = BATTLE_DamageCalc( attackindex, defindex );		}		iRet = BATTLE_RET_CRITICAL;		if( CHAR_getInt( attackindex, CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER ){			// 勇士武器专精技能升级			PROFESSION_SKILL_WEAPON_FOCUS_LVEVEL_UP( attackindex, "PROFESSION_WEAPON_FOCUS" );			// 勇士二刀流技能升级			PROFESSION_SKILL_DUAL_WEAPON_LVEVEL_UP( attackindex, "PROFESSION_DUAL_WEAPON" );		}	}else{		(*pDamage) = BATTLE_DamageCalc( attackindex, defindex );		iRet = BATTLE_RET_NORMAL;	}		if( opt == BATTLE_COM_S_GBREAK){		;;	}else#ifdef _SKILL_GUARDBREAK2//破除防御2 vincent add 2002/05/20  if( opt == BATTLE_COM_S_GBREAK2){		if( CHAR_getWorkInt( defindex, CHAR_WORKBATTLECOM1 ) == BATTLE_COM_GUARD){			(*pDamage) = (*pDamage)*1.3;		}else{			(*pDamage) = (*pDamage)*0.7;		}	}else#endif#ifdef _PETSKILL_REGRET	if( opt == BATTLE_COM_S_REGRET2 ){// 人物伤害减少		(*pDamage) = (*pDamage)*0.8;	}else#endif			#ifdef _SONIC_ATTACK				// WON ADD 音波攻击	if( opt == BATTLE_COM_S_SONIC2 ){// 人物伤害减半		(*pDamage) = (*pDamage)*0.5;	}else#endif	if( CHAR_getWorkInt( defindex, CHAR_WORKBATTLECOM1 ) == BATTLE_COM_GUARD		&&  CHAR_getWorkInt( defindex, CHAR_WORKCONFUSION ) <= 0 ){		(*pDamage) = BATTLE_GuardAdjust( (*pDamage) );	}	if( (*pDamage) < 1 ) (*pDamage) = RAND( 0, 1 );				#ifdef _PREVENT_TEAMATTACK	// 防止同队互打	if (CHAR_getInt( defindex, CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER ||		CHAR_getInt( defindex, CHAR_WHICHTYPE ) == CHAR_TYPEPET ) {		int myside = CHAR_getWorkInt( defindex, CHAR_WORKBATTLESIDE);//attackindex		if( myside == CHAR_getWorkInt( attackindex, CHAR_WORKBATTLESIDE)){			if( CHAR_getWorkInt( attackindex, CHAR_WORKCONFUSION) > 0 #ifdef _PROFESSION_SKILL			// WON ADD 人物职业技能					|| CHAR_getWorkInt( attackindex, CHAR_WORKINSTIGATE) > 0	// 挑拨	#endif#ifdef _PROFESSION_ADDSKILL					|| CHAR_getWorkInt( attackindex, CHAR_WORKANNEX) > 0 //附身#endif				){					//攻击方异常混乱#ifdef _PETSKILL_TEMPTATION			}else if( CHAR_getWorkInt( attackindex, CHAR_WORKTEMPTATION ) > 0 ){//水漾诱惑							#endif			}else if( CHAR_getInt( attackindex, CHAR_WHICHTYPE) == CHAR_TYPEPET &&				CHAR_getWorkInt( attackindex, CHAR_WORKBATTLEFLG) & CHAR_BATTLEFLG_AIBAD ){	//nono宠			}else if( CHAR_getInt( defindex, CHAR_WHICHTYPE) == CHAR_TYPEPET && 				CHAR_getWorkInt( defindex, CHAR_WORKPLAYERINDEX) == attackindex ){		// 自已宠物			}else {				int myhp, mymaxhp;				mymaxhp = CHAR_getWorkInt( defindex, CHAR_WORKMAXHP);				myhp = CHAR_getInt( defindex, CHAR_HP ) - *pDamage;				mymaxhp = mymaxhp *0.40;				if( mymaxhp >= myhp || mymaxhp < 40 ){					*pDamage = 0;				}else {					*pDamage = 1;				}			}		}	}#endif				#ifdef _EQUIT_ARRANGE	if( BATTLE_ArrangeCheck( attackindex, defindex) == TRUE ){		*pDamage *= 0.1;		iRet = BATTLE_RET_ARRANGE;				// 勇士格挡技能增加		if( (CHAR_getInt( defindex, CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER) )			PROFESSION_SKILL_LVEVEL_UP( defindex, "PROFESSION_DEFLECT" );		}#endif				if( (*pDamage) == 0 ){		iRet = BATTLE_RET_MISS;		if( GuardianIndex != -1 ){			iRet = BATTLE_RET_NORMAL;			*pDamage = 1;		}else if( CHAR_getWorkInt( defindex, CHAR_WORKBATTLECOM1 ) == BATTLE_COM_GUARD 			&&  CHAR_getWorkInt( defindex, CHAR_WORKCONFUSION ) <= 0 ){			iRet = BATTLE_RET_ALLGUARD;		}	}				(*pDamage) *= gBattleDamageModyfy;	return iRet;}#ifdef _PETSKILL_SETDUCKBOOL BATTLE_CheckMySkillDuck( int charaindex ){	int SDuck=0,rad=0;	if( !CHAR_CHECKINDEX( charaindex) )		return FALSE;	if( (SDuck=CHAR_getWorkInt( charaindex, CHAR_MYSKILLDUCK)) > 0 ){		int duck1 = CHAR_getWorkInt( charaindex, CHAR_MYSKILLDUCKPOWER);

⌨️ 快捷键说明

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