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

status effect: damage receive multiplier

This commit is contained in:
collett 2020-01-09 21:04:43 +09:00
parent da17eecac5
commit a5884fd604
12 changed files with 221 additions and 87 deletions

View file

@ -495,7 +495,8 @@ void Action::Action::buildEffects()
if( m_lutEntry.damagePotency > 0 ) if( m_lutEntry.damagePotency > 0 )
{ {
auto dmg = calcDamage( isCorrectCombo() ? m_lutEntry.damageComboPotency : m_lutEntry.damagePotency ); 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 ) if( dmg.first > 0 )
actor->onActionHostile( m_pSource ); actor->onActionHostile( m_pSource );

View file

@ -24,6 +24,9 @@ namespace Sapphire::World::Action
const uint32_t EffectTypeInvalid = 0; const uint32_t EffectTypeInvalid = 0;
const uint32_t EffectTypeDamageMultiplier = 1; const uint32_t EffectTypeDamageMultiplier = 1;
const uint32_t EffectTypeDamageReceiveMultiplier = 2;
const uint32_t EffectTypeHot = 3;
const uint32_t EffectTypeDot = 4;
struct StatusEffectEntry struct StatusEffectEntry
{ {

View file

@ -2081,165 +2081,271 @@ ActionLut::Lut ActionLut::m_actionLut =
ActionLut::StatusEffectTable ActionLut::m_statusEffectTable = ActionLut::StatusEffectTable ActionLut::m_statusEffectTable =
{ {
//Fight or Flight, ファイト・オア・フライト: damageMultiplier, physical, 25% //Fight or Flight, ファイト・オア・フライト: EffectTypeDamageMultiplier, physical, 25%
{ 76, { 1, 1, 25, 0, 0 } }, { 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 } }, { 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 } }, { 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 } }, { 751, { 1, 0, 10, 0, 0 } },
//more than 1 effect is found //more than 1 effect is found
//Darkside, 暗黒: damageMultiplier, all, 10% //Darkside, 暗黒: EffectTypeDamageMultiplier, all, 10%
//{ 751, { 1, 0, 10, 0, 0 } }, //{ 751, { 1, 0, 10, 0, 0 } },
//Darkside, 暗黒: damageMultiplier, all, 10% //Darkside, 暗黒: EffectTypeDamageMultiplier, all, 10%
//{ 751, { 1, 0, 10, 0, 0 } }, //{ 751, { 1, 0, 10, 0, 0 } },
//Darkside, 暗黒: damageMultiplier, all, 10% //Darkside, 暗黒: EffectTypeDamageMultiplier, all, 10%
//{ 751, { 1, 0, 10, 0, 0 } }, //{ 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 } }, { 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 } }, { 101, { 1, 0, 10, 0, 0 } },
//more than 1 effect is found //more than 1 effect is found
//Twin Snakes, 双掌打: damageMultiplier, all, 10% //Twin Snakes, 双掌打: EffectTypeDamageMultiplier, all, 10%
//{ 101, { 1, 0, 10, 0, 0 } }, //{ 101, { 1, 0, 10, 0, 0 } },
//Twin Snakes, 双掌打: damageMultiplier, all, 10% //Twin Snakes, 双掌打: EffectTypeDamageMultiplier, all, 10%
//{ 101, { 1, 0, 10, 0, 0 } }, //{ 101, { 1, 0, 10, 0, 0 } },
//Fists of Fire, 紅蓮の構え: damageMultiplier, all, 10% //Fists of Fire, 紅蓮の構え: EffectTypeDamageMultiplier, all, 10%
{ 103, { 1, 0, 10, 0, 0 } }, { 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 } }, { 1181, { 1, 0, 30, 0, 0 } },
//more than 1 effect is found //more than 1 effect is found
//Riddle of Fire, 紅蓮の極意: damageMultiplier, all, 25% //Riddle of Fire, 紅蓮の極意: EffectTypeDamageMultiplier, all, 25%
//{ 1181, { 1, 0, 25, 0, 0 } }, //{ 1181, { 1, 0, 25, 0, 0 } },
//Brotherhood, 桃園結義:攻撃: damageMultiplier, physical, 5% //Brotherhood, 桃園結義:攻撃: EffectTypeDamageMultiplier, physical, 5%
{ 1185, { 1, 1, 5, 0, 0 } }, { 1185, { 1, 1, 5, 0, 0 } },
//Disembowel, ディセムボウル: damageMultiplier, all, 10% //Disembowel, ディセムボウル: EffectTypeDamageMultiplier, all, 10%
{ 1914, { 1, 0, 10, 0, 0 } }, { 1914, { 1, 0, 10, 0, 0 } },
//Lance Charge, ランスチャージ: damageMultiplier, all, 15% //Lance Charge, ランスチャージ: EffectTypeDamageMultiplier, all, 15%
{ 1864, { 1, 0, 15, 0, 0 } }, { 1864, { 1, 0, 15, 0, 0 } },
//Left Eye, 竜の左眼: damageMultiplier, all, 5% //Left Eye, 竜の左眼: EffectTypeDamageMultiplier, all, 5%
{ 1454, { 1, 0, 5, 0, 0 } }, { 1454, { 1, 0, 5, 0, 0 } },
//Right Eye, 竜の右眼: damageMultiplier, all, 10% //Right Eye, 竜の右眼: EffectTypeDamageMultiplier, all, 10%
{ 1453, { 1, 0, 10, 0, 0 } }, { 1453, { 1, 0, 10, 0, 0 } },
//Right Eye, 竜の右眼: damageMultiplier, all, 10% //Right Eye, 竜の右眼: EffectTypeDamageMultiplier, all, 10%
{ 1910, { 1, 0, 10, 0, 0 } }, { 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 } }, { 497, { 1, 0, 30, 0, 0 } },
//Ten Chi Jin, 天地人: damageMultiplier, all, 150% //Ten Chi Jin, 天地人: EffectTypeDamageMultiplier, all, 150%
{ 1186, { 1, 0, 150, 0, 0 } }, { 1186, { 1, 0, 150, 0, 0 } },
//Jinpu, 陣風: damageMultiplier, all, 13% //Jinpu, 陣風: EffectTypeDamageMultiplier, all, 13%
{ 1298, { 1, 0, 13, 0, 0 } }, { 1298, { 1, 0, 13, 0, 0 } },
//more than 1 effect is found //more than 1 effect is found
//Jinpu, 陣風: damageMultiplier, all, 13% //Jinpu, 陣風: EffectTypeDamageMultiplier, all, 13%
//{ 1298, { 1, 0, 13, 0, 0 } }, //{ 1298, { 1, 0, 13, 0, 0 } },
//Jinpu, 陣風: damageMultiplier, all, 13% //Jinpu, 陣風: EffectTypeDamageMultiplier, all, 13%
//{ 1298, { 1, 0, 13, 0, 0 } }, //{ 1298, { 1, 0, 13, 0, 0 } },
//Kaiten, 必殺剣・回天: damageMultiplier, all, 50% //Kaiten, 必殺剣・回天: EffectTypeDamageMultiplier, all, 50%
{ 1229, { 1, 0, 50, 0, 0 } }, { 1229, { 1, 0, 50, 0, 0 } },
//Raging Strikes, 猛者の撃: damageMultiplier, all, 10% //Raging Strikes, 猛者の撃: EffectTypeDamageMultiplier, all, 10%
{ 125, { 1, 0, 10, 0, 0 } }, { 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 } }, { 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 } }, { 1822, { 1, 0, 5, 0, 0 } },
//Enochian, エノキアン: damageMultiplier, magic, 15% //Enochian, エノキアン: EffectTypeDamageMultiplier, magic, 15%
{ 868, { 1, 2, 15, 0, 0 } }, { 868, { 1, 2, 15, 0, 0 } },
//Devotion, エギの加護: damageMultiplier, all, 5% //Devotion, エギの加護: EffectTypeDamageMultiplier, all, 5%
{ 1213, { 1, 0, 5, 0, 0 } }, { 1213, { 1, 0, 5, 0, 0 } },
//Embolden, エンボルデン: damageMultiplier, magic, 2% //Embolden, エンボルデン: EffectTypeDamageMultiplier, magic, 2%
{ 1239, { 1, 2, 2, 0, 0 } }, { 1239, { 1, 2, 2, 0, 0 } },
//Embolden, エンボルデン: damageMultiplier, physical, 2% //Embolden, エンボルデン: EffectTypeDamageMultiplier, physical, 2%
{ 1297, { 1, 1, 2, 0, 0 } }, { 1297, { 1, 1, 2, 0, 0 } },
//Manafication, マナフィケーション: damageMultiplier, all, 5% //Manafication, マナフィケーション: EffectTypeDamageMultiplier, all, 5%
{ 1971, { 1, 0, 5, 0, 0 } }, { 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 } }, { 1878, { 1, 0, 0, 0, 0 } },
//The Balance, アーゼマの均衡: damageMultiplier, all, 6% //The Balance, アーゼマの均衡: EffectTypeDamageMultiplier, all, 6%
{ 1882, { 1, 0, 6, 0, 0 } }, { 1882, { 1, 0, 6, 0, 0 } },
//The Arrow, オシュオンの矢: damageMultiplier, all, 6% //The Arrow, オシュオンの矢: EffectTypeDamageMultiplier, all, 6%
{ 1884, { 1, 0, 6, 0, 0 } }, { 1884, { 1, 0, 6, 0, 0 } },
//The Spear, ハルオーネの槍: damageMultiplier, all, 6% //The Spear, ハルオーネの槍: EffectTypeDamageMultiplier, all, 6%
{ 1885, { 1, 0, 6, 0, 0 } }, { 1885, { 1, 0, 6, 0, 0 } },
//The Bole, 世界樹の幹: damageMultiplier, all, 6% //The Bole, 世界樹の幹: EffectTypeDamageMultiplier, all, 6%
{ 1883, { 1, 0, 6, 0, 0 } }, { 1883, { 1, 0, 6, 0, 0 } },
//The Ewer, サリャクの水瓶: damageMultiplier, all, 6% //The Ewer, サリャクの水瓶: EffectTypeDamageMultiplier, all, 6%
{ 1886, { 1, 0, 6, 0, 0 } }, { 1886, { 1, 0, 6, 0, 0 } },
//The Spire, ビエルゴの塔: damageMultiplier, all, 6% //The Spire, ビエルゴの塔: EffectTypeDamageMultiplier, all, 6%
{ 1887, { 1, 0, 6, 0, 0 } }, { 1887, { 1, 0, 6, 0, 0 } },
//Lord of Crowns, クラウンロード: damageMultiplier, all, 8% //Lord of Crowns, クラウンロード: EffectTypeDamageMultiplier, all, 8%
{ 1876, { 1, 0, 8, 0, 0 } }, { 1876, { 1, 0, 8, 0, 0 } },
//Lady of Crowns, クラウンレディ: damageMultiplier, all, 8% //Lady of Crowns, クラウンレディ: EffectTypeDamageMultiplier, all, 8%
{ 1877, { 1, 0, 8, 0, 0 } }, { 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 } }, { 1716, { 1, 0, 50, 0, 0 } },
//Mighty Guard, マイティガード: damageMultiplier, all, -70% //Peculiar Light, 不思議な光: EffectTypeDamageReceiveMultiplier, magic, 30%
{ 1719, { 1, 0, -70, 0, 0 } }, { 1721, { 2, 2, 30, 0, 0 } },
//Waxing Nocturne, 狂戦士化: damageMultiplier, all, 50% //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 } }, { 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 } }, { 1193, { 1, 0, -10, 0, 0 } },
//more than 1 effect is found //more than 1 effect is found
//Reprisal, リプライザル: damageMultiplier, all, -10% //Reprisal, リプライザル: EffectTypeDamageMultiplier, all, -10%
//{ 1193, { 1, 0, -10, 0, 0 } }, //{ 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 } }, { 1656, { 1, 0, 30, 0, 0 } },
//Magic Burst L, ロゴス・マジックバースト: damageMultiplier, magic, 1% //Magic Burst L, ロゴス・マジックバースト: EffectTypeDamageMultiplier, magic, 1%
{ 1652, { 1, 2, 1, 0, 0 } }, { 1652, { 1, 2, 1, 0, 0 } },
//Bravery L, ロゴス・ブレイブ: damageMultiplier, all, 10% //Bravery L, ロゴス・ブレイブ: EffectTypeDamageMultiplier, all, 10%
{ 1646, { 1, 0, 10, 0, 0 } }, { 1646, { 1, 0, 10, 0, 0 } },
//Double Edge L, ロゴス・ダブルエッジ: damageMultiplier, physical, 15% //Double Edge L, ロゴス・ダブルエッジ: EffectTypeDamageMultiplier, physical, 15%
{ 1653, { 1, 1, 15, 0, 0 } }, { 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 } }, { 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 } }, { 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 } }, { 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 } }, { 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 } }, { 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 } }, { 1740, { 1, 2, 30, 0, 0 } },
//more than 1 effect is found //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 } }, //{ 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 } }, { 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 } }, { 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 } }, { 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 } }, { 443, { 1, 0, 25, 0, 0 } },
//more than 1 effect is found //more than 1 effect is found
//Damage Up, ダメージ上昇: damageMultiplier, all, 15% //Damage Up, ダメージ上昇: EffectTypeDamageMultiplier, all, 15%
//{ 443, { 1, 0, 15, 0, 0 } }, //{ 443, { 1, 0, 15, 0, 0 } },
//Damage Up, ダメージ上昇: damageMultiplier, all, 25% //Damage Up, ダメージ上昇: EffectTypeDamageMultiplier, all, 25%
//{ 443, { 1, 0, 25, 0, 0 } }, //{ 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 } }, { 591, { 1, 0, -90, 0, 0 } },
//Minimum, ミニマム: damageMultiplier, all, -50% //Minimum, ミニマム: EffectTypeDamageMultiplier, all, -50%
{ 438, { 1, 0, -50, 0, 0 } }, { 438, { 1, 0, -50, 0, 0 } },
//more than 1 effect is found //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 } }, //{ 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 } }, //{ 438, { 1, 0, -50, 0, 0 } },
//Minimum, ミニマム: damageMultiplier, all, -50% //Minimum, ミニマム: EffectTypeDamageMultiplier, all, -50%
//{ 438, { 1, 0, -50, 0, 0 } }, //{ 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 } }, //{ 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 } }, //{ 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 } }, { 1016, { 1, 0, -10, 0, 0 } },
//more than 1 effect is found //more than 1 effect is found
//Damage Down, ダメージ低下: damageMultiplier, all, -10% //Damage Down, ダメージ低下: EffectTypeDamageMultiplier, all, -10%
//{ 1016, { 1, 0, -10, 0, 0 } }, //{ 1016, { 1, 0, -10, 0, 0 } },
//Damage Down, ダメージ低下: damageMultiplier, all, -3% //Damage Down, ダメージ低下: EffectTypeDamageMultiplier, all, -3%
//{ 1016, { 1, 0, -3, 0, 0 } }, //{ 1016, { 1, 0, -3, 0, 0 } },
//Damage Down, ダメージ低下: damageMultiplier, all, -3% //Damage Down, ダメージ低下: EffectTypeDamageMultiplier, all, -3%
//{ 1016, { 1, 0, -3, 0, 0 } }, //{ 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 } },
}; };

