// 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 RY_SABRINA_ACTOR_PLAYER_H #define RY_SABRINA_ACTOR_PLAYER_H // nel misc #include "nel/misc/types_nl.h" // sabrina #include "sabrina_pointers.h" #include "sabrina_actor.h" //------------------------------------------------------------------------------------------------------ // Constants //------------------------------------------------------------------------------------------------------ namespace SABRINA { const uint32 SLOTS_PER_MEMORY_BANK = 20; } //------------------------------------------------------------------------------------------------------ // CSabrinaActorPlayer - Player specialisation of Sabrina actor class //------------------------------------------------------------------------------------------------------ class CSabrinaActorPlayer: public ISabrinaActor { public: //------------------------------------------------------------------------------------------------------ // ctor and dtor CSabrinaActorPlayer(CEntityBase *parent); CSabrinaActorPlayer(const CSabrinaActorPlayer& other); virtual ~CSabrinaActorPlayer(); //------------------------------------------------------------------------------------------------------ // Virtual application of results of a Sabrina Action to a target virtual void cbSabrinaActionApplyBegin(); virtual void applyHeal(SABRINA::THealType healType, uint32 healQuantity); virtual void applyDamage(SABRINA::TDmgType damageType, uint32 damage); virtual void applyBeginSecondaryEffect(SABRINA::TEffectType effectType, uint32 strength); virtual void applyEndSecondaryEffect(SABRINA::TEffectType effectType); virtual void cbSabrinaActionApplyEnd(); //------------------------------------------------------------------------------------------------------ // Virtual Read Accessor Interface virtual sint32 getSkillValue(SKILLS::ESkills skill) const; virtual sint32 getAttackSkillValue() const; virtual sint32 getDefenseSkillValue() const; virtual sint32 getDodgeSkillValue() const; virtual bool getRightHandWeaponStats(CWeaponStats& stats) const; virtual bool getLeftHandWeaponStats(CWeaponStats& stats) const; virtual bool getAmmoStats(CWeaponStats& stats) const; virtual bool getArmorProtectionStats(SLOT_EQUIPMENT::TSlotEquipment slot,CArmorStats& protection) const; virtual bool getLeftHandProtectionStats(CShieldStats& protection) const; virtual ISabrinaActor* getTarget() const; //------------------------------------------------------------------------------------------------------ // Logical test routines virtual bool isValidOffensiveTarget(ISabrinaActor* target) const; virtual bool isValidCurativeTarget(ISabrinaActor* target) const; //------------------------------------------------------------------------------------------------------ // Management of the player's own actions virtual void beginSabrinaAction(const ISabrinaPhraseModel* phrase); virtual void cancelSabrinaAction(SABRINA::TEventCode reason); //------------------------------------------------------------------------------------------------------ // Virtual callbacks for message sending on activation/ cancelation of Sabrina actions virtual void cbSabrinaActionBegin(const CSabrinaPhraseInstance* completedPhrase); virtual void cbSabrinaActionSuccess(const CSabrinaPhraseInstance* completedPhrase, SABRINA::TEventCode code); virtual void cbSabrinaActionFailure(const CSabrinaPhraseInstance* completedPhrase, SABRINA::TEventCode code); virtual void cbSabrinaActionCancel(const CSabrinaPhraseInstance* completedPhrase, SABRINA::TEventCode code); virtual void cbSabrinaActionEnd(const CSabrinaPhraseInstance* completedPhrase); //------------------------------------------------------------------------------------------------------ // Cyclic action management methods /// set the cyclic action void setCyclicAction( ISabrinaPhraseModel *phrase); /// stop the cyclic action void stopCyclicAction(const TDataSetRow &entityRowId); //------------------------------------------------------------------------------------------------------ // Management of the player's phrase memory // add memory banks (used at player connection to creat memory set) // note that memory bank names are limited to 7 letters void addMemoryBank(const std::string& memoryBankName); // memorize a phrase in a slot in a memory bank void memorize(const std::string& memoryBankName, uint32 memorySlot, ISabrinaPhraseDescription* phrase); // set the 'active memory bank' variable void setActiveMemoryBank(const std::string& memoryBankName); // set the default action within the active memory bank (~0u to reset to no default action) // deppending on the action type this may or may not be a cyclic action void setDefaultAction(uint32 memorySlot); // execute an action from within the active memory bank void executeAction(uint32 memorySlot); // the client and/ or server has indicated that they now (or no longer) are well placed for // performing the current default action (the action must be cyclic) void setCyclicActionFlag(bool value); //------------------------------------------------------------------------------------------------------ // Message Management for player information messages... // TODO... private: // the player's current active action phrase CSabrinaPhraseInstancePtr _CurrentActionPhrase; // structure for the player's phrase memory... struct CMemoryBank { uint64 BankId; // used as a 0..7 character asciiz string std::vector MemorySlots; // MemorySlots[SABRINA::SLOTS_PER_MEMORY_BANK]; uint32 DefaultAction; // ~0u if none CMemoryBank(): BankId(0), MemorySlots(SABRINA::SLOTS_PER_MEMORY_BANK), DefaultAction(~0u) { } // copy constructor (needed to protect smart pointers...) CMemoryBank(const CMemoryBank& other): BankId(other.BankId), MemorySlots(other.MemorySlots), DefaultAction(other.DefaultAction) { } }; // the player's set of memory banks (one per right hand item type) std::vector _MemoryBanks; // index of the active memory bank (within _MemoryBanks) uint32 _ActiveMemoryBank; // a flag used to determine whether or not to launch a new action automatically when the // current action terminates bool _CyclicActionFlag; // set to true if the client is well placed and default action is cyclic }; #endif