From f7ca365c8d24645419c8d0aa05a9a8a23ce4bf1a Mon Sep 17 00:00:00 2001 From: collett Date: Fri, 10 Jan 2020 19:39:44 +0900 Subject: [PATCH] status effect: heal cast multiplier, crit dh bonus fix multipliers not applying to dots/hots clean up hard-coded values. --- src/world/Action/ActionLut.h | 10 + src/world/Action/ActionLutData.cpp | 242 +++++++++++++----------- src/world/Math/CalcStats.cpp | 74 ++++++-- src/world/Math/CalcStats.h | 4 +- src/world/StatusEffect/StatusEffect.cpp | 34 +++- 5 files changed, 233 insertions(+), 131 deletions(-) diff --git a/src/world/Action/ActionLut.h b/src/world/Action/ActionLut.h index 4e4907b1..5d4b4acd 100644 --- a/src/world/Action/ActionLut.h +++ b/src/world/Action/ActionLut.h @@ -28,6 +28,16 @@ namespace Sapphire::World::Action const uint32_t EffectTypeHot = 3; const uint32_t EffectTypeDot = 4; const uint32_t EffectTypeHealReceiveMultiplier = 5; + const uint32_t EffectTypeHealCastMultiplier = 6; + const uint32_t EffectTypeCritDHRateBonus = 7; + + const uint8_t EffectActionTypeFilterPhysical = 1; + const uint8_t EffectActionTypeFilterMagical = 2; + const uint8_t EffectActionTypeFilterAll = 255; + + const uint8_t EffectCritDHBonusFilterDamage = 1; + const uint8_t EffectCritDHBonusFilterHeal = 2; + const uint8_t EffectCritDHBonusFilterAll = 255; struct StatusEffectEntry { diff --git a/src/world/Action/ActionLutData.cpp b/src/world/Action/ActionLutData.cpp index e73e6a67..ab65fe44 100644 --- a/src/world/Action/ActionLutData.cpp +++ b/src/world/Action/ActionLutData.cpp @@ -2085,10 +2085,10 @@ ActionLut::StatusEffectTable ActionLut::m_statusEffectTable = //Fight or Flight, ファイト・オア・フライト: EffectTypeDamageMultiplier, physical, 25% { 76, { 1, 1, 25, 0, 0 } }, //Sentinel, センチネル: EffectTypeDamageReceiveMultiplier, all, -30% - { 74, { 2, 0, -30, 0, 0 } }, + { 74, { 2, 255, -30, 0, 0 } }, //more than 1 effect is found //Sentinel, センチネル: EffectTypeDamageReceiveMultiplier, all, -30% - //{ 74, { 2, 0, -30, 0, 0 } }, + //{ 74, { 2, 255, -30, 0, 0 } }, //Circle of Scorn, サークル・オブ・ドゥーム: EffectTypeDot, physical, potency 35 { 248, { 4, 1, 35, 0, 0 } }, //Goring Blade, ゴアブレード: EffectTypeDot, physical, potency 85 @@ -2096,44 +2096,44 @@ ActionLut::StatusEffectTable ActionLut::m_statusEffectTable = //Requiescat, レクイエスカット: EffectTypeDamageMultiplier, magic, 50% { 1368, { 1, 2, 50, 0, 0 } }, //Vulnerability Down, 被ダメージ低下: EffectTypeDamageReceiveMultiplier, all, -30% - { 912, { 2, 0, -30, 0, 0 } }, + { 912, { 2, 255, -30, 0, 0 } }, //more than 1 effect is found //Vulnerability Down, 被ダメージ低下: EffectTypeDamageReceiveMultiplier, all, -30% - //{ 912, { 2, 0, -30, 0, 0 } }, + //{ 912, { 2, 255, -30, 0, 0 } }, //Storm's Eye, シュトルムブレハ: EffectTypeDamageMultiplier, all, 10% - { 90, { 1, 0, 10, 0, 0 } }, + { 90, { 1, 255, 10, 0, 0 } }, //Raw Intuition, 原初の直感: EffectTypeDamageReceiveMultiplier, all, -20% - { 735, { 2, 0, -20, 0, 0 } }, + { 735, { 2, 255, -20, 0, 0 } }, //more than 1 effect is found //Raw Intuition, 原初の直感: EffectTypeDamageReceiveMultiplier, all, -20% - //{ 735, { 2, 0, -20, 0, 0 } }, + //{ 735, { 2, 255, -20, 0, 0 } }, //Nascent Glint, 原初の猛り[被]: EffectTypeDamageReceiveMultiplier, all, -10% - { 1858, { 2, 0, -10, 0, 0 } }, + { 1858, { 2, 255, -10, 0, 0 } }, //Darkside, 暗黒: EffectTypeDamageMultiplier, all, 10% - { 751, { 1, 0, 10, 0, 0 } }, + { 751, { 1, 255, 10, 0, 0 } }, //more than 1 effect is found //Darkside, 暗黒: EffectTypeDamageMultiplier, all, 10% - //{ 751, { 1, 0, 10, 0, 0 } }, + //{ 751, { 1, 255, 10, 0, 0 } }, //Darkside, 暗黒: EffectTypeDamageMultiplier, all, 10% - //{ 751, { 1, 0, 10, 0, 0 } }, + //{ 751, { 1, 255, 10, 0, 0 } }, //Darkside, 暗黒: EffectTypeDamageMultiplier, all, 10% - //{ 751, { 1, 0, 10, 0, 0 } }, + //{ 751, { 1, 255, 10, 0, 0 } }, //Shadow Wall, シャドウウォール: EffectTypeDamageReceiveMultiplier, all, -30% - { 747, { 2, 0, -30, 0, 0 } }, + { 747, { 2, 255, -30, 0, 0 } }, //more than 1 effect is found //Shadow Wall, シャドウウォール: EffectTypeDamageReceiveMultiplier, all, -30% - //{ 747, { 2, 0, -30, 0, 0 } }, + //{ 747, { 2, 255, -30, 0, 0 } }, //Dark Missionary, ダークミッショナリー: EffectTypeDamageReceiveMultiplier, all, -10% - { 1894, { 2, 0, -10, 0, 0 } }, + { 1894, { 2, 255, -10, 0, 0 } }, //No Mercy, ノー・マーシー: EffectTypeDamageMultiplier, all, 20% - { 1831, { 1, 0, 20, 0, 0 } }, + { 1831, { 1, 255, 20, 0, 0 } }, //Camouflage, カモフラージュ: EffectTypeDamageReceiveMultiplier, all, -10% - { 1832, { 2, 0, -10, 0, 0 } }, + { 1832, { 2, 255, -10, 0, 0 } }, //Nebula, ネビュラ: EffectTypeDamageReceiveMultiplier, all, -30% - { 1834, { 2, 0, -30, 0, 0 } }, + { 1834, { 2, 255, -30, 0, 0 } }, //more than 1 effect is found //Nebula, ネビュラ: EffectTypeDamageReceiveMultiplier, all, -30% - //{ 1834, { 2, 0, -30, 0, 0 } }, + //{ 1834, { 2, 255, -30, 0, 0 } }, //Aurora, オーロラ: EffectTypeHot, potency 200 { 1835, { 3, 0, 200, 0, 0 } }, //Sonic Break, ソニックブレイク: EffectTypeDot, unknown, potency 90 @@ -2141,18 +2141,18 @@ ActionLut::StatusEffectTable ActionLut::m_statusEffectTable = //Bow Shock, バウショック: EffectTypeDot, unknown, potency 90 { 1838, { 4, 0, 90, 0, 0 } }, //Heart of Light, ハート・オブ・ライト: EffectTypeDamageReceiveMultiplier, all, -10% - { 1839, { 2, 0, -10, 0, 0 } }, + { 1839, { 2, 255, -10, 0, 0 } }, //Heart of Stone, ハート・オブ・ストーン: EffectTypeDamageReceiveMultiplier, all, -7% - { 1840, { 2, 0, -7, 0, 0 } }, + { 1840, { 2, 255, -7, 0, 0 } }, //Fists of Earth, 金剛の構え: EffectTypeDamageReceiveMultiplier, all, -10% - { 104, { 2, 0, -10, 0, 0 } }, + { 104, { 2, 255, -10, 0, 0 } }, //Twin Snakes, 双掌打: EffectTypeDamageMultiplier, all, 10% - { 101, { 1, 0, 10, 0, 0 } }, + { 101, { 1, 255, 10, 0, 0 } }, //more than 1 effect is found //Twin Snakes, 双掌打: EffectTypeDamageMultiplier, all, 10% - //{ 101, { 1, 0, 10, 0, 0 } }, + //{ 101, { 1, 255, 10, 0, 0 } }, //Twin Snakes, 双掌打: EffectTypeDamageMultiplier, all, 10% - //{ 101, { 1, 0, 10, 0, 0 } }, + //{ 101, { 1, 255, 10, 0, 0 } }, //Demolish, 破砕拳: EffectTypeDot, physical, potency 65 { 246, { 4, 1, 65, 0, 0 } }, //more than 1 effect is found @@ -2164,33 +2164,35 @@ ActionLut::StatusEffectTable ActionLut::m_statusEffectTable = //Mantra, マントラ: EffectTypeHealReceiveMultiplier, 20% //{ 102, { 5, 0, 20, 0, 0 } }, //Fists of Fire, 紅蓮の構え: EffectTypeDamageMultiplier, all, 10% - { 103, { 1, 0, 10, 0, 0 } }, + { 103, { 1, 255, 10, 0, 0 } }, //Earth's Reply, 金剛の決意: EffectTypeDamageReceiveMultiplier, all, -10% - { 1180, { 2, 0, -10, 0, 0 } }, + { 1180, { 2, 255, -10, 0, 0 } }, //Riddle of Fire, 紅蓮の極意: EffectTypeDamageMultiplier, all, 25% - { 1181, { 1, 0, 25, 0, 0 } }, + { 1181, { 1, 255, 25, 0, 0 } }, //more than 1 effect is found //Riddle of Fire, 紅蓮の極意: EffectTypeDamageMultiplier, all, 30% - //{ 1181, { 1, 0, 30, 0, 0 } }, + //{ 1181, { 1, 255, 30, 0, 0 } }, //Brotherhood, 桃園結義:攻撃: EffectTypeDamageMultiplier, physical, 5% { 1185, { 1, 1, 5, 0, 0 } }, //Disembowel, ディセムボウル: EffectTypeDamageMultiplier, all, 10% - { 1914, { 1, 0, 10, 0, 0 } }, + { 1914, { 1, 255, 10, 0, 0 } }, //Lance Charge, ランスチャージ: EffectTypeDamageMultiplier, all, 15% - { 1864, { 1, 0, 15, 0, 0 } }, + { 1864, { 1, 255, 15, 0, 0 } }, //Chaos Thrust, 桜華狂咲: EffectTypeDot, physical, potency 45 { 118, { 4, 1, 45, 0, 0 } }, + //Battle Litany, バトルリタニー: EffectTypeCritDHRateBonus, damage, crit 10%, dh 0% + { 786, { 7, 1, 10, 0, 0 } }, //Left Eye, 竜の左眼: EffectTypeDamageMultiplier, all, 5% - { 1454, { 1, 0, 5, 0, 0 } }, + { 1454, { 1, 255, 5, 0, 0 } }, //Right Eye, 竜の右眼: EffectTypeDamageMultiplier, all, 10% - { 1453, { 1, 0, 10, 0, 0 } }, + { 1453, { 1, 255, 10, 0, 0 } }, //Right Eye, 竜の右眼: EffectTypeDamageMultiplier, all, 10% - { 1910, { 1, 0, 10, 0, 0 } }, + { 1910, { 1, 255, 10, 0, 0 } }, //Vulnerability Up, 被ダメージ上昇: EffectTypeDamageReceiveMultiplier, all, 5% - { 638, { 2, 0, 5, 0, 0 } }, + { 638, { 2, 255, 5, 0, 0 } }, //more than 1 effect is found //Vulnerability Up, 被ダメージ上昇: EffectTypeDamageReceiveMultiplier, all, 10% - //{ 638, { 2, 0, 10, 0, 0 } }, + //{ 638, { 2, 255, 10, 0, 0 } }, //Shadow Fang, 影牙: EffectTypeDot, physical, potency 90 { 508, { 4, 1, 90, 0, 0 } }, //more than 1 effect is found @@ -2199,18 +2201,18 @@ ActionLut::StatusEffectTable ActionLut::m_statusEffectTable = //Shadow Fang, 影牙: EffectTypeDot, physical, potency 50 //{ 508, { 4, 1, 50, 0, 0 } }, //Kassatsu, 活殺自在: EffectTypeDamageMultiplier, all, 30% - { 497, { 1, 0, 30, 0, 0 } }, + { 497, { 1, 255, 30, 0, 0 } }, //Ten Chi Jin, 天地人: EffectTypeDamageMultiplier, all, 150% - { 1186, { 1, 0, 150, 0, 0 } }, + { 1186, { 1, 255, 150, 0, 0 } }, //Jinpu, 陣風: EffectTypeDamageMultiplier, all, 13% - { 1298, { 1, 0, 13, 0, 0 } }, + { 1298, { 1, 255, 13, 0, 0 } }, //more than 1 effect is found //Jinpu, 陣風: EffectTypeDamageMultiplier, all, 13% - //{ 1298, { 1, 0, 13, 0, 0 } }, + //{ 1298, { 1, 255, 13, 0, 0 } }, //Jinpu, 陣風: EffectTypeDamageMultiplier, all, 13% - //{ 1298, { 1, 0, 13, 0, 0 } }, + //{ 1298, { 1, 255, 13, 0, 0 } }, //Kaiten, 必殺剣・回天: EffectTypeDamageMultiplier, all, 50% - { 1229, { 1, 0, 50, 0, 0 } }, + { 1229, { 1, 255, 50, 0, 0 } }, //Higanbana, 彼岸花: EffectTypeDot, physical, potency 60 { 1228, { 4, 1, 60, 0, 0 } }, //more than 1 effect is found @@ -2221,7 +2223,7 @@ ActionLut::StatusEffectTable ActionLut::m_statusEffectTable = //Higanbana, 彼岸花: EffectTypeDot, physical, potency 35 //{ 1228, { 4, 1, 35, 0, 0 } }, //Raging Strikes, 猛者の撃: EffectTypeDamageMultiplier, all, 10% - { 125, { 1, 0, 10, 0, 0 } }, + { 125, { 1, 255, 10, 0, 0 } }, //Venomous Bite, ベノムバイト: EffectTypeDot, physical, potency 30 { 124, { 4, 1, 30, 0, 0 } }, //more than 1 effect is found @@ -2246,7 +2248,7 @@ ActionLut::StatusEffectTable ActionLut::m_statusEffectTable = //Caustic Bite, コースティックバイト: EffectTypeDot, physical, potency 50 //{ 1200, { 4, 1, 50, 0, 0 } }, //Troubadour, トルバドゥール: EffectTypeDamageReceiveMultiplier, all, -10% - { 1934, { 2, 0, -10, 0, 0 } }, + { 1934, { 2, 255, -10, 0, 0 } }, //Stormbite, ストームバイト: EffectTypeDot, physical, potency 50 { 1201, { 4, 1, 50, 0, 0 } }, //more than 1 effect is found @@ -2255,15 +2257,15 @@ ActionLut::StatusEffectTable ActionLut::m_statusEffectTable = //Nature's Minne, 地神のミンネ: EffectTypeHealReceiveMultiplier, 20% { 1202, { 5, 0, 20, 0, 0 } }, //Tactician, タクティシャン: EffectTypeDamageReceiveMultiplier, all, -10% - { 1951, { 2, 0, -10, 0, 0 } }, + { 1951, { 2, 255, -10, 0, 0 } }, //Bioblaster, バイオブラスト: EffectTypeDot, physical, potency 60 { 1866, { 4, 1, 60, 0, 0 } }, //Standard Finish, スタンダードフィニッシュ: EffectTypeDamageMultiplier, all, 5% - { 1821, { 1, 0, 5, 0, 0 } }, + { 1821, { 1, 255, 5, 0, 0 } }, //Shield Samba, 守りのサンバ: EffectTypeDamageReceiveMultiplier, all, -10% - { 1826, { 2, 0, -10, 0, 0 } }, + { 1826, { 2, 255, -10, 0, 0 } }, //Technical Finish, テクニカルフィニッシュ: EffectTypeDamageMultiplier, all, 5% - { 1822, { 1, 0, 5, 0, 0 } }, + { 1822, { 1, 255, 5, 0, 0 } }, //Thunder, サンダー: EffectTypeDot, magic, potency 40 { 161, { 4, 2, 40, 0, 0 } }, //Thunder II, サンダラ: EffectTypeDot, magic, potency 30 @@ -2326,7 +2328,7 @@ ActionLut::StatusEffectTable ActionLut::m_statusEffectTable = //Miasma III, ミアズガ: EffectTypeDot, magic, potency 40 //{ 1215, { 4, 2, 40, 0, 0 } }, //Devotion, エギの加護: EffectTypeDamageMultiplier, all, 5% - { 1213, { 1, 0, 5, 0, 0 } }, + { 1213, { 1, 255, 5, 0, 0 } }, //Everlasting Flight, 不死鳥の翼: EffectTypeHot, potency 100 { 1868, { 3, 0, 100, 0, 0 } }, //more than 1 effect is found @@ -2342,7 +2344,7 @@ ActionLut::StatusEffectTable ActionLut::m_statusEffectTable = //Embolden, エンボルデン: EffectTypeDamageMultiplier, physical, 2% { 1297, { 1, 1, 2, 0, 0 } }, //Manafication, マナフィケーション: EffectTypeDamageMultiplier, all, 5% - { 1971, { 1, 0, 5, 0, 0 } }, + { 1971, { 1, 255, 5, 0, 0 } }, //Aero, エアロ: EffectTypeDot, magic, potency 30 { 143, { 4, 2, 30, 0, 0 } }, //Aero II, エアロラ: EffectTypeDot, magic, potency 60 @@ -2355,14 +2357,22 @@ ActionLut::StatusEffectTable ActionLut::m_statusEffectTable = { 1219, { 3, 0, 200, 0, 0 } }, //Dia, ディア: EffectTypeDot, magic, potency 60 { 1871, { 4, 2, 60, 0, 0 } }, + //Temperance, テンパランス: EffectTypeHealCastMultiplier, 20% + { 1872, { 6, 0, 20, 0, 0 } }, //Temperance, テンパランス:効果: EffectTypeDamageReceiveMultiplier, all, 10% - { 1873, { 2, 0, 10, 0, 0 } }, + { 1873, { 2, 255, 10, 0, 0 } }, + //Dissipation, 転化: EffectTypeHealCastMultiplier, 20% + { 791, { 6, 0, 20, 0, 0 } }, //Biolysis, 蠱毒法: EffectTypeDot, magic, potency 60 { 1895, { 4, 2, 60, 0, 0 } }, //Whispering Dawn, 光の囁き: EffectTypeHot, potency 120 { 315, { 3, 0, 120, 0, 0 } }, + //Fey Illumination, フェイイルミネーション: EffectTypeHealCastMultiplier, 10% + { 317, { 6, 0, 10, 0, 0 } }, //Angel's Whisper, 光輝の囁き: EffectTypeHot, potency 120 { 1874, { 3, 0, 120, 0, 0 } }, + //Seraphic Illumination, セラフィックイルミネーション: EffectTypeHealCastMultiplier, 10% + { 1875, { 6, 0, 10, 0, 0 } }, //Combust, コンバス: EffectTypeDot, magic, potency 40 { 838, { 4, 2, 40, 0, 0 } }, //more than 1 effect is found @@ -2386,7 +2396,7 @@ ActionLut::StatusEffectTable ActionLut::m_statusEffectTable = //Combust II, コンバラ: EffectTypeDot, magic, potency 35 //{ 843, { 4, 2, 35, 0, 0 } }, //Divination, ディヴィネーション: EffectTypeDamageMultiplier, all, 0% - { 1878, { 1, 0, 0, 0, 0 } }, + { 1878, { 1, 255, 0, 0, 0 } }, //Wheel of Fortune, 運命の輪: EffectTypeHot, potency 50 { 956, { 3, 0, 50, 0, 0 } }, //more than 1 effect is found @@ -2407,73 +2417,77 @@ ActionLut::StatusEffectTable ActionLut::m_statusEffectTable = //more than 1 effect is found //Diurnal Intersection, 星天交差[日]: EffectTypeHot, potency 80 //{ 1888, { 3, 0, 80, 0, 0 } }, + //Neutral Sect, ニュートラルセクト: EffectTypeHealCastMultiplier, 20% + { 1892, { 6, 0, 20, 0, 0 } }, //The Balance, アーゼマの均衡: EffectTypeDamageMultiplier, all, 6% - { 1882, { 1, 0, 6, 0, 0 } }, + { 1882, { 1, 255, 6, 0, 0 } }, //The Arrow, オシュオンの矢: EffectTypeDamageMultiplier, all, 6% - { 1884, { 1, 0, 6, 0, 0 } }, + { 1884, { 1, 255, 6, 0, 0 } }, //The Spear, ハルオーネの槍: EffectTypeDamageMultiplier, all, 6% - { 1885, { 1, 0, 6, 0, 0 } }, + { 1885, { 1, 255, 6, 0, 0 } }, //The Bole, 世界樹の幹: EffectTypeDamageMultiplier, all, 6% - { 1883, { 1, 0, 6, 0, 0 } }, + { 1883, { 1, 255, 6, 0, 0 } }, //The Ewer, サリャクの水瓶: EffectTypeDamageMultiplier, all, 6% - { 1886, { 1, 0, 6, 0, 0 } }, + { 1886, { 1, 255, 6, 0, 0 } }, //The Spire, ビエルゴの塔: EffectTypeDamageMultiplier, all, 6% - { 1887, { 1, 0, 6, 0, 0 } }, + { 1887, { 1, 255, 6, 0, 0 } }, //Lord of Crowns, クラウンロード: EffectTypeDamageMultiplier, all, 8% - { 1876, { 1, 0, 8, 0, 0 } }, + { 1876, { 1, 255, 8, 0, 0 } }, //Lady of Crowns, クラウンレディ: EffectTypeDamageMultiplier, all, 8% - { 1877, { 1, 0, 8, 0, 0 } }, + { 1877, { 1, 255, 8, 0, 0 } }, //Off-guard, ガードオファ: EffectTypeDamageReceiveMultiplier, all, 50% - { 1717, { 2, 0, 50, 0, 0 } }, + { 1717, { 2, 255, 50, 0, 0 } }, //Boost, 力溜め: EffectTypeDamageMultiplier, all, 50% - { 1716, { 1, 0, 50, 0, 0 } }, + { 1716, { 1, 255, 50, 0, 0 } }, //Peculiar Light, 不思議な光: EffectTypeDamageReceiveMultiplier, magic, 30% { 1721, { 2, 2, 30, 0, 0 } }, //Mighty Guard, マイティガード: EffectTypeDamageMultiplier, all, -70% - { 1719, { 1, 0, -70, 0, 0 } }, + { 1719, { 1, 255, -70, 0, 0 } }, //more than 1 effect is found //Mighty Guard, マイティガード: EffectTypeDamageReceiveMultiplier, all, -40% - //{ 1719, { 2, 0, -40, 0, 0 } }, + //{ 1719, { 2, 255, -40, 0, 0 } }, //Bleeding, ペイン: EffectTypeDot, magic, potency 25 { 1714, { 4, 2, 25, 0, 0 } }, //Waxing Nocturne, 狂戦士化: EffectTypeDamageMultiplier, all, 50% - { 1718, { 1, 0, 50, 0, 0 } }, + { 1718, { 1, 255, 50, 0, 0 } }, //Windburn, 裂傷: EffectTypeDot, magic, potency 20 { 1723, { 4, 2, 20, 0, 0 } }, //Diamondback, 超硬化: EffectTypeDamageReceiveMultiplier, all, -90% - { 1722, { 2, 0, -90, 0, 0 } }, + { 1722, { 2, 255, -90, 0, 0 } }, //Reprisal, リプライザル: EffectTypeDamageMultiplier, all, -10% - { 1193, { 1, 0, -10, 0, 0 } }, + { 1193, { 1, 255, -10, 0, 0 } }, //more than 1 effect is found //Reprisal, リプライザル: EffectTypeDamageMultiplier, all, -10% - //{ 1193, { 1, 0, -10, 0, 0 } }, + //{ 1193, { 1, 255, -10, 0, 0 } }, //Choco Beak, チョコビーク: EffectTypeDot, physical, potency 20 { 236, { 4, 1, 20, 0, 0 } }, + //Choco Surge, チョコサージ: EffectTypeHealCastMultiplier, 30% + { 238, { 6, 0, 30, 0, 0 } }, //Choco Regen, チョコリジェネ: EffectTypeHot, potency 25 { 237, { 3, 0, 25, 0, 0 } }, //Vulnerability Up, 被ダメージ上昇: EffectTypeDamageReceiveMultiplier, all, 5% - { 1208, { 2, 0, 5, 0, 0 } }, + { 1208, { 2, 255, 5, 0, 0 } }, //more than 1 effect is found //Vulnerability Up, 被ダメージ上昇: EffectTypeDamageReceiveMultiplier, all, 5% - //{ 1208, { 2, 0, 5, 0, 0 } }, + //{ 1208, { 2, 255, 5, 0, 0 } }, //Boost, 力溜め: EffectTypeDamageMultiplier, all, 30% - { 1656, { 1, 0, 30, 0, 0 } }, + { 1656, { 1, 255, 30, 0, 0 } }, //Magic Burst L, ロゴス・マジックバースト: EffectTypeDamageMultiplier, magic, 1% { 1652, { 1, 2, 1, 0, 0 } }, //Bravery L, ロゴス・ブレイブ: EffectTypeDamageMultiplier, all, 10% - { 1646, { 1, 0, 10, 0, 0 } }, + { 1646, { 1, 255, 10, 0, 0 } }, //Double Edge L, ロゴス・ダブルエッジ: EffectTypeDamageMultiplier, physical, 15% { 1653, { 1, 1, 15, 0, 0 } }, //Wisdom of the Aetherweaver, 術士の記憶: EffectTypeDamageMultiplier, magic, 60% { 1631, { 1, 2, 60, 0, 0 } }, //Wisdom of the Martialist, 闘士の記憶: EffectTypeDamageMultiplier, all, 40% - { 1632, { 1, 0, 40, 0, 0 } }, + { 1632, { 1, 255, 40, 0, 0 } }, //Wisdom of the Skirmisher, 武人の記憶: EffectTypeDamageMultiplier, all, 20% - { 1636, { 1, 0, 20, 0, 0 } }, + { 1636, { 1, 255, 20, 0, 0 } }, //Wisdom of the Watcher, 斥候の記憶: EffectTypeDamageMultiplier, all, -5% - { 1637, { 1, 0, -5, 0, 0 } }, + { 1637, { 1, 255, -5, 0, 0 } }, //Wisdom of the Templar, 聖騎士の記憶: EffectTypeDamageMultiplier, all, -5% - { 1638, { 1, 0, -5, 0, 0 } }, + { 1638, { 1, 255, -5, 0, 0 } }, //Wisdom of the Duelist, 剣豪の記憶: EffectTypeDamageMultiplier, physical, 40% { 1740, { 1, 1, 40, 0, 0 } }, //more than 1 effect is found @@ -2484,81 +2498,89 @@ ActionLut::StatusEffectTable ActionLut::m_statusEffectTable = //Wisdom of the Fiendhunter, 弓聖の記憶: EffectTypeDamageMultiplier, physical, 25% { 1741, { 1, 1, 25, 0, 0 } }, //Last Bastion, ラストバスティオン: EffectTypeDamageReceiveMultiplier, all, -50% - { 196, { 2, 0, -50, 0, 0 } }, + { 196, { 2, 255, -50, 0, 0 } }, //Land Waker, 原初の大地: EffectTypeDamageReceiveMultiplier, all, -50% - { 863, { 2, 0, -50, 0, 0 } }, + { 863, { 2, 255, -50, 0, 0 } }, //Dark Force, ダークフォース: EffectTypeDamageReceiveMultiplier, all, -50% - { 864, { 2, 0, -50, 0, 0 } }, + { 864, { 2, 255, -50, 0, 0 } }, //Damage Up, ダメージ上昇: EffectTypeDamageReceiveMultiplier, all, -15% - { 263, { 2, 0, -15, 0, 0 } }, + { 263, { 2, 255, -15, 0, 0 } }, //Infernal Fetters, 炎獄の鎖: EffectTypeDamageMultiplier, all, -10% - { 377, { 1, 0, -10, 0, 0 } }, + { 377, { 1, 255, -10, 0, 0 } }, //Infirmity, 虚弱: EffectTypeHealReceiveMultiplier, -50% { 172, { 5, 0, -50, 0, 0 } }, //Disseminate, ディスセミネイト: EffectTypeDamageReceiveMultiplier, all, 25% - { 348, { 2, 0, 25, 0, 0 } }, + { 348, { 2, 255, 25, 0, 0 } }, //Damage Up, ダメージ上昇: EffectTypeDamageMultiplier, all, 25% - { 443, { 1, 0, 25, 0, 0 } }, + { 443, { 1, 255, 25, 0, 0 } }, //more than 1 effect is found //Damage Up, ダメージ上昇: EffectTypeDamageMultiplier, all, 15% - //{ 443, { 1, 0, 15, 0, 0 } }, + //{ 443, { 1, 255, 15, 0, 0 } }, //Damage Up, ダメージ上昇: EffectTypeDamageMultiplier, all, 25% - //{ 443, { 1, 0, 25, 0, 0 } }, + //{ 443, { 1, 255, 25, 0, 0 } }, //Frost Blade, 凍てつく剣: EffectTypeDamageReceiveMultiplier, all, -10% - { 526, { 2, 0, -10, 0, 0 } }, + { 526, { 2, 255, -10, 0, 0 } }, //Bluefire, 青碧の炎: EffectTypeHealReceiveMultiplier, -80% { 591, { 5, 0, -80, 0, 0 } }, //more than 1 effect is found //Bluefire, 青碧の炎: EffectTypeDamageMultiplier, all, -90% - //{ 591, { 1, 0, -90, 0, 0 } }, + //{ 591, { 1, 255, -90, 0, 0 } }, //Minimum, ミニマム: EffectTypeDamageMultiplier, all, -50% - { 438, { 1, 0, -50, 0, 0 } }, + { 438, { 1, 255, -50, 0, 0 } }, //more than 1 effect is found //Minimum, ミニマム: EffectTypeDamageReceiveMultiplier, all, 50% - //{ 438, { 2, 0, 50, 0, 0 } }, + //{ 438, { 2, 255, 50, 0, 0 } }, //Minimum, ミニマム: EffectTypeDamageReceiveMultiplier, all, 45% - //{ 438, { 2, 0, 45, 0, 0 } }, + //{ 438, { 2, 255, 45, 0, 0 } }, //Minimum, ミニマム: EffectTypeDamageMultiplier, all, -90% - //{ 438, { 1, 0, -90, 0, 0 } }, + //{ 438, { 1, 255, -90, 0, 0 } }, //Minimum, ミニマム: EffectTypeDamageReceiveMultiplier, all, 50% - //{ 438, { 2, 0, 50, 0, 0 } }, + //{ 438, { 2, 255, 50, 0, 0 } }, //Minimum, ミニマム: EffectTypeDamageMultiplier, all, -50% - //{ 438, { 1, 0, -50, 0, 0 } }, + //{ 438, { 1, 255, -50, 0, 0 } }, //Minimum, ミニマム: EffectTypeDamageMultiplier, all, -50% - //{ 438, { 1, 0, -50, 0, 0 } }, + //{ 438, { 1, 255, -50, 0, 0 } }, //Minimum, ミニマム: EffectTypeDamageReceiveMultiplier, all, 50% - //{ 438, { 2, 0, 50, 0, 0 } }, + //{ 438, { 2, 255, 50, 0, 0 } }, //Minimum, ミニマム: EffectTypeDamageReceiveMultiplier, all, 45% - //{ 438, { 2, 0, 45, 0, 0 } }, + //{ 438, { 2, 255, 45, 0, 0 } }, //Minimum, ミニマム: EffectTypeDamageMultiplier, all, -90% - //{ 438, { 1, 0, -90, 0, 0 } }, + //{ 438, { 1, 255, -90, 0, 0 } }, //Minimum, ミニマム: EffectTypeDamageReceiveMultiplier, all, 50% - //{ 438, { 2, 0, 50, 0, 0 } }, + //{ 438, { 2, 255, 50, 0, 0 } }, //Minimum, ミニマム: EffectTypeDamageMultiplier, all, -50% - //{ 438, { 1, 0, -50, 0, 0 } }, + //{ 438, { 1, 255, -50, 0, 0 } }, //Bigbulge Biggerbrain, マッチョサイエンティスト: EffectTypeDamageReceiveMultiplier, all, -30% - { 1003, { 2, 0, -30, 0, 0 } }, + { 1003, { 2, 255, -30, 0, 0 } }, //Damage Down, ダメージ低下: EffectTypeDamageMultiplier, all, -3% - { 1016, { 1, 0, -3, 0, 0 } }, + { 1016, { 1, 255, -3, 0, 0 } }, //more than 1 effect is found //Damage Down, ダメージ低下: EffectTypeDamageMultiplier, all, -3% - //{ 1016, { 1, 0, -3, 0, 0 } }, + //{ 1016, { 1, 255, -3, 0, 0 } }, //Damage Down, ダメージ低下: EffectTypeDamageMultiplier, all, -10% - //{ 1016, { 1, 0, -10, 0, 0 } }, + //{ 1016, { 1, 255, -10, 0, 0 } }, //Damage Down, ダメージ低下: EffectTypeDamageMultiplier, all, -10% - //{ 1016, { 1, 0, -10, 0, 0 } }, + //{ 1016, { 1, 255, -10, 0, 0 } }, //Vulnerability Up, 被ダメージ上昇: EffectTypeDamageReceiveMultiplier, all, 10% - { 202, { 2, 0, 10, 0, 0 } }, + { 202, { 2, 255, 10, 0, 0 } }, //Offensive Optimization, 攻撃形態: EffectTypeDamageReceiveMultiplier, all, 50% - { 681, { 2, 0, 50, 0, 0 } }, + { 681, { 2, 255, 50, 0, 0 } }, //Defensive Optimization, 防御形態: EffectTypeDamageReceiveMultiplier, all, -50% - { 682, { 2, 0, -50, 0, 0 } }, + { 682, { 2, 255, -50, 0, 0 } }, //Blessing of Earth, 土の加護: EffectTypeDamageReceiveMultiplier, all, -40% - { 683, { 2, 0, -40, 0, 0 } }, + { 683, { 2, 255, -40, 0, 0 } }, //Magic Vulnerability Down, 被魔法ダメージ軽減: EffectTypeDamageReceiveMultiplier, magic, -25% { 812, { 2, 2, -25, 0, 0 } }, //Vulnerability Up, 被ダメージ上昇: EffectTypeDamageReceiveMultiplier, all, 10% - { 714, { 2, 0, 10, 0, 0 } }, + { 714, { 2, 255, 10, 0, 0 } }, + //Healing Potency Down, 魔法回復力ダウン: EffectTypeHealCastMultiplier, -30% + { 933, { 6, 0, -30, 0, 0 } }, //Rampart, ランパート: EffectTypeDamageReceiveMultiplier, all, -20% - { 1191, { 2, 0, -20, 0, 0 } }, + { 1191, { 2, 255, -20, 0, 0 } }, + //Berserk, バーサク: EffectTypeCritDHRateBonus, damage, crit 100%, dh 100% + { 86, { 7, 1, 100, 100, 100 } }, + //Inner Release, 原初の解放: EffectTypeCritDHRateBonus, damage, crit 100%, dh 100% + { 1177, { 7, 1, 100, 100, 100 } }, + //Devilment, 攻めのタンゴ: EffectTypeCritDHRateBonus, damage, crit 20%, dh 20% + { 1825, { 7, 1, 20, 20, 20 } }, }; diff --git a/src/world/Math/CalcStats.cpp b/src/world/Math/CalcStats.cpp index bb40534a..cb70a138 100644 --- a/src/world/Math/CalcStats.cpp +++ b/src/world/Math/CalcStats.cpp @@ -194,7 +194,7 @@ float CalcStats::blockProbability( const Chara& chara ) return std::floor( ( 30 * blockRate ) / levelVal + 10 ); } -float CalcStats::directHitProbability( const Chara& chara ) +float CalcStats::directHitProbability( const Chara& chara, uint8_t filterType ) { const auto& baseStats = chara.getStats(); auto level = chara.getLevel(); @@ -204,10 +204,23 @@ float CalcStats::directHitProbability( const Chara& chara ) auto divVal = static_cast< float >( levelTable[ level ][ Common::LevelTableEntry::DIV ] ); auto subVal = static_cast< float >( levelTable[ level ][ Common::LevelTableEntry::SUB ] ); - return std::floor( 550.f * ( dhRate - subVal ) / divVal ) / 10.f; + auto result = std::floor( 550.f * ( dhRate - subVal ) / divVal ) / 10.f; + + for( auto const& entry : chara.getStatusEffectMap() ) + { + auto status = entry.second; + auto effectEntry = status->getEffectEntry(); + if( effectEntry.effectType != Sapphire::World::Action::EffectTypeCritDHRateBonus ) + continue; + if( effectEntry.effectValue1 & filterType ) + { + result += effectEntry.effectValue3; + } + } + return result; } -float CalcStats::criticalHitProbability( const Chara& chara ) +float CalcStats::criticalHitProbability( const Chara& chara, uint8_t filterType ) { const auto& baseStats = chara.getStats(); auto level = chara.getLevel(); @@ -217,7 +230,20 @@ float CalcStats::criticalHitProbability( const Chara& chara ) auto divVal = static_cast< float >( levelTable[ level ][ Common::LevelTableEntry::DIV ] ); auto subVal = static_cast< float >( levelTable[ level ][ Common::LevelTableEntry::SUB ] ); - return std::floor( 200.f * ( chRate - subVal ) / divVal + 50.f ) / 10.f; + auto result = std::floor( 200.f * ( chRate - subVal ) / divVal + 50.f ) / 10.f; + + for( auto const& entry : chara.getStatusEffectMap() ) + { + auto status = entry.second; + auto effectEntry = status->getEffectEntry(); + if( effectEntry.effectType != Sapphire::World::Action::EffectTypeCritDHRateBonus ) + continue; + if( effectEntry.effectValue1 & filterType ) + { + result += effectEntry.effectValue2; + } + } + return result; } @@ -491,13 +517,13 @@ std::pair< float, Sapphire::Common::ActionHitSeverityType > CalcStats::calcAutoA factor = std::floor( factor * speed( chara ) ); - if( criticalHitProbability( chara ) > range100( rng ) ) + if( criticalHitProbability( chara, Sapphire::World::Action::EffectCritDHBonusFilterDamage ) > range100( rng ) ) { factor *= criticalHitBonus( chara ); hitType = Sapphire::Common::ActionHitSeverityType::CritDamage; } - if( directHitProbability( chara ) > range100( rng ) ) + if( directHitProbability( chara, Sapphire::World::Action::EffectCritDHBonusFilterDamage ) > range100( rng ) ) { factor *= 1.25f; hitType = hitType == Sapphire::Common::ActionHitSeverityType::CritDamage ? @@ -513,7 +539,7 @@ std::pair< float, Sapphire::Common::ActionHitSeverityType > CalcStats::calcAutoA auto effectEntry = status->getEffectEntry(); if( effectEntry.effectType != Sapphire::World::Action::EffectTypeDamageMultiplier ) continue; - if( effectEntry.effectValue1 == 0 || effectEntry.effectValue1 == 1 ) + if( effectEntry.effectValue1 & Sapphire::World::Action::EffectActionTypeFilterPhysical ) { factor *= 1.0f + ( effectEntry.effectValue2 / 100.0f ); } @@ -584,13 +610,13 @@ std::pair< float, Sapphire::Common::ActionHitSeverityType > CalcStats::calcActio auto factor =calcDamageBaseOnPotency( chara, ptc, wepDmg ); Sapphire::Common::ActionHitSeverityType hitType = Sapphire::Common::ActionHitSeverityType::NormalDamage; - if( criticalHitProbability( chara ) > range100( rng ) ) + if( criticalHitProbability( chara, Sapphire::World::Action::EffectCritDHBonusFilterDamage ) > range100( rng ) ) { factor *= criticalHitBonus( chara ); hitType = Sapphire::Common::ActionHitSeverityType::CritDamage; } - if( directHitProbability( chara ) > range100( rng ) ) + if( directHitProbability( chara, Sapphire::World::Action::EffectCritDHBonusFilterDamage ) > range100( rng ) ) { factor *= 1.25f; hitType = hitType == Sapphire::Common::ActionHitSeverityType::CritDamage ? @@ -606,9 +632,9 @@ std::pair< float, Sapphire::Common::ActionHitSeverityType > CalcStats::calcActio auto effectEntry = status->getEffectEntry(); if( effectEntry.effectType != Sapphire::World::Action::EffectTypeDamageMultiplier ) continue; - if( effectEntry.effectValue1 == 0 || - ( effectEntry.effectValue1 == 1 && action.isPhysical() ) || - ( effectEntry.effectValue1 == 2 && action.isMagic() ) ) + uint8_t actionType = action.isPhysical() ? Sapphire::World::Action::EffectActionTypeFilterPhysical : + ( action.isMagic() ? Sapphire::World::Action::EffectActionTypeFilterMagical : 0 ); + if( effectEntry.effectValue1 & actionType ) { factor *= 1.0f + ( effectEntry.effectValue2 / 100.0f ); } @@ -626,9 +652,12 @@ float CalcStats::applyDamageReceiveMultiplier( const Sapphire::Entity::Chara& ch auto effectEntry = status->getEffectEntry(); if( effectEntry.effectType != Sapphire::World::Action::EffectTypeDamageReceiveMultiplier ) continue; - if( effectEntry.effectValue1 == 0 || - ( effectEntry.effectValue1 == 1 && ( attackType == -1 || attackType == 1 || attackType == 2 || attackType == 3 || attackType == 4 ) ) || - ( effectEntry.effectValue1 == 2 && attackType == 5 ) ) + uint8_t actionType = 0; + if( attackType == -1 || attackType == 1 || attackType == 2 || attackType == 3 || attackType == 4 ) + actionType = Sapphire::World::Action::EffectActionTypeFilterPhysical; + else if( attackType == 5 ) + actionType = Sapphire::World::Action::EffectActionTypeFilterMagical; + if( effectEntry.effectValue1 & actionType ) { damage *= ( 1.0f + ( effectEntry.effectValue2 / 100.0f ) ); } @@ -655,7 +684,7 @@ std::pair< float, Sapphire::Common::ActionHitSeverityType > CalcStats::calcActio auto factor = calcHealBaseOnPotency( chara, ptc, wepDmg ); Sapphire::Common::ActionHitSeverityType hitType = Sapphire::Common::ActionHitSeverityType::NormalHeal; - if( criticalHitProbability( chara ) > range100( rng ) ) + if( criticalHitProbability( chara, Sapphire::World::Action::EffectCritDHBonusFilterHeal ) > range100( rng ) ) { factor *= criticalHitBonus( chara ); hitType = Sapphire::Common::ActionHitSeverityType::CritHeal; @@ -663,6 +692,19 @@ std::pair< float, Sapphire::Common::ActionHitSeverityType > CalcStats::calcActio factor *= 1.0f + ( ( range100( rng ) - 50.0f ) / 1000.0f ); + for( auto const& entry : chara.getStatusEffectMap() ) + { + auto status = entry.second; + auto effectEntry = status->getEffectEntry(); + if( effectEntry.effectType != Sapphire::World::Action::EffectTypeHealCastMultiplier ) + continue; + + if( action.getActionData()->actionCategory == 2 ) // must be a "cast" + { + factor *= 1.0f + ( effectEntry.effectValue2 / 100.0f ); + } + } + return std::pair( factor, hitType ); } diff --git a/src/world/Math/CalcStats.h b/src/world/Math/CalcStats.h index 1f861e1c..100cac8c 100644 --- a/src/world/Math/CalcStats.h +++ b/src/world/Math/CalcStats.h @@ -26,12 +26,12 @@ namespace Sapphire::Math /*! * @brief Calculates the probability of a direct hit happening */ - static float directHitProbability( const Sapphire::Entity::Chara& chara ); + static float directHitProbability( const Sapphire::Entity::Chara& chara, uint8_t filterType ); /*! * @brief Calculates the probability of a critical hit happening */ - static float criticalHitProbability( const Sapphire::Entity::Chara& chara ); + static float criticalHitProbability( const Sapphire::Entity::Chara& chara, uint8_t filterType ); /*! * @brief Calculates the contribution of potency to damage output. diff --git a/src/world/StatusEffect/StatusEffect.cpp b/src/world/StatusEffect/StatusEffect.cpp index 6cacd46f..7d740efa 100644 --- a/src/world/StatusEffect/StatusEffect.cpp +++ b/src/world/StatusEffect/StatusEffect.cpp @@ -124,17 +124,45 @@ void Sapphire::StatusEffect::StatusEffect::applyStatus() { auto wepDmg = Sapphire::Math::CalcStats::getWeaponDamage( *m_sourceActor ); auto damage = Sapphire::Math::CalcStats::calcDamageBaseOnPotency( *m_sourceActor, m_effectEntry.effectValue2, wepDmg ); + + for( auto const& entry : m_sourceActor->getStatusEffectMap() ) + { + auto status = entry.second; + auto effectEntry = status->getEffectEntry(); + if( effectEntry.effectType != Sapphire::World::Action::EffectTypeDamageMultiplier ) + continue; + if( effectEntry.effectValue1 & m_effectEntry.effectValue1 ) + { + damage *= 1.0f + ( effectEntry.effectValue2 / 100.0f ); + } + } + m_cachedHotOrDotValue = Sapphire::Math::CalcStats::applyDamageReceiveMultiplier( *m_targetActor, damage, - m_effectEntry.effectValue1 == 1 ? -1 : ( m_effectEntry.effectValue1 == 2 ? 5 : -128 ) ); + m_effectEntry.effectValue1 == Sapphire::World::Action::EffectActionTypeFilterPhysical ? -1 : + ( m_effectEntry.effectValue1 == Sapphire::World::Action::EffectActionTypeFilterMagical ? 5 : -128 ) ); + m_cachedSourceCrit = Sapphire::Math::CalcStats::criticalHitProbability( *m_sourceActor, Sapphire::World::Action::EffectCritDHBonusFilterDamage ); + m_cachedSourceCritBonus = Sapphire::Math::CalcStats::criticalHitBonus( *m_sourceActor ); } else if( m_effectEntry.effectType == Sapphire::World::Action::EffectTypeHot ) { auto wepDmg = Sapphire::Math::CalcStats::getWeaponDamage( *m_sourceActor ); auto heal = Sapphire::Math::CalcStats::calcHealBaseOnPotency( *m_sourceActor, m_effectEntry.effectValue2, wepDmg ); + + if( m_effectEntry.effectValue1 == 0 ) // this value is always 0 atm, if statement here just in case there is a hot that isn't a "cast" + { + for( auto const& entry : m_sourceActor->getStatusEffectMap() ) + { + auto status = entry.second; + auto effectEntry = status->getEffectEntry(); + if( effectEntry.effectType != Sapphire::World::Action::EffectTypeHealCastMultiplier ) + continue; + heal *= 1.0f + ( effectEntry.effectValue2 / 100.0f ); + } + } m_cachedHotOrDotValue = Sapphire::Math::CalcStats::applyHealingReceiveMultiplier( *m_targetActor, heal, m_effectEntry.effectValue1 ); + m_cachedSourceCrit = Sapphire::Math::CalcStats::criticalHitProbability( *m_sourceActor, Sapphire::World::Action::EffectCritDHBonusFilterHeal ); + m_cachedSourceCritBonus = Sapphire::Math::CalcStats::criticalHitBonus( *m_sourceActor ); } - m_cachedSourceCrit = Sapphire::Math::CalcStats::criticalHitProbability( *m_sourceActor ); - m_cachedSourceCritBonus = Sapphire::Math::CalcStats::criticalHitBonus( *m_sourceActor ); pScriptMgr->onStatusReceive( m_targetActor, m_id ); }