// Ryzom - MMORPG Framework // Copyright (C) 2010 Winch Gate Property Limited // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as // published by the Free Software Foundation, either version 3 of the // License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #ifndef RYZOM_COMBAT_H #define RYZOM_COMBAT_H #include "nel/misc/types_nl.h" namespace COMBAT_HISTORY { enum TCombatHistory { BeginMiss = 0, Miss = BeginMiss, Fumble, Parry, Dodge, EndMiss = Dodge, BeginHit, HitHead = BeginHit, HitChest, HitArms, HitHands, HitLegs, HitFeet, BeginCriticalHit, CriticalHitHead = BeginCriticalHit, CriticalHitChest, CriticalHitArms, CriticalHitHands, CriticalHitLegs, CriticalHitFeet, EndCriticalHit = CriticalHitFeet, EndHit = EndCriticalHit, NbHistoryEvent, Unknown = NbHistoryEvent, }; /// convert an history entry to a string const std::string &toString(TCombatHistory event); }; // COMBAT_HISTORY // /** * * \author David Fleury * \author Nevrax France * \date 2003 */ class CCombat { public: /// Constructor CCombat() { _History.resize(_MaxHistoryDepth, COMBAT_HISTORY::Unknown); _CurrentIndex = 0; _Melee = true; } /// Constructor CCombat( const TDataSetRow &attackerRowId, const TDataSetRow &targetRowId, bool melee = true ) : _AttackerRowId(attackerRowId), _TargetRowId(targetRowId), _Melee(melee) { _History.resize(_MaxHistoryDepth, COMBAT_HISTORY::Unknown); _CurrentIndex = 0; } /// get attacker row id inline const TDataSetRow &attacker() const { return _AttackerRowId; } /// get target row id inline const TDataSetRow &target() const { return _TargetRowId; } /// get combat history inline const std::vector &history() const { return _History; } /// get history event of given depth inline COMBAT_HISTORY::TCombatHistory historyEvent(uint8 depth) const { nlassert( _MaxHistoryDepth == _History.size() ); if(depth < _MaxHistoryDepth ) return _History[ (_MaxHistoryDepth + _CurrentIndex - depth) % _MaxHistoryDepth ]; else { nlwarning(" asked for event depth %u, but max history size is %u", depth, _MaxHistoryDepth); return COMBAT_HISTORY::Unknown; } } /// push an event in the history inline void pushEvent(COMBAT_HISTORY::TCombatHistory event) { const uint8 size = _History.size(); nlassert( _MaxHistoryDepth == size ); _CurrentIndex = (_CurrentIndex+1)%_MaxHistoryDepth; _History[_CurrentIndex] = event; } /// static : max history depth static uint8 maxHistoryDepth() { return _MaxHistoryDepth; } private: /// attacker TDataSetRow _AttackerRowId; /// target TDataSetRow _TargetRowId; /// combat History std::vector _History; /// current index in History uint8 _CurrentIndex; /// range or melee combat uint8 _Melee; static uint8 _MaxHistoryDepth; }; #endif // RYZOM_COMBAT_H /* End of combat.h */