324 lines
10 KiB
C++
324 lines
10 KiB
C++
#pragma once
|
||
class CAnimal;
|
||
/***************************************************************/
|
||
/*为了使代码可维护性更高,代码结构更加清晰,把技能的结果部分放本类计算
|
||
/***************************************************************/
|
||
|
||
|
||
//技能释放的结果的参数,使用一个结构体,避免参数越来越多
|
||
typedef struct tagSkillResultParam
|
||
{
|
||
CAnimal * pSrcEntity; //释放者的指针
|
||
CAnimal *pTargetEntity; //目标的指针
|
||
PSKILLRESULT pSkillResult; //技能的作用id
|
||
INT_PTR nSkillID; //技能的id
|
||
WORD nTargetPosX; //技能的作用点的坐标x
|
||
WORD nTargetPosY; //技能的作用点的坐标y
|
||
BYTE btIgnoreDefence; //忽略对方的防御,技能里使用到的
|
||
BYTE bReserver;
|
||
BYTE btIgnoreMaxDropHp; //忽略每次最大伤害限制
|
||
BYTE btReserver; //保留
|
||
tagSkillResultParam()
|
||
{
|
||
memset(this,0,sizeof(*this));
|
||
}
|
||
}SKILLRESULTPARAM,*PSKILLRESULTPARAM;
|
||
|
||
/**
|
||
* 内功技能ID
|
||
* 技能ID 4:半月弯刀
|
||
* 技能ID 6:烈火剑法
|
||
* 技能ID 8:逐日剑法
|
||
* 技能ID 12:雷电术
|
||
* 技能ID 18:冰咆哮
|
||
* 技能ID 21:流星火雨
|
||
* 技能ID 24:灵魂火符
|
||
* 技能ID 33:嗜血术
|
||
*/
|
||
enum enInternalWorkSkillsId
|
||
{
|
||
enInternalWorkSkillsId_HalfMoon = 4, //半月弯刀
|
||
enInternalWorkSkillsId_Fire = 6, //烈火剑法
|
||
enInternalWorkSkillsId_DayByDay = 8, //逐日剑法
|
||
enInternalWorkSkillsId_Thunder = 12, //雷电术
|
||
enInternalWorkSkillsId_IceStorm = 18, //冰咆哮
|
||
enInternalWorkSkillsId_RainFlowSpark = 21, //流星火雨
|
||
enInternalWorkSkillsId_SoulFireSign = 24, //灵魂火符
|
||
enInternalWorkSkillsId_BloodBite = 33, //嗜血术
|
||
};
|
||
|
||
//内功(技能Id -- 玩家属性:技能增伤Id)
|
||
std::map<unsigned short, unsigned short> InternalWorkIncreaseDamageMap {
|
||
{enInternalWorkSkillsId_HalfMoon, PROP_ACTOR_HALFMONTHS_INCREASEDAMAGE},
|
||
{enInternalWorkSkillsId_Fire, PROP_ACTOR_FIRE_INCREASEDAMAGE},
|
||
{enInternalWorkSkillsId_DayByDay, PROP_ACTOR_DAYBYDAY_INCREASEDAMAGE},
|
||
{enInternalWorkSkillsId_Thunder, PROP_ACTOR_THUNDER_INCREASEDAMAGE},
|
||
{enInternalWorkSkillsId_IceStorm, PROP_ACTOR_ICESTORM_INCREASEDAMAGE},
|
||
{enInternalWorkSkillsId_RainFlowSpark, PROP_ACTOR_FIRERAIN_INCREASEDAMAGE},
|
||
{enInternalWorkSkillsId_SoulFireSign, PROP_ACTOR_FIRESIGN_INCREASEDAMAGE},
|
||
{enInternalWorkSkillsId_BloodBite, PROP_ACTOR_BLOODBITE_INCREASEDAMAGE},
|
||
};
|
||
|
||
//内功(技能Id -- 玩家属性:技能减伤Id)
|
||
std::map<unsigned short, unsigned short> InternalWorkReduceDamageMap {
|
||
{enInternalWorkSkillsId_HalfMoon, PROP_ACTOR_HALFMONTHS_REDUCEDAMAGE},
|
||
{enInternalWorkSkillsId_Fire, PROP_ACTOR_FIRE_REDUCEDAMAGE},
|
||
{enInternalWorkSkillsId_DayByDay, PROP_ACTOR_DAYBYDAY_REDUCEDAMAGE},
|
||
{enInternalWorkSkillsId_Thunder, PROP_ACTOR_THUNDER_REDUCEDAMAGE},
|
||
{enInternalWorkSkillsId_IceStorm, PROP_ACTOR_ICESTORM_REDUCEDAMAGE},
|
||
{enInternalWorkSkillsId_RainFlowSpark, PROP_ACTOR_FIRERAIN_REDUCEDAMAGE},
|
||
{enInternalWorkSkillsId_SoulFireSign, PROP_ACTOR_FIRESIGN_REDUCEDAMAGE},
|
||
{enInternalWorkSkillsId_BloodBite, PROP_ACTOR_BLOODBITE_REDUCEDAMAGE},
|
||
};
|
||
|
||
class CSkillResult
|
||
{
|
||
public:
|
||
|
||
typedef void (CSkillResult::*SkillResultFunc)(PSKILLRESULTPARAM pParam);
|
||
/*
|
||
* Comments: 计算技能的结果
|
||
* Param PSKILLRESULTPARAM pParam:技能的指针
|
||
* Param bool bNoDelay: 如果为true的话表示无论参数是什么,都不需延迟
|
||
* @Return void:
|
||
*/
|
||
void DoResult( PSKILLRESULTPARAM pParam,bool bNoDelay =false);
|
||
|
||
|
||
//错误的id
|
||
inline void IsError(PSKILLRESULTPARAM pParam){}
|
||
|
||
|
||
//添加buff
|
||
inline void AddBuff(PSKILLRESULTPARAM pParam);
|
||
|
||
//删除buff
|
||
inline void DefBuff(PSKILLRESULTPARAM pParam);
|
||
|
||
//内功攻击
|
||
inline void PhysicAttack(PSKILLRESULTPARAM pParam);
|
||
|
||
//神圣攻击
|
||
inline void HolyAttack(PSKILLRESULTPARAM pParam);
|
||
|
||
//瞬移到目标旁
|
||
inline void MoveToTarget(PSKILLRESULTPARAM pParam);
|
||
|
||
//瞬移回巢
|
||
inline void MoveBackHome(PSKILLRESULTPARAM pParam);
|
||
|
||
//外功攻击
|
||
inline void MagicAttack(PSKILLRESULTPARAM pParam);
|
||
|
||
//修改属性
|
||
inline void ChangeProperty(PSKILLRESULTPARAM pParam);
|
||
|
||
//把目标抓到自己身边
|
||
inline void CatchTarget(PSKILLRESULTPARAM pParam);
|
||
|
||
//设定攻击目标
|
||
inline void SetAttackTarget(PSKILLRESULTPARAM pParam);
|
||
|
||
//治疗
|
||
inline void Cure(PSKILLRESULTPARAM pParam);
|
||
|
||
|
||
//冲锋
|
||
inline void RapidMove(PSKILLRESULTPARAM pParam);
|
||
|
||
//丢弃目标
|
||
inline void LostTarget(PSKILLRESULTPARAM pParam);
|
||
|
||
//删除特效,还没编码
|
||
inline void DeleteEffect(PSKILLRESULTPARAM pParam);
|
||
|
||
//刷怪
|
||
inline void MobEntity(PSKILLRESULTPARAM pParam);
|
||
|
||
//振屏
|
||
inline void ScreenShake(PSKILLRESULTPARAM pParam);
|
||
|
||
//自身的血的%d治疗给目标加血
|
||
inline void SelfHpCureTarget(PSKILLRESULTPARAM pParam);
|
||
|
||
//删除特定技能的CD时间
|
||
inline void SelfDelSkillCd(PSKILLRESULTPARAM pParam);
|
||
|
||
//击飞
|
||
inline void BeatFly(PSKILLRESULTPARAM pParam);
|
||
|
||
//击退
|
||
inline void BeatBack(PSKILLRESULTPARAM pParam);
|
||
|
||
|
||
inline void CatchMonster(PSKILLRESULTPARAM pParam);//抓怪
|
||
|
||
inline void WizardAttack(PSKILLRESULTPARAM pParam);//道术攻击
|
||
|
||
inline void IgnoreDefence(PSKILLRESULTPARAM pParam); //忽略目标的防御
|
||
|
||
inline void IgnoreMaxDropHp(PSKILLRESULTPARAM pParam); //忽略每次最大伤害限制
|
||
|
||
|
||
|
||
inline void MobFire(PSKILLRESULTPARAM pParam); //召唤出火墙
|
||
|
||
inline void MobPet(PSKILLRESULTPARAM pParam); //召唤出宠物
|
||
|
||
//删除自身宠物
|
||
inline void RemovePet(PSKILLRESULTPARAM pParam);
|
||
|
||
//往前走若干格
|
||
inline void GoAhead(PSKILLRESULTPARAM pParam);
|
||
|
||
//后退若干格
|
||
inline void GoBack(PSKILLRESULTPARAM pParam);
|
||
|
||
|
||
|
||
//在一个场景里随机移动
|
||
static void RandTransfer(CFuBen *pFb,CScene *pScene,CEntity *pEntity);
|
||
|
||
static void FixTransfer(CFuBen *pFb,CScene *pScene,CEntity *pEntity, int nPosX,int nPosY);
|
||
|
||
//最后一个安全区域随机传送
|
||
void LastSafeAreaRTransfer(PSKILLRESULTPARAM pParam);
|
||
|
||
//指定场景地点传送
|
||
void Transfer(PSKILLRESULTPARAM pParam);
|
||
|
||
//本场景随机传送
|
||
void SceneTransfer(PSKILLRESULTPARAM pParam);
|
||
|
||
//上一个安全区传送
|
||
void LastSafeAreaTransfer(PSKILLRESULTPARAM pParam);
|
||
|
||
|
||
//推迟移动时间
|
||
void PostponeMoveTime(PSKILLRESULTPARAM pParam);
|
||
|
||
//降低特定部位的装备的耐久
|
||
void ChangEquipDua(PSKILLRESULTPARAM pParam);
|
||
|
||
//按怪物的掉率掉落东西
|
||
void DropMonsterItem(PSKILLRESULTPARAM pParam);
|
||
|
||
//改变模型
|
||
void ChangeModel(PSKILLRESULTPARAM pParam);
|
||
|
||
//按百分比扣属性,rate表示扩除的万分比,1000表示10%,id=1表示扣血,1表示扣蓝
|
||
void RateChangeProperty(PSKILLRESULTPARAM pParam);
|
||
|
||
//改成怪物是否可被攻击
|
||
void ChangeMonsterAttacked(PSKILLRESULTPARAM pParam);
|
||
|
||
//给予奖励
|
||
void GiveAward(PSKILLRESULTPARAM pParam);
|
||
|
||
//客户端播放引导性特效
|
||
inline void PlayGuide(PSKILLRESULTPARAM pParam);
|
||
|
||
//往1个点移动
|
||
inline void PointMove(PSKILLRESULTPARAM pParam);
|
||
|
||
//自己移动到范围内的鼠标指定的点
|
||
inline void SelfPointMove(PSKILLRESULTPARAM pParam);
|
||
|
||
//向某目标冲撞
|
||
inline void TargetRapidMove(PSKILLRESULTPARAM pParam);
|
||
|
||
//瞬回血
|
||
inline void FastSelfCurHp(PSKILLRESULTPARAM pParam);
|
||
|
||
//把目标移动到范围内的鼠标指定的点
|
||
inline void TargetPointMove(PSKILLRESULTPARAM pParam);
|
||
|
||
//抓取符合条件所有对象
|
||
inline void CatchAll(PSKILLRESULTPARAM pParam);
|
||
|
||
//抓取符合条件所有对象
|
||
inline void MonsterMove(PSKILLRESULTPARAM pParam);
|
||
|
||
/////////////////////////下面是一些公共的函数
|
||
|
||
//正常的攻击,所有的攻击都调用这个函数,只是攻击类型不同
|
||
inline void NormalAttack(PSKILLRESULTPARAM pParam, int nAttackType);
|
||
|
||
|
||
/*
|
||
* Comments:添加buff的处理,因为buff和debuff在成功率和时间减免上有差别,所以把这个接口统一出来
|
||
* Param PSKILLRESULTPARAM pParam:参数
|
||
* Param float fTimeDesc:时间的减免
|
||
* @Return void:
|
||
*/
|
||
inline void AddBufProcess(PSKILLRESULTPARAM pParam, float fTimeDesc=0.0);
|
||
|
||
|
||
/*
|
||
* Comments:是否命中
|
||
目前策划给的命中概率是 ( 实际命中几率(%) = 攻击方命中几率(%) - 防守方闪避几率(%)+ 0.95
|
||
* Param PSKILLRESULTPARAM pParam: 参数
|
||
* Param bool isInnerAttack: 是否是内功攻击,true表示是内功攻击,否则表示外功攻击
|
||
* @Return bool: 如果命中返回true,否则返回false
|
||
*/
|
||
|
||
inline bool isHit(PSKILLRESULTPARAM pParam, INT_PTR nAttackType );
|
||
|
||
|
||
//闪避了
|
||
void OnDodge(CEntity * pSrcEntity,CEntity * pEntity);
|
||
|
||
inline unsigned int GetAttackAbility(CEntity * pEntity)
|
||
{
|
||
return 1;
|
||
}
|
||
|
||
//广播受击
|
||
inline void BroadCastHit(CAnimal * pEntity, Uint64 hTargetHandle);
|
||
|
||
/*
|
||
* Comments: 伤害计算, 现在策划的伤害计算是
|
||
hpAttack = 伤害值* (1 - 防御减免比例);
|
||
防御减免比例=
|
||
外防 /(1500 + 外防) :外攻攻击
|
||
内防 /(800 + 内防) : 内攻攻击
|
||
故伤害计算为 伤害值 * 1500/(1500 + 外防) :外攻攻击
|
||
伤害值 * 800/ (800 + 内防) :内攻攻击
|
||
* Param INT_PTR nSkillId: 技能的ID
|
||
* Param CEntity * pTargetEntity: 目标实体的指针
|
||
* Param float fAttackValue: 释放技能者打出的伤害值
|
||
* Param INT_PTR nAttackType: 攻击类型
|
||
* @Return void:
|
||
*/
|
||
void CalculateDamage(INT_PTR nSkillId,CAnimal * pSrcEntity,CAnimal *pTargetEntity,
|
||
PSKILLRESULTPARAM pParam,float fAttackValue,INT_PTR nAttackType);
|
||
|
||
/*
|
||
* Comments:广播各神对主人丢弃资产
|
||
* Param LPCTSTR sName:主人名字
|
||
* Param bool boItems:是否是丢弃物品
|
||
* Param int nItemId:物品id
|
||
* Param int nCount:物品数量或金钱数量
|
||
* @Return void:
|
||
*/
|
||
void NoticeRemMasterAsset( LPCTSTR sName, bool boItems, int nItemId, int nCount);
|
||
|
||
/*
|
||
* Comments:通过类型获取攻击值
|
||
* Param CActor * pSrcActor:玩家
|
||
* Param int nType:类型
|
||
* Param int nParam:参数是否随机,不随机就取最大值
|
||
* @Return int:
|
||
*/
|
||
int GetAttackValByType(CAnimal * pSrcActor, int nType, int nParam = 0 );
|
||
|
||
|
||
//说话
|
||
inline void Shout(PSKILLRESULTPARAM pParam);
|
||
|
||
|
||
protected:
|
||
static const SkillResultFunc Handlers[];
|
||
//static SkillResultMgr * s_skillResultMgr; //技能内存结果的管理器
|
||
};
|