#pragma once //技能配置表 #define MAX_SECRET_SAUCE_COUNT_ONE_SKILL 4 //一个技能最大的秘笈数量 #define MAX_SKILL_LEVEL 20 //技能的最大的等级 #define SKILLCON_PARAM 5 //技能筛选69,70参数 //技能的中心点的类型 enum enSkillCerterPosType { stSkillTargetCenter = 0, //以目标为中心 stSkillActorCenter = 1, //以主角为中心 stSkillSpellPointCenter = 2, //以施法点为中心 stSkillActorCenterDir = 3, //以主角瞬时坐标方向为中心 }; //范围的分类 enum enSkillRangeType { stSkillRangeSingle, //无范围,仅针对目标的单体技能(单体) stSkillRangeRotationSingle, //线性旋转(单体) stSkillRangeRotationGroup, //线性范围(群体) stSkillRangeGroup, //范围(群体) stSkillRangeAccurateRotation, //矢量精确旋转,以中心点与鼠标的位置的连线作为旋转轴旋转,比线性旋转更精确,用于法师的火球术 stSkillRangePointCenter, //施法点中心范围(群体), 与范围(群体)不同的是传递给PointSkillResult的是施法点中心坐标 stSkillRangeNoTarget, //无目标的 }; enum enSkillType { stPassiveSkill = 0, //被动技能 stPhysicAttackSkill = 1, //物理攻击技能 stMagicAttackSkill = 2, //魔法攻击技能 stTransferSkill = 3, //传送技能 stLifeSkill = 4, //生活技能 stOtherSpecialSkill = 5, //其他特殊的技能,比如队伍buff,通过技能实现的 }; enum enSkillClass { scSkillClassVocBasic = 1, //职业基本技能 scSkillClassMonster = 2, //怪物技能 scSkillCriticalBlow = 3, //必杀 scSkillDig = 4, //挖矿技能 TO DELETE scSkillHideAttach = 5, //隐藏的附加技能(烈火剑法,逐日剑法,不检查) scSkillRide = 6, //座驾技能 scSkillClassGuild = 11, //行会技能,展示在行会面板上的技能(保存于人物的技能列表中) }; //技能的释放结果的ID enum enSkillResultID { srSkillResultError = 0, //占位 srSkillResultPhysicAttack = 1, //物理攻击 srSkillResultMagicAttack = 2, //法术攻击 srSkillResulWizardAttack = 3, //道术攻击 srSkillResultAddBuff = 4, //增加buff srSkillResultDelBuff = 5, //删除buff srSkillCatchMonster = 6, //抓怪 srSkillResultBeatBack = 7, //击退 srSkillResultMobFire = 8, //召唤火墙 srSkillResultMobPet = 9, //召唤宠物 srSkillResultGoAhead = 10, //往前跑若干格 srSkillResultGoBack = 11, //向后退若干格 srSkillResultLastSafeAreaRTransfer = 12, //上一个安全区随机传送 srSkillResultChangeProperty = 13, //被动技能 srSkillResultCure = 14, //瞬间治疗 srSkillResultHolyAttack = 15, //神圣攻击 srSkillResultMoveToTarget = 16, //瞬移到目标旁 srSkillResultMoveBackHome = 17, //瞬移回巢 srSkillResultTransfer = 18, //指定场景地点传送 srSkillResultSceneTransfer = 19, //本场景随机传送 srSkillResultLastSafeAreaTransfer = 20, //上一个安全区传送 srSkillResultDeleteEffect = 21, //删除特效 srSkillResulIgnoreDefence = 22, //忽视目标的防御 srSkillResulCatchTarget = 23, //把目标抓到自己身边 srSkillResultSetAttackTarget = 24, //设置攻击目标 srSkillResultMobEntity = 25, //刷怪 srSkillResultChargeAttack = 26, //冲锋 srSkillResultSelfHpCureTarget = 27, //自身的HP的百分比治疗目标 srSkillResultLostTarget = 28, //丢弃目标 srSkillResultChangEquipDua = 29, //改变装备的耐久 srSkillResultDropMonsterItem = 30, //按怪物的掉率掉落东西 srSkillResultScreenShake = 15, //振屏 srSkillResultChangeFubenProgress = 32, //改变副本进度 srSkillResultChangeModel = 33, //改变外形 srSkillResultRateChangeProperty = 34, //百分比改属性 srSkillResultDeleteSkillCd = 35, //删除技能的CD srSkillResultGiveAward = 36, //给奖励 srSkillResultBeatFly = 37, //击飞 srSkillResultPlayGuide = 38, //客户端播放引导性特 srSkillResultIgnoreMaxDropHp = 39, //忽略每次最大伤害限制 srSkillResultPointMove = 40, //把目标移动到地图一个点 srSkillResultSelfPointMove = 41, //自己移动到范围内的鼠标指定的点 srSkillResultTargetRapidMove = 42, //向某目标冲撞 srSkillResultRemovePet = 43, //删除宠物 srSkillResultChangeMonsterAttacked = 44, //改变怪物是否能被攻击 srSkillResultFastSelfCurHp = 45, //瞬回血 srSkillResultTargetPointMove = 46, //把目标移动到范围内的鼠标指定的点 }; //技能的训练或者释放条件ID enum enSkillTrainCondition { /// 释放条件 scSkillConditonHP =1, //消耗命 scSkillConditonMP =2, //消耗蓝 scSkillConditionWithoutBuff =3, //不存在buff scSkillConditionTargetDistance =4,//和目标的距离 /// 旧的 scSkillConditonLevel =1, //等级必须大于等于一定的级别 scSkillConditonMoney =2, //金钱 scSkillConditonItem =3, //物品 scSkillConditonExp =4, //经验 scSkillConditonXiuwei =5, //修为 scSkillConditonVocation =6, //职业需求 //scSkillConditonHP =7, //消耗命 //scSkillConditonMP =8, //消耗蓝 scSkillConditionTargetExist =9, //目标存在 scSkillConditionPetCount =10, //存在宠物的数量 scSkillConditionWithBuff =11, //存在buff //scSkillConditionWithoutBuff =12,// 身上必须没有指定类型的buff //scSkillConditionTargetDistance =13,//和目标的距离 scSkillConditionTargetOverLap =14,//和目标重叠 scSkillConditionFaceTarget =15, ////需要面向目标 scSkillConditionOneDirTarget =16,//需要和目标的方向 scSkillConditionMountExpLimited=17,//坐骑经验不够 scSkillConditionHpRateBelow=18,//自身的血的百分比必须低于一定的值 scSkillConditionSpecialTarget =19, //需要特定的目标 scSkillConditionTargetCanAttack =20, //目标可攻击 scSkillConditionEfficiency = 21, //需要生活技能的熟练度 scSkillConditionJumpPoweer =22, //轻功不够 scSkillConditinBindCoin =23, //绑定银两的消耗 scSkillConditinCampTitle =24, //阵营的职位的条件 scSkillConditionBrotherCount =25, //结拜的数目 scSkillConditionTargetDis =26, //需要目标,并且和目标的y轴的绝对距离少于等于value scSkillConditioOnlineBrotherCount =27, //队伍里的在线的结拜好友的数量 >= value,不包括自己 scSkillConditionBaseMpRate =28, //消耗基础蓝的万分比 value表示基础蓝的万分比,比如8500表示85%,玩家的基础蓝表示等级带来的MaxMp,不包括buff,装备等附加的 scSkillConditionBaseHpRate=29, //消耗基础血的万分比 value表示基础血的万分比,比如8500表示85%,玩家的基础血表示等级带来的MaxHp,不包括buff,装备等附加的 scSkillConditionBattleState =30, //在与玩家的战斗状态,value 1表示是 0表示否 scSkillConditionGuildCont=31, scSkillConditionSkillLevel =32, scSkillConditionXpValue=33, scSkillConditionMetiralDura =34, //装备材料的耐久消耗 scSkillConditionTargetLine =35, //和目标一条直线上 scSkillConditionDigTool =36, //挖矿工具 scSkillConditionAnger =37, //怒气值 scSkillConditionArea = 38, //需要特定的区域类型,value表示区域的属性类型 scSkillConditionCircle =39, //转数的限制 }; //技能的效果类型 enum enSkillEffectType { stSkillEffectTypeNone = 0, //无效果 stSkillEffectTypeSwing = 1, //挥洒 stSkillEffectTypeCast = 2, //投掷与爆炸一样(暂时未用) stSkillEffectTypeFly = 3, //飞行 stSkillEffectTypeExplode = 4, //爆炸 与投掷一样 上层 stSkillEffectTypeFootAlways = 5, //脚下持续 stSkillEffectTypeAlways = 6, //持续 只能人物使用 stSkillEffectDirByActor = 7, //只能人物使用,按方向 stSkillEffectTypeExplodeFloor = 8, //爆炸 下层 }; enum enSkillPropertyValueType { ptValueTypeInt=0, //属性的数值类型是整数 ptValueTypeFloat =1,//属性的数值类型是浮点数 ptValueTypeBuffRate = 2,//被动技能触发添加buff的概率 ptValueTypeBuffId =3,//被动技能触发添加buff的Id ptValueTypeSkillAddBuff =4,//学习/遗忘技能时添加/删除buff }; //技能在特殊的buff下是否能用,包括封、断、晕眩 enum enSkillSpecialBuffCondition { stSkillSpecialBuffNone =0, //都不能用 stSkillSpecialBuffFengDuan, //在封断的时候能够使用 stSkillSpecialBuffDizzy, //在晕眩的时候可以使用 stSkillSpecialBuffAll, //在封断的时候都能够使用 }; //伤害类型,用于技能命中和一些攻击、防御时判定 enum enSkillHitType { htDefault = 0, //默认 htFire, //火墙 htBuff, //buf伤害 }; //技能升级或者释放的条件,分表表示条件的ID,value,是否消耗,用在条件的判断上 typedef struct tagSkillTrainSpellCondition { BYTE nConditionID; //条件ID BYTE bConsumed; //是否要消耗 BYTE bReserve; //保留 int nCount; //数量 INT64 nValue; //值 } SKILLTRAINSPELLCONDITION,*PSKILLTRAINSPELLCONDITION; //技能的秘籍数据 typedef struct tagSkillMiji { WORD nMijiId; //秘籍的ID WORD nMinLevel; //可以学习该秘籍的最低的技能等级 }SKILLMIJI,*PSKILLMIJI; //Buff条件需要单独判断 /* typedef struct tagBuffCondition { BYTE nType; // buff的类型 BYTE nCount; //数量 WORD nID; // buff的id } BUFFCONDITION, *PBUFFCONDITION; */ //技能目标选择的筛选条件 typedef struct tagTargetSelCondition { int nKey; //条件ID GAMEATTRVALUE value; //条件的值 }TARGETSELCONDITION,*PTARGETSELCONDITION; //特效的配置 typedef struct tagSpecialEffect { BYTE nType; //特效的类型 BYTE nAlways; //是否总是生效 int nID; //特效的ID int nKeepTime;//持续时间 int nDelayTime; //延迟生效时间 BYTE nSceneEffect; int nTotalCount;//特效总帧数 int nTotalDirCount;//总方向数 } SPECIALEFFECT,*PSPECIALEFFECT; //技能的释放结果 typedef struct tagSkillResult { int nId; int nValue; int nDelay; int nParam1; int nParam2; int nParam3; int nParam4; int nParam5; int nParam6; int nResultType; BYTE btHitType; BYTE ignoreTargetDis; //忽视和目标的距离(例如:道士技能:虚空黑洞) BYTE bBuffType; //bufftype /* BYTE nResultType; //效果的类型ID BYTE bVt; //值的类型 (浮点等) WORD wMjID; //秘笈的ID,如果是0表示是一个普通的技能效果 BYTE bLevel; //使用技能的等级(用于特殊技能) BYTE alwaysTakeEffect; //就算施法者下线了也要生效 BYTE bRateType; //属性比例是相对于哪个数值,0表示物理攻击,1表示法术攻击,2表示道术攻击,。。。后面可以扩展 BYTE timeAddType; //时间是基于哪个属性的比例提高,0表示物理攻击,1表示魔法攻击,2表示道术攻击,3表示等级,其他可以增加 BYTE intervalAddType; //buff的时间间隔是基于哪个属性的比例提高,0表示物理攻击,1表示魔法攻击,2表示道术攻击,3表示等级,其他可以增加 int nId; int nInterval; int nDelay; //延迟,单位是毫秒 int nTimes; //作用的次数 int nValue; //值 int valueRate; //值的万分比 int timeRate; //时间的万分比 int intervalRate; // buff的时间的万分比 WORD maxTime; //buff最大的作用次数 WORD maxDur; //buff最大的作用间隔 int nEffectId; //特效的ID int nEffectType; //特效的类型 int nAiId; //召唤宝宝的aiId int nColorPriority; //添加buff的时候的优先级,从1开始,优先级高的将顶替优先级低的 int nColor; //添加buff的时候给添加的颜色,主要是道士的毒,麻痹的毒 BYTE ignoreTargetDis; //忽视和目标的距离,用于野蛮冲撞这样的技能,撞开的时候依然有效 BYTE btHitType; //伤害类型,用于技能命中伤害时判定 1:火墙 byte nParam; */ tagSkillResult() { memset(this,0,sizeof(*this) ); } }SKILLRESULT,*PSKILLRESULT; //技能的等级信息 typedef struct tagSkillAction { int nTargetType ; //目标的类型 DataList skillResults; //技能释放结果 DataList specialEffect; //升级的特效 DataList targetConditions; //目标选择的条件 }SKILLACTION ,*PSKILLACTION; //在一个特定范围里的技能的效果 typedef struct tagSkillOneRange { int nStartX; //x左边的点 int nEndX; //x右边的点 int nStartY; //y上面的点 int nEndY; //y下面的点 int rangeType; // 范围的类型 int rangeCenter; //范围的中心 int nDelay; //延迟目标选择 int nForceHitTargetDis;//非指向的群体技能可以强制打中已选目标的距离(主要是处理跑动的目标打不中的问题) DataList skillResults; //技能释放结果 DataList targetConditions; //目标选择的条件 //DataList actions; //技能在这个范围内的效果 }SKILLONERANGE,*PSKILLONERANGE; typedef struct tagSkillOneLevel { unsigned int nLevel; //DataList ranges; //技能在每一个范围里的效果 DataList pranges; //技能在每一个范围里的效果 DataList trainConditions; //训练条件 DataList spellConditions;//技能的使用需求 unsigned int nSingTime; //吟唱时间 unsigned int nCooldownTimes; //CD时间 int nAttrIdx; int nHitId; int nMaxPet; bool isSceneEffect = false; }SKILLONELEVEL,*PSKILLONELEVEL; /*一个技能的数据*/ struct OneSkillData { char sSkillName[60]; //技能名字 WORD nSkillID; //技能ID BYTE nSkillType; //技能的类型,近身攻击之类 BYTE bSpecialBuffCond; //技能在封断、晕眩的时候是否能够使用 BYTE bSkillClass; //技能的分类0职业被动技能,1职业主动技能,2阵营技能,3结拜技能,4侠侣技能,5职业绝学,6江湖绝学,7通用技能,8其他技能 BYTE bIsSwitch; //是否手动开关 BYTE bPriority; //技能的优先级 bool bIsAutoLearn;//是否自动学 BYTE bVocation; //职业 bool bBeedCalPassiveProperty; //是否需要计算被动属性,某些主动技能也需要按被动技能计算属性 bool bSingleEmptyEffect; int nCommonCdTime; //技能使用的时候公共cd时间 int nAutoLearnSkillLvl; //自动学习技能的等级 DataList levels ; // 技能的等级 BYTE btClientDir; //使用客户端方向 WORD wAttrId; //对应的属性id bool boIsDelete; //是否删除 };