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