* Changed weapon skills to read list_num from the skill_db when calculating damage

git-svn-id: https://svn.code.sf.net/p/rathena/svn/branches/stable@1111 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
celest 2005-02-15 10:25:24 +00:00
parent f0586beb14
commit 7fa2d81908
2 changed files with 45 additions and 46 deletions

View File

@ -1,6 +1,8 @@
Date Added
02/15
* Added Wallex's changes for weapon skills to read list_num from the skill_db
when calculating damage [celest]
* Login / Login SQL: Fixed the EXE-Version check (now it works finally :) [Sirius]
* Char SQL: Fixed the '0x2b05' reply to the mapserver (now multi - mapservers works again!)
* Rewrote skill blocking system that was allowing people to bypass blocking

View File

@ -620,6 +620,8 @@ static struct Damage battle_calc_pet_weapon_attack(
int flag,dmg_lv=0;
int t_mode=0,t_race=0,t_size=1,s_race=0,s_ele=0;
struct status_change *t_sc_data;
int div_flag=0; // 0: total damage is to be divided by div_
// 1: damage is distributed,and has to be multiplied by div_ [celest]
//return前の処理があるので情報出力部のみ変更
if( target == NULL || pd == NULL ){ //srcは内容に直接触れていないのでスルーしてみる
@ -661,7 +663,11 @@ static struct Damage battle_calc_pet_weapon_attack(
hitrate=status_get_hit(src) - flee + 80;
type=0; // normal
div_ = 1; // single attack
if (skill_num > 0) {
div_ = skill_get_num(skill_num,skill_lv);
if (div_ < 1) div_ = 1; //Avoid the rare case where the db says div_ is 0 and below
}
else div_ = 1; // single attack
luk=status_get_luk(src);
@ -735,7 +741,6 @@ static struct Damage battle_calc_pet_weapon_attack(
break;
case AC_DOUBLE: // ダブルストレイフィング
damage = damage*(180+ 20*skill_lv)/100;
div_=2;
flag=(flag&~BF_RANGEMASK)|BF_LONG;
break;
case AC_SHOWER: // アローシャワー
@ -750,7 +755,7 @@ static struct Damage battle_calc_pet_weapon_attack(
damage = damage*(100+ 10*skill_lv)/100;
hitrate = hitrate*(100+5*skill_lv)/100;
div_=t_size+1;
damage*=div_;
div_flag = 1;
break;
case KN_SPEARSTAB: // スピアスタブ
damage = damage*(100+ 15*skill_lv)/100;
@ -783,7 +788,6 @@ static struct Damage battle_calc_pet_weapon_attack(
break;
case AS_SONICBLOW: // ソニックブロウ
damage = damage*(300+ 50*skill_lv)/100;
div_=8;
break;
case TF_SPRINKLESAND: // 砂まき
damage = damage*125/100;
@ -793,8 +797,7 @@ static struct Damage battle_calc_pet_weapon_attack(
break;
// 以下MOB
case NPC_COMBOATTACK: // 多段攻撃
div_=skill_get_num(skill_num,skill_lv);
damage *= div_;
div_flag = 1;
break;
case NPC_RANDOMATTACK: // ランダムATK攻撃
damage = damage*(50+rand()%150)/100;
@ -842,7 +845,6 @@ static struct Damage battle_calc_pet_weapon_attack(
break;
case CR_HOLYCROSS: // ホーリークロス
damage = damage*(100+ 35*skill_lv)/100;
div_=2;
break;
case CR_GRANDCROSS:
hitrate= 1000000;
@ -859,7 +861,6 @@ static struct Damage battle_calc_pet_weapon_attack(
break;
case MO_FINGEROFFENSIVE: //指弾
damage = damage * (125 + 25 * skill_lv) / 100;
div_ = 1;
flag=(flag&~BF_RANGEMASK)|BF_LONG; //orn
break;
case MO_INVESTIGATE: // 発 勁
@ -875,7 +876,6 @@ static struct Damage battle_calc_pet_weapon_attack(
break;
case MO_CHAINCOMBO: // 連打掌
damage = damage*(150+ 50*skill_lv)/100;
div_=4;
break;
case MO_COMBOFINISH: // 猛龍拳
damage = damage*(240+ 60*skill_lv)/100;
@ -893,14 +893,12 @@ static struct Damage battle_calc_pet_weapon_attack(
break;
case CH_CHAINCRUSH: // 連柱崩撃
damage = damage*(400+ 100*skill_lv)/100;
div_=skill_get_num(skill_num,skill_lv);
break;
case CH_PALMSTRIKE: // 猛虎硬派山
damage = damage*(200+ 100*skill_lv)/100;
break;
case LK_SPIRALPIERCE: /* スパイラルピアース */
damage = damage*(100+ 50*skill_lv)/100; //増加量が分からないので適当に
div_=5;
flag=(flag&~BF_RANGEMASK)|BF_LONG;
if(target->type == BL_PC)
((struct map_session_data *)target)->canmove_tick = gettick() + 1000;
@ -921,12 +919,15 @@ static struct Damage battle_calc_pet_weapon_attack(
break;
case CG_ARROWVULCAN: /* アローバルカン */
damage = damage*(200+100*skill_lv)/100;
div_=9;
break;
case AS_SPLASHER: /* ベナムスプラッシャー */
damage = damage*(200+20*skill_lv)/100;
break;
}
if (div_flag && div_ > 1) { // [Skotlex]
damage *= div_;
damage2 *= div_;
}
}
if( skill_num!=NPC_CRITICALSLASH ){
@ -1061,6 +1062,8 @@ static struct Damage battle_calc_mob_weapon_attack(
struct status_change *sc_data,*t_sc_data;
short *sc_count;
short *option, *opt1, *opt2;
int div_flag=0; // 0: total damage is to be divided by div_
// 1: damage is distributed,and has to be multiplied by div_ [celest]
//return前の処理があるので情報出力部のみ変更
if( src == NULL || target == NULL || md == NULL ){
@ -1129,7 +1132,10 @@ static struct Damage battle_calc_mob_weapon_attack(
hitrate=status_get_hit(src) - flee + 80;
type=0; // normal
div_ = 1; // single attack
if (skill_num > 0) {
div_ = skill_get_num(skill_num,skill_lv);
if (div_ < 1) div_ = 1; //Avoid the rare case where the db says div_ is 0 and below
} else div_ = 1; // single attack
luk=status_get_luk(src);
@ -1230,7 +1236,6 @@ static struct Damage battle_calc_mob_weapon_attack(
break;
case AC_DOUBLE: // ダブルストレイフィング
damage = damage*(180+ 20*skill_lv)/100;
div_=2;
flag=(flag&~BF_RANGEMASK)|BF_LONG;
break;
case AC_SHOWER: // アローシャワー
@ -1243,9 +1248,9 @@ static struct Damage battle_calc_mob_weapon_attack(
break;
case KN_PIERCE: // ピアース
damage = damage*(100+ 10*skill_lv)/100;
hitrate=hitrate*(100+5*skill_lv)/100;
div_=t_size+1;
damage*=div_;
hitrate = hitrate*(100+5*skill_lv)/100;
div_ = t_size+1;
div_flag = 1;
break;
case KN_SPEARSTAB: // スピアスタブ
damage = damage*(100+ 15*skill_lv)/100;
@ -1285,7 +1290,6 @@ static struct Damage battle_calc_mob_weapon_attack(
break;
case AS_SONICBLOW: // ソニックブロウ
damage = damage*(300+ 50*skill_lv)/100;
div_=8;
break;
case TF_SPRINKLESAND: // 砂まき
damage = damage*125/100;
@ -1295,8 +1299,7 @@ static struct Damage battle_calc_mob_weapon_attack(
break;
// 以下MOB
case NPC_COMBOATTACK: // 多段攻撃
div_=skill_get_num(skill_num,skill_lv);
damage *= div_;
div_flag = 1;
break;
case NPC_RANDOMATTACK: // ランダムATK攻撃
damage = damage*(50+rand()%150)/100;
@ -1344,7 +1347,6 @@ static struct Damage battle_calc_mob_weapon_attack(
break;
case CR_HOLYCROSS: // ホーリークロス
damage = damage*(100+ 35*skill_lv)/100;
div_=2;
break;
case CR_GRANDCROSS:
hitrate= 1000000;
@ -1361,7 +1363,6 @@ static struct Damage battle_calc_mob_weapon_attack(
break;
case MO_FINGEROFFENSIVE: //指弾
damage = damage * (125 + 25 * skill_lv) / 100;
div_ = 1;
flag=(flag&~BF_RANGEMASK)|BF_LONG; //orn
break;
case MO_INVESTIGATE: // 発 勁
@ -1377,7 +1378,6 @@ static struct Damage battle_calc_mob_weapon_attack(
break;
case MO_CHAINCOMBO: // 連打掌
damage = damage*(150+ 50*skill_lv)/100;
div_=4;
break;
case BA_MUSICALSTRIKE: // ミュージカルストライク
damage = damage*(60+ 40 * skill_lv)/100;
@ -1395,14 +1395,12 @@ static struct Damage battle_calc_mob_weapon_attack(
break;
case CH_CHAINCRUSH: // 連柱崩撃
damage = damage*(400+ 100*skill_lv)/100;
div_=skill_get_num(skill_num,skill_lv);
break;
case CH_PALMSTRIKE: // 猛虎硬派山
damage = damage*(200+ 100*skill_lv)/100;
break;
case LK_SPIRALPIERCE: /* スパイラルピアース */
damage = damage*(100+ 50*skill_lv)/100; //増加量が分からないので適当に
div_=5;
flag=(flag&~BF_RANGEMASK)|BF_LONG;
if(tsd)
tsd->canmove_tick = gettick() + 1000;
@ -1423,12 +1421,15 @@ static struct Damage battle_calc_mob_weapon_attack(
break;
case CG_ARROWVULCAN: /* アローバルカン */
damage = damage*(200+100*skill_lv)/100;
div_=9;
break;
case AS_SPLASHER: /* ベナムスプラッシャー */
damage = damage*(200+20*skill_lv)/100;
break;
}
if (div_flag && div_ > 1) { // [Skotlex]
damage *= div_;
damage2 *= div_;
}
}
if( skill_num!=NPC_CRITICALSLASH ){
@ -1617,6 +1618,8 @@ static struct Damage battle_calc_pc_weapon_attack(
int watk,watk_,cardfix,t_ele;
int da=0,i,t_class,ac_flag = 0;
int idef_flag=0,idef_flag_=0;
int div_flag=0; // 0: total damage is to be divided by div_
// 1: damage is distributed,and has to be multiplied by div_ [celest]
//return前の処理があるので情報出力部のみ変更
if( src == NULL || target == NULL || sd == NULL ){
@ -1695,7 +1698,10 @@ static struct Damage battle_calc_pc_weapon_attack(
hitrate=status_get_hit(src) - flee + 80; //命中率計算
type=0; // normal
div_ = 1; // single attack
if (skill_num > 0) {
div_=skill_get_num(skill_num,skill_lv);
if (div_ < 1) div_ = 1; //Avoid the rare case where the db says div_ is 0 and below
} else div_ = 1; // single attack
dex=status_get_dex(src); //DEX
luk=status_get_luk(src); //LUK
@ -1955,7 +1961,6 @@ static struct Damage battle_calc_pc_weapon_attack(
}
damage = damage*(180+ 20*skill_lv)/100;
damage2 = damage2*(180+ 20*skill_lv)/100;
div_=2;
if(sd->arrow_ele > 0) {
s_ele = sd->arrow_ele;
s_ele_ = sd->arrow_ele;
@ -1998,8 +2003,7 @@ static struct Damage battle_calc_pc_weapon_attack(
damage2 = damage2*(100+ 10*skill_lv)/100;
hitrate=hitrate*(100+5*skill_lv)/100;
div_=t_size+1;
damage*=div_;
damage2*=div_;
div_flag=1;
break;
case KN_SPEARSTAB: // スピアスタブ
damage = damage*(100+ 15*skill_lv)/100;
@ -2054,7 +2058,6 @@ static struct Damage battle_calc_pc_weapon_attack(
hitrate+=30; // hitrate +30, thanks to midas
damage = damage*(300+ 50*skill_lv)/100;
damage2 = damage2*(300+ 50*skill_lv)/100;
div_=8;
break;
case TF_SPRINKLESAND: // 砂まき
damage = damage*125/100;
@ -2074,9 +2077,7 @@ static struct Damage battle_calc_pc_weapon_attack(
break;
// 以下MOB
case NPC_COMBOATTACK: // 多段攻撃
div_=skill_get_num(skill_num,skill_lv);
damage *= div_;
damage2 *= div_;
div_flag=1;
break;
case NPC_RANDOMATTACK: // ランダムATK攻撃
damage = damage*(50+rand()%150)/100;
@ -2137,7 +2138,6 @@ static struct Damage battle_calc_pc_weapon_attack(
case CR_HOLYCROSS: // ホーリークロス
damage = damage*(100+ 35*skill_lv)/100;
damage2 = damage2*(100+ 35*skill_lv)/100;
div_=2;
break;
case CR_GRANDCROSS:
hitrate= 1000000;
@ -2159,16 +2159,13 @@ static struct Damage battle_calc_pc_weapon_attack(
no_cardfix = 1;
break;
case MO_FINGEROFFENSIVE: //指弾
damage = damage * (125 + 25 * skill_lv) / 100;
damage2 = damage2 * (125 + 25 * skill_lv) / 100;
if(battle_config.finger_offensive_type == 0) {
damage = damage * (125 + 25 * skill_lv) / 100 * sd->spiritball_old;
damage2 = damage2 * (125 + 25 * skill_lv) / 100 * sd->spiritball_old;
div_ = sd->spiritball_old;
div_flag = 1;
}
else {
damage = damage * (125 + 25 * skill_lv) / 100;
damage2 = damage2 * (125 + 25 * skill_lv) / 100;
div_ = 1;
}
else div_ = 1;
flag=(flag&~BF_RANGEMASK)|BF_LONG; //orn
break;
case MO_INVESTIGATE: // 発 勁
@ -2192,7 +2189,6 @@ static struct Damage battle_calc_pc_weapon_attack(
case MO_CHAINCOMBO: // 連打掌
damage = damage*(150+ 50*skill_lv)/100;
damage2 = damage2*(150+ 50*skill_lv)/100;
div_=4;
break;
case MO_COMBOFINISH: // 猛龍拳
damage = damage*(240+ 60*skill_lv)/100;
@ -2229,7 +2225,6 @@ static struct Damage battle_calc_pc_weapon_attack(
case CH_CHAINCRUSH: // 連柱崩撃
damage = damage*(100+ 60*skill_lv)/100;
damage2 = damage2*(100+ 60*skill_lv)/100;
div_=skill_get_num(skill_num,skill_lv);
break;
case CH_PALMSTRIKE: // 猛虎硬派山
damage = damage*(50+ 100*skill_lv)/100;
@ -2238,7 +2233,6 @@ static struct Damage battle_calc_pc_weapon_attack(
case LK_SPIRALPIERCE: /* スパイラルピアース */
damage = damage*(100+ 50*skill_lv)/100; //増加量が分からないので適当に
damage2 = damage2*(100+ 50*skill_lv)/100; //増加量が分からないので適当に
div_=5;
flag=(flag&~BF_RANGEMASK)|BF_LONG;
if(tsd)
tsd->canmove_tick = gettick() + 1000;
@ -2265,7 +2259,6 @@ static struct Damage battle_calc_pc_weapon_attack(
case CG_ARROWVULCAN: /* アローバルカン */
damage = damage*(200+100*skill_lv)/100;
damage2 = damage2*(200+100*skill_lv)/100;
div_=9;
if(sd->arrow_ele > 0) {
s_ele = sd->arrow_ele;
s_ele_ = sd->arrow_ele;
@ -2325,6 +2318,10 @@ static struct Damage battle_calc_pc_weapon_attack(
}
break;
}
if (div_flag && div_ > 1) { // [Skotlex]
damage *= div_;
damage2 *= div_;
}
}
if(da == 2) { //三段掌が発動しているか
type = 0x08;