diff --git a/data/actions/player.json b/data/actions/player.json index fd131e4c..ebd0494f 100644 --- a/data/actions/player.json +++ b/data/actions/player.json @@ -2041,7 +2041,20 @@ "nextCombo": [], "statuses": { "caster": [], - "target": [] + "target": [ + { + "id": 150, + "duration": 30000, + "statusRefreshPolicy": 17, + "flag": 8192, + "modifiers": [ + { + "modifier": "TickHeal", + "value": 50 + } + ] + } + ] } }, "134": { @@ -2101,7 +2114,20 @@ "nextCombo": [], "statuses": { "caster": [], - "target": [] + "target": [ + { + "id": 158, + "duration": 21000, + "statusRefreshPolicy": 17, + "flag": 8192, + "modifiers": [ + { + "modifier": "TickHeal", + "value": 150 + } + ] + } + ] } }, "138": { diff --git a/src/common/Common.h b/src/common/Common.h index adcba688..dad9e8eb 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -937,7 +937,8 @@ namespace Sapphire::Common Invisibilty = 512, CanStatusOff = 1024, FcBuff = 2048, - RemoveOnSuccessfulHit = 4096 + RemoveOnSuccessfulHit = 4096, + ReplaceSameCaster = 8192 }; enum class StatusRefreshPolicy : uint8_t diff --git a/src/world/Action/Action.cpp b/src/world/Action/Action.cpp index 533d23a3..9ee60a2d 100644 --- a/src/world/Action/Action.cpp +++ b/src/world/Action/Action.cpp @@ -649,7 +649,10 @@ void Action::Action::applyStatusEffect( bool isSelf, Entity::CharaPtr& target, E } case Common::StatusRefreshPolicy::ReplaceOrApply: { - pActionBuilder->applyStatusEffect( target, status.id, status.duration, 0, std::move( status.modifiers ), status.flag, statusToSource, true ); + if( (status.flag & static_cast< uint32_t >( Common::StatusEffectFlag::ReplaceSameCaster ) && hasSameStatusFromSameCaster) || hasSameStatus ) + pActionBuilder->replaceStatusEffect( referenceStatus, target, status.id, status.duration, 0, std::move( status.modifiers ), status.flag, statusToSource ); + else + pActionBuilder->applyStatusEffect( target, status.id, status.duration, 0, std::move( status.modifiers ), status.flag, statusToSource, true ); break; } case Common::StatusRefreshPolicy::Extend: diff --git a/src/world/Action/ActionResult.cpp b/src/world/Action/ActionResult.cpp index 72891c65..82c8392d 100644 --- a/src/world/Action/ActionResult.cpp +++ b/src/world/Action/ActionResult.cpp @@ -184,7 +184,7 @@ void ActionResult::execute() for( auto const& entry : m_target->getStatusEffectMap() ) { auto statusEffect = entry.second; - if( statusEffect->getId() == m_result.Value && m_bShouldOverride ) + if( statusEffect->getId() == m_result.Value && m_bShouldOverride && statusEffect->getSrcActorId() == m_pStatus->getSrcActorId() ) { statusEffect->refresh( m_pStatus->getDuration() ); m_pStatus->setSlot( statusEffect->getSlot() ); diff --git a/src/world/Action/ActionResultBuilder.cpp b/src/world/Action/ActionResultBuilder.cpp index 85f901d3..eb27c5c6 100644 --- a/src/world/Action/ActionResultBuilder.cpp +++ b/src/world/Action/ActionResultBuilder.cpp @@ -1,4 +1,4 @@ - #include "ActionResultBuilder.h" +#include "ActionResultBuilder.h" #include "ActionResult.h" #include diff --git a/src/world/Actor/Chara.cpp b/src/world/Actor/Chara.cpp index f4f40d8e..7a068c90 100644 --- a/src/world/Actor/Chara.cpp +++ b/src/world/Actor/Chara.cpp @@ -49,12 +49,6 @@ Chara::Chara( ObjKind type ) : m_lastAttack = Common::Util::getTimeMs(); m_bonusStats.fill( 0 ); - - // initialize the free slot queue - for( uint8_t i = 0; i < MAX_STATUS_EFFECTS; i++ ) - { - m_statusEffectFreeSlotQueue.push( i ); - } } Chara::~Chara() = default; @@ -521,12 +515,6 @@ int8_t Chara::getStatusEffectFreeSlot() { int8_t freeEffectSlot = -1; - // if( m_statusEffectFreeSlotQueue.empty() ) - // return freeEffectSlot; - - // freeEffectSlot = static_cast< int8_t >( m_statusEffectFreeSlotQueue.front() ); - // m_statusEffectFreeSlotQueue.pop(); - if( m_statusEffectSlots.size() >= MAX_STATUS_EFFECTS ) return freeEffectSlot; @@ -544,15 +532,11 @@ int8_t Chara::getStatusEffectFreeSlot() void Chara::statusEffectFreeSlot( uint8_t slotId ) { - // m_statusEffectFreeSlotQueue.push( slotId ); m_statusEffectSlots.erase( slotId ); - // std::set< uint8_t > shiftedSlots; } void Chara::replaceSingleStatusEffect( uint32_t slotId, StatusEffect::StatusEffectPtr pStatus ) { - // removeStatusEffect( slotId, false ); - // addStatusEffect( pStatus ); pStatus->setSlot( slotId ); m_statusEffectMap[ slotId ] = pStatus; pStatus->applyStatus(); @@ -630,13 +614,11 @@ std::map< uint8_t, Sapphire::StatusEffect::StatusEffectPtr >::iterator Chara::re auto it = m_statusEffectMap.erase( pEffectIt ); - // for( const auto& effectIt : m_statusEffectMap ) for( auto effectIt = it; effectIt != m_statusEffectMap.end(); ) { - // if( effectIt.first > effectSlotId ) - // { // if the status is *after* the one being removed, shift the slots down by one auto shifted_slot = effectIt->first - 1; + auto node_slot = m_statusEffectSlots.extract( effectIt->first ); node_slot.value() = shifted_slot; m_statusEffectSlots.insert( std::move( node_slot ) ); @@ -649,7 +631,6 @@ std::map< uint8_t, Sapphire::StatusEffect::StatusEffectPtr >::iterator Chara::re Logger::warn( "Shifted slot {} to slot: {}", effectSlotId, shifted_slot ); ++effectIt; - // } } Logger::warn( "Slot id being freed: {}", effectSlotId ); diff --git a/src/world/Actor/Chara.h b/src/world/Actor/Chara.h index 252a2cd6..30c2fcbf 100644 --- a/src/world/Actor/Chara.h +++ b/src/world/Actor/Chara.h @@ -86,7 +86,6 @@ namespace Sapphire::Entity /*! Status effects */ const uint8_t MAX_STATUS_EFFECTS = 30; - std::queue< uint8_t > m_statusEffectFreeSlotQueue; std::vector< std::pair< uint8_t, uint32_t > > m_statusEffectList; std::map< uint8_t, StatusEffect::StatusEffectPtr > m_statusEffectMap; std::set< uint8_t > m_statusEffectSlots;