aozhiwei f688b2fded 1
2021-03-19 19:36:22 +08:00

126 lines
4.0 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 Obstacle;
class Creature : public MoveableEntity
{
public:
bool dead = false;
int team_id = 0;
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;
Weapon* curr_weapon = nullptr;
Weapon car_weapon;
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(int skill_id);
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();
bool CanSee(const Creature* c) const;
virtual void CancelAction() {};
virtual void ResetAction() {};
virtual std::string GetName() { return "";};
virtual void SendDebugMsg(const std::string& debug_msg);
virtual void DropItems(Obstacle* obstacle) {};
virtual bool IsPlayer() const { return false;};
virtual bool IsAndroid() const { return false;};
RaceType_e GetRace() { return race_; }
float GetAttrAbs(int attr_id);
float GetAttrRate(int attr_id);
private:
virtual void AddBuffPostProc(Creature* caster, Buff* buff);
virtual void OnBuffRemove(const Buff& buff);
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);
Skill* GetPassiveSkill(int skill_id);
void RemovePassiveSkill(int skill_id);
protected:
RaceType_e race_ = kHumanRace;
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;
Skill* curr_skill_ = nullptr;
int skill_target_id_ = 0;
a8::Vec2 skill_target_pos_;
std::map<int, Skill*> skill_hash_;
std::map<int, Skill*> passive_skill_hash_;
friend class Skill;
};
void InternalShot(Creature* sender,
MetaData::Equip* weapon_meta,
MetaData::EquipUpgrade* weapon_upgrade_meta,
MetaData::Equip* bullet_meta,
int weapon_lv,
int skill_id,
float fly_distance,
bool is_tank_skin);