View file

@ -63,10 +63,10 @@ void EffectBuilder::restoreMP( Entity::CharaPtr& target, Entity::CharaPtr& resto
moveToResultList( target, nextResult ); 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() ); EffectResultPtr nextResult = make_EffectResult( damagingTarget, nullptr, getResultDelayMs() );
nextResult->damage( amount, severity, flag ); nextResult->damage( amount, attackType, severity, flag );
moveToResultList( effectTarget, nextResult ); moveToResultList( effectTarget, nextResult );
} }

View file

@ -18,7 +18,7 @@ namespace Sapphire::World::Action
void restoreMP( Entity::CharaPtr& effectTarget, Entity::CharaPtr& restoringTarget, uint32_t amount, void restoreMP( Entity::CharaPtr& effectTarget, Entity::CharaPtr& restoringTarget, uint32_t amount,
Common::ActionEffectResultFlag flag = Common::ActionEffectResultFlag::None); 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::ActionHitSeverityType severity = Common::ActionHitSeverityType::NormalDamage,
Common::ActionEffectResultFlag flag = Common::ActionEffectResultFlag::None); Common::ActionEffectResultFlag flag = Common::ActionEffectResultFlag::None);

View file

@ -12,12 +12,13 @@ EffectResult::EffectResult( Entity::CharaPtr target, Entity::CharaPtr source, ui
m_target( std::move( target ) ), m_target( std::move( target ) ),
m_source( std::move( source ) ), m_source( std::move( source ) ),
m_delayMs( runAfter ), m_delayMs( runAfter ),
m_type( Common::ActionEffectType::Nothing ),
m_value( 0 ), m_value( 0 ),
m_value2( 0 ), m_value2( 0 ),
m_param0( 0 ), m_param0( 0 ),
m_param1( 0 ), m_param1( 0 ),
m_type( Common::ActionEffectType::Nothing ),
m_param2( 0 ), m_param2( 0 ),
m_attackType( -1 ),
m_flag( Common::ActionEffectResultFlag::None ) m_flag( Common::ActionEffectResultFlag::None )
{ {
@ -43,11 +44,12 @@ uint64_t EffectResult::getDelay()
return m_delayMs; 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_param0 = static_cast< uint8_t >( severity );
m_value = amount; m_value = amount;
m_flag = flag; m_flag = flag;
m_attackType = attackType;
m_type = Common::ActionEffectType::Damage; m_type = Common::ActionEffectType::Damage;
} }

View file

@ -15,7 +15,7 @@ namespace Sapphire::World::Action
public: public:
explicit EffectResult( Entity::CharaPtr target, Entity::CharaPtr source, uint64_t delayMs ); 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 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 restoreMP( uint32_t amount, Common::ActionEffectResultFlag flag = Common::ActionEffectResultFlag::None );
void startCombo( uint16_t actionId ); void startCombo( uint16_t actionId );
@ -47,6 +47,7 @@ namespace Sapphire::World::Action
uint32_t m_value; uint32_t m_value;
uint32_t m_value2; uint32_t m_value2;
int8_t m_attackType;
Common::ActionEffectResultFlag m_flag; Common::ActionEffectResultFlag m_flag;
}; };
} }

View file

@ -693,7 +693,7 @@ void Sapphire::Entity::BNpc::autoAttack( CharaPtr pTarget )
auto pRNGMgr = m_pFw->get< World::Manager::RNGMgr >(); auto pRNGMgr = m_pFw->get< World::Manager::RNGMgr >();
auto damage = Math::CalcStats::calcAutoAttackDamage( *this ); 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 ); auto effectPacket = std::make_shared< Server::EffectPacket >( getId(), pTarget->getId(), 7 );
effectPacket->setRotation( Util::floatToUInt16Rot( getRot() ) ); effectPacket->setRotation( Util::floatToUInt16Rot( getRot() ) );
Common::EffectEntry effectEntry{}; Common::EffectEntry effectEntry{};

View file

@ -390,8 +390,6 @@ uint8_t Sapphire::Entity::Chara::getLevel() const
Let an actor take damage and perform necessary steps Let an actor take damage and perform necessary steps
according to resulting hp, propagates new hp value to players according to resulting hp, propagates new hp value to players
in range 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 \param amount of damage to be taken
*/ */
@ -504,6 +502,7 @@ void Sapphire::Entity::Chara::autoAttack( CharaPtr pTarget )
srand( static_cast< uint32_t >( tick ) ); srand( static_cast< uint32_t >( tick ) );
auto damage = static_cast< uint16_t >( 10 + rand() % 12 ); 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 ); auto effectPacket = std::make_shared< Server::EffectPacket >( getId(), pTarget->getId(), 7 );
effectPacket->setRotation( Util::floatToUInt16Rot( getRot() ) ); effectPacket->setRotation( Util::floatToUInt16Rot( getRot() ) );

View file

@ -1576,6 +1576,7 @@ void Sapphire::Entity::Player::autoAttack( CharaPtr pTarget )
auto variation = static_cast< uint32_t >( pRNGMgr->getRandGenerator< float >( 0, 3 ).next() ); auto variation = static_cast< uint32_t >( pRNGMgr->getRandGenerator< float >( 0, 3 ).next() );
auto damage = Math::CalcStats::calcAutoAttackDamage( *this ); 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 ) if( getClass() == ClassJob::Machinist || getClass() == ClassJob::Bard || getClass() == ClassJob::Archer )
{ {

View file

@ -573,6 +573,25 @@ std::pair< float, Sapphire::Common::ActionHitSeverityType > CalcStats::calcActio
return std::pair( factor, hitType ); 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 ) 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 // lol just for testing

View file

@ -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 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 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 ); static uint32_t primaryStatValue( const Sapphire::Entity::Chara& chara );