?? battle.c
字號:
- t_def - ((vitbonusmax < 1)?0: rand()%(vitbonusmax+1) );
}
}
}
// 0枹枮偩偭偨応崌1偵曗惓
if(damage<1) damage=1;
// 夞旔廋惓
if(hitrate < 1000000)
hitrate = ( (hitrate>95)?95: ((hitrate<5)?5:hitrate) );
if( hitrate < 1000000 && // 昁拞峌寕
(t_sc_data != NULL && (t_sc_data[SC_SLEEP].timer!=-1 || // 悋柊偼昁拞
t_sc_data[SC_STAN].timer!=-1 || // 僗僞儞偼昁拞
t_sc_data[SC_FREEZE].timer!=-1 || (t_sc_data[SC_STONE].timer!=-1 && t_sc_data[SC_STONE].val2==0) ) ) ) // 搥寢偼昁拞
hitrate = 1000000;
if(type == 0 && rand()%100 >= hitrate)
damage = 0;
if(t_sc_data) {
int cardfix=100;
if(t_sc_data[SC_DEFENDER].timer != -1 && flag&BF_LONG)
cardfix=cardfix*(100-t_sc_data[SC_DEFENDER].val2)/100;
if(cardfix != 100)
damage=damage*cardfix/100;
}
if(damage < 0) damage = 0;
// 懏 惈偺揔梡
damage=battle_attr_fix(damage, s_ele, battle_get_element(target) );
// 僀儞儀僫儉廋惓
if(skill_num==TF_POISON){
damage = battle_attr_fix(damage + 15*skill_lv, s_ele, battle_get_element(target) );
}
if(skill_num==MC_CARTREVOLUTION){
damage = battle_attr_fix(damage, 0, battle_get_element(target) );
}
// 姰慡夞旔偺敾掕
if(battle_config.enemy_perfect_flee) {
if(skill_num == 0 && skill_lv >= 0 && tmd!=NULL && hitrate < 1000000 && rand()%1000 < battle_get_flee2(target) ){
damage=0;
type=0x0b;
}
}
if(def1 >= 1000000 && damage > 0)
damage = 1;
if(skill_num != CR_GRANDCROSS)
damage=battle_calc_damage(src,target,damage,div_,skill_num,skill_lv,flag);
wd.damage=damage;
wd.damage2=0;
wd.type=type;
wd.div_=div_;
wd.amotion=battle_get_amotion(src);
if(skill_num == KN_AUTOCOUNTER)
wd.amotion >>= 1;
wd.dmotion=battle_get_dmotion(target);
wd.blewcount=blewcount;
wd.flag=flag;
return wd;
}
static struct Damage battle_calc_mob_weapon_attack(
struct block_list *src,struct block_list *target,int skill_num,int skill_lv,int wflag)
{
struct map_session_data *tsd=NULL;
struct mob_data* md=(struct mob_data *)src,*tmd=NULL;
int hitrate,flee,cri = 0,atkmin,atkmax;
int luk,target_count = 1;
int def1 = battle_get_def(target);
int def2 = battle_get_def2(target);
int t_vit = battle_get_vit(target);
struct Damage wd;
int damage,damage2=0,type,div_,blewcount=skill_get_blewcount(skill_num,skill_lv);
int flag,skill,ac_flag = 0;
int t_mode=0,t_race=0,t_size=1,s_race=0,s_ele=0;
struct status_change *sc_data,*t_sc_data;
short *sc_count;
short *option, *opt1, *opt2;
s_race=battle_get_race(src);
s_ele=battle_get_attack_element(src);
sc_data=battle_get_sc_data(src);
sc_count=battle_get_sc_count(src);
option=battle_get_option(src);
opt1=battle_get_opt1(src);
opt2=battle_get_opt2(src);
// 僞乕僎僢僩
if(target->type==BL_PC)
tsd=(struct map_session_data *)target;
else if(target->type==BL_MOB)
tmd=(struct mob_data *)target;
t_race=battle_get_race( target );
t_size=battle_get_size( target );
t_mode=battle_get_mode( target );
t_sc_data=battle_get_sc_data( target );
if((skill_num == 0 || (target->type == BL_PC && battle_config.pc_auto_counter_type&2) ||
(target->type == BL_MOB && battle_config.monster_auto_counter_type&2)) && skill_lv >= 0) {
if(skill_num != CR_GRANDCROSS && t_sc_data && t_sc_data[SC_AUTOCOUNTER].timer != -1) {
int dir = map_calc_dir(src,target->x,target->y),t_dir = battle_get_dir(target);
int dist = distance(src->x,src->y,target->x,target->y);
if(dist <= 0 || map_check_dir(dir,t_dir) ) {
memset(&wd,0,sizeof(wd));
t_sc_data[SC_AUTOCOUNTER].val3 = 0;
t_sc_data[SC_AUTOCOUNTER].val4 = 1;
if(sc_data && sc_data[SC_AUTOCOUNTER].timer == -1) {
int range = battle_get_range(target);
if((target->type == BL_PC && ((struct map_session_data *)target)->status.weapon != 11 && dist <= range+1) ||
(target->type == BL_MOB && range <= 3 && dist <= range+1) )
t_sc_data[SC_AUTOCOUNTER].val3 = src->id;
}
return wd;
}
else ac_flag = 1;
}
}
flag=BF_SHORT|BF_WEAPON|BF_NORMAL; // 峌寕偺庬椶偺愝掕
// 夞旔棪寁嶼丄夞旔敾掕偼屻偱
flee = battle_get_flee(target);
if(battle_config.agi_penaly_type > 0 || battle_config.vit_penaly_type > 0)
target_count += battle_counttargeted(target,src);
if(battle_config.agi_penaly_type > 0) {
if(target_count >= battle_config.agi_penaly_count) {
if(battle_config.agi_penaly_type == 1)
flee = (flee * (100 - (target_count - (battle_config.agi_penaly_count - 1))*battle_config.agi_penaly_num))/100;
else if(battle_config.agi_penaly_type == 2)
flee -= (target_count - (battle_config.agi_penaly_count - 1))*battle_config.agi_penaly_num;
if(flee < 1) flee = 1;
}
}
hitrate=battle_get_hit(src) - flee + 80;
type=0; // normal
div_ = 1; // single attack
luk=battle_get_luk(src);
if(battle_config.enemy_str)
damage = battle_get_baseatk(src);
else
damage = 0;
atkmin = battle_get_atk(src);
atkmax = battle_get_atk2(src);
if(mob_db[md->class].range>3 )
flag=(flag&~BF_RANGEMASK)|BF_LONG;
if(atkmin > atkmax) atkmin = atkmax;
if(sc_data != NULL && sc_data[SC_MAXIMIZEPOWER].timer!=-1 ){ // 儅僉僔儅僀僘僷儚乕
atkmin=atkmax;
}
cri = battle_get_critical(src);
cri -= battle_get_luk(target) * 3;
if(battle_config.enemy_critical_rate != 100) {
cri = cri*battle_config.enemy_critical_rate/100;
if(cri < 1)
cri = 1;
}
if(t_sc_data != NULL && t_sc_data[SC_SLEEP].timer!=-1 ) // 悋柊拞偼僋儕僥傿僇儖偑攞偵
cri <<=1;
if(ac_flag) cri = 1000;
if(skill_num == KN_AUTOCOUNTER) {
if(!(battle_config.monster_auto_counter_type&1))
cri = 1000;
else
cri <<= 1;
}
if(tsd && tsd->critical_def)
cri = cri * (100 - tsd->critical_def) / 100;
if((skill_num == 0 || skill_num == KN_AUTOCOUNTER) && skill_lv >= 0 && battle_config.enemy_critical && (rand() % 1000) < cri) // 敾掕乮僗僉儖偺応崌偼柍帇乯
// 揋偺敾掕
{
damage += atkmax;
type = 0x0a;
}
else {
int vitbonusmax;
if(atkmax > atkmin)
damage += atkmin + rand() % (atkmax-atkmin + 1);
else
damage += atkmin ;
// 僗僉儖廋惓侾乮峌寕椡攞壔宯乯
// 僆乕僶乕僩儔僗僩(+5% 乣 +25%),懠峌寕宯僗僉儖偺応崌偙偙偱曗惓
// 僶僢僔儏,儅僌僫儉僽儗僀僋,
// 儃乕儕儞僌僶僢僔儏,僗僺傾僽乕儊儔儞,僽儔儞僨傿僢僔儏僗僺傾,僗僺傾僗僞僢僽,
// 儊儅乕僫僀僩,僇乕僩儗儃儕儏乕僔儑儞
// 僟僽儖僗僩儗僀僼傿儞僌,傾儘乕僔儍儚乕,僠儍乕僕傾儘乕,
// 僜僯僢僋僽儘乕
if( sc_data!=NULL && sc_data[SC_OVERTHRUST].timer!=-1) // 僆乕僶乕僩儔僗僩
damage += damage*(5*sc_data[SC_OVERTHRUST].val1)/100;
if(skill_num>0){
int i;
if( (i=skill_get_pl(skill_num))>0 )
s_ele=i;
flag=(flag&~BF_SKILLMASK)|BF_SKILL;
switch( skill_num ){
case SM_BASH: // 僶僢僔儏
damage = damage*(100+ 30*skill_lv)/100;
hitrate = (hitrate*(100+5*skill_lv))/100;
break;
case SM_MAGNUM: // 儅僌僫儉僽儗僀僋
damage = damage*(5*skill_lv +(wflag)?65:115 )/100;
break;
case MC_MAMMONITE: // 儊儅乕僫僀僩
damage = damage*(100+ 50*skill_lv)/100;
break;
case AC_DOUBLE: // 僟僽儖僗僩儗僀僼傿儞僌
damage = damage*(180+ 20*skill_lv)/100;
div_=2;
flag=(flag&~BF_RANGEMASK)|BF_LONG;
break;
case AC_SHOWER: // 傾儘乕僔儍儚乕
damage = damage*(75 + 5*skill_lv)/100;
flag=(flag&~BF_RANGEMASK)|BF_LONG;
break;
case AC_CHARGEARROW: // 僠儍乕僕傾儘乕
damage = damage*150/100;
flag=(flag&~BF_RANGEMASK)|BF_LONG;
break;
case KN_PIERCE: // 僺傾乕僗
damage = damage*(100+ 10*skill_lv)/100;
hitrate=hitrate*(100+5*skill_lv)/100;
div_=t_size+1;
damage*=div_;
break;
case KN_SPEARSTAB: // 僗僺傾僗僞僽
damage = damage*(100+ 15*skill_lv)/100;
break;
case KN_SPEARBOOMERANG: // 僗僺傾僽乕儊儔儞
damage = damage*(100+ 50*skill_lv)/100;
flag=(flag&~BF_RANGEMASK)|BF_LONG;
break;
case KN_BRANDISHSPEAR: // 僽儔儞僨傿僢僔儏僗僺傾
damage = damage*(100+ 20*skill_lv)/100;
if(skill_lv>3 && wflag==1) damage2+=damage/2;
if(skill_lv>6 && wflag==1) damage2+=damage/4;
if(skill_lv>9 && wflag==1) damage2+=damage/8;
if(skill_lv>6 && wflag==2) damage2+=damage/2;
if(skill_lv>9 && wflag==2) damage2+=damage/4;
if(skill_lv>9 && wflag==3) damage2+=damage/2;
damage +=damage2;
blewcount=0;
break;
case KN_BOWLINGBASH: // 儃僂儕儞僌僶僢僔儏
damage = damage*(100+ 50*skill_lv)/100;
blewcount=0;
break;
case KN_AUTOCOUNTER:
if(battle_config.monster_auto_counter_type&1)
hitrate += 20;
else
hitrate = 1000000;
flag=(flag&~BF_SKILLMASK)|BF_NORMAL;
break;
case AS_SONICBLOW: // 僜僯僢僋僽儘僂
damage = damage*(300+ 50*skill_lv)/100;
div_=8;
break;
case TF_SPRINKLESAND: // 嵒傑偒
damage = damage*125/100;
break;
case MC_CARTREVOLUTION: // 僇乕僩儗儃儕儏乕僔儑儞
damage = (damage*150)/100;
break;
// 埲壓MOB
case NPC_COMBOATTACK: // 懡抜峌寕
div_=skill_get_num(skill_num,skill_lv);
damage *= div_;
break;
case NPC_RANDOMATTACK: // 儔儞僟儉ATK峌寕
damage = damage*(50+rand()%150)/100;
break;
// 懏惈峌寕乮揔摉乯
case NPC_WATERATTACK:
case NPC_GROUNDATTACK:
case NPC_FIREATTACK:
case NPC_WINDATTACK:
case NPC_POISONATTACK:
case NPC_HOLYATTACK:
case NPC_DARKNESSATTACK:
case NPC_TELEKINESISATTACK:
damage = damage*(100+25*(skill_lv-1))/100;
break;
case NPC_GUIDEDATTACK:
hitrate = 1000000;
break;
case NPC_RANGEATTACK:
flag=(flag&~BF_RANGEMASK)|BF_LONG;
break;
case NPC_PIERCINGATT:
flag=(flag&~BF_RANGEMASK)|BF_SHORT;
break;
case RG_BACKSTAP: // 僶僢僋僗僞僽
damage = damage*(300+ 40*skill_lv)/100;
hitrate = 1000000;
break;
case RG_RAID: // 僒僾儔僀僘傾僞僢僋
damage = damage*(100+ 40*skill_lv)/100;
break;
case RG_INTIMIDATE: // 僀儞僥傿儈僨僀僩
damage = damage*(100+ 30*skill_lv)/100;
break;
case CR_SHIELDCHARGE: // 僔乕儖僪僠儍乕僕
damage = damage*(100+ 20*skill_lv)/100;
flag=(flag&~BF_RANGEMASK)|BF_SHORT;
s_ele = 0;
break;
case CR_SHIELDBOOMERANG: // 僔乕儖僪僽乕儊儔儞
damage = damage*(100+ 30*skill_lv)/100;
flag=(flag&~BF_RANGEMASK)|BF_LONG;
s_ele = 0;
break;
case CR_HOLYCROSS: // 儂乕儕乕僋儘僗
damage = damage*(100+ 35*skill_lv)/100;
div_=2;
break;
case CR_GRANDCROSS:
hitrate= 1000000;
break;
case MO_FINGEROFFENSIVE: //巜抏
damage = damage * (100 + 50 * skill_lv) / 100;
div_ = 1;
break;
case MO_INVESTIGATE: // 敪 櫎
if(def1 < 1000000)
damage = damage*(100+ 75*skill_lv)/100 * (def1 + def2)/100;
hitrate = 1000000;
s_ele = 0;
break;
case MO_EXTREMITYFIST: // 垻廋梾攅朠対
damage = damage * 8 + 250 + (skill_lv * 150);
hitrate = 1000000;
s_ele = 0;
break;
case MO_CHAINCOMBO: // 楢懪彾
damage = damage*(150+ 50*skill_lv)/100;
div_=4;
break;
case MO_COMBOFINISH: // 栆棿対
damage = damage*(240+ 60*skill_lv)/100;
break;
case BA_MUSICALSTRIKE: // 儈儏乕僕僇儖僗僩儔僀僋
damage = damage*(100+ 50 * skill_lv)/100;
flag=(flag&~BF_RANGEMASK)|BF_LONG;
break;
case DC_THROWARROW: // 栴寕偪
damage = damage*(100+ 50 * skill_lv)/100;
flag=(flag&~BF_RANGEMASK)|BF_LONG;
break;
}
}
if( skill_num!=NPC_CRITICALSLASH ){
// 懳 徾偺杊屼椡偵傛?zhèn)閮_儊乕僕偺尭彮
// 僨傿僶僀儞僾儘僥僋僔儑儞乮偙偙偱偄偄偺偐側(cè)丠乯
if ( skill_num != MO_INVESTIGATE && skill_num != MO_EXTREMITYFIST && skill_num != KN_AUTOCOUNTER && def1 < 1000000) { //DEF, VIT柍帇
int t_def;
if(battle_config.vit_penaly_type > 0) {
if(target_count >= battle_config.vit_penaly_count) {
if(battle_config.vit_penaly_type == 1) {
def1 = (def1 * (100 - (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num))/100;
def2 = (def2 * (100 - (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num))/100;
t_vit = (t_vit * (100 - (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num))/100;
}
else if(battle_config.vit_penaly_type == 2) {
def1 -= (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num;
def2 -= (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num;
t_vit -= (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num;
}
if(def1 < 0) def1 = 0;
if(def2 < 1) def2 = 1;
if(t_vit < 1) t_vit = 1;
}
}
t_def = def2*8/10;
if(battle_check_undead(s_race,battle_get_elem_type(src)) || s_race==6)
if(target->type==BL_PC && (skill=pc_checkskill(tsd,AL_DP)) > 0 )
t_def += skill*3;
vitbonusmax = (t_vit/20)*(t_vit/20)-1;
damage = damage * (100 - def1) /100
- t_def - ((vitbonusmax < 1)?0: rand()%(vitbonusmax+1) );
}
}
}
// 0枹枮偩偭偨応崌1偵曗惓
if(damage<1) damage=1;
// 夞旔廋惓
if(hitrate < 1000000)
hitrate = ( (hitrate>95)?95: ((hitrate<5)?5:hitrate) );
if( hitrate < 1000000 && // 昁拞峌寕
(t_sc_data != NULL && (t_sc_data[SC_SLEEP].timer!=-1 || // 悋柊偼昁拞
t_sc_data[SC_STAN].timer!=-1 || // 僗僞儞偼昁拞
t_sc_data[SC_FREEZE].timer!=-1 || (t_sc_data[SC_STONE].timer!=-1 && t_sc_data[SC_STONE].val2==0) ) ) ) // 搥寢偼昁拞
hitrate = 1000000;
if(type
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -