📄 battle.c
字号:
/*==========================================
* 廋楙僟儊乕僕
*------------------------------------------
*/
int battle_addmastery(struct map_session_data *sd,struct block_list *target,int dmg,int type)
{
int damage,skill;
int race=battle_get_race(target);
int weapon;
damage = 0;
// 僨乕儌儞儀僀儞(+3 乣 +30) vs 晄巰 or 埆杺 (巰恖偼娷傔側偄丠)
if((skill = pc_checkskill(sd,AL_DEMONBANE)) > 0 && (battle_check_undead(race,battle_get_elem_type(target)) || race==6) )
damage += (skill * 3);
// 價乕僗僩儀僀儞(+4 乣 +40) vs 摦暔 or 崺拵
if((skill = pc_checkskill(sd,HT_BEASTBANE)) > 0 && (race==2 || race==4) )
damage += (skill * 4);
if(type == 0)
weapon = sd->weapontype1;
else
weapon = sd->weapontype2;
switch(weapon)
{
case 0x01: // 抁寱 (Updated By AppleGirl)
case 0x02: // 1HS
{
// 寱廋楙(+4 乣 +40) 曅庤寱 抁寱娷傓
if((skill = pc_checkskill(sd,SM_SWORD)) > 0) {
damage += (skill * 4);
}
break;
}
case 0x03: // 2HS
{
// 椉庤寱廋楙(+4 乣 +40) 椉庤寱
if((skill = pc_checkskill(sd,SM_TWOHAND)) > 0) {
damage += (skill * 4);
}
break;
}
case 0x04: // 1HL
{
// 憚廋楙(+4 乣 +40,+5 乣 +50) 憚
if((skill = pc_checkskill(sd,KN_SPEARMASTERY)) > 0) {
if(!pc_isriding(sd))
damage += (skill * 4); // 儁僐偵忔偭偰側偄
else
damage += (skill * 5); // 儁僐偵忔偭偰傞
}
break;
}
case 0x05: // 2HL
{
// 憚廋楙(+4 乣 +40,+5 乣 +50) 憚
if((skill = pc_checkskill(sd,KN_SPEARMASTERY)) > 0) {
if(!pc_isriding(sd))
damage += (skill * 4); // 儁僐偵忔偭偰側偄
else
damage += (skill * 5); // 儁僐偵忔偭偰傞
}
break;
}
case 0x06: // 曅庤晙
{
if((skill = pc_checkskill(sd,AM_AXEMASTERY)) > 0) {
damage += (skill * 3);
}
break;
}
case 0x07: // Axe by Tato
{
if((skill = pc_checkskill(sd,AM_AXEMASTERY)) > 0) {
damage += (skill * 3);
}
break;
}
case 0x08: // 儊僀僗
{
// 儊僀僗廋楙(+3 乣 +30) 儊僀僗
if((skill = pc_checkskill(sd,PR_MACEMASTERY)) > 0) {
damage += (skill * 3);
}
break;
}
case 0x09: // 側偟?
break;
case 0x0a: // 忨
break;
case 0x0b: // 媩
break;
case 0x00: // 慺庤
case 0x0c: // Knuckles
{
// 揝対(+3 乣 +30) 慺庤,僫僢僋儖
if((skill = pc_checkskill(sd,MO_IRONHAND)) > 0) {
damage += (skill * 3);
}
break;
}
case 0x0d: // Musical Instrument
{
// 妝婍偺楙廗(+3 乣 +30) 妝婍
if((skill = pc_checkskill(sd,BA_MUSICALLESSON)) > 0) {
damage += (skill * 3);
}
break;
}
case 0x0e: // Dance Mastery
{
// Dance Lesson Skill Effect(+3 damage for every lvl = +30) 曏
if((skill = pc_checkskill(sd,DC_DANCINGLESSON)) > 0) {
damage += (skill * 3);
}
break;
}
case 0x0f: // Book
{
// Advance Book Skill Effect(+3 damage for every lvl = +30) {
if((skill = pc_checkskill(sd,SA_ADVANCEDBOOK)) > 0) {
damage += (skill * 3);
}
break;
}
case 0x10: // Katars
{
// 僇僞乕儖廋楙(+3 乣 +30) 僇僞乕儖
if((skill = pc_checkskill(sd,AS_KATAR)) > 0) {
//僜僯僢僋僽儘乕帪偼暿張棟乮1寕偵晅偒1/8揔墳)
damage += (skill * 3);
}
break;
}
}
damage = dmg + damage;
return (damage);
}
static struct Damage battle_calc_pet_weapon_attack(
struct block_list *src,struct block_list *target,int skill_num,int skill_lv,int wflag)
{
struct pet_data *pd = (struct pet_data *)src;
struct mob_data *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;
int t_mode=0,t_race=0,t_size=1,s_race=0,s_ele=0;
struct status_change *t_sc_data;
s_race=battle_get_race(src);
s_ele=battle_get_attack_element(src);
// 僞乕僎僢僩
if(target->type == BL_MOB)
tmd=(struct mob_data *)target;
else {
memset(&wd,0,sizeof(wd));
return wd;
}
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 );
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.pet_str)
damage = battle_get_baseatk(src);
else
damage = 0;
atkmin = battle_get_atk(src);
atkmax = battle_get_atk2(src);
if(mob_db[pd->class].range>3 )
flag=(flag&~BF_RANGEMASK)|BF_LONG;
if(atkmin > atkmax) 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(skill_num == 0 && 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(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 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 ){
// 懳 徾偺杊屼椡偵傛傞僟儊乕僕偺尭彮
// 僨傿僶僀儞僾儘僥僋僔儑儞乮偙偙偱偄偄偺偐側丠乯
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;
vitbonusmax = (t_vit/20)*(t_vit/20)-1;
damage = damage * (100 - def1) /100
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -