📄 battle_event.c
字号:
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 ){ 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); //扣攻击方的血 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;}#endif// Robin 0910 RidePetDebugint BATTLE_DamageSub2( 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; damage = *pDamage; petdamage = *pPetDamage; playerdamage = *pDamage; if( damage <= 0 )return 0; attackpet = BATTLE_getRidePet( attackindex ); defpet = BATTLE_getRidePet( defindex ); if( *pRefrect != -1 ){ react = BATTLE_GetDamageReact( defindex ); }else{ react = BATTLE_MD_NONE; } if( react == BATTLE_MD_REFLEC ){ if( BATTLE_IsThrowWepon( CHAR_getItemIndex( attackindex, CHAR_ARM ) ) == FALSE ){ *pRefrect = BATTLE_MD_REFLEC; }else{ *pRefrect = BATTLE_MD_NONE; } } if( react == BATTLE_MD_ABSROB ){ hp = CHAR_getInt( defindex, CHAR_HP ); hp += playerdamage; if( defpet != -1 ) { pethp = CHAR_getInt( defpet, CHAR_HP ); 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 ){ hp = CHAR_getInt( attackindex, CHAR_HP ); hp -= playerdamage; if( attackpet != -1 ) { pethp = CHAR_getInt( attackpet, CHAR_HP ); if( pethp > 0 ) { pethp -= petdamage; } } work = CHAR_getWorkInt( defindex, CHAR_WORKDAMAGEREFLEC ) - 1; CHAR_setWorkInt( defindex, CHAR_WORKDAMAGEREFLEC, max( work, 0 ) ); defindex = attackindex; defpet = attackpet; }else 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; }else{ hp = CHAR_getInt( defindex, CHAR_HP ); hp -= playerdamage; if( defpet != -1 ){ pethp = CHAR_getInt( defpet, CHAR_HP ); if( pethp > 0 ) { pethp -= petdamage; //print(" def_damage:%d ridepet_damage:%d ", (damage*petquick)/(defquick+petquick), damage - playerdamage); } } *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; } } battleindex = CHAR_getWorkInt( defindex, CHAR_WORKBATTLEINDEX ); if( BattleArray[battleindex].type == BATTLE_TYPE_P_vs_P ){ } if( IsUltimate ){ CHAR_setWorkInt( defindex, CHAR_WORKULTIMATE, 0 ); } //*pDamage = damage; *pDamage = playerdamage; *pPetDamage = petdamage; return IsUltimate;}void BATTLE_DamageSubCale( int attackindex, int defindex, int *pDamage, int *pPetDamage){ int pethp; int damage, playerdamage, petdamage; int attackpet, defpet; int defquick = 0, petquick = 0; damage = *pDamage; petdamage = *pPetDamage; playerdamage = damage; attackpet = BATTLE_getRidePet( attackindex ); defpet = BATTLE_getRidePet( defindex ); defquick = CHAR_getWorkInt( defindex, CHAR_WORKDEFENCEPOWER ); defquick = ( defquick < 1)?1:defquick; if( defpet != -1 ) { petquick = CHAR_getWorkInt( defpet, CHAR_WORKDEFENCEPOWER ); petquick = ( petquick < 1)?1:petquick; pethp = CHAR_getInt( defpet, CHAR_HP ); if( pethp > 0 ) { playerdamage = (damage*petquick)/(defquick+petquick); petdamage = damage - playerdamage; if( damage > 0 && playerdamage < 1 ) playerdamage = 1; } } *pDamage = playerdamage; *pPetDamage = petdamage;}int BATTLE_Attack( int battleindex, int attackNo, int defNo ){ char szBuffer[512]=""; char szCommand[1024]; int damage = 0, petdamage = 0, attackindex, toindex, ultimate = 0, defindex, react = 0, statusDefNo, opt = 0; int flg = 0, iWork, par, perStatus, i, DefSide = 0, Guardian = -1; BOOL iRet = TRUE; int suitpoison=30;//基本中毒% attackindex = BATTLE_No2Index( battleindex, attackNo ); defindex = toindex = BATTLE_No2Index( battleindex, defNo ); if( CHAR_CHECKINDEX( attackindex ) == FALSE ) return FALSE; if( CHAR_CHECKINDEX( defindex ) == FALSE ) return FALSE;#ifdef _PETSKILL_RETRACE Battle_Attack_ReturnData_x.Battle_Attack_ReturnData = 0;#endif if( gWeponType == ITEM_BOW ){ if( toindex < 0 || CHAR_getInt( toindex, CHAR_HP ) <= 0 ){ snprintf( szCommand, sizeof( szCommand ), "r%X|f0|d0|", defNo ); BATTLESTR_ADD( szCommand ); return FALSE; } } if( CHAR_getInt( toindex, CHAR_HP ) <= 0 ) return FALSE; if( CHAR_getInt( attackindex, CHAR_HP ) <= 0 ) return FALSE; // 光、镜、守 if( BATTLE_GetDamageReact( attackindex ) > 0 ) iRet = FALSE; else if( BATTLE_GetDamageReact( defindex ) > 0 ) iRet = FALSE; // 攻击模式 iWork = BATTLE_AttackSeq( attackindex, toindex, &damage, &Guardian, opt ); if( Guardian >= 0 ) defindex = BATTLE_No2Index( battleindex, Guardian ); if( gDamageDiv != 0.0 && damage > 0 ){ damage /= gDamageDiv; if( damage <= 0 ) damage = 1; } par = BATTLE_AttrAdjust( attackindex, defindex, 100 ); react = 0; ultimate = BATTLE_DamageSub( attackindex, defindex, &damage, &petdamage, &react ); if( react == BATTLE_MD_REFLEC ){ defindex = attackindex
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -