📄 battle_event.c
字号:
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 + -