231 lines
6 KiB
C
231 lines
6 KiB
C
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||
|
// 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 <http://www.gnu.org/licenses/>.
|
||
|
|
||
|
|
||
|
|
||
|
#ifndef RY_COMBAT_ATTACKER_H
|
||
|
#define RY_COMBAT_ATTACKER_H
|
||
|
|
||
|
// nel misc
|
||
|
#include "nel/misc/types_nl.h"
|
||
|
// game_share
|
||
|
#include "game_share/tick_event_handler.h"
|
||
|
#include "game_share/game_item_manager/game_item.h"
|
||
|
//
|
||
|
#include "entity_base.h"
|
||
|
#include "character.h"
|
||
|
#include "player_manager.h"
|
||
|
#include "entity_manager.h"
|
||
|
|
||
|
extern CPlayerManager PlayerManager;
|
||
|
|
||
|
|
||
|
struct CCombatWeapon
|
||
|
{
|
||
|
CCombatWeapon()
|
||
|
{
|
||
|
SpeedInTicks = 0;
|
||
|
Damage = 0;
|
||
|
Quality = 0;
|
||
|
DmgType = DMGTYPE::UNDEFINED;
|
||
|
Range = 0;
|
||
|
Skill = SKILLS::unknown;
|
||
|
SkillValue = 0;
|
||
|
Family = ITEMFAMILY::UNDEFINED;
|
||
|
}
|
||
|
|
||
|
CCombatWeapon(CGameItemPtr itemPtr);
|
||
|
|
||
|
std::string toString() const
|
||
|
{
|
||
|
const std::string temp = NLMISC::toString("Damage = %u, Quality = %u, SkillValue = %u, dmgType = %s, Family = %s", Damage, Quality, SkillValue,DMGTYPE::toString(DmgType).c_str(), ITEMFAMILY::toString(Family).c_str() );
|
||
|
return temp;
|
||
|
}
|
||
|
|
||
|
uint16 SpeedInTicks;
|
||
|
uint16 Damage;
|
||
|
uint16 Quality;
|
||
|
DMGTYPE::EDamageType DmgType;
|
||
|
ITEMFAMILY::EItemFamily Family;
|
||
|
float Range; // if > 0 range weapon or ammo, == 0 melee weapon
|
||
|
SKILLS::ESkills Skill; // no meaning for ammos
|
||
|
sint32 SkillValue; // no meaning for ammos
|
||
|
};
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Base class for combat attackers
|
||
|
* \author David Fleury
|
||
|
* \author Nevrax France
|
||
|
* \date 2003
|
||
|
*/
|
||
|
class CCombatAttacker
|
||
|
{
|
||
|
public:
|
||
|
enum TAttackerItem
|
||
|
{
|
||
|
RightHandItem =0,
|
||
|
LeftHandItem,
|
||
|
Ammo,
|
||
|
|
||
|
Unknown,
|
||
|
};
|
||
|
|
||
|
public:
|
||
|
CCombatAttacker() {}
|
||
|
|
||
|
CCombatAttacker( const TDataSetRow &rowId) : _RowId(rowId)
|
||
|
{}
|
||
|
|
||
|
virtual ~CCombatAttacker()
|
||
|
{}
|
||
|
|
||
|
virtual void lockRightItem() = 0;
|
||
|
virtual void lockLeftItem() = 0;
|
||
|
virtual void lockAmmos(uint16 nb = 1) = 0;
|
||
|
virtual void unlockRightItem() = 0;
|
||
|
virtual void unlockLeftItem() = 0;
|
||
|
virtual void unlockAmmos(uint16 nb = 1) = 0;
|
||
|
|
||
|
virtual void damageItem(bool right = true) = 0;
|
||
|
|
||
|
virtual sint32 getSkillValue( SKILLS::ESkills skill) const = 0;
|
||
|
|
||
|
inline CEntityBase *getEntity() { return CEntityBaseManager::getEntityBasePtr(_RowId); }
|
||
|
inline const TDataSetRow &getEntityRowId() const { return _RowId; }
|
||
|
|
||
|
virtual bool checkAmmoAmount( uint8 qty = 1) const = 0;
|
||
|
virtual void consumeAmmos( uint8 qty = 1) = 0;
|
||
|
|
||
|
virtual bool getItem( TAttackerItem item, CCombatWeapon &weaponItem) const = 0;
|
||
|
|
||
|
public:
|
||
|
/// row id
|
||
|
TDataSetRow _RowId;
|
||
|
};
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Derived class for player attackers
|
||
|
* \author David Fleury
|
||
|
* \author Nevrax France
|
||
|
* \date 2003
|
||
|
*/
|
||
|
class CCombatAttackerPlayer : public CCombatAttacker
|
||
|
{
|
||
|
public:
|
||
|
CCombatAttackerPlayer(const TDataSetRow &rowId) : CCombatAttacker(rowId)
|
||
|
{
|
||
|
CCharacter *player = PlayerManager.getChar(_RowId);
|
||
|
if(!player) return;
|
||
|
|
||
|
_RightHandItem = player->getRightHandItem();
|
||
|
_LeftHandItem = player->getLeftHandItem();
|
||
|
_Ammos = player->getAmmoItem();
|
||
|
}
|
||
|
|
||
|
virtual ~CCombatAttackerPlayer()
|
||
|
{}
|
||
|
|
||
|
inline void lockRightItem() { if (_RightHandItem != NULL) _RightHandItem->setLockState(_RightHandItem->getLockState() + 1 ); }
|
||
|
inline void lockLeftItem() { if (_LeftHandItem != NULL) _LeftHandItem->setLockState(_LeftHandItem->getLockState() + 1 ); }
|
||
|
inline void lockAmmos(uint16 nb = 1) { if (_Ammos != NULL) _Ammos->setLockState(_Ammos->getLockState() + nb ); }
|
||
|
|
||
|
inline void unlockRightItem() { if (_RightHandItem != NULL) _RightHandItem->setLockState(_RightHandItem->getLockState() - 1); }
|
||
|
inline void unlockLeftItem() { if (_LeftHandItem != NULL) _LeftHandItem->setLockState(_LeftHandItem->getLockState() - 1); }
|
||
|
inline void unlockAmmos(uint16 nb = 1) { if (_Ammos != NULL) _Ammos->setLockState(_Ammos->getLockState() - nb); }
|
||
|
|
||
|
virtual bool checkAmmoAmount( uint8 qty = 1) const;
|
||
|
|
||
|
virtual void consumeAmmos( uint8 qty = 1)
|
||
|
{
|
||
|
CCharacter *character = PlayerManager.getChar(_RowId);
|
||
|
if(!character) return;
|
||
|
character->consumeAmmo(qty);
|
||
|
}
|
||
|
|
||
|
inline void damageItem(bool right = true) {}
|
||
|
|
||
|
virtual bool getItem( TAttackerItem item, CCombatWeapon &weaponItem) const;
|
||
|
|
||
|
inline sint32 getSkillValue( SKILLS::ESkills skill) const
|
||
|
{
|
||
|
CCharacter *character = PlayerManager.getChar(_RowId);
|
||
|
if (!character || skill >= SKILLS::NUM_SKILLS) return 0;
|
||
|
return character->getSkills()._Skills[ skill ].Current;
|
||
|
}
|
||
|
|
||
|
|
||
|
public:
|
||
|
/// right hand item
|
||
|
CGameItemPtr _RightHandItem;
|
||
|
|
||
|
/// left hand item
|
||
|
CGameItemPtr _LeftHandItem;
|
||
|
|
||
|
/// current ammos
|
||
|
CGameItemPtr _Ammos;
|
||
|
};
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Derived class for AI attackers
|
||
|
* \author David Fleury
|
||
|
* \author Nevrax France
|
||
|
* \date 2003
|
||
|
*/
|
||
|
class CCombatAttackerAI : public CCombatAttacker
|
||
|
{
|
||
|
public:
|
||
|
CCombatAttackerAI()
|
||
|
{}
|
||
|
|
||
|
CCombatAttackerAI(const TDataSetRow &rowId);
|
||
|
|
||
|
virtual ~CCombatAttackerAI()
|
||
|
{}
|
||
|
|
||
|
inline void consumeAmmos( uint8 qty = 1) {}
|
||
|
inline void damageItem(bool right = true) {}
|
||
|
inline void lockRightItem() {}
|
||
|
inline void lockLeftItem() {}
|
||
|
inline void lockAmmos(uint16 nb = 1) {}
|
||
|
inline void unlockRightItem() {}
|
||
|
inline void unlockLeftItem() {}
|
||
|
inline void unlockAmmos(uint16 nb = 1) {}
|
||
|
|
||
|
inline sint32 getSkillValue( SKILLS::ESkills skill) const { return _RightHandWeapon.SkillValue; }
|
||
|
|
||
|
inline bool checkAmmoAmount( uint8 qty = 1) const { return true; }
|
||
|
|
||
|
virtual bool getItem( TAttackerItem item, CCombatWeapon &weaponItem) const;
|
||
|
|
||
|
public:
|
||
|
// right hand item
|
||
|
CCombatWeapon _RightHandWeapon;
|
||
|
|
||
|
// left hand item
|
||
|
CCombatWeapon _LeftHandWeapon;
|
||
|
|
||
|
// ammo
|
||
|
CCombatWeapon _Ammo;
|
||
|
};
|
||
|
|
||
|
|
||
|
#endif // RY_COMBAT_ATTACKER_H
|
||
|
|
||
|
/* End of combat_attacker.h */
|