98 lines
3.2 KiB
C++
98 lines
3.2 KiB
C++
#pragma once
|
|
|
|
#include "moveableentity.h"
|
|
#include "buff.h"
|
|
|
|
#include "cs_proto.pb.h"
|
|
|
|
namespace MetaData
|
|
{
|
|
class Skill;
|
|
class SkillPhase;
|
|
}
|
|
|
|
struct xtimer_list;
|
|
class Skill;
|
|
class Creature : public MoveableEntity
|
|
{
|
|
public:
|
|
|
|
bool aiming = false;
|
|
ActionType_e action_type = AT_None;
|
|
a8::Vec2 attack_dir;
|
|
HumanAbility ability;
|
|
a8::Vec2 target_pos;
|
|
std::function<bool ()> on_move_collision;
|
|
|
|
virtual ~Creature() override;
|
|
virtual void Initialize() override;
|
|
bool HasBuffEffect(int buff_effect_id);
|
|
Buff* GetBuffByEffectId(int effect_id);
|
|
Buff* GetBuffById(int buff_id);
|
|
void AddBuff(Creature* caster,
|
|
MetaData::Buff* buff_meta,
|
|
int skill_lv,
|
|
MetaData::Skill* buff_skill_meta = nullptr);
|
|
bool IsImmuneBuffEffect(int buff_effect);
|
|
void MustBeAddBuff(Creature* caster, int buff_id);
|
|
void RemoveBuffById(int buff_id);
|
|
void RecalcBuffAttr();
|
|
void RemoveBuffByEffectId(int buff_effect_id);
|
|
void ClearBuffList();
|
|
float GetBuffAttrAbs(int attr_id);
|
|
float GetBuffAttrRate(int attr_id);
|
|
void FillBuffList(::google::protobuf::RepeatedPtrField<::cs::MFBuff>* pb_buff_list);
|
|
void TriggerBuff(Skill* skill, std::set<Entity*>& target_list, BuffTriggerType_e trigger_type);
|
|
Skill* GetSkill(int skill_id);
|
|
void AddSkill(int skill_id);
|
|
void ClearSkill();
|
|
void AddPassiveSkill(MetaData::Skill* skill_meta);
|
|
void ClearPassiveSkill();
|
|
|
|
virtual void SelectSkillTargets(Skill* skill,
|
|
const a8::Vec2& target_pos,
|
|
std::set<Entity*>& target_list);
|
|
virtual bool CanUseSkill(int skill_id);
|
|
void DoSkill(int skill_id, int target_id, const a8::Vec2& target_pos);
|
|
void ResetSkill();
|
|
Skill* CurrentSkill();
|
|
MetaData::SkillPhase* GetCurrSkillPhase();
|
|
|
|
virtual void CancelAction() {};
|
|
virtual void ResetAction() {};
|
|
|
|
private:
|
|
|
|
virtual void AddBuffPostProc(Creature* caster, Buff* buff);
|
|
virtual void OnBuffRemove(const Buff& buff);
|
|
virtual void SendDebugMsg(const std::string& debug_msg);
|
|
virtual void DoSkillPreProc(int skill_id, int target_id, const a8::Vec2& target_pos);
|
|
virtual void DoSkillPostProc(bool used, int skill_id, int target_id, const a8::Vec2& target_pos);
|
|
virtual void _UpdateMove(int speed) {};
|
|
|
|
void UpdateSkill();
|
|
void ProcSkillPhase(MetaData::SkillPhase* phase);
|
|
void ProcBuffEffect(Creature* caster, Buff* buff);
|
|
void TriggerOneObjectBuff(Skill* skill, Entity* target, BuffTriggerType_e trigger_type);
|
|
|
|
bool HasPassiveSkill(MetaData::Skill* skill_meta);
|
|
void ClearPassiveSkillBuff(MetaData::Skill* skill_meta);
|
|
void AddPassiveSkillBuff(MetaData::Skill* skill_meta);
|
|
void RemovePassiveSkill(MetaData::Skill* skill_meta);
|
|
|
|
private:
|
|
std::array<float, kHAT_End> buff_attr_abs_ = {};
|
|
std::array<float, kHAT_End> buff_attr_rate_ = {};
|
|
std::array<Buff*, kBET_End> buff_effect_ = {};
|
|
std::list<Buff> buff_list_;
|
|
|
|
a8::Vec2 skill_dir;
|
|
float skill_param1 = 0;
|
|
bool playing_skill = false;
|
|
size_t curr_skill_phase = 0;
|
|
int skill_target_id_ = 0;
|
|
a8::Vec2 skill_target_pos_;
|
|
std::map<int, Skill*> skill_hash_;
|
|
std::map<MetaData::Skill*, xtimer_list*> passive_skill_metas_;
|
|
};
|