From a5884fd604470c281da2d4f5a99cfe88fcf6b149 Mon Sep 17 00:00:00 2001 From: collett Date: Thu, 9 Jan 2020 21:04:43 +0900 Subject: [PATCH] status effect: damage receive multiplier --- src/world/Action/Action.cpp | 3 +- src/world/Action/ActionLut.h | 3 + src/world/Action/ActionLutData.cpp | 260 ++++++++++++++++++++--------- src/world/Action/EffectBuilder.cpp | 4 +- src/world/Action/EffectBuilder.h | 2 +- src/world/Action/EffectResult.cpp | 6 +- src/world/Action/EffectResult.h | 3 +- src/world/Actor/BNpc.cpp | 2 +- src/world/Actor/Chara.cpp | 3 +- src/world/Actor/Player.cpp | 1 + src/world/Math/CalcStats.cpp | 19 +++ src/world/Math/CalcStats.h | 2 + 12 files changed, 221 insertions(+), 87 deletions(-) diff --git a/src/world/Action/Action.cpp b/src/world/Action/Action.cpp index 8d96d36e..04171d77 100644 --- a/src/world/Action/Action.cpp +++ b/src/world/Action/Action.cpp @@ -495,7 +495,8 @@ void Action::Action::buildEffects() if( m_lutEntry.damagePotency > 0 ) { auto dmg = calcDamage( isCorrectCombo() ? m_lutEntry.damageComboPotency : m_lutEntry.damagePotency ); - m_effectBuilder->damage( actor, actor, dmg.first, dmg.second ); + dmg.first = Math::CalcStats::applyDamageReceiveMultiplier( *actor, dmg.first, m_actionData->attackType ); + m_effectBuilder->damage( actor, actor, dmg.first, m_actionData->attackType, dmg.second ); if( dmg.first > 0 ) actor->onActionHostile( m_pSource ); diff --git a/src/world/Action/ActionLut.h b/src/world/Action/ActionLut.h index e39350ec..37bcab6e 100644 --- a/src/world/Action/ActionLut.h +++ b/src/world/Action/ActionLut.h @@ -24,6 +24,9 @@ namespace Sapphire::World::Action const uint32_t EffectTypeInvalid = 0; const uint32_t EffectTypeDamageMultiplier = 1; + const uint32_t EffectTypeDamageReceiveMultiplier = 2; + const uint32_t EffectTypeHot = 3; + const uint32_t EffectTypeDot = 4; struct StatusEffectEntry { diff --git a/src/world/Action/ActionLutData.cpp b/src/world/Action/ActionLutData.cpp index edfbb466..61ecd74f 100644 --- a/src/world/Action/ActionLutData.cpp +++ b/src/world/Action/ActionLutData.cpp @@ -2081,165 +2081,271 @@ ActionLut::Lut ActionLut::m_actionLut = ActionLut::StatusEffectTable ActionLut::m_statusEffectTable = { - //Fight or Flight, ファイト・オア・フライト: damageMultiplier, physical, 25% + //Fight or Flight, ファイト・オア・フライト: EffectTypeDamageMultiplier, physical, 25% { 76, { 1, 1, 25, 0, 0 } }, - //Requiescat, レクイエスカット: damageMultiplier, magic, 50% + //Sentinel, センチネル: EffectTypeDamageReceiveMultiplier, all, -30% + { 74, { 2, 0, -30, 0, 0 } }, + //more than 1 effect is found + //Sentinel, センチネル: EffectTypeDamageReceiveMultiplier, all, -30% + //{ 74, { 2, 0, -30, 0, 0 } }, + //Requiescat, レクイエスカット: EffectTypeDamageMultiplier, magic, 50% { 1368, { 1, 2, 50, 0, 0 } }, - //Storm's Eye, シュトルムブレハ: damageMultiplier, all, 10% + //Vulnerability Down, 被ダメージ低下: EffectTypeDamageReceiveMultiplier, all, -30% + { 912, { 2, 0, -30, 0, 0 } }, + //more than 1 effect is found + //Vulnerability Down, 被ダメージ低下: EffectTypeDamageReceiveMultiplier, all, -30% + //{ 912, { 2, 0, -30, 0, 0 } }, + //Storm's Eye, シュトルムブレハ: EffectTypeDamageMultiplier, all, 10% { 90, { 1, 0, 10, 0, 0 } }, - //Darkside, 暗黒: damageMultiplier, all, 10% + //Raw Intuition, 原初の直感: EffectTypeDamageReceiveMultiplier, all, -20% + { 735, { 2, 0, -20, 0, 0 } }, + //more than 1 effect is found + //Raw Intuition, 原初の直感: EffectTypeDamageReceiveMultiplier, all, -20% + //{ 735, { 2, 0, -20, 0, 0 } }, + //Nascent Glint, 原初の猛り[被]: EffectTypeDamageReceiveMultiplier, all, -10% + { 1858, { 2, 0, -10, 0, 0 } }, + //Darkside, 暗黒: EffectTypeDamageMultiplier, all, 10% { 751, { 1, 0, 10, 0, 0 } }, //more than 1 effect is found - //Darkside, 暗黒: damageMultiplier, all, 10% + //Darkside, 暗黒: EffectTypeDamageMultiplier, all, 10% //{ 751, { 1, 0, 10, 0, 0 } }, - //Darkside, 暗黒: damageMultiplier, all, 10% + //Darkside, 暗黒: EffectTypeDamageMultiplier, all, 10% //{ 751, { 1, 0, 10, 0, 0 } }, - //Darkside, 暗黒: damageMultiplier, all, 10% + //Darkside, 暗黒: EffectTypeDamageMultiplier, all, 10% //{ 751, { 1, 0, 10, 0, 0 } }, - //No Mercy, ノー・マーシー: damageMultiplier, all, 20% + //Shadow Wall, シャドウウォール: EffectTypeDamageReceiveMultiplier, all, -30% + { 747, { 2, 0, -30, 0, 0 } }, + //more than 1 effect is found + //Shadow Wall, シャドウウォール: EffectTypeDamageReceiveMultiplier, all, -30% + //{ 747, { 2, 0, -30, 0, 0 } }, + //Dark Missionary, ダークミッショナリー: EffectTypeDamageReceiveMultiplier, all, -10% + { 1894, { 2, 0, -10, 0, 0 } }, + //No Mercy, ノー・マーシー: EffectTypeDamageMultiplier, all, 20% { 1831, { 1, 0, 20, 0, 0 } }, - //Twin Snakes, 双掌打: damageMultiplier, all, 10% + //Camouflage, カモフラージュ: EffectTypeDamageReceiveMultiplier, all, -10% + { 1832, { 2, 0, -10, 0, 0 } }, + //Nebula, ネビュラ: EffectTypeDamageReceiveMultiplier, all, -30% + { 1834, { 2, 0, -30, 0, 0 } }, + //more than 1 effect is found + //Nebula, ネビュラ: EffectTypeDamageReceiveMultiplier, all, -30% + //{ 1834, { 2, 0, -30, 0, 0 } }, + //Heart of Light, ハート・オブ・ライト: EffectTypeDamageReceiveMultiplier, all, -10% + { 1839, { 2, 0, -10, 0, 0 } }, + //Heart of Stone, ハート・オブ・ストーン: EffectTypeDamageReceiveMultiplier, all, -7% + { 1840, { 2, 0, -7, 0, 0 } }, + //Fists of Earth, 金剛の構え: EffectTypeDamageReceiveMultiplier, all, -10% + { 104, { 2, 0, -10, 0, 0 } }, + //Twin Snakes, 双掌打: EffectTypeDamageMultiplier, all, 10% { 101, { 1, 0, 10, 0, 0 } }, //more than 1 effect is found - //Twin Snakes, 双掌打: damageMultiplier, all, 10% + //Twin Snakes, 双掌打: EffectTypeDamageMultiplier, all, 10% //{ 101, { 1, 0, 10, 0, 0 } }, - //Twin Snakes, 双掌打: damageMultiplier, all, 10% + //Twin Snakes, 双掌打: EffectTypeDamageMultiplier, all, 10% //{ 101, { 1, 0, 10, 0, 0 } }, - //Fists of Fire, 紅蓮の構え: damageMultiplier, all, 10% + //Fists of Fire, 紅蓮の構え: EffectTypeDamageMultiplier, all, 10% { 103, { 1, 0, 10, 0, 0 } }, - //Riddle of Fire, 紅蓮の極意: damageMultiplier, all, 30% + //Earth's Reply, 金剛の決意: EffectTypeDamageReceiveMultiplier, all, -10% + { 1180, { 2, 0, -10, 0, 0 } }, + //Riddle of Fire, 紅蓮の極意: EffectTypeDamageMultiplier, all, 30% { 1181, { 1, 0, 30, 0, 0 } }, //more than 1 effect is found - //Riddle of Fire, 紅蓮の極意: damageMultiplier, all, 25% + //Riddle of Fire, 紅蓮の極意: EffectTypeDamageMultiplier, all, 25% //{ 1181, { 1, 0, 25, 0, 0 } }, - //Brotherhood, 桃園結義:攻撃: damageMultiplier, physical, 5% + //Brotherhood, 桃園結義:攻撃: EffectTypeDamageMultiplier, physical, 5% { 1185, { 1, 1, 5, 0, 0 } }, - //Disembowel, ディセムボウル: damageMultiplier, all, 10% + //Disembowel, ディセムボウル: EffectTypeDamageMultiplier, all, 10% { 1914, { 1, 0, 10, 0, 0 } }, - //Lance Charge, ランスチャージ: damageMultiplier, all, 15% + //Lance Charge, ランスチャージ: EffectTypeDamageMultiplier, all, 15% { 1864, { 1, 0, 15, 0, 0 } }, - //Left Eye, 竜の左眼: damageMultiplier, all, 5% + //Left Eye, 竜の左眼: EffectTypeDamageMultiplier, all, 5% { 1454, { 1, 0, 5, 0, 0 } }, - //Right Eye, 竜の右眼: damageMultiplier, all, 10% + //Right Eye, 竜の右眼: EffectTypeDamageMultiplier, all, 10% { 1453, { 1, 0, 10, 0, 0 } }, - //Right Eye, 竜の右眼: damageMultiplier, all, 10% + //Right Eye, 竜の右眼: EffectTypeDamageMultiplier, all, 10% { 1910, { 1, 0, 10, 0, 0 } }, - //Kassatsu, 活殺自在: damageMultiplier, all, 30% + //Vulnerability Up, 被ダメージ上昇: EffectTypeDamageReceiveMultiplier, all, 10% + { 638, { 2, 0, 10, 0, 0 } }, + //more than 1 effect is found + //Vulnerability Up, 被ダメージ上昇: EffectTypeDamageReceiveMultiplier, all, 5% + //{ 638, { 2, 0, 5, 0, 0 } }, + //Kassatsu, 活殺自在: EffectTypeDamageMultiplier, all, 30% { 497, { 1, 0, 30, 0, 0 } }, - //Ten Chi Jin, 天地人: damageMultiplier, all, 150% + //Ten Chi Jin, 天地人: EffectTypeDamageMultiplier, all, 150% { 1186, { 1, 0, 150, 0, 0 } }, - //Jinpu, 陣風: damageMultiplier, all, 13% + //Jinpu, 陣風: EffectTypeDamageMultiplier, all, 13% { 1298, { 1, 0, 13, 0, 0 } }, //more than 1 effect is found - //Jinpu, 陣風: damageMultiplier, all, 13% + //Jinpu, 陣風: EffectTypeDamageMultiplier, all, 13% //{ 1298, { 1, 0, 13, 0, 0 } }, - //Jinpu, 陣風: damageMultiplier, all, 13% + //Jinpu, 陣風: EffectTypeDamageMultiplier, all, 13% //{ 1298, { 1, 0, 13, 0, 0 } }, - //Kaiten, 必殺剣・回天: damageMultiplier, all, 50% + //Kaiten, 必殺剣・回天: EffectTypeDamageMultiplier, all, 50% { 1229, { 1, 0, 50, 0, 0 } }, - //Raging Strikes, 猛者の撃: damageMultiplier, all, 10% + //Raging Strikes, 猛者の撃: EffectTypeDamageMultiplier, all, 10% { 125, { 1, 0, 10, 0, 0 } }, - //Standard Finish, スタンダードフィニッシュ: damageMultiplier, all, 5% + //Troubadour, トルバドゥール: EffectTypeDamageReceiveMultiplier, all, -10% + { 1934, { 2, 0, -10, 0, 0 } }, + //Tactician, タクティシャン: EffectTypeDamageReceiveMultiplier, all, -10% + { 1951, { 2, 0, -10, 0, 0 } }, + //Standard Finish, スタンダードフィニッシュ: EffectTypeDamageMultiplier, all, 5% { 1821, { 1, 0, 5, 0, 0 } }, - //Technical Finish, テクニカルフィニッシュ: damageMultiplier, all, 5% + //Shield Samba, 守りのサンバ: EffectTypeDamageReceiveMultiplier, all, -10% + { 1826, { 2, 0, -10, 0, 0 } }, + //Technical Finish, テクニカルフィニッシュ: EffectTypeDamageMultiplier, all, 5% { 1822, { 1, 0, 5, 0, 0 } }, - //Enochian, エノキアン: damageMultiplier, magic, 15% + //Enochian, エノキアン: EffectTypeDamageMultiplier, magic, 15% { 868, { 1, 2, 15, 0, 0 } }, - //Devotion, エギの加護: damageMultiplier, all, 5% + //Devotion, エギの加護: EffectTypeDamageMultiplier, all, 5% { 1213, { 1, 0, 5, 0, 0 } }, - //Embolden, エンボルデン: damageMultiplier, magic, 2% + //Embolden, エンボルデン: EffectTypeDamageMultiplier, magic, 2% { 1239, { 1, 2, 2, 0, 0 } }, - //Embolden, エンボルデン: damageMultiplier, physical, 2% + //Embolden, エンボルデン: EffectTypeDamageMultiplier, physical, 2% { 1297, { 1, 1, 2, 0, 0 } }, - //Manafication, マナフィケーション: damageMultiplier, all, 5% + //Manafication, マナフィケーション: EffectTypeDamageMultiplier, all, 5% { 1971, { 1, 0, 5, 0, 0 } }, - //Divination, ディヴィネーション: damageMultiplier, all, 0% + //Temperance, テンパランス:効果: EffectTypeDamageReceiveMultiplier, all, 10% + { 1873, { 2, 0, 10, 0, 0 } }, + //Divination, ディヴィネーション: EffectTypeDamageMultiplier, all, 0% { 1878, { 1, 0, 0, 0, 0 } }, - //The Balance, アーゼマの均衡: damageMultiplier, all, 6% + //The Balance, アーゼマの均衡: EffectTypeDamageMultiplier, all, 6% { 1882, { 1, 0, 6, 0, 0 } }, - //The Arrow, オシュオンの矢: damageMultiplier, all, 6% + //The Arrow, オシュオンの矢: EffectTypeDamageMultiplier, all, 6% { 1884, { 1, 0, 6, 0, 0 } }, - //The Spear, ハルオーネの槍: damageMultiplier, all, 6% + //The Spear, ハルオーネの槍: EffectTypeDamageMultiplier, all, 6% { 1885, { 1, 0, 6, 0, 0 } }, - //The Bole, 世界樹の幹: damageMultiplier, all, 6% + //The Bole, 世界樹の幹: EffectTypeDamageMultiplier, all, 6% { 1883, { 1, 0, 6, 0, 0 } }, - //The Ewer, サリャクの水瓶: damageMultiplier, all, 6% + //The Ewer, サリャクの水瓶: EffectTypeDamageMultiplier, all, 6% { 1886, { 1, 0, 6, 0, 0 } }, - //The Spire, ビエルゴの塔: damageMultiplier, all, 6% + //The Spire, ビエルゴの塔: EffectTypeDamageMultiplier, all, 6% { 1887, { 1, 0, 6, 0, 0 } }, - //Lord of Crowns, クラウンロード: damageMultiplier, all, 8% + //Lord of Crowns, クラウンロード: EffectTypeDamageMultiplier, all, 8% { 1876, { 1, 0, 8, 0, 0 } }, - //Lady of Crowns, クラウンレディ: damageMultiplier, all, 8% + //Lady of Crowns, クラウンレディ: EffectTypeDamageMultiplier, all, 8% { 1877, { 1, 0, 8, 0, 0 } }, - //Boost, 力溜め: damageMultiplier, all, 50% + //Off-guard, ガードオファ: EffectTypeDamageReceiveMultiplier, all, 50% + { 1717, { 2, 0, 50, 0, 0 } }, + //Boost, 力溜め: EffectTypeDamageMultiplier, all, 50% { 1716, { 1, 0, 50, 0, 0 } }, - //Mighty Guard, マイティガード: damageMultiplier, all, -70% - { 1719, { 1, 0, -70, 0, 0 } }, - //Waxing Nocturne, 狂戦士化: damageMultiplier, all, 50% + //Peculiar Light, 不思議な光: EffectTypeDamageReceiveMultiplier, magic, 30% + { 1721, { 2, 2, 30, 0, 0 } }, + //Mighty Guard, マイティガード: EffectTypeDamageReceiveMultiplier, all, -40% + { 1719, { 2, 0, -40, 0, 0 } }, + //more than 1 effect is found + //Mighty Guard, マイティガード: EffectTypeDamageMultiplier, all, -70% + //{ 1719, { 1, 0, -70, 0, 0 } }, + //Waxing Nocturne, 狂戦士化: EffectTypeDamageMultiplier, all, 50% { 1718, { 1, 0, 50, 0, 0 } }, - //Reprisal, リプライザル: damageMultiplier, all, -10% + //Diamondback, 超硬化: EffectTypeDamageReceiveMultiplier, all, -90% + { 1722, { 2, 0, -90, 0, 0 } }, + //Reprisal, リプライザル: EffectTypeDamageMultiplier, all, -10% { 1193, { 1, 0, -10, 0, 0 } }, //more than 1 effect is found - //Reprisal, リプライザル: damageMultiplier, all, -10% + //Reprisal, リプライザル: EffectTypeDamageMultiplier, all, -10% //{ 1193, { 1, 0, -10, 0, 0 } }, - //Boost, 力溜め: damageMultiplier, all, 30% + //Vulnerability Up, 被ダメージ上昇: EffectTypeDamageReceiveMultiplier, all, 5% + { 1208, { 2, 0, 5, 0, 0 } }, + //more than 1 effect is found + //Vulnerability Up, 被ダメージ上昇: EffectTypeDamageReceiveMultiplier, all, 5% + //{ 1208, { 2, 0, 5, 0, 0 } }, + //Boost, 力溜め: EffectTypeDamageMultiplier, all, 30% { 1656, { 1, 0, 30, 0, 0 } }, - //Magic Burst L, ロゴス・マジックバースト: damageMultiplier, magic, 1% + //Magic Burst L, ロゴス・マジックバースト: EffectTypeDamageMultiplier, magic, 1% { 1652, { 1, 2, 1, 0, 0 } }, - //Bravery L, ロゴス・ブレイブ: damageMultiplier, all, 10% + //Bravery L, ロゴス・ブレイブ: EffectTypeDamageMultiplier, all, 10% { 1646, { 1, 0, 10, 0, 0 } }, - //Double Edge L, ロゴス・ダブルエッジ: damageMultiplier, physical, 15% + //Double Edge L, ロゴス・ダブルエッジ: EffectTypeDamageMultiplier, physical, 15% { 1653, { 1, 1, 15, 0, 0 } }, - //Wisdom of the Aetherweaver, 術士の記憶: damageMultiplier, magic, 60% + //Wisdom of the Aetherweaver, 術士の記憶: EffectTypeDamageMultiplier, magic, 60% { 1631, { 1, 2, 60, 0, 0 } }, - //Wisdom of the Martialist, 闘士の記憶: damageMultiplier, all, 40% + //Wisdom of the Martialist, 闘士の記憶: EffectTypeDamageMultiplier, all, 40% { 1632, { 1, 0, 40, 0, 0 } }, - //Wisdom of the Skirmisher, 武人の記憶: damageMultiplier, all, 20% + //Wisdom of the Skirmisher, 武人の記憶: EffectTypeDamageMultiplier, all, 20% { 1636, { 1, 0, 20, 0, 0 } }, - //Wisdom of the Watcher, 斥候の記憶: damageMultiplier, all, -5% + //Wisdom of the Watcher, 斥候の記憶: EffectTypeDamageMultiplier, all, -5% { 1637, { 1, 0, -5, 0, 0 } }, - //Wisdom of the Templar, 聖騎士の記憶: damageMultiplier, all, -5% + //Wisdom of the Templar, 聖騎士の記憶: EffectTypeDamageMultiplier, all, -5% { 1638, { 1, 0, -5, 0, 0 } }, - //Wisdom of the Duelist, 剣豪の記憶: damageMultiplier, magic, 30% + //Wisdom of the Duelist, 剣豪の記憶: EffectTypeDamageMultiplier, magic, 30% { 1740, { 1, 2, 30, 0, 0 } }, //more than 1 effect is found - //Wisdom of the Duelist, 剣豪の記憶: damageMultiplier, physical, 40% + //Wisdom of the Duelist, 剣豪の記憶: EffectTypeDamageMultiplier, physical, 40% //{ 1740, { 1, 1, 40, 0, 0 } }, - //Wisdom of the Elder, 賢者の記憶: damageMultiplier, magic, 35% + //Wisdom of the Elder, 賢者の記憶: EffectTypeDamageMultiplier, magic, 35% { 1739, { 1, 2, 35, 0, 0 } }, - //Wisdom of the Fiendhunter, 弓聖の記憶: damageMultiplier, physical, 25% + //Wisdom of the Fiendhunter, 弓聖の記憶: EffectTypeDamageMultiplier, physical, 25% { 1741, { 1, 1, 25, 0, 0 } }, - //Infernal Fetters, 炎獄の鎖: damageMultiplier, all, -10% + //Last Bastion, ラストバスティオン: EffectTypeDamageReceiveMultiplier, all, -50% + { 196, { 2, 0, -50, 0, 0 } }, + //Land Waker, 原初の大地: EffectTypeDamageReceiveMultiplier, all, -50% + { 863, { 2, 0, -50, 0, 0 } }, + //Dark Force, ダークフォース: EffectTypeDamageReceiveMultiplier, all, -50% + { 864, { 2, 0, -50, 0, 0 } }, + //Damage Up, ダメージ上昇: EffectTypeDamageReceiveMultiplier, all, -15% + { 263, { 2, 0, -15, 0, 0 } }, + //Infernal Fetters, 炎獄の鎖: EffectTypeDamageMultiplier, all, -10% { 377, { 1, 0, -10, 0, 0 } }, - //Damage Up, ダメージ上昇: damageMultiplier, all, 25% + //Disseminate, ディスセミネイト: EffectTypeDamageReceiveMultiplier, all, 25% + { 348, { 2, 0, 25, 0, 0 } }, + //Damage Up, ダメージ上昇: EffectTypeDamageMultiplier, all, 25% { 443, { 1, 0, 25, 0, 0 } }, //more than 1 effect is found - //Damage Up, ダメージ上昇: damageMultiplier, all, 15% + //Damage Up, ダメージ上昇: EffectTypeDamageMultiplier, all, 15% //{ 443, { 1, 0, 15, 0, 0 } }, - //Damage Up, ダメージ上昇: damageMultiplier, all, 25% + //Damage Up, ダメージ上昇: EffectTypeDamageMultiplier, all, 25% //{ 443, { 1, 0, 25, 0, 0 } }, - //Bluefire, 青碧の炎: damageMultiplier, all, -90% + //Frost Blade, 凍てつく剣: EffectTypeDamageReceiveMultiplier, all, -10% + { 526, { 2, 0, -10, 0, 0 } }, + //Bluefire, 青碧の炎: EffectTypeDamageMultiplier, all, -90% { 591, { 1, 0, -90, 0, 0 } }, - //Minimum, ミニマム: damageMultiplier, all, -50% + //Minimum, ミニマム: EffectTypeDamageMultiplier, all, -50% { 438, { 1, 0, -50, 0, 0 } }, //more than 1 effect is found - //Minimum, ミニマム: damageMultiplier, all, -90% + //Minimum, ミニマム: EffectTypeDamageReceiveMultiplier, all, 50% + //{ 438, { 2, 0, 50, 0, 0 } }, + //Minimum, ミニマム: EffectTypeDamageMultiplier, all, -90% //{ 438, { 1, 0, -90, 0, 0 } }, - //Minimum, ミニマム: damageMultiplier, all, -50% + //Minimum, ミニマム: EffectTypeDamageReceiveMultiplier, all, 45% + //{ 438, { 2, 0, 45, 0, 0 } }, + //Minimum, ミニマム: EffectTypeDamageReceiveMultiplier, all, 50% + //{ 438, { 2, 0, 50, 0, 0 } }, + //Minimum, ミニマム: EffectTypeDamageMultiplier, all, -50% //{ 438, { 1, 0, -50, 0, 0 } }, - //Minimum, ミニマム: damageMultiplier, all, -50% + //Minimum, ミニマム: EffectTypeDamageMultiplier, all, -50% //{ 438, { 1, 0, -50, 0, 0 } }, - //Minimum, ミニマム: damageMultiplier, all, -90% + //Minimum, ミニマム: EffectTypeDamageReceiveMultiplier, all, 50% + //{ 438, { 2, 0, 50, 0, 0 } }, + //Minimum, ミニマム: EffectTypeDamageMultiplier, all, -90% //{ 438, { 1, 0, -90, 0, 0 } }, - //Minimum, ミニマム: damageMultiplier, all, -50% + //Minimum, ミニマム: EffectTypeDamageReceiveMultiplier, all, 45% + //{ 438, { 2, 0, 45, 0, 0 } }, + //Minimum, ミニマム: EffectTypeDamageReceiveMultiplier, all, 50% + //{ 438, { 2, 0, 50, 0, 0 } }, + //Minimum, ミニマム: EffectTypeDamageMultiplier, all, -50% //{ 438, { 1, 0, -50, 0, 0 } }, - //Damage Down, ダメージ低下: damageMultiplier, all, -10% + //Bigbulge Biggerbrain, マッチョサイエンティスト: EffectTypeDamageReceiveMultiplier, all, -30% + { 1003, { 2, 0, -30, 0, 0 } }, + //Damage Down, ダメージ低下: EffectTypeDamageMultiplier, all, -10% { 1016, { 1, 0, -10, 0, 0 } }, //more than 1 effect is found - //Damage Down, ダメージ低下: damageMultiplier, all, -10% + //Damage Down, ダメージ低下: EffectTypeDamageMultiplier, all, -10% //{ 1016, { 1, 0, -10, 0, 0 } }, - //Damage Down, ダメージ低下: damageMultiplier, all, -3% + //Damage Down, ダメージ低下: EffectTypeDamageMultiplier, all, -3% //{ 1016, { 1, 0, -3, 0, 0 } }, - //Damage Down, ダメージ低下: damageMultiplier, all, -3% + //Damage Down, ダメージ低下: EffectTypeDamageMultiplier, all, -3% //{ 1016, { 1, 0, -3, 0, 0 } }, + //Vulnerability Up, 被ダメージ上昇: EffectTypeDamageReceiveMultiplier, all, 10% + { 202, { 2, 0, 10, 0, 0 } }, + //Offensive Optimization, 攻撃形態: EffectTypeDamageReceiveMultiplier, all, 50% + { 681, { 2, 0, 50, 0, 0 } }, + //Defensive Optimization, 防御形態: EffectTypeDamageReceiveMultiplier, all, -50% + { 682, { 2, 0, -50, 0, 0 } }, + //Blessing of Earth, 土の加護: EffectTypeDamageReceiveMultiplier, all, -40% + { 683, { 2, 0, -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 } }, + //Rampart, ランパート: EffectTypeDamageReceiveMultiplier, all, -20% + { 1191, { 2, 0, -20, 0, 0 } }, }; diff --git a/src/world/Action/EffectBuilder.cpp b/src/world/Action/EffectBuilder.cpp index 3ead03ea..a4388141 100644 --- a/src/world/Action/EffectBuilder.cpp +++ b/src/world/Action/EffectBuilder.cpp @@ -63,10 +63,10 @@ void EffectBuilder::restoreMP( Entity::CharaPtr& target, Entity::CharaPtr& resto moveToResultList( target, nextResult ); } -void EffectBuilder::damage( Entity::CharaPtr& effectTarget, Entity::CharaPtr& damagingTarget, uint32_t amount, Common::ActionHitSeverityType severity, Common::ActionEffectResultFlag flag ) +void EffectBuilder::damage( Entity::CharaPtr& effectTarget, Entity::CharaPtr& damagingTarget, uint32_t amount, int8_t attackType, Common::ActionHitSeverityType severity, Common::ActionEffectResultFlag flag ) { EffectResultPtr nextResult = make_EffectResult( damagingTarget, nullptr, getResultDelayMs() ); - nextResult->damage( amount, severity, flag ); + nextResult->damage( amount, attackType, severity, flag ); moveToResultList( effectTarget, nextResult ); } diff --git a/src/world/Action/EffectBuilder.h b/src/world/Action/EffectBuilder.h index 3af9683e..7a5904c6 100644 --- a/src/world/Action/EffectBuilder.h +++ b/src/world/Action/EffectBuilder.h @@ -18,7 +18,7 @@ namespace Sapphire::World::Action void restoreMP( Entity::CharaPtr& effectTarget, Entity::CharaPtr& restoringTarget, uint32_t amount, Common::ActionEffectResultFlag flag = Common::ActionEffectResultFlag::None); - void damage( Entity::CharaPtr& effectTarget, Entity::CharaPtr& damagingTarget, uint32_t amount, + void damage( Entity::CharaPtr& effectTarget, Entity::CharaPtr& damagingTarget, uint32_t amount, int8_t attackType, Common::ActionHitSeverityType severity = Common::ActionHitSeverityType::NormalDamage, Common::ActionEffectResultFlag flag = Common::ActionEffectResultFlag::None); diff --git a/src/world/Action/EffectResult.cpp b/src/world/Action/EffectResult.cpp index 39468fed..65d92694 100644 --- a/src/world/Action/EffectResult.cpp +++ b/src/world/Action/EffectResult.cpp @@ -12,12 +12,13 @@ EffectResult::EffectResult( Entity::CharaPtr target, Entity::CharaPtr source, ui m_target( std::move( target ) ), m_source( std::move( source ) ), m_delayMs( runAfter ), + m_type( Common::ActionEffectType::Nothing ), m_value( 0 ), m_value2( 0 ), m_param0( 0 ), m_param1( 0 ), - m_type( Common::ActionEffectType::Nothing ), m_param2( 0 ), + m_attackType( -1 ), m_flag( Common::ActionEffectResultFlag::None ) { @@ -43,11 +44,12 @@ uint64_t EffectResult::getDelay() return m_delayMs; } -void EffectResult::damage( uint32_t amount, Common::ActionHitSeverityType severity, Common::ActionEffectResultFlag flag ) +void EffectResult::damage( uint32_t amount, int8_t attackType, Common::ActionHitSeverityType severity, Common::ActionEffectResultFlag flag ) { m_param0 = static_cast< uint8_t >( severity ); m_value = amount; m_flag = flag; + m_attackType = attackType; m_type = Common::ActionEffectType::Damage; } diff --git a/src/world/Action/EffectResult.h b/src/world/Action/EffectResult.h index 61e8b3fe..687c2062 100644 --- a/src/world/Action/EffectResult.h +++ b/src/world/Action/EffectResult.h @@ -15,7 +15,7 @@ namespace Sapphire::World::Action public: explicit EffectResult( Entity::CharaPtr target, Entity::CharaPtr source, uint64_t delayMs ); - void damage( uint32_t amount, Common::ActionHitSeverityType severity, Common::ActionEffectResultFlag flag = Common::ActionEffectResultFlag::None ); + void damage( uint32_t amount, int8_t attackType, Common::ActionHitSeverityType severity, Common::ActionEffectResultFlag flag = Common::ActionEffectResultFlag::None ); void heal( uint32_t amount, Common::ActionHitSeverityType severity, Common::ActionEffectResultFlag flag = Common::ActionEffectResultFlag::None ); void restoreMP( uint32_t amount, Common::ActionEffectResultFlag flag = Common::ActionEffectResultFlag::None ); void startCombo( uint16_t actionId ); @@ -47,6 +47,7 @@ namespace Sapphire::World::Action uint32_t m_value; uint32_t m_value2; + int8_t m_attackType; Common::ActionEffectResultFlag m_flag; }; } diff --git a/src/world/Actor/BNpc.cpp b/src/world/Actor/BNpc.cpp index ddb3f54b..537e9aec 100644 --- a/src/world/Actor/BNpc.cpp +++ b/src/world/Actor/BNpc.cpp @@ -693,7 +693,7 @@ void Sapphire::Entity::BNpc::autoAttack( CharaPtr pTarget ) auto pRNGMgr = m_pFw->get< World::Manager::RNGMgr >(); auto damage = Math::CalcStats::calcAutoAttackDamage( *this ); - + damage.first = Math::CalcStats::applyDamageReceiveMultiplier( *pTarget, damage.first, -1 ); auto effectPacket = std::make_shared< Server::EffectPacket >( getId(), pTarget->getId(), 7 ); effectPacket->setRotation( Util::floatToUInt16Rot( getRot() ) ); Common::EffectEntry effectEntry{}; diff --git a/src/world/Actor/Chara.cpp b/src/world/Actor/Chara.cpp index aeb43576..69904e45 100644 --- a/src/world/Actor/Chara.cpp +++ b/src/world/Actor/Chara.cpp @@ -390,8 +390,6 @@ uint8_t Sapphire::Entity::Chara::getLevel() const Let an actor take damage and perform necessary steps according to resulting hp, propagates new hp value to players in range -TODO: eventually this needs to distinguish between physical and -magical dmg and take status effects into account \param amount of damage to be taken */ @@ -504,6 +502,7 @@ void Sapphire::Entity::Chara::autoAttack( CharaPtr pTarget ) srand( static_cast< uint32_t >( tick ) ); auto damage = static_cast< uint16_t >( 10 + rand() % 12 ); + damage = Math::CalcStats::applyDamageReceiveMultiplier( *pTarget, damage, -1 ); auto effectPacket = std::make_shared< Server::EffectPacket >( getId(), pTarget->getId(), 7 ); effectPacket->setRotation( Util::floatToUInt16Rot( getRot() ) ); diff --git a/src/world/Actor/Player.cpp b/src/world/Actor/Player.cpp index 793f048c..f2be253c 100644 --- a/src/world/Actor/Player.cpp +++ b/src/world/Actor/Player.cpp @@ -1576,6 +1576,7 @@ void Sapphire::Entity::Player::autoAttack( CharaPtr pTarget ) auto variation = static_cast< uint32_t >( pRNGMgr->getRandGenerator< float >( 0, 3 ).next() ); auto damage = Math::CalcStats::calcAutoAttackDamage( *this ); + damage.first = Math::CalcStats::applyDamageReceiveMultiplier( *pTarget, damage.first, -1 ); if( getClass() == ClassJob::Machinist || getClass() == ClassJob::Bard || getClass() == ClassJob::Archer ) { diff --git a/src/world/Math/CalcStats.cpp b/src/world/Math/CalcStats.cpp index 55aa7037..4530be47 100644 --- a/src/world/Math/CalcStats.cpp +++ b/src/world/Math/CalcStats.cpp @@ -573,6 +573,25 @@ std::pair< float, Sapphire::Common::ActionHitSeverityType > CalcStats::calcActio return std::pair( factor, hitType ); } +float CalcStats::applyDamageReceiveMultiplier( const Sapphire::Entity::Chara& chara, float originalDamage, int8_t attackType ) +{ + float damage = originalDamage; + for( auto const& entry : chara.getStatusEffectMap() ) + { + auto status = entry.second; + 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 ) ) + { + damage *= ( 1.0f + ( effectEntry.effectValue2 / 100.0f ) ); + } + } + return damage; +} + std::pair< float, Sapphire::Common::ActionHitSeverityType > CalcStats::calcActionHealing( const Sapphire::Entity::Chara& chara, const Sapphire::World::Action::Action& action, uint32_t ptc, float wepDmg ) { // lol just for testing diff --git a/src/world/Math/CalcStats.h b/src/world/Math/CalcStats.h index b50a82f7..aca412b2 100644 --- a/src/world/Math/CalcStats.h +++ b/src/world/Math/CalcStats.h @@ -133,6 +133,8 @@ namespace Sapphire::Math static std::pair< float, Common::ActionHitSeverityType > calcActionDamage( const Sapphire::Entity::Chara& chara, const Sapphire::World::Action::Action& action, uint32_t ptc, float wepDmg ); + static float applyDamageReceiveMultiplier( const Sapphire::Entity::Chara& chara, float originalDamage, int8_t attackType ); + static std::pair< float, Common::ActionHitSeverityType > calcActionHealing( const Sapphire::Entity::Chara& chara, const Sapphire::World::Action::Action& action, uint32_t ptc, float wepDmg ); static uint32_t primaryStatValue( const Sapphire::Entity::Chara& chara );