1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-05-28 12:17:46 +00:00

status effect: heal cast multiplier, crit dh bonus

fix multipliers not applying to dots/hots
clean up hard-coded values.
This commit is contained in:
collett 2020-01-10 19:39:44 +09:00
parent b744941620
commit f7ca365c8d
5 changed files with 233 additions and 131 deletions

View file

@ -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
{

View file

@ -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 } },
};

View file

@ -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 );
}

View file

@ -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.

View file

@ -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 );
}