?? battle_event.c
字號:
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 + -