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

📄 battle_event.c

📁 石器时代8.0服务端完整源代码。可以直接编译
💻 C
📖 第 1 页 / 共 5 页
字号:
static char *aszCrushTbl[] = { "完好", "受损", "毁坏" , "不堪使用" , "碎片" };#elsestatic char *aszCrushTbl[] = { "受损", "毁坏" };#endif#ifdef _TAKE_ITEMDAMAGEint BATTLE_ItemCrush( int charaindex, int ItemEquip, int Damages, int flg){	int itemindex, breadnums;	int crushlevel, crushenum, maxcrushenum;	char szBuffer[256]="";	int battleindex, bid;	itemindex = CHAR_getItemIndex( charaindex, ItemEquip );	if( ITEM_CHECKINDEX( itemindex ) == FALSE )		return -1;	battleindex = CHAR_getWorkInt( charaindex, CHAR_WORKBATTLEINDEX );	bid = BATTLE_Index2No( battleindex, charaindex );	crushlevel = ITEM_getInt( itemindex, ITEM_CRUSHLEVEL);	if( crushlevel < 0 ) crushlevel=0;	crushenum = ITEM_getInt( itemindex, ITEM_DAMAGECRUSHE);	maxcrushenum = ITEM_getInt( itemindex, ITEM_MAXDAMAGECRUSHE);	if( maxcrushenum < 1 ) return -1;	if( ItemEquip == CHAR_ARM )	{		if( (breadnums = ((Damages-50)/40)) <= 0 )			breadnums = 1;	}else	{		if( Damages >= 200 ) breadnums = 1;		if( (breadnums = ((200 - Damages)/20)) < 0 )			breadnums = 1;	}	crushenum = crushenum - RAND( breadnums, (breadnums*1.4) );	ITEM_setInt( itemindex, ITEM_DAMAGECRUSHE, crushenum);	if( crushenum <= 0 ){	//损坏消失		crushenum = 0;		sprintf(szBuffer, "%s因过度损坏而消失。\n", ITEM_getChar( itemindex, ITEM_NAME));		CHAR_talkToCli( charaindex, -1, szBuffer, CHAR_COLORYELLOW);		LogItem(			CHAR_getChar( charaindex, CHAR_NAME ), 			CHAR_getChar( charaindex, CHAR_CDKEY ),#ifdef _add_item_log_name  // WON ADD 在item的log中增加item名称			itemindex,#else       		ITEM_getInt( itemindex, ITEM_ID ),  #endif			"因过度损坏而消失",			CHAR_getInt( charaindex,CHAR_FLOOR),			CHAR_getInt( charaindex,CHAR_X ), 	      	CHAR_getInt( charaindex,CHAR_Y ),	        ITEM_getChar( itemindex, ITEM_UNIQUECODE),					ITEM_getChar( itemindex, ITEM_NAME),					ITEM_getInt( itemindex, ITEM_ID)		);		CHAR_DelItem( charaindex, ItemEquip);		crushlevel = 4;	}else	{	//损坏扣值		int defs, level=0;		defs = (crushenum*100)/maxcrushenum;		if( defs >= 70 ){			level = 0;		}else if( defs >= 50 && defs < 70 )	{			level = 1;		}else if( defs >= 30 && defs < 50 )	{			level = 2;		}else if( defs < 30 )	{			level = 3;		}		if( level != crushlevel && defs < 70 )	{			ITEM_setInt( itemindex, ITEM_CRUSHLEVEL, level);//			for( i = 0; i < arraysizeof( ItemBreakPos ); i ++ ){//				work = ITEM_getInt( itemindex, ItemBreakPos[i] );//				if( work <= 0 )continue;//				work *=0.95;//				ITEM_setInt( itemindex, ItemBreakPos[i], work );//			}			sprintf( szBuffer, "%s是%s的。",			ITEM_getChar( itemindex, ITEM_NAME ), aszCrushTbl[level] );			CHAR_talkToCli( charaindex, -1, szBuffer, CHAR_COLORRED);			//更改道具说明//			buf1 = ITEM_getChar( itemindex, ITEM_SECRETNAME);//			if( strstr( buf1, "(") != 0 )	{//				char buf5[256];//				if( getStringFromIndexWithDelim( buf1,"(",1, buf5, sizeof( buf5)) != FALSE )	{//					sprintf( buf1, buf5);//				}//			}//			sprintf( buf2, "%s(%s)", buf1, aszCrushTbl[level]);//			ITEM_setChar( itemindex, ITEM_SECRETNAME, buf2);		}	}   	CHAR_sendItemDataOne( charaindex, ItemEquip );	CHAR_complianceParameter( charaindex );	CHAR_send_P_StatusString( charaindex, CHAR_P_STRING_ATK | CHAR_P_STRING_DEF 		| CHAR_P_STRING_QUICK | CHAR_P_STRING_CHARM );	return TRUE;}#elseint BATTLE_ItemCrush( int charaindex ){	int EquipTbl[CHAR_EQUIPPLACENUM], i, itemindex, rndwork, type;	int work, crushlevel, j, ItemEquip;	char szBuffer[256]="";	int	ItemBreakPos[] = {	    ITEM_ATTACKNUM_MIN,    	ITEM_ATTACKNUM_MAX,	    ITEM_MODIFYATTACK,    	ITEM_MODIFYDEFENCE,	    ITEM_MODIFYQUICK,    	ITEM_MODIFYHP,	    ITEM_MODIFYMP,    	ITEM_MODIFYLUCK,	    ITEM_MODIFYCHARM,    	ITEM_MODIFYAVOID,	};	for( j = 0, i = 0; i < CHAR_EQUIPPLACENUM; i ++ ){		itemindex = CHAR_getItemIndex( charaindex, i );		if( ITEM_CHECKINDEX( itemindex ) == TRUE		&& ITEM_getInt( itemindex, ITEM_MERGEFLG ) == 1	){			EquipTbl[j] = i;			j ++;		}	}	if( j == 0 )return FALSE;	rndwork = RAND( 0, j-1 );	ItemEquip = EquipTbl[rndwork];	itemindex = CHAR_getItemIndex( charaindex, ItemEquip );	if( ITEM_CHECKINDEX( itemindex ) == FALSE )return FALSE;	crushlevel = ITEM_getInt( itemindex, ITEM_CRUSHLEVEL );	if( crushlevel > 1 ) return FALSE;	{		if( crushlevel == 1 ){			sprintf( szBuffer, "CrushLv2(毁坏道具Lv2)" );		}else{			sprintf( szBuffer, "CrushLv1(毁坏道具Lv1)" );		}		LogItem(			CHAR_getChar( charaindex, CHAR_NAME ),			CHAR_getChar( charaindex, CHAR_CDKEY ),#ifdef _add_item_log_name  // WON ADD 在item的log中增加item名称			itemindex,#else   			ITEM_getInt( itemindex, ITEM_ID ),#endif			szBuffer,	       	CHAR_getInt( charaindex,CHAR_FLOOR),			CHAR_getInt( charaindex,CHAR_X ),        	CHAR_getInt( charaindex,CHAR_Y ),			ITEM_getChar( itemindex, ITEM_UNIQUECODE),					ITEM_getChar( itemindex, ITEM_NAME),					ITEM_getInt( itemindex, ITEM_ID)		);	}	/*{ int battleindex, bid;		//sprintf( szBuffer, "(%s)的(%s)是(%s)\n",		//	CHAR_getUseName( charaindex ),		//	ITEM_getChar( itemindex, ITEM_NAME ),		//	aszCrushTbl[crushlevel] );		battleindex = CHAR_getWorkInt( charaindex, CHAR_WORKBATTLEINDEX );		bid = BATTLE_Index2No( battleindex, charaindex );		//BATTLE_BroadCast( battleindex, szBuffer,			(bid >= 10)? CHAR_COLORGRAY : CHAR_COLORPURPLE ) ;	}*/	type = ITEM_getInt( itemindex, ITEM_TYPE );	szBuffer[0] = 0;	switch( type ){	case ITEM_FIST:	case ITEM_AXE:	case ITEM_CLUB:	case ITEM_SPEAR:	case ITEM_BOW:	case ITEM_BOOMERANG:	case ITEM_BOUNDTHROW:	case ITEM_BREAKTHROW:		sprintf( szBuffer, "%s%s", aszCrushTbl[crushlevel], BREAK_NAME_WEPON );		break;	case ITEM_HELM:	case ITEM_ARMOUR:		sprintf( szBuffer, "%s%s", aszCrushTbl[crushlevel], BREAK_NAME_AROMER );		break;	case ITEM_BRACELET:	sprintf( szBuffer, "%s%s", aszCrushTbl[crushlevel], BREAK_BRACELET );break;	case ITEM_MUSIC:	sprintf( szBuffer, "%s%s", aszCrushTbl[crushlevel], BREAK_MUSIC );break;	case ITEM_NECKLACE:	sprintf( szBuffer, "%s%s", aszCrushTbl[crushlevel], BREAK_NECKLACE );break;	case ITEM_RING:		sprintf( szBuffer, "%s%s", aszCrushTbl[crushlevel], BREAK_RING );break;	case ITEM_BELT:		sprintf( szBuffer, "%s%s", aszCrushTbl[crushlevel], BREAK_BELT );break;	case ITEM_EARRING:	sprintf( szBuffer, "%s%s", aszCrushTbl[crushlevel], BREAK_EARRING );break;	case ITEM_NOSERING:	sprintf( szBuffer, "%s%s", aszCrushTbl[crushlevel], BREAK_NOSERING );break;	case ITEM_AMULET:	sprintf( szBuffer, "%s%s", aszCrushTbl[crushlevel], BREAK_AMULET );break;	case ITEM_OTHER:	sprintf( szBuffer, "%s%s", aszCrushTbl[crushlevel], BREAK_OTHER );break;	default:		sprintf( szBuffer, "%s%s", aszCrushTbl[crushlevel], BREAK_OTHER );break;		break;	}	ITEM_setChar( itemindex, ITEM_SECRETNAME, szBuffer );	for( i = 0; i < arraysizeof( ItemBreakPos ); i ++ ){		work = ITEM_getInt( itemindex, ItemBreakPos[i] );		if( work <= 0 )continue;		if( crushlevel == 1 ){			work = 1;		}else{			work /= 2;			if( work < 1 ) work = 1;		}		ITEM_setInt( itemindex, ItemBreakPos[i], work );	}   	CHAR_sendItemDataOne( charaindex, ItemEquip );	ITEM_setInt( itemindex, ITEM_CRUSHLEVEL, crushlevel + 1 );	CHAR_complianceParameter( charaindex );	CHAR_send_P_StatusString( charaindex,		CHAR_P_STRING_ATK		| CHAR_P_STRING_DEF		| CHAR_P_STRING_QUICK		| CHAR_P_STRING_CHARM );	return TRUE;}#endif#ifdef _TAKE_ITEMDAMAGEstatic int BATTLE_ItemCrushSeq( int attackindex, int charaindex, int Damages){	int iRet = FALSE;	int crushindex=-1, crushpower;	int flg=0;//flg def 1 att 2	flg=1;	if( ( crushindex = BATTLE_ItemCrushCheck( charaindex, flg) ) >= 0 ) {		if( CHAR_getInt( charaindex, CHAR_WHICHTYPE) == CHAR_TYPEPLAYER ){			crushpower = CHAR_getWorkInt( attackindex, CHAR_WORKATTACKPOWER);			BATTLE_ItemCrush( charaindex, crushindex, Damages, flg);		}	}	flg=2;	if( ( crushindex = BATTLE_ItemCrushCheck( attackindex, flg) ) >= 0 )	{		if( CHAR_getInt( attackindex, CHAR_WHICHTYPE) == CHAR_TYPEPLAYER ){			crushpower = CHAR_getWorkInt( charaindex, CHAR_WORKDEFENCEPOWER);			BATTLE_ItemCrush( attackindex, crushindex, Damages, flg);		}	}		return iRet;}#elsestatic int BATTLE_ItemCrushSeq( int charaindex ){	char szWork[256];	int iRet = FALSE;	if( BATTLE_ItemCrushCheck( charaindex ) == TRUE ){		if( BATTLE_ItemCrush( charaindex ) == TRUE ){			sprintf( szWork, "BK|%s的\t装备受到损伤。",				CHAR_getUseName( charaindex ) );			strcat( szBadStatusString, szWork );			iRet = TRUE;		}	}	return iRet;}#endif#ifdef _EQUIT_ARRANGEstatic BOOL BATTLE_ArrangeCheck( int attackindex, int defindex){	int DEF_ARR;	if( CHAR_getWorkInt( defindex, CHAR_WORKBATTLECOM1 ) == BATTLE_COM_GUARD ){		return FALSE;	}	if( BATTLE_GetDamageReact( defindex ) > 0 ){		return FALSE;	}	if( BATTLE_CanMoveCheck( defindex ) == FALSE ){		return FALSE;	}	if( CHAR_getWorkInt( defindex, CHAR_WORKBATTLEFLG ) & CHAR_BATTLEFLG_NODUCK ){		return FALSE;	}	if( CHAR_getWorkInt( defindex, CHAR_WORKBATTLEFLG ) & CHAR_BATTLEFLG_ABIO ){		return FALSE;	}	if( (DEF_ARR = CHAR_getWorkInt( defindex, CHAR_WORKARRANGEPOWER )) > 0 ){		int per = (DEF_ARR > 700)?700:DEF_ARR;		if( RAND( 1, 1000 ) <= per ){			return TRUE;		}	}	return FALSE;}#endif//回避判定static BOOL BATTLE_DuckCheck(	int attackindex,	int defindex){	int flg = FALSE;	int  Df_Dex, At_Dex, Df_Luck = 0;	float per, Work, wari, Big, Small;	gDuckPer = 0;	if( CHAR_getWorkInt( defindex, CHAR_WORKBATTLECOM1 ) == BATTLE_COM_GUARD ){		return FALSE;	}	if( BATTLE_GetDamageReact( defindex ) > 0 ){		return FALSE;	}	if( BATTLE_CanMoveCheck( defindex ) == FALSE ){#ifdef _PROFESSION_ADDSKILL		if( CHAR_getWorkInt( defindex, CHAR_DOOMTIME ) <= 0 )//集气时可闪避(并且没有处於天罗地网和盾击的状态)			return FALSE;		else{			if( CHAR_getWorkInt( defindex, CHAR_WORKDRAGNET ) == 0 				&& CHAR_getWorkInt( defindex, CHAR_WORKDIZZY ) == 0 ){			}			else{				return FALSE;			}		}#else		return FALSE;#endif	}	if( CHAR_getWorkInt( defindex, CHAR_WORKBATTLEFLG ) & CHAR_BATTLEFLG_NODUCK ){		return FALSE;	}	if( CHAR_getWorkInt( defindex, CHAR_WORKBATTLEFLG ) & CHAR_BATTLEFLG_ABIO ){		return FALSE;	}#ifdef _PETSKILL_SETDUCK	if( BATTLE_CheckMySkillDuck( defindex ) == TRUE ){		return TRUE;	}#endif	At_Dex = CHAR_getWorkInt( attackindex, CHAR_WORKFIXDEX );	Df_Dex = CHAR_getWorkInt( defindex, CHAR_WORKFIXDEX );	if( CHAR_getInt( defindex, CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER ){		Df_Luck = CHAR_getWorkInt( defindex, CHAR_WORKFIXLUCK );	}	if( CHAR_getInt( attackindex, CHAR_WHICHTYPE ) == CHAR_TYPEENEMY	&&  CHAR_getInt( defindex, CHAR_WHICHTYPE ) == CHAR_TYPEPET	){		At_Dex *= 0.8;	}else	if( CHAR_getInt( attackindex, CHAR_WHICHTYPE ) != CHAR_TYPEENEMY	&&  CHAR_getInt( defindex, CHAR_WHICHTYPE ) == CHAR_TYPEPET	){		Df_Dex *= 0.8;	}else	if( CHAR_getInt( attackindex, CHAR_WHICHTYPE ) != CHAR_TYPEPLAYER	&&  CHAR_getInt( defindex, CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER	){		At_Dex *= 0.6;	}else	if( CHAR_getInt( attackindex, CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER	&&  CHAR_getInt( defindex, CHAR_WHICHTYPE ) != CHAR_TYPEPLAYER	){		Df_Dex *= 0.6;	}	if( Df_Dex >= At_Dex ){		Big = Df_Dex;		Small = At_Dex;		wari = 1.0;	}else{		Big = At_Dex;		Small = Df_Dex;		if( Big <= 0 ){			wari = 0.0;		}else{			wari = Small / Big;		}	}	if( CHAR_getWorkInt( defindex, CHAR_WORKBATTLECOM1 ) == BATTLE_COM_JYUJYUTU	){		gKawashiPara = 0.027;	}else{		gKawashiPara = 0.02;	}	Work = ( Big - Small ) / gKawashiPara;	if( Work <= 0 ) Work = 0;	per = (float)( sqrt( (double)Work ) );	per *= wari;	per += Df_Luck;	per += gBattleDuckModyfy;	if( CHAR_getWorkInt( attackindex, CHAR_WORKDRUNK )  > 0 ){		per += RAND( 20, 30 );	}	if( gWeponType == ITEM_BOW ){		per += 20;	}	if( CHAR_getWorkInt( defindex, CHAR_WORKBATTLECOM1 ) == BATTLE_COM_S_NOGUARD ){		per += CHAR_GETWORKINT_HIGH( defindex, CHAR_WORKBATTLECOM3 );	}	if( gWeponType == ITEM_BOW ){		per += 20;	}	per *= 100;	if( per > KAWASHI_MAX_RATE*100 ) per = KAWASHI_MAX_RATE*100; 	if( per <= 0 ) per = 1;	gDuckPer = per * 0.01;#ifdef _EQUIT_HITRIGHT	if( CHAR_getInt( attackindex, CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER ){		int AddHit = CHAR_getWorkInt( attackindex, CHAR_WORKHITRIGHT);		per -= RAND( AddHit*0.8, AddHit*1.2);		per = ( per < 0 )?0:per;	}#endif#ifdef _PROFESSION_SKILL			// WON ADD 人物职业技能	per = BATTLE_check_profession_duck( defindex, per );#endif	#ifdef _PROFESSION_ADDSKILL	if( CHAR_getWorkInt( attackindex, CHAR_WORKBATTLECOM1 ) == BATTLE_COM_S_CHAOS ){ //混乱攻击时命中降低		per += (per*0.4);		}#endif	if( RAND( 1, 10000 ) <= per ){

⌨️ 快捷键说明

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