Index: src/map/lua/lua_baseentity.cpp =================================================================== --- src/map/lua/lua_baseentity.cpp (revision 4045) +++ src/map/lua/lua_baseentity.cpp (working copy) +inline int32 CLuaBaseEntity::healingWaltz(lua_State *L) +{ + DSP_DEBUG_BREAK_IF(m_PBaseEntity == NULL); + DSP_DEBUG_BREAK_IF(m_PBaseEntity->objtype == TYPE_NPC); + + lua_pushinteger( L, ((CBattleEntity*)m_PBaseEntity)->StatusEffectContainer->HealingWaltz()); + return 1; +} /************************************************************************ * * * * @@ -7648,6 +7656,7 @@ LUNAR_DECLARE_METHOD(CLuaBaseEntity,delStatusEffect), LUNAR_DECLARE_METHOD(CLuaBaseEntity,delStatusEffectSilent), LUNAR_DECLARE_METHOD(CLuaBaseEntity,eraseStatusEffect), + LUNAR_DECLARE_METHOD(CLuaBaseEntity,healingWaltz), LUNAR_DECLARE_METHOD(CLuaBaseEntity,dispelStatusEffect), LUNAR_DECLARE_METHOD(CLuaBaseEntity,dispelAllStatusEffect), LUNAR_DECLARE_METHOD(CLuaBaseEntity,eraseAllStatusEffect), Index: src/map/lua/lua_baseentity.h =================================================================== --- src/map/lua/lua_baseentity.h (revision 4045) +++ src/map/lua/lua_baseentity.h (working copy) @@ -326,6 +326,7 @@ int32 delStatusEffect(lua_State*); // Removes Status Effect int32 delStatusEffectSilent(lua_State*);// Removes Status Effect, suppresses message int32 eraseStatusEffect(lua_State*); // Used with "Erase" spell + int32 healingWaltz(lua_State*); // Used with "Healing Waltz" ability int32 dispelStatusEffect(lua_State*); // Used with "Dispel" spell int32 stealStatusEffect(lua_State*); // Used in mob skills to steal effects int32 dispelAllStatusEffect(lua_State*); // Dispels all effects and returns number erased Index: src/map/status_effect_container.h =================================================================== --- src/map/status_effect_container.h (revision 4045) +++ src/map/status_effect_container.h (working copy) @@ -62,6 +62,7 @@ bool HasStatusEffectByFlag(uint16 flag); EFFECT EraseStatusEffect(); // удаляем первый отрицательный эффект + EFFECT HealingWaltz(); // dancers healing waltz uint8 EraseAllStatusEffect(); // erases all status effects EFFECT DispelStatusEffect(); // удаляем первый положительный эффект uint8 DispelAllStatusEffect(); // dispels all status effects Index: src/map/status_effect_container.cpp =================================================================== --- src/map/status_effect_container.cpp (revision 4045) +++ src/map/status_effect_container.cpp (working copy) @@ -578,6 +578,57 @@ return EFFECT_NONE; } +EFFECT CStatusEffectContainer::HealingWaltz() +{ + EFFECT effect_id; + std::vector waltzableList; + for( uint16 i = 0; i < m_StatusEffectList.size(); ++i ) + { + effect_id = m_StatusEffectList.at(i)->GetStatusID(); + if( ( effect_id == EFFECT_BANE || + effect_id == EFFECT_BLINDNESS || + effect_id == EFFECT_CURSE || + effect_id == EFFECT_DISEASE || + effect_id == EFFECT_PARALYSIS || + effect_id == EFFECT_POISON || + effect_id == EFFECT_SILENCE || + effect_id == EFFECT_PLAGUE || + effect_id == EFFECT_STR_DOWN || + effect_id == EFFECT_DEX_DOWN || + effect_id == EFFECT_VIT_DOWN || + effect_id == EFFECT_AGI_DOWN || + effect_id == EFFECT_INT_DOWN || + effect_id == EFFECT_MND_DOWN || + effect_id == EFFECT_CHR_DOWN || + effect_id == EFFECT_MAX_HP_DOWN || + effect_id == EFFECT_MAX_MP_DOWN || + effect_id == EFFECT_ACCURACY_DOWN || + effect_id == EFFECT_ATTACK_DOWN || + effect_id == EFFECT_EVASION_DOWN || + effect_id == EFFECT_DEFENSE_DOWN || + effect_id == EFFECT_MAGIC_DEF_DOWN || + effect_id == EFFECT_MAGIC_ACC_DOWN || + effect_id == EFFECT_MAGIC_ATK_DOWN || + effect_id == EFFECT_MAX_TP_DOWN || + effect_id == EFFECT_ENMITY_DOWN || + effect_id == EFFECT_CRIT_HIT_EVASION_DOWN || + effect_id == EFFECT_MAGIC_EVASION_DOWN || + m_StatusEffectList.at(i)->GetFlag() & EFFECTFLAG_ERASABLE ) && + m_StatusEffectList.at(i)->GetDuration() > 0 ) + { + waltzableList.push_back(i); + } + } + if( !waltzableList.empty() ) + { + uint16 rndIdx = rand() % waltzableList.size(); + EFFECT result = m_StatusEffectList.at(waltzableList.at(rndIdx))->GetStatusID(); + RemoveStatusEffect(waltzableList.at(rndIdx)); + return result; + } + return EFFECT_NONE; +} + /* Erases all negative status effects returns number of erased effects Index: scripts/globals/abilities/healing_waltz.lua =================================================================== --- scripts/globals/abilities/healing_waltz.lua (revision 4045) +++ scripts/globals/abilities/healing_waltz.lua (working copy) @@ -21,5 +21,5 @@ end; function OnUseAbility(player, target, ability) - target:eraseStatusEffect(); -end; \ No newline at end of file + target:healingWaltz(); +end;