?? battle_event.c
字號:
if( (rad = (rand()%100)) > duck1 ){ return FALSE; }else {//回避 return TRUE; } } return FALSE;}#endif#ifdef _PROFESSION_SKILL // WON ADD 人物職業技能int BATTLE_check_profession_duck( int charaindex, int per ){ int SDuck=0; if( (SDuck=CHAR_getWorkInt( charaindex, CHAR_WORK_P_DUCK)) > 0 ){ int duck1 = CHAR_getWorkInt( charaindex, CHAR_WORKMOD_P_DUCK); per = per * ( 100 + duck1 ) / 100; } return per;}#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 _PROFESSION_SKILL // WON ADD 人物職業技能 if( CHAR_getWorkInt( charaindex, CHAR_WORKTRAP ) > 0 ){ //陷阱 return BATTLE_MD_TRAP; }#endif#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 _PROFESSION_SKILL // WON ADD 人物職業技能 if( react == BATTLE_MD_TRAP ){ if( BATTLE_IsThrowWepon( CHAR_getItemIndex( attackindex, CHAR_ARM ) ) == FALSE ) *pRefrect = BATTLE_MD_TRAP; else *pRefrect = BATTLE_MD_NONE; }#endif#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 _PROFESSION_SKILL // WON ADD 人物職業技能 if( *pRefrect == BATTLE_MD_TRAP ){ //陷阱 #ifdef _PETSKILL_BATTLE_MODEL if(CHAR_getWorkInt(defindex,CHAR_NPCWORKINT1) == BATTLE_COM_S_BATTLE_MODEL){ CHAR_setWorkInt( defindex, CHAR_WORKTRAP, 0 ); CHAR_setWorkInt( defindex, CHAR_WORKMODTRAP, 0 ); hp = CHAR_getInt(defindex,CHAR_HP); pethp = CHAR_getInt(defpet,CHAR_HP); } else#endif { int value=0; value = CHAR_getWorkInt( defindex, CHAR_WORKMODTRAP ); damage = value; playerdamage = damage; 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; } CHAR_setWorkInt( defindex, CHAR_WORKTRAP, 0 ); CHAR_setWorkInt( defindex, CHAR_WORKMODTRAP, 0 ); defindex = attackindex; defpet = attackpet; } }else#endif#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 ){ }#ifdef _PETSKILL_LER// 雷爾不能被打飛 if(CHAR_getInt(defindex,CHAR_BASEBASEIMAGENUMBER) == 101813 || CHAR_getInt(defindex,CHAR_BASEBASEIMAGENUMBER) == 101814) IsUltimate = 0;#endif 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; 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 _PROFESSION_SKILL // WON ADD 人物職業技能 if( react == BATTLE_MD_TRAP ){ if( BATTLE_IsThrowWepon( CHAR_getItemIndex( attackindex, CHAR_ARM ) ) == FALSE ) *pRefrect = BATTLE_MD_TRAP; else *pRefrect = BATTLE_MD_NONE; }#endif#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 +=
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -