📄 battle_event.c
字号:
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; }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 ); 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); if( (rad = (rand()%100)) > duck1 ){ return FALSE; }else {//回避 return TRUE; } } return FALSE;}#endifint BATTLE_GetDamageReact( int charaindex ){ if( CHAR_getWorkInt( charaindex, CHAR_WORKDAMAGEVANISH ) > 0 ){ return BATTLE_MD_VANISH; } if( CHAR_getWorkInt( charaindex, CHAR_WORKDAMAGEABSROB ) > 0 ){ return BATTLE_MD_ABSROB; } if( CHAR_getWorkInt( charaindex, CHAR_WORKDAMAGEREFLEC ) > 0 ){ return BATTLE_MD_REFLEC; }#ifdef _PETSKILL_ACUPUNCTURE if( CHAR_getWorkInt( charaindex, CHAR_WORKACUPUNCTURE ) > 0 ){ //针刺外皮 //print("\n针刺:BATTLE_GetDamageReact"); return BATTLE_MD_ACUPUNCTURE; }#endif return 0;}int BATTLE_DamageSub( int attackindex, int defindex, int *pDamage, int *pPetDamage, int *pRefrect ){ int hp = 0, addpoint = 0, maxhp, IsUltimate = 0, react, work, battleindex; int damage, playerdamage, petdamage; int attackpet, defpet; int pethp = 0, petmaxhp = 0; int defquick = 0, petquick = 0; damage = *pDamage; petdamage = *pPetDamage; playerdamage = damage; if( damage <= 0 )return 0;#ifdef _PETSKILL_SHOWMERCY if( CHAR_getInt( defindex, CHAR_HP ) - damage <= 0 && CHAR_getWorkInt(attackindex, CHAR_WORKBATTLECOM1) == BATTLE_COM_S_SHOWMERCY ){ damage = CHAR_getInt( defindex, CHAR_HP ) - 1; *pDamage = damage; playerdamage = damage; }#endif attackpet = BATTLE_getRidePet( attackindex ); defpet = BATTLE_getRidePet( defindex ); if( defpet != -1 ) { defquick = CHAR_getWorkInt( defindex, CHAR_WORKDEFENCEPOWER ); petquick = CHAR_getWorkInt( defpet, CHAR_WORKDEFENCEPOWER ); } if( *pRefrect != -1 ){ react = BATTLE_GetDamageReact( defindex ); }else{ react = BATTLE_MD_NONE; } battleindex = CHAR_getWorkInt( defindex, CHAR_WORKBATTLEINDEX ); if( react == BATTLE_MD_REFLEC ){ if( BATTLE_IsThrowWepon( CHAR_getItemIndex( attackindex, CHAR_ARM ) ) == FALSE ){ *pRefrect = BATTLE_MD_REFLEC; }else{ *pRefrect = BATTLE_MD_NONE; } }else{ }#ifdef _PETSKILL_ACUPUNCTURE if( react == BATTLE_MD_ACUPUNCTURE ){ if( BATTLE_IsThrowWepon( CHAR_getItemIndex( attackindex, CHAR_ARM ) ) == FALSE ){ *pRefrect = BATTLE_MD_ACUPUNCTURE; }else{ *pRefrect = BATTLE_MD_NONE; } }#endif if( react == BATTLE_MD_ABSROB ){ hp = CHAR_getInt( defindex, CHAR_HP ); if( defpet == -1 ) { hp += damage; }else { pethp = CHAR_getInt( defpet, CHAR_HP ); playerdamage = (damage*petquick)/(defquick+petquick) +1 ; petdamage = damage - playerdamage +1 ; hp += playerdamage; pethp += petdamage; } work = CHAR_getWorkInt( defindex, CHAR_WORKDAMAGEABSROB ) - 1; CHAR_setWorkInt( defindex, CHAR_WORKDAMAGEABSROB, max( work, 0 ) ); *pRefrect = BATTLE_MD_ABSROB; }else if( *pRefrect == BATTLE_MD_REFLEC ){#ifdef _PETSKILL_BATTLE_MODEL if(CHAR_getWorkInt(defindex,CHAR_NPCWORKINT1) == BATTLE_COM_S_BATTLE_MODEL){ work = CHAR_getWorkInt( defindex, CHAR_WORKDAMAGEREFLEC ) - 1; CHAR_setWorkInt( defindex, CHAR_WORKDAMAGEREFLEC, max( work, 0 ) ); hp = CHAR_getInt(defindex,CHAR_HP); pethp = CHAR_getInt(defpet,CHAR_HP); } else#endif { hp = CHAR_getInt( attackindex, CHAR_HP ); if( attackpet == -1 ) { hp -= damage; }else { pethp = CHAR_getInt( attackpet, CHAR_HP ); defquick = CHAR_getWorkInt( attackindex, CHAR_WORKDEFENCEPOWER ); petquick = CHAR_getWorkInt( attackpet, CHAR_WORKDEFENCEPOWER ); if( pethp > 0 ) { playerdamage = (damage*petquick)/(defquick+petquick) +1; petdamage = damage - playerdamage +1 ; hp -= playerdamage; pethp -= petdamage; }else hp -= damage; } work = CHAR_getWorkInt( defindex, CHAR_WORKDAMAGEREFLEC ) - 1; CHAR_setWorkInt( defindex, CHAR_WORKDAMAGEREFLEC, max( work, 0 ) ); defindex = attackindex; defpet = attackpet; } }else#ifdef _PETSKILL_ACUPUNCTURE if( *pRefrect == BATTLE_MD_ACUPUNCTURE ){ //针刺外皮 if( damage%2 != 0 ) damage+=1; playerdamage = damage; //先扣被攻击方的血,因为之後的动作都是对攻击方做的 hp = CHAR_getInt( defindex, CHAR_HP ); if( attackpet == -1 ) { hp -= damage; if(hp<0)hp=0; maxhp = CHAR_getWorkInt( defindex, CHAR_WORKMAXHP ); CHAR_setInt( defindex, CHAR_HP, min( hp, maxhp ) ); }else { pethp = CHAR_getInt( defpet, CHAR_HP ); defquick = CHAR_getWorkInt( defindex, CHAR_WORKDEFENCEPOWER ); petquick = CHAR_getWorkInt( defpet, CHAR_WORKDEFENCEPOWER ); if( pethp > 0 ) { playerdamage = (damage*petquick)/(defquick+petquick) +1; petdamage = damage - playerdamage +1 ; if(playerdamage%2 != 0) playerdamage+=1; if(petdamage%2 != 0) petdamage+=1; hp -= playerdamage; pethp -= petdamage; if(hp<0)hp=0; maxhp = CHAR_getWorkInt( defindex, CHAR_WORKMAXHP ); CHAR_setInt( defindex, CHAR_HP, min( hp, maxhp ) ); if( pethp < 0 ) pethp = 0; petmaxhp = CHAR_getWorkInt( defpet, CHAR_WORKMAXHP ); CHAR_setInt( defpet, CHAR_HP, min( pethp, petmaxhp ) ); }else{ hp -= damage; if(hp<0)hp=0; maxhp = CHAR_getWorkInt( defindex, CHAR_WORKMAXHP ); CHAR_setInt( defindex, CHAR_HP, min( hp, maxhp ) ); } } //Change 2003/08/22 if( (damage) >= CHAR_getWorkInt( defindex, CHAR_WORKMAXHP ) * 1.2 + 20 ){ int DefSide=0,i; int defNo = BATTLE_Index2No( battleindex, defindex ); CHAR_setWorkInt( defindex, CHAR_WORKULTIMATE, 0 ); //死亡的宠物改为休息 if( defNo >= SIDE_OFFSET ){ i = defNo - SIDE_OFFSET; DefSide = 1; }else{ i = defNo; } i = defNo-DefSide*SIDE_OFFSET; BattleArray[battleindex].Side[DefSide].Entry[i].flg |= BENT_FLG_ULTIMATE; } //针刺外皮技能回合数设为0 CHAR_setWorkInt( defindex, CHAR_WORKACUPUNCTURE, 0); //if( CHAR_getWorkInt( defindex, CHAR_WORKSLEEP ) > 0 )//检查有无昏睡 // CHAR_setWorkInt( defindex, CHAR_WORKSLEEP, 0);#ifdef _PETSKILL_BATTLE_MODEL if(CHAR_getWorkInt(defindex,CHAR_NPCWORKINT1) != BATTLE_COM_S_BATTLE_MODEL)#endif { //扣攻击方的血 hp = CHAR_getInt( attackindex, CHAR_HP ); if( attackpet == -1 ) { hp -= damage/2; }else { pethp = CHAR_getInt( attackpet, CHAR_HP ); defquick = CHAR_getWorkInt( attackindex, CHAR_WORKDEFENCEPOWER ); petquick = CHAR_getWorkInt( attackpet, CHAR_WORKDEFENCEPOWER ); if( pethp > 0 ) { playerdamage = (damage*petquick)/(defquick+petquick) +1; petdamage = damage - playerdamage +1 ; if(playerdamage%2 != 0) playerdamage+=1; if(petdamage%2 != 0) petdamage+=1; hp -= playerdamage/2; pethp -= petdamage/2; }else hp -= damage/2; } playerdamage /= 2; defindex = attackindex; defpet = attackpet; } }else#endif if( react == BATTLE_MD_VANISH ){ hp = CHAR_getInt( defindex, CHAR_HP ); if( defpet != -1 ) pethp = CHAR_getInt( defpet, CHAR_HP ); work = CHAR_getWorkInt( defindex, CHAR_WORKDAMAGEVANISH ) - 1; CHAR_setWorkInt( defindex, CHAR_WORKDAMAGEVANISH, max( work, 0 ) ); *pRefrect = BATTLE_MD_VANISH; //andy_log print("*pRefrect = BATTLE_MD_VANISH !!\n"); }else{ hp = CHAR_getInt( defindex, CHAR_HP ); if( defpet == -1 ) { hp -= damage; }else { pethp = CHAR_getInt( defpet, CHAR_HP ); if( pethp > 0 ) { //andy_edit 2002/07/31 defquick = defquick>0?defquick:1; petquick = petquick>0?petquick:1; playerdamage = (damage*petquick)/(defquick+petquick)+ 1; //playerdamage = (damage*petquick)/(defquick+petquick) +1; petdamage = damage - playerdamage +1; hp -= playerdamage; pethp -= petdamage; //print(" def_damage:%d ridepet_damage:%d ", (damage*petquick)/(defquick+petquick), damage - playerdamage); }else hp -= damage; } *pRefrect = 0; } if( hp < 0 ){ addpoint = -hp; hp = 0; } maxhp = CHAR_getWorkInt( defindex, CHAR_WORKMAXHP ); CHAR_setInt( defindex, CHAR_HP, min( hp, maxhp ) ); if( defpet != -1 ) { if( pethp < 0 ) pethp = 0; petmaxhp = CHAR_getWorkInt( defpet, CHAR_WORKMAXHP ); CHAR_setInt( defpet, CHAR_HP, min( pethp, petmaxhp ) ); // Robin 0804 if( pethp <= 0 ) { CHAR_setInt( defindex, CHAR_RIDEPET, -1 ); BATTLE_changeRideImage( defindex ); CHAR_setWorkInt( defindex, CHAR_WORKPETFALL, 1 ); print(" defpet_die! "); } } if( (damage) >= maxhp * 1.2 + 20 ){ IsUltimate = 2; }else{ if( addpoint > 0 ){ addpoint += CHAR_getWorkInt( defindex, CHAR_WORKULTIMATE ); CHAR_setWorkInt( defindex, CHAR_WORKULTIMATE, addpoint ); if( addpoint >= maxhp * 1.2 + 20 )IsUltimate = 1; } } if( BattleArray[battleindex].type == BATTLE_TYPE_P_vs_P ){ } if( IsUltimate ){ CHAR_setWorkInt( defindex, CHAR_WORKULTIMATE, 0 ); } if( playerdamage < 0 ) playerdamage = 0; if( petdamage < 0 ) petdamage = 0; *pDamage = playerdamage; *pPetDamage = petdamage; return IsUltimate;}#ifdef _PETSKILL_FIREKILL //火线猎杀专用int BATTLE_DamageSub_FIREKILL( int attackindex, int defindex, int *pDamage, int *pPetDamage, int *pRefrect ){ int hp, addpoint = 0, maxhp, IsUltimate = 0, react, work, battleindex; int damage, playerdamage, petdamage; int attackpet, defpet; int pethp = 0, petmaxhp = 0; int defquick = 0, petquick = 0; damage = *pDamage; petdamage = *pPetDamage; playerdamage = damage; if( damage <= 0 )return 0; attackpet = BATTLE_getRidePet( attackindex ); defpet = BATTLE_getRidePet( defindex ); if( defpet != -1 ) { defquick = CHAR_getWorkInt( defindex, CHAR_WORKDEFENCEPOWER ); petquick = CHAR_getWorkInt( defpet, CHAR_WORKDEFENCEPOWER ); } if( *pRefrect != -1 ){ react = BATTLE_GetDamageReact( defindex ); }else{ react = BATTLE_MD_NONE; } react = BATTLE_MD_NONE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -