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; Index: sql/status_effects.sql =================================================================== --- sql/status_effects.sql (revision 4045) +++ sql/status_effects.sql (working copy) @@ -45,13 +45,13 @@ INSERT INTO `status_effects` VALUES (0,'ko',0,0,0,0,0,0,0); INSERT INTO `status_effects` VALUES (1,'weakness',0,0,0,3,0,0,0); INSERT INTO `status_effects` VALUES (2,'sleep',48,2,19,2,193,0,8); -INSERT INTO `status_effects` VALUES (3,'poison',32,0,0,2,0,0,3); -INSERT INTO `status_effects` VALUES (4,'paralysis',32,0,0,1,0,0,5); -INSERT INTO `status_effects` VALUES (5,'blindness',32,0,0,1,0,0,8); -INSERT INTO `status_effects` VALUES (6,'silence',32,0,0,2,0,0,4); +INSERT INTO `status_effects` VALUES (3,'poison',16416,0,0,2,0,0,3); +INSERT INTO `status_effects` VALUES (4,'paralysis',16416,0,0,1,0,0,5); +INSERT INTO `status_effects` VALUES (5,'blindness',16416,0,0,1,0,0,8); +INSERT INTO `status_effects` VALUES (6,'silence',16416,0,0,2,0,0,4); INSERT INTO `status_effects` VALUES (7,'petrification',32,7,0,2,10,0,2); -INSERT INTO `status_effects` VALUES (8,'disease',4128,8,0,2,0,0,1); -INSERT INTO `status_effects` VALUES (9,'curse',32,9,0,2,0,0,8); +INSERT INTO `status_effects` VALUES (8,'disease',20512,8,0,2,0,0,1); +INSERT INTO `status_effects` VALUES (9,'curse',16416,9,0,2,0,0,8); INSERT INTO `status_effects` VALUES (10,'stun',34,0,0,2,7,0,6); INSERT INTO `status_effects` VALUES (11,'bind',34,0,0,2,0,0,5); INSERT INTO `status_effects` VALUES (12,'weight',34,0,32,1,0,0,4); @@ -68,8 +68,8 @@ INSERT INTO `status_effects` VALUES (23,'kaustra',32,0,228,0,0,0,0); INSERT INTO `status_effects` VALUES (28,'terror',32,7,0,0,0,0,8); INSERT INTO `status_effects` VALUES (29,'mute',32,0,0,2,0,6,4); -INSERT INTO `status_effects` VALUES (30,'bane',32,0,0,2,0,9,8); -INSERT INTO `status_effects` VALUES (31,'plague',4128,8,0,2,0,0,1); +INSERT INTO `status_effects` VALUES (30,'bane',16416,0,0,2,0,9,8); +INSERT INTO `status_effects` VALUES (31,'plague',20512,8,0,2,0,0,1); INSERT INTO `status_effects` VALUES (32,'flee',33,0,12,0,0,0,4); INSERT INTO `status_effects` VALUES (33,'haste',33,0,13,0,0,0,4); INSERT INTO `status_effects` VALUES (34,'blaze_spikes',33,34,0,0,0,0,1); @@ -174,7 +174,7 @@ INSERT INTO `status_effects` VALUES (133,'drown',34,0,0,0,132,128,3); INSERT INTO `status_effects` VALUES (134,'dia',34,0,135,0,0,0,7); INSERT INTO `status_effects` VALUES (135,'bio',34,0,134,0,0,0,8); -INSERT INTO `status_effects` VALUES (136,'str_down',34,0,0,0,0,80,3); +INSERT INTO `status_effects` VALUES (136,'str_down',16418,0,0,0,0,80,3); INSERT INTO `status_effects` VALUES (137,'dex_down',34,0,0,0,0,81,2); INSERT INTO `status_effects` VALUES (138,'vit_down',34,0,0,0,0,82,4); INSERT INTO `status_effects` VALUES (139,'agi_down',34,0,0,0,0,83,5); @@ -524,6 +524,7 @@ INSERT INTO `status_effects` VALUES (798,'chainbound',32,0,0,0,0,0,0); INSERT INTO `status_effects` VALUES (799,'skillchain',32,0,0,0,0,0,0); INSERT INTO `status_effects` VALUES (800,'dynamis',0,0,0,0,0,0,0); +INSERT INTO `status_effects` VALUES (801,'fov_food',0,0,0,2,0,0,0); /*!40000 ALTER TABLE `status_effects` ENABLE KEYS */; UNLOCK TABLES; /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; Index: src/map/lua/lua_baseentity.cpp =================================================================== --- src/map/lua/lua_baseentity.cpp (revision 4045) +++ src/map/lua/lua_baseentity.cpp (working copy) @@ -4231,6 +4231,14 @@ return 1; } +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.h =================================================================== --- src/map/status_effect.h (revision 4045) +++ src/map/status_effect.h (working copy) @@ -51,12 +51,13 @@ EFFECTFLAG_DEATH = 0x0020, // исчезает при смерти EFFECTFLAG_MAGIC_BEGIN = 0x0040, // исчезает перед началом чтения заклинания EFFECTFLAG_MAGIC_END = 0x0080, // исчезает после прочтения заклинания - EFFECTFLAG_ON_ZONE = 0x0100, + EFFECTFLAG_ON_ZONE = 0x0100, EFFECTFLAG_NO_LOSS_MESSAGE = 0x0200, // Suppress effect worn off message. - EFFECTFLAG_INVISIBLE = 0x0400, // invisible effect - EFFECTFLAG_DETECTABLE = 0x0800, // invisible, sneak, deo - EFFECTFLAG_NO_REST = 0x1000, // prevents resting, curse II, plague, disease - EFFECTFLAG_PREVENT_ACTION = 0x2000 // sleep, lullaby, stun, petro. Not implemented + EFFECTFLAG_INVISIBLE = 0x0400, // invisible effect + EFFECTFLAG_DETECTABLE = 0x0800, // invisible, sneak, deo + EFFECTFLAG_NO_REST = 0x1000, // prevents resting, curse II, plague, disease + EFFECTFLAG_PREVENT_ACTION = 0x2000, // sleep, lullaby, stun, petro. Not implemented + EFFECTFLAG_WALTZABLE = 0x4000 //for healing waltzable spells }; enum EFFECT 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,29 @@ return EFFECT_NONE; } +EFFECT CStatusEffectContainer::HealingWaltz() +{ + EFFECT effect_id; + std::vector waltzableList; + for( uint16 i = 0; i < m_StatusEffectList.size(); ++i ) + { + if( ( m_StatusEffectList.at(i)->GetFlag() & EFFECTFLAG_WALTZABLE || + 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: 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