diff options
Diffstat (limited to 'src/map/battle.cpp')
-rw-r--r-- | src/map/battle.cpp | 641 |
1 files changed, 7 insertions, 634 deletions
diff --git a/src/map/battle.cpp b/src/map/battle.cpp index fe14615..4d98b45 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -129,7 +129,6 @@ int battle_get_max_hp(struct block_list *bl) return ((struct map_session_data *) bl)->status.max_hp; else { - eptr<struct status_change, StatusChange> sc_data = battle_get_sc_data(bl); int max_hp = 1; if (bl->type == BL_MOB && ((struct mob_data *) bl)) { @@ -145,14 +144,6 @@ int battle_get_max_hp(struct block_list *bl) max_hp = (max_hp * battle_config.monster_hp_rate) / 100; } } - if (sc_data) - { - if (sc_data[SC_APPLEIDUN].timer != -1) - max_hp += - ((5 + sc_data[SC_APPLEIDUN].val1 * 2 + - ((sc_data[SC_APPLEIDUN].val2 + 1) >> 1) + - sc_data[SC_APPLEIDUN].val3 / 10) * max_hp) / 100; - } if (max_hp < 1) max_hp = 1; return max_hp; @@ -176,23 +167,6 @@ int battle_get_str(struct block_list *bl) else if (bl->type == BL_PC && ((struct map_session_data *) bl)) return ((struct map_session_data *) bl)->paramc[ATTR::STR]; - if (sc_data) - { - if (sc_data[SC_LOUD].timer != -1 && sc_data[SC_QUAGMIRE].timer == -1 - && bl->type != BL_PC) - str += 4; - if (sc_data[SC_BLESSING].timer != -1 && bl->type != BL_PC) - { // ブレッシング - int race = battle_get_race(bl); - if (battle_check_undead(race, battle_get_elem_type(bl)) - || race == 6) - str >>= 1; // 悪 魔/不死 - else - str += sc_data[SC_BLESSING].val1; // その他 - } - if (sc_data[SC_TRUESIGHT].timer != -1 && bl->type != BL_PC) // トゥルーサイト - str += 5; - } if (str < 0) str = 0; return str; @@ -216,23 +190,6 @@ int battle_get_agi(struct block_list *bl) else if (bl->type == BL_PC && (struct map_session_data *) bl) agi = ((struct map_session_data *) bl)->paramc[ATTR::AGI]; - if (sc_data) - { - if (sc_data[SC_INCREASEAGI].timer != -1 && sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1 && bl->type != BL_PC) // 速度増加(PCはpc.cで) - agi += 2 + sc_data[SC_INCREASEAGI].val1; - - if (sc_data[SC_CONCENTRATE].timer != -1 - && sc_data[SC_QUAGMIRE].timer == -1 && bl->type != BL_PC) - agi += agi * (2 + sc_data[SC_CONCENTRATE].val1) / 100; - - if (sc_data[SC_DECREASEAGI].timer != -1) // 速度減少 - agi -= 2 + sc_data[SC_DECREASEAGI].val1; - - if (sc_data[SC_QUAGMIRE].timer != -1) // クァグマイア - agi >>= 1; - if (sc_data[SC_TRUESIGHT].timer != -1 && bl->type != BL_PC) // トゥルーサイト - agi += 5; - } if (agi < 0) agi = 0; return agi; @@ -254,13 +211,6 @@ int battle_get_vit(struct block_list *bl) vit = ((struct mob_data *) bl)->stats[MOB_VIT]; else if (bl->type == BL_PC && (struct map_session_data *) bl) vit = ((struct map_session_data *) bl)->paramc[ATTR::VIT]; - if (sc_data) - { - if (sc_data[SC_STRIPARMOR].timer != -1 && bl->type != BL_PC) - vit = vit * 60 / 100; - if (sc_data[SC_TRUESIGHT].timer != -1 && bl->type != BL_PC) // トゥルーサイト - vit += 5; - } if (vit < 0) vit = 0; @@ -284,22 +234,6 @@ int battle_get_int(struct block_list *bl) else if (bl->type == BL_PC && (struct map_session_data *) bl) int_ = ((struct map_session_data *) bl)->paramc[ATTR::INT]; - if (sc_data) - { - if (sc_data[SC_BLESSING].timer != -1 && bl->type != BL_PC) - { // ブレッシング - int race = battle_get_race(bl); - if (battle_check_undead(race, battle_get_elem_type(bl)) - || race == 6) - int_ >>= 1; // 悪 魔/不死 - else - int_ += sc_data[SC_BLESSING].val1; // その他 - } - if (sc_data[SC_STRIPHELM].timer != -1 && bl->type != BL_PC) - int_ = int_ * 60 / 100; - if (sc_data[SC_TRUESIGHT].timer != -1 && bl->type != BL_PC) // トゥルーサイト - int_ += 5; - } if (int_ < 0) int_ = 0; return int_; @@ -322,27 +256,6 @@ int battle_get_dex(struct block_list *bl) else if (bl->type == BL_PC && (struct map_session_data *) bl) dex = ((struct map_session_data *) bl)->paramc[ATTR::DEX]; - if (sc_data) - { - if (sc_data[SC_CONCENTRATE].timer != -1 - && sc_data[SC_QUAGMIRE].timer == -1 && bl->type != BL_PC) - dex += dex * (2 + sc_data[SC_CONCENTRATE].val1) / 100; - - if (sc_data[SC_BLESSING].timer != -1 && bl->type != BL_PC) - { // ブレッシング - int race = battle_get_race(bl); - if (battle_check_undead(race, battle_get_elem_type(bl)) - || race == 6) - dex >>= 1; // 悪 魔/不死 - else - dex += sc_data[SC_BLESSING].val1; // その他 - } - - if (sc_data[SC_QUAGMIRE].timer != -1) // クァグマイア - dex >>= 1; - if (sc_data[SC_TRUESIGHT].timer != -1 && bl->type != BL_PC) // トゥルーサイト - dex += 5; - } if (dex < 0) dex = 0; return dex; @@ -367,12 +280,8 @@ int battle_get_luk(struct block_list *bl) if (sc_data) { - if (sc_data[SC_GLORIA].timer != -1 && bl->type != BL_PC) // グロリア(PCはpc.cで) - luk += 30; if (sc_data[SC_CURSE].timer != -1) // 呪い luk = 0; - if (sc_data[SC_TRUESIGHT].timer != -1 && bl->type != BL_PC) // トゥルーサイト - luk += 5; } if (luk < 0) luk = 0; @@ -399,16 +308,8 @@ int battle_get_flee(struct block_list *bl) if (sc_data) { - if (sc_data[SC_WHISTLE].timer != -1 && bl->type != BL_PC) - flee += - flee * (sc_data[SC_WHISTLE].val1 + sc_data[SC_WHISTLE].val2 + - (sc_data[SC_WHISTLE].val3 >> 16)) / 100; if (sc_data[SC_BLIND].timer != -1 && bl->type != BL_PC) flee -= flee * 25 / 100; - if (sc_data[SC_WINDWALK].timer != -1 && bl->type != BL_PC) // ウィンドウォーク - flee += flee * (sc_data[SC_WINDWALK].val2) / 100; - if (sc_data[SC_SPIDERWEB].timer != -1 && bl->type != BL_PC) //スパイダーウェブ - flee -= flee * 50 / 100; if (battle_is_unarmed(bl)) flee += (skill_power_bl(bl, TMW_BRAWLING) >> 3); // +25 for 200 @@ -439,17 +340,8 @@ int battle_get_hit(struct block_list *bl) if (sc_data) { - if (sc_data[SC_HUMMING].timer != -1 && bl->type != BL_PC) // - hit += - hit * (sc_data[SC_HUMMING].val1 * 2 + - sc_data[SC_HUMMING].val2 + - sc_data[SC_HUMMING].val3) / 100; if (sc_data[SC_BLIND].timer != -1 && bl->type != BL_PC) // 呪い hit -= hit * 25 / 100; - if (sc_data[SC_TRUESIGHT].timer != -1 && bl->type != BL_PC) // トゥルーサイト - hit += 3 * (sc_data[SC_TRUESIGHT].val1); - if (sc_data[SC_CONCENTRATION].timer != -1 && bl->type != BL_PC) //コンセントレーション - hit += (hit * (10 * (sc_data[SC_CONCENTRATION].val1))) / 100; if (battle_is_unarmed(bl)) hit += (skill_power_bl(bl, TMW_BRAWLING) >> 4); // +12 for 200 @@ -482,12 +374,7 @@ int battle_get_flee2(struct block_list *bl) else flee2 = battle_get_luk(bl) + 1; - if (sc_data) { - if (sc_data[SC_WHISTLE].timer != -1 && bl->type != BL_PC) - flee2 += (sc_data[SC_WHISTLE].val1 + sc_data[SC_WHISTLE].val2 - + (sc_data[SC_WHISTLE].val3 & 0xffff)) * 10; - if (battle_is_unarmed(bl)) flee2 += (skill_power_bl(bl, TMW_BRAWLING) >> 3); // +25 for 200 flee2 += skill_power_bl(bl, TMW_SPEED) >> 3; @@ -520,17 +407,6 @@ int battle_get_critical(struct block_list *bl) else critical = battle_get_luk(bl) * 3 + 1; - if (sc_data) - { - if (sc_data[SC_FORTUNE].timer != -1 && bl->type != BL_PC) - critical += - (10 + sc_data[SC_FORTUNE].val1 + sc_data[SC_FORTUNE].val2 + - sc_data[SC_FORTUNE].val3) * 10; - if (sc_data[SC_EXPLOSIONSPIRITS].timer != -1 && bl->type != BL_PC) - critical += sc_data[SC_EXPLOSIONSPIRITS].val2; - if (sc_data[SC_TRUESIGHT].timer != -1 && bl->type != BL_PC) //トゥルーサイト - critical += critical * sc_data[SC_TRUESIGHT].val1 / 100; - } if (critical < 1) critical = 1; return critical; @@ -560,12 +436,8 @@ int battle_get_baseatk(struct block_list *bl) } if (sc_data) { //状態異常あり - if (sc_data[SC_PROVOKE].timer != -1 && bl->type != BL_PC) //PCでプロボック(SM_PROVOKE)状態 - batk = batk * (100 + 2 * sc_data[SC_PROVOKE].val1) / 100; //base_atk増加 if (sc_data[SC_CURSE].timer != -1) //呪われていたら batk -= batk * 25 / 100; //base_atkが25%減少 - if (sc_data[SC_CONCENTRATION].timer != -1 && bl->type != BL_PC) //コンセントレーション - batk += batk * (5 * sc_data[SC_CONCENTRATION].val1) / 100; } if (batk < 1) batk = 1; //base_atkは最低でも1 @@ -592,12 +464,8 @@ int battle_get_atk(struct block_list *bl) if (sc_data) { - if (sc_data[SC_PROVOKE].timer != -1 && bl->type != BL_PC) - atk = atk * (100 + 2 * sc_data[SC_PROVOKE].val1) / 100; if (sc_data[SC_CURSE].timer != -1) atk -= atk * 25 / 100; - if (sc_data[SC_CONCENTRATION].timer != -1 && bl->type != BL_PC) //コンセントレーション - atk += atk * (5 * sc_data[SC_CONCENTRATION].val1) / 100; } if (atk < 0) atk = 0; @@ -644,21 +512,8 @@ int battle_get_atk2(struct block_list *bl) atk2 = ((struct mob_data *) bl)->stats[MOB_ATK2]; if (sc_data) { - if (sc_data[SC_IMPOSITIO].timer != -1) - atk2 += sc_data[SC_IMPOSITIO].val1 * 5; - if (sc_data[SC_PROVOKE].timer != -1) - atk2 = atk2 * (100 + 2 * sc_data[SC_PROVOKE].val1) / 100; if (sc_data[SC_CURSE].timer != -1) atk2 -= atk2 * 25 / 100; - if (sc_data[SC_DRUMBATTLE].timer != -1) - atk2 += sc_data[SC_DRUMBATTLE].val2; - if (sc_data[SC_NIBELUNGEN].timer != -1 - && (battle_get_element(bl) / 10) >= 8) - atk2 += sc_data[SC_NIBELUNGEN].val2; - if (sc_data[SC_STRIPWEAPON].timer != -1) - atk2 = atk2 * 90 / 100; - if (sc_data[SC_CONCENTRATION].timer != -1) //コンセントレーション - atk2 += atk2 * (5 * sc_data[SC_CONCENTRATION].val1) / 100; } if (atk2 < 0) @@ -698,9 +553,6 @@ int battle_get_matk1(struct block_list *bl) int matk, int_ = battle_get_int(bl); matk = int_ + (int_ / 5) * (int_ / 5); - if (sc_data) - if (sc_data[SC_MINDBREAKER].timer != -1 && bl->type != BL_PC) - matk = matk * (100 + 2 * sc_data[SC_MINDBREAKER].val1) / 100; return matk; } else if (bl->type == BL_PC && (struct map_session_data *) bl) @@ -717,16 +569,12 @@ int battle_get_matk1(struct block_list *bl) static int battle_get_matk2(struct block_list *bl) { - eptr<struct status_change, StatusChange> sc_data = battle_get_sc_data(bl); nullpo_ret(bl); if (bl->type == BL_MOB) { int matk, int_ = battle_get_int(bl); matk = int_ + (int_ / 7) * (int_ / 7); - if (sc_data) - if (sc_data[SC_MINDBREAKER].timer != -1 && bl->type != BL_PC) - matk = matk * (100 + 2 * sc_data[SC_MINDBREAKER].val1) / 100; return matk; } else if (bl->type == BL_PC && (struct map_session_data *) bl) @@ -765,36 +613,14 @@ int battle_get_def(struct block_list *bl) { if (sc_data) { - //キーピング時はDEF100 - if (sc_data[SC_KEEPING].timer != -1) - def = 100; - //プロボック時は減算 - if (sc_data[SC_PROVOKE].timer != -1 && bl->type != BL_PC) - def = (def * (100 - 6 * sc_data[SC_PROVOKE].val1) + 50) / 100; - //戦太鼓の響き時は加算 - if (sc_data[SC_DRUMBATTLE].timer != -1 && bl->type != BL_PC) - def += sc_data[SC_DRUMBATTLE].val3; //毒にかかっている時は減算 if (sc_data[SC_POISON].timer != -1 && bl->type != BL_PC) def = def * 75 / 100; - //ストリップシールド時は減算 - if (sc_data[SC_STRIPSHIELD].timer != -1 && bl->type != BL_PC) - def = def * 85 / 100; - //シグナムクルシス時は減算 - if (sc_data[SC_SIGNUMCRUCIS].timer != -1 && bl->type != BL_PC) - def = def * (100 - sc_data[SC_SIGNUMCRUCIS].val2) / 100; - //永遠の混沌時はDEF0になる - if (sc_data[SC_ETERNALCHAOS].timer != -1 && bl->type != BL_PC) - def = 0; //凍結、石化時は右シフト if (sc_data[SC_FREEZE].timer != -1 || (sc_data[SC_STONE].timer != -1 && sc_data[SC_STONE].val2 == 0)) def >>= 1; - //コンセントレーション時は減算 - if (sc_data[SC_CONCENTRATION].timer != -1 && bl->type != BL_PC) - def = - (def * (100 - 5 * sc_data[SC_CONCENTRATION].val1)) / 100; } //詠唱中は詠唱時減算率に基づいて減算 if (skilltimer != -1) @@ -837,15 +663,11 @@ int battle_get_mdef(struct block_list *bl) if (mdef > 90) mdef = 90; } - if (sc_data[SC_BARRIER].timer != -1) - mdef = 100; //凍結、石化時は1.25倍 if (sc_data[SC_FREEZE].timer != -1 || (sc_data[SC_STONE].timer != -1 && sc_data[SC_STONE].val2 == 0)) mdef = mdef * 125 / 100; - if (sc_data[SC_MINDBREAKER].timer != -1 && bl->type != BL_PC) - mdef -= (mdef * 6 * sc_data[SC_MINDBREAKER].val1) / 100; } } if (mdef < 0) @@ -872,15 +694,8 @@ int battle_get_def2(struct block_list *bl) if (sc_data) { - if (sc_data[SC_ANGELUS].timer != -1 && bl->type != BL_PC) - def2 = def2 * (110 + 5 * sc_data[SC_ANGELUS].val1) / 100; - if (sc_data[SC_PROVOKE].timer != -1 && bl->type != BL_PC) - def2 = (def2 * (100 - 6 * sc_data[SC_PROVOKE].val1) + 50) / 100; if (sc_data[SC_POISON].timer != -1 && bl->type != BL_PC) def2 = def2 * 75 / 100; - //コンセントレーション時は減算 - if (sc_data[SC_CONCENTRATION].timer != -1 && bl->type != BL_PC) - def2 = def2 * (100 - 5 * sc_data[SC_CONCENTRATION].val1) / 100; } if (def2 < 1) def2 = 1; @@ -895,7 +710,6 @@ int battle_get_def2(struct block_list *bl) int battle_get_mdef2(struct block_list *bl) { int mdef2 = 0; - eptr<struct status_change, StatusChange> sc_data = battle_get_sc_data(bl); nullpo_ret(bl); if (bl->type == BL_MOB) @@ -906,11 +720,7 @@ int battle_get_mdef2(struct block_list *bl) mdef2 = ((struct map_session_data *) bl)->mdef2 + (((struct map_session_data *) bl)->paramc[ATTR::VIT] >> 1); - if (sc_data) - { - if (sc_data[SC_MINDBREAKER].timer != -1 && bl->type != BL_PC) - mdef2 -= (mdef2 * 6 * sc_data[SC_MINDBREAKER].val1) / 100; - } + if (mdef2 < 0) mdef2 = 0; return mdef2; @@ -936,37 +746,8 @@ int battle_get_speed(struct block_list *bl) if (sc_data) { - //速度増加時は25%減算 - if (sc_data[SC_INCREASEAGI].timer != -1 - && sc_data[SC_DONTFORGETME].timer == -1) - speed -= speed * 25 / 100; - //速度減少時は25%加算 - if (sc_data[SC_DECREASEAGI].timer != -1) - speed = speed * 125 / 100; - //クァグマイア時は50%加算 - if (sc_data[SC_QUAGMIRE].timer != -1) - speed = speed * 3 / 2; - //私を忘れないで…時は加算 - if (sc_data[SC_DONTFORGETME].timer != -1) - speed = - speed * (100 + sc_data[SC_DONTFORGETME].val1 * 2 + - sc_data[SC_DONTFORGETME].val2 + - (sc_data[SC_DONTFORGETME].val3 & 0xffff)) / 100; - //金剛時は25%加算 - if (sc_data[SC_STEELBODY].timer != -1) - speed = speed * 125 / 100; - //ディフェンダー時は加算 - if (sc_data[SC_DEFENDER].timer != -1) - speed = (speed * (155 - sc_data[SC_DEFENDER].val1 * 5)) / 100; - //踊り状態は4倍遅い - if (sc_data[SC_DANCING].timer != -1) - speed *= 4; - //呪い時は450加算 if (sc_data[SC_CURSE].timer != -1) speed = speed + 450; - //ウィンドウォーク時はLv*2%減算 - if (sc_data[SC_WINDWALK].timer != -1) - speed -= (speed * (sc_data[SC_WINDWALK].val1 * 2)) / 100; } if (speed < 1) speed = 1; @@ -993,57 +774,11 @@ int battle_get_adelay(struct block_list *bl) if (sc_data) { - //ツーハンドクイッケン使用時でクァグマイアでも私を忘れないで…でもない時は3割減算 - if (sc_data[SC_TWOHANDQUICKEN].timer != -1 && sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1) // 2HQ - aspd_rate -= 30; - //アドレナリンラッシュ使用時でツーハンドクイッケンでもクァグマイアでも私を忘れないで…でもない時は - if (sc_data[SC_ADRENALINE].timer != -1 - && sc_data[SC_TWOHANDQUICKEN].timer == -1 - && sc_data[SC_QUAGMIRE].timer == -1 - && sc_data[SC_DONTFORGETME].timer == -1) - { // アドレナリンラッシュ - //使用者とパーティメンバーで格差が出る設定でなければ3割減算 - if (sc_data[SC_ADRENALINE].val2 - || !battle_config.party_skill_penaly) - aspd_rate -= 30; - //そうでなければ2.5割減算 - else - aspd_rate -= 25; - } - //スピアクィッケン時は減算 - if (sc_data[SC_SPEARSQUICKEN].timer != -1 && sc_data[SC_ADRENALINE].timer == -1 && sc_data[SC_TWOHANDQUICKEN].timer == -1 && sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1) // スピアクィッケン - aspd_rate -= sc_data[SC_SPEARSQUICKEN].val2; - //夕日のアサシンクロス時は減算 - if (sc_data[SC_ASSNCROS].timer != -1 && // 夕陽のアサシンクロス - sc_data[SC_TWOHANDQUICKEN].timer == -1 - && sc_data[SC_ADRENALINE].timer == -1 - && sc_data[SC_SPEARSQUICKEN].timer == -1 - && sc_data[SC_DONTFORGETME].timer == -1) - aspd_rate -= - 5 + sc_data[SC_ASSNCROS].val1 + - sc_data[SC_ASSNCROS].val2 + sc_data[SC_ASSNCROS].val3; - //私を忘れないで…時は加算 - if (sc_data[SC_DONTFORGETME].timer != -1) // 私を忘れないで - aspd_rate += - sc_data[SC_DONTFORGETME].val1 * 3 + - sc_data[SC_DONTFORGETME].val2 + - (sc_data[SC_DONTFORGETME].val3 >> 16); - //金剛時25%加算 - if (sc_data[SC_STEELBODY].timer != -1) // 金剛 - aspd_rate += 25; - //増速ポーション使用時は減算 - if (sc_data[SC_SPEEDPOTION2].timer != -1) - aspd_rate -= sc_data[SC_SPEEDPOTION2].val1; - else if (sc_data[SC_SPEEDPOTION1].timer != -1) - aspd_rate -= sc_data[SC_SPEEDPOTION2].val1; - else if (sc_data[SC_SPEEDPOTION0].timer != -1) - aspd_rate -= sc_data[SC_SPEEDPOTION2].val1; + if (sc_data[SC_SPEEDPOTION0].timer != -1) + aspd_rate -= sc_data[SC_SPEEDPOTION0].val1; // Fate's `haste' spell works the same as the above if (sc_data[SC_HASTE].timer != -1) aspd_rate -= sc_data[SC_HASTE].val1; - //ディフェンダー時は加算 - if (sc_data[SC_DEFENDER].timer != -1) - adelay += (1100 - sc_data[SC_DEFENDER].val1 * 100); } if (aspd_rate != 100) @@ -1068,46 +803,10 @@ int battle_get_amotion(struct block_list *bl) if (sc_data) { - if (sc_data[SC_TWOHANDQUICKEN].timer != -1 && sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1) // 2HQ - aspd_rate -= 30; - if (sc_data[SC_ADRENALINE].timer != -1 - && sc_data[SC_TWOHANDQUICKEN].timer == -1 - && sc_data[SC_QUAGMIRE].timer == -1 - && sc_data[SC_DONTFORGETME].timer == -1) - { // アドレナリンラッシュ - if (sc_data[SC_ADRENALINE].val2 - || !battle_config.party_skill_penaly) - aspd_rate -= 30; - else - aspd_rate -= 25; - } - if (sc_data[SC_SPEARSQUICKEN].timer != -1 && sc_data[SC_ADRENALINE].timer == -1 && sc_data[SC_TWOHANDQUICKEN].timer == -1 && sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1) // スピアクィッケン - aspd_rate -= sc_data[SC_SPEARSQUICKEN].val2; - if (sc_data[SC_ASSNCROS].timer != -1 && // 夕陽のアサシンクロス - sc_data[SC_TWOHANDQUICKEN].timer == -1 - && sc_data[SC_ADRENALINE].timer == -1 - && sc_data[SC_SPEARSQUICKEN].timer == -1 - && sc_data[SC_DONTFORGETME].timer == -1) - aspd_rate -= - 5 + sc_data[SC_ASSNCROS].val1 + - sc_data[SC_ASSNCROS].val2 + sc_data[SC_ASSNCROS].val3; - if (sc_data[SC_DONTFORGETME].timer != -1) // 私を忘れないで - aspd_rate += - sc_data[SC_DONTFORGETME].val1 * 3 + - sc_data[SC_DONTFORGETME].val2 + - (sc_data[SC_DONTFORGETME].val3 >> 16); - if (sc_data[SC_STEELBODY].timer != -1) // 金剛 - aspd_rate += 25; - if (sc_data[SC_SPEEDPOTION2].timer != -1) - aspd_rate -= sc_data[SC_SPEEDPOTION2].val1; - else if (sc_data[SC_SPEEDPOTION1].timer != -1) - aspd_rate -= sc_data[SC_SPEEDPOTION1].val1; - else if (sc_data[SC_SPEEDPOTION0].timer != -1) + if (sc_data[SC_SPEEDPOTION0].timer != -1) aspd_rate -= sc_data[SC_SPEEDPOTION0].val1; if (sc_data[SC_HASTE].timer != -1) aspd_rate -= sc_data[SC_HASTE].val1; - if (sc_data[SC_DEFENDER].timer != -1) - amotion += (550 - sc_data[SC_DEFENDER].val1 * 50); } if (aspd_rate != 100) @@ -1140,11 +839,6 @@ int battle_get_dmotion(struct block_list *bl) else return 2000; - if ((sc_data && sc_data[SC_ENDURE].timer != -1) || - (bl->type == BL_PC - && ((struct map_session_data *) bl)->special_state.infinite_endure)) - ret = 0; - return ret; } @@ -1162,8 +856,6 @@ int battle_get_element(struct block_list *bl) if (sc_data) { - if (sc_data[SC_BENEDICTIO].timer != -1) // 聖体降福 - ret = 26; if (sc_data[SC_FREEZE].timer != -1) // 凍結 ret = 21; if (sc_data[SC_STONE].timer != -1 && sc_data[SC_STONE].val2 == 0) @@ -1173,37 +865,6 @@ int battle_get_element(struct block_list *bl) return ret; } -static -int battle_get_attack_element(struct block_list *bl) -{ - int ret = 0; - eptr<struct status_change, StatusChange> sc_data = battle_get_sc_data(bl); - - nullpo_ret(bl); - if (bl->type == BL_MOB && (struct mob_data *) bl) - ret = 0; - else if (bl->type == BL_PC && (struct map_session_data *) bl) - ret = ((struct map_session_data *) bl)->atk_ele; - - if (sc_data) - { - if (sc_data[SC_FROSTWEAPON].timer != -1) // フロストウェポン - ret = 1; - if (sc_data[SC_SEISMICWEAPON].timer != -1) // サイズミックウェポン - ret = 2; - if (sc_data[SC_FLAMELAUNCHER].timer != -1) // フレームランチャー - ret = 3; - if (sc_data[SC_LIGHTNINGLOADER].timer != -1) // ライトニングローダー - ret = 4; - if (sc_data[SC_ENCPOISON].timer != -1) // エンチャントポイズン - ret = 5; - if (sc_data[SC_ASPERSIO].timer != -1) // アスペルシオ - ret = 6; - } - - return ret; -} - int battle_get_party_id(struct block_list *bl) { nullpo_ret(bl); @@ -1369,7 +1030,6 @@ int battle_damage(struct block_list *bl, struct block_list *target, { eptr<struct status_change, StatusChange> sc_data = battle_get_sc_data(target); short *sc_count; - int i; nullpo_ret(target); //blはNULLで呼ばれることがあるので他でチェック @@ -1412,26 +1072,6 @@ int battle_damage(struct block_list *bl, struct block_list *target, struct map_session_data *tsd = (struct map_session_data *) target; - if (tsd && tsd->sc_data[SC_DEVOTION].val1) - { // ディボーションをかけられている - struct map_session_data *md = - map_id2sd(tsd->sc_data[SC_DEVOTION].val1); - if (md && skill_devotion3(&md->bl, target->id)) - { - skill_devotion(md, target->id); - } - else if (md && bl) - for (i = 0; i < 5; i++) - if (md->dev.val1[i] == target->id) - { - clif_damage(bl, &md->bl, gettick(), 0, 0, - damage, 0, 0, 0); - pc_damage(&md->bl, md, damage); - - return 0; - } - } - if (tsd && tsd->skilltimer != -1) { // 詠唱妨害 // フェンカードや妨害されないスキルかの検査 @@ -1498,11 +1138,10 @@ int battle_stopwalking(struct block_list *bl, int type) *------------------------------------------ */ static -int battle_calc_damage(struct block_list *src, struct block_list *bl, +int battle_calc_damage(struct block_list *, struct block_list *bl, int damage, int div_, - SkillID skill_num, int, BF flag) + SkillID, int, BF flag) { - struct map_session_data *sd = NULL; struct mob_data *md = NULL; eptr<struct status_change, StatusChange> sc_data; short *sc_count; @@ -1511,8 +1150,6 @@ int battle_calc_damage(struct block_list *src, struct block_list *bl, if (bl->type == BL_MOB) md = (struct mob_data *) bl; - else - sd = (struct map_session_data *) bl; sc_data = battle_get_sc_data(bl); sc_count = battle_get_sc_count(bl); @@ -1541,138 +1178,6 @@ int battle_calc_damage(struct block_list *src, struct block_list *bl, // ニューマ damage = 0; } - - if (sc_data[SC_ROKISWEIL].timer != -1 - && damage > 0 - && bool(flag & BF_MAGIC)) - { - // ニューマ - damage = 0; - } - - if (sc_data[SC_AETERNA].timer != -1 && damage > 0) - { // レックスエーテルナ - damage <<= 1; - skill_status_change_end(bl, SC_AETERNA, -1); - } - - //属性場のダメージ増加 - if (sc_data[SC_VOLCANO].timer != -1) - { // ボルケーノ - if (bool(flag & BF_SKILL) - && skill_get_pl(skill_num) == 3) - damage += damage * sc_data[SC_VOLCANO].val4 / 100; - else if (!bool(flag & BF_SKILL) - && (battle_get_attack_element(bl) == 3)) - damage += damage * sc_data[SC_VOLCANO].val4 / 100; - } - - if (sc_data[SC_VIOLENTGALE].timer != -1) - { // バイオレントゲイル - if (bool(flag & BF_SKILL) - && skill_get_pl(skill_num) == 4) - damage += damage * sc_data[SC_VIOLENTGALE].val4 / 100; - else if (!bool(flag & BF_SKILL) - && (battle_get_attack_element(bl) == 4)) - damage += damage * sc_data[SC_VIOLENTGALE].val4 / 100; - } - - if (sc_data[SC_DELUGE].timer != -1) - { // デリュージ - if (bool(flag & BF_SKILL) - && skill_get_pl(skill_num) == 1) - damage += damage * sc_data[SC_DELUGE].val4 / 100; - else if (!bool(flag & BF_SKILL) - && (battle_get_attack_element(bl) == 1)) - damage += damage * sc_data[SC_DELUGE].val4 / 100; - } - - if (sc_data[SC_ENERGYCOAT].timer != -1 && damage > 0 - && bool(flag & BF_WEAPON)) - { // エナジーコート - if (sd) - { - if (sd->status.sp > 0) - { - int per = sd->status.sp * 5 / (sd->status.max_sp + 1); - sd->status.sp -= sd->status.sp * (per * 5 + 10) / 1000; - if (sd->status.sp < 0) - sd->status.sp = 0; - damage -= damage * ((per + 1) * 6) / 100; - clif_updatestatus(sd, SP_SP); - } - if (sd->status.sp <= 0) - skill_status_change_end(bl, SC_ENERGYCOAT, -1); - } - else - damage -= damage * (sc_data[SC_ENERGYCOAT].val1 * 6) / 100; - } - - if (sc_data[SC_KYRIE].timer != -1 && damage > 0) - { - // キリエエレイソン - struct status_change *sc = &sc_data[SC_KYRIE]; - sc->val2 -= damage; - if (bool(flag & BF_WEAPON)) - { - if (sc->val2 >= 0) - damage = 0; - else - damage = -sc->val2; - } - if ((--sc->val3) <= 0 || (sc->val2 <= 0)) - skill_status_change_end(bl, SC_KYRIE, -1); - } - - if (sc_data[SC_BASILICA].timer != -1 && damage > 0) - { - // ニューマ - damage = 0; - } - if (sc_data[SC_LANDPROTECTOR].timer != -1 && damage > 0 - && bool(flag & BF_MAGIC)) - { - // ニューマ - damage = 0; - } - - if (sc_data[SC_AUTOGUARD].timer != -1 && damage > 0 - && bool(flag & BF_WEAPON)) - { - if (MRAND(100) < sc_data[SC_AUTOGUARD].val2) - { - damage = 0; - if (sd) - sd->canmove_tick = gettick() + 300; - else if (md) - md->canmove_tick = gettick() + 300; - } - } -// -- moonsoul (chance to block attacks with new Lord Knight skill parrying) -// - if (sc_data[SC_PARRYING].timer != -1 && damage > 0 - && bool(flag & BF_WEAPON)) - { - if (MRAND(100) < sc_data[SC_PARRYING].val2) - damage = 0; - } - // リジェクトソード - if (sc_data[SC_REJECTSWORD].timer != -1 && damage > 0 - && bool(flag & BF_WEAPON) - && // the logic was always broken, I've simplfied to what it - // was doing, it's not like this will be sticking around long - ((src->type == BL_PC - && ((struct map_session_data *) src)->status.weapon == 1) - || src->type == BL_MOB)) - { - if (MRAND(100) < (10 + 5 * sc_data[SC_REJECTSWORD].val1)) - { //反射確率は10+5*Lv - damage = damage * 50 / 100; - battle_damage(bl, src, damage, 0); - if ((--sc_data[SC_REJECTSWORD].val2) <= 0) - skill_status_change_end(bl, SC_REJECTSWORD, -1); - } - } } if (battle_config.skill_min_damage @@ -1780,11 +1285,6 @@ struct Damage battle_calc_mob_weapon_attack(struct block_list *src, if (atkmin > atkmax) atkmin = atkmax; - if (sc_data && 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) @@ -1819,22 +1319,6 @@ struct Damage battle_calc_mob_weapon_attack(struct block_list *src, damage += atkmin + MRAND((atkmax - atkmin + 1)); else damage += atkmin; - // スキル修正1(攻撃力倍化系) - // オーバートラスト(+5% 〜 +25%),他攻撃系スキルの場合ここで補正 - // バッシュ,マグナムブレイク, - // ボーリングバッシュ,スピアブーメラン,ブランディッシュスピア,スピアスタッブ, - // メマーナイト,カートレボリューション - // ダブルストレイフィング,アローシャワー,チャージアロー, - // ソニックブロー - if (sc_data) - { //状態異常中のダメージ追加 - if (sc_data[SC_OVERTHRUST].timer != -1) // オーバートラスト - damage += damage * (5 * sc_data[SC_OVERTHRUST].val1) / 100; - if (sc_data[SC_TRUESIGHT].timer != -1) // トゥルーサイト - damage += damage * (2 * sc_data[SC_TRUESIGHT].val1) / 100; - if (sc_data[SC_BERSERK].timer != -1) // バーサーク - damage += damage * 50 / 100; - } if (skill_num != SkillID::ZERO && skill_num != SkillID::NEGATIVE) { @@ -1952,29 +1436,10 @@ struct Damage battle_calc_mob_weapon_attack(struct block_list *src, cardfix = cardfix * (100 - tsd->near_attack_def_rate) / 100; damage = damage * cardfix / 100; } - if (t_sc_data) - { - int cardfix = 100; - if (t_sc_data[SC_DEFENDER].timer != -1 - && bool(flag & BF_LONG)) - cardfix = cardfix * (100 - t_sc_data[SC_DEFENDER].val2) / 100; - if (cardfix != 100) - damage = damage * cardfix / 100; - } - if (t_sc_data && t_sc_data[SC_ASSUMPTIO].timer != -1) - { //アシャンプティオ - if (!map[target->m].flag.pvp) - damage = damage / 3; - else - damage = damage / 2; - } if (damage < 0) damage = 0; - if (sc_data && sc_data[SC_AURABLADE].timer != -1) /* オーラブレード 必中 */ - damage += sc_data[SC_AURABLADE].val1 * 10; - // 完全回避の判定 if (skill_num == SkillID::ZERO && skill_lv >= 0 && tsd != NULL && MRAND(1000) < battle_get_flee2(target)) @@ -2182,8 +1647,7 @@ struct Damage battle_calc_pc_weapon_attack(struct block_list *src, atkmax = watk; atkmax_ = watk_; } - if ((sc_data && sc_data[SC_WEAPONPERFECTION].timer != -1) - || (sd->special_state.no_sizefix)) + if (sd->special_state.no_sizefix) { // ウェポンパーフェクション || ドレイクカード atkmax = watk; atkmax_ = watk_; @@ -2194,12 +1658,6 @@ struct Damage battle_calc_pc_weapon_attack(struct block_list *src, if (atkmin_ > atkmax_) atkmin_ = atkmax_; - if (sc_data && sc_data[SC_MAXIMIZEPOWER].timer != -1) - { // マキシマイズパワー - atkmin = atkmax; - atkmin_ = atkmax_; - } - if (sd->double_rate > 0 && skill_num == SkillID::ZERO && skill_lv >= 0) da = MRAND(100) < sd->double_rate; @@ -2310,32 +1768,6 @@ struct Damage battle_calc_pc_weapon_attack(struct block_list *src, } } - // スキル修正1(攻撃力倍化系) - // オーバートラスト(+5% 〜 +25%),他攻撃系スキルの場合ここで補正 - // バッシュ,マグナムブレイク, - // ボーリングバッシュ,スピアブーメラン,ブランディッシュスピア,スピアスタッブ, - // メマーナイト,カートレボリューション - // ダブルストレイフィング,アローシャワー,チャージアロー, - // ソニックブロー - if (sc_data) - { //状態異常中のダメージ追加 - if (sc_data[SC_OVERTHRUST].timer != -1) - { // オーバートラスト - damage += damage * (5 * sc_data[SC_OVERTHRUST].val1) / 100; - damage2 += damage2 * (5 * sc_data[SC_OVERTHRUST].val1) / 100; - } - if (sc_data[SC_TRUESIGHT].timer != -1) - { // トゥルーサイト - damage += damage * (2 * sc_data[SC_TRUESIGHT].val1) / 100; - damage2 += damage2 * (2 * sc_data[SC_TRUESIGHT].val1) / 100; - } - if (sc_data[SC_BERSERK].timer != -1) - { // バーサーク - damage += damage * 50 / 100; - damage2 += damage2 * 50 / 100; - } - } - if (skill_num != SkillID::ZERO && skill_num != SkillID::NEGATIVE) { flag = (flag & ~BF_SKILLMASK) | BF_SKILL; @@ -2517,34 +1949,6 @@ struct Damage battle_calc_pc_weapon_attack(struct block_list *src, } //カードによるダメージ減衰処理ここまで -//対象にステータス異常がある場合のダメージ減算処理ここから - if (t_sc_data) - { - cardfix = 100; - if (t_sc_data[SC_DEFENDER].timer != -1 - && bool(flag & BF_LONG)) //ディフェンダー状態で遠距離攻撃 - cardfix = cardfix * (100 - t_sc_data[SC_DEFENDER].val2) / 100; //ディフェンダーによる減衰 - if (cardfix != 100) - { - damage = damage * cardfix / 100; //ディフェンダー補正によるダメージ減少 - damage2 = damage2 * cardfix / 100; //ディフェンダー補正による左手ダメージ減少 - } - if (t_sc_data[SC_ASSUMPTIO].timer != -1) - { //アスムプティオ - if (!map[target->m].flag.pvp) - { - damage = damage / 3; - damage2 = damage2 / 3; - } - else - { - damage = damage / 2; - damage2 = damage2 / 2; - } - } - } -//対象にステータス異常がある場合のダメージ減算処理ここまで - if (damage < 0) damage = 0; if (damage2 < 0) @@ -2556,12 +1960,6 @@ struct Damage battle_calc_pc_weapon_attack(struct block_list *src, damage += sd->spiritball * 3; damage2 += sd->spiritball * 3; - if (sc_data && sc_data[SC_AURABLADE].timer != -1) - { /* オーラブレード 必中 */ - damage += sc_data[SC_AURABLADE].val1 * 10; - damage2 += sc_data[SC_AURABLADE].val1 * 10; - } - // >二刀流の左右ダメージ計算誰かやってくれぇぇぇぇえええ! // >map_session_data に左手ダメージ(atk,atk2)追加して // >pc_calcstatus()でやるべきかな? @@ -2725,16 +2123,6 @@ struct Damage battle_calc_weapon_attack(struct block_list *src, if (sd->status.weapon && sd->status.weapon != 11) { int breakrate = 1; - if (target->type == BL_PC && sd->sc_data[SC_MELTDOWN].timer != -1) - { - breakrate += 100 * sd->sc_data[SC_MELTDOWN].val1; - if (MRAND(10000) < - breakrate * battle_config.equipment_break_rate / 100 - || breakrate >= 10000) - pc_breakweapon((struct map_session_data *) target); - } - if (sd->sc_data[SC_OVERTHRUST].timer != -1) - breakrate += 20 * sd->sc_data[SC_OVERTHRUST].val1; if (wd.type == 0x0a) breakrate *= 2; if (MRAND(10000) < @@ -2751,12 +2139,6 @@ struct Damage battle_calc_weapon_attack(struct block_list *src, && (wd.damage > 0 || wd.damage2 > 0)) { int breakrate = 1; - if (src->type == BL_PC - && ((struct map_session_data *) src)-> - sc_data[SC_MELTDOWN].timer != -1) - breakrate += - 70 * - ((struct map_session_data *) src)->sc_data[SC_MELTDOWN].val1; if (wd.type == 0x0a) breakrate *= 2; if (MRAND(10000) < @@ -3114,13 +2496,6 @@ ATK battle_weapon_attack(struct block_list *src, struct block_list *target, rdamage = 1; } } - if (t_sc_data && t_sc_data[SC_REFLECTSHIELD].timer != -1) - { - rdamage += - damage * t_sc_data[SC_REFLECTSHIELD].val2 / 100; - if (rdamage < 1) - rdamage = 1; - } } else if (bool(wd.flag & BF_LONG)) { @@ -3270,8 +2645,6 @@ ATK battle_weapon_attack(struct block_list *src, struct block_list *target, if (rdamage > 0) battle_damage(target, src, rdamage, 0); - if (t_sc_data && t_sc_data[SC_SPLASHER].timer != -1) //殴ったので対象のベナムスプラッシャー状態を解除 - skill_status_change_end(target, SC_SPLASHER, -1); map_freeblock_unlock(); } |