using UnityEngine; using System; using System.Collections; using System.Collections.Generic; using System.Linq; /// /// 角色[游戏数据] /// public class GameHeroVo { /// /// 是否是我自己的英雄 Ps. 本字段为本地字段,未同步到网络. /// 是我的= true, 其他人的= false /// public bool IsMyOwnerHero = false; /// /// 唯一ID /// public string uid { get; set; } = "0"; /// /// 模板数据id /// public string typeId { get; set; } /// ///当前的经验(角色吃经验丹获得经验从而使level值成长.) /// public int xp { get; set; } /// /// 当前等级进展,累计的总经验 /// public int maxXp { get { if (this.starLimitLv == this.level) { return xp; } var lvMo = GameConfigData.Ins.Gethero_levelexpMo(this.level + 1); if (null != lvMo) { return lvMo.requiredExp; } return GameConfigData.Ins.Gethero_levelexpMo(this.level).requiredExp; } } /// /// 当前等级(level值决定了其他属性如hp, phyAtk,等的成长(公式)) /// public int level { get; set; } = 1; /// /// 品阶(S A B C D)(品阶可以通过吃碎片成长) /// public string grade { get; set; } = "D"; /// /// 武器数据引用 /// internal GameCollectEquips EquipRef; /// /// 言灵数据引用 /// internal GameCollectYanling YanlingRef; #region 扩展功能标签 /// /// 判断自己是否是队长 /// public bool IsTeamLeader => UserProxy.Instance.player.heroTeamConfig.teamDic.Values.ToList().Exists(team => team.CurTeamLeaderUID == this.uid); /// /// 判断自己是否已经有战队了 /// public bool IsInTeam => int.Parse(this.uid) > 0 && UserProxy.Instance.player.heroTeamConfig.teamDic.Values.ToList().Exists(team => team.heros.Contains(this.uid)); /// /// 是否可升级, 玩家等级限制英雄等级 /// /// public bool HeroCanLevelUp => this.level < (sm_playerlevel.getUserLvById(UserProxy.Instance.player.baseInfo.level)?.hero_max_level ?? 15); // 找不到配置数据, 默认最大15级 /// /// 英雄的模板数据源 /// public sm_hero mo => sm_hero.GetMoByID(this.typeId); #endregion #region 技能 // UNDONE : 技能部分梳理好,补充这里 -- 王刚 2019年12月4日 // 原来 : 普通技能, 手动1, 手动2, 被动技能和队长技能. // 新的 : 普攻、必杀、被动、闪避、队长技 /// /// 技能等级信息记录 /// key 为技能ID,value为技能对应的等级 /// [Obsolete("旧技能信息", true)] public Dictionary skillDic = new Dictionary(); /// /// 子技能列表(子技能id) /// public Dictionary> subSkills = new Dictionary>(); /// /// 查询可解锁技能列表 /// /// public List GetUnlockAbleSkills(int mainSkillId) { var li = new List(); var ssl = sm_subSkill.GetSubSkillsByMainSkillId(mainSkillId) // 取主技能对应的子技能集合 .Where(sm => sm.level == 1); // 未解锁,限定为1级技能 foreach (var sm in ssl) { bool find = false; if (this.subSkills.ContainsKey(mainSkillId)) // 防御 { var itor_sm = sm; if (this.subSkills[mainSkillId].Contains(itor_sm.subSkillId)) { find = true; } else { while (itor_sm.nextLevel_Id > 0) { // 整个链条上的id都判断一遍 if (this.subSkills[mainSkillId].Contains(itor_sm.nextLevel_Id)) { find = true; break; } itor_sm = sm_subSkill.GetMoById(itor_sm.nextLevel_Id); } } } if (!find && sm.canUnlock(this)) // 英雄子技能列表中不包含的id判定为待解锁状态 { li.Add(sm); } } return li; } /// /// 查询可升级子技能 /// /// public List GetUpdateAbleSkills(int mainSkillId) { var li = new List(); if (this.subSkills.ContainsKey(mainSkillId)) { foreach (var id in this.subSkills[mainSkillId]) { var sk = sm_subSkill.GetMoById(id); if (sk.canUpgrade(this)) { li.Add(sk); } } } return li; } /// /// 取一个主技能底下的所有子技能 /// /// /// public List GetSubSkills(int mainSkillId) { var li = new List(); var ssl = sm_subSkill.GetSubSkillsByMainSkillId(mainSkillId) // 取主技能对应的子技能集合 .Where(sm => sm.level == 1); // 未解锁,限定为1级技能 foreach (var sm in ssl) { bool find = false; if (this.subSkills.ContainsKey(mainSkillId)) // 防御 { var itor_sm = sm; if (this.subSkills[mainSkillId].Contains(itor_sm.subSkillId)) { find = true; li.Add(sm); continue; } else { while (itor_sm.nextLevel_Id > 0) { // 整个链条上的id都判断一遍 if (this.subSkills[mainSkillId].Contains(itor_sm.nextLevel_Id)) { find = true; break; } itor_sm = sm_subSkill.GetMoById(itor_sm.nextLevel_Id); } } } if (!find) // 英雄子技能列表中不包含的id判定为待解锁状态 { li.Add(sm); } } return li; } /// /// 队长技 /// /// public sm_skill SkillLeader() { return sm_skill.GetMoByID(int.Parse(this.mo.skill_leader)); } /// /// 普通攻击技能 /// /// public sm_skill SkillNormal() { return sm_skill.GetMoByID(int.Parse(this.mo.GetNormalSkills()[0])); //return sm_skill.GetMoByID(int.Parse(this.mo.skill_normal)); } /// /// 必杀技 /// /// public sm_skill SkillBisha() { return sm_skill.GetMoByID(int.Parse(this.mo.skill_bisha)); } /// /// 闪避/冲刺 /// /// public sm_skill SkillShanbi() { return sm_skill.GetMoByID(int.Parse(this.mo.skill_shanbi)); } /// /// 被动技 /// /// public sm_skill SkillBeidong() { return sm_skill.GetMoByID(int.Parse(this.mo.skill_beidong)); } #endregion /* 一个英雄 有3个装备槽: waepon、armor、ring */ #region 装备 /// /// 英雄的装备信息 /// key = [waepon. armor. ring] /// value = 装备UID /// public Dictionary equips = new Dictionary(); /// /// 拉取本英雄可用的装备列表 /// /// public List UsableWeapons() { return UserProxy.Instance.player.collectEquip.FindUseableEquips(int.Parse(this.typeId)); } #endregion /* 一个英雄 有3个言灵槽: left:1、middle:2、right:3 */ #region 言灵 /// /// 英雄的言灵信息 (暂时先用字符串吧,优化的时候再说(王刚2020年1月2日18:50:53)) /// key = [1. 2. 3] /// public Dictionary yanling = new Dictionary(); /// /// 英雄的言灵信息---新的 2021.6.22 /// public Dictionary hero_yanling { get { Dictionary dic = new Dictionary(); foreach (KeyValuePair kv in this.yanling) { if (UserProxy.Instance.player.collectYanling.items.ContainsKey(kv.Value.itemuid)) { UserYanlingVo vo = UserProxy.Instance.player.collectYanling.items[kv.Value.itemuid]; dic[kv.Key] = vo; } else { UserYanlingVo vo = new UserYanlingVo(); dic[kv.Key] = vo; } } return dic; } } /// /// 拉取本英雄可用的言灵列表 /// /// public List UsableYanling() { return UserProxy.Instance.player.collectYanling.FindUseableYanlings(int.Parse(this.typeId)); } /// /// 当前英雄装配的言灵套系属性加成 /// public List hero_yanlingComposeAttr { get { List list = new List(); List cIdList = new List(); foreach (KeyValuePair kv in this.hero_yanling) { if (kv.Value.typeId == null) { continue; } int id = kv.Value.nMo.GetYanlingExt().composeId; cIdList.Add(id); } if (cIdList.Count == 0) { return list; } int count = 0; int composeId = 0; foreach (var item in cIdList.GroupBy(c => c)) { int n = item.Count(); if (count < n) { count = n; composeId = item.Key; } } if (composeId == 0) { return list; } if (count <= 1) { return list; } sm_yanling_compose mo = GameConfigData.Ins.Getyanling_composeMo(composeId); if (mo == null) { return list; } string[] twoList = mo.two_compose.Split(','); int attrType = int.Parse(twoList[0]); yanlingComposeDataVo vo = new yanlingComposeDataVo(); vo.composeId = composeId; vo.isShow = false; if (count >= 2) { vo.isShow = true; } vo.attr = (EHeroAddProperties)attrType; vo.desc = mo.two_desc; vo.attrName = mo.name; vo.type = int.Parse(twoList[1]); vo.val = int.Parse(twoList[2]); list.Add(vo); //sm_yanling_compose newMo = GameConfigData.Ins.Getyanling_composeMo(composeId); string[] threeList = mo.three_compose.Split(','); int attrType_3 = int.Parse(threeList[0]); yanlingComposeDataVo vo_3 = new yanlingComposeDataVo(); vo_3.composeId = composeId; vo_3.isShow = false; if (count >= 3) { vo_3.isShow = true; } vo_3.attr = (EHeroAddProperties)attrType_3; vo_3.desc = mo.three_desc; vo_3.attrName = mo.name; vo_3.type = int.Parse(threeList[1]); vo_3.val = int.Parse(threeList[2]); list.Add(vo_3); return list; } } public string yanlingComseName { get { if (this.hero_yanlingComposeAttr.Count == 0) { return ""; } if (this.hero_yanlingComposeAttr[0].composeId == 0) { return ""; } sm_yanling_compose mo = GameConfigData.Ins.Getyanling_composeMo(this.hero_yanlingComposeAttr[0].composeId); if (mo == null) { return ""; } return mo.name; } } #endregion #region 过时 /// /// 英雄锁定状态() /// true= 被锁定 /// false = 未锁定 /// [Obsolete("")] public bool isLocked { get; set; } /// /// 当前等阶 默认是0--------这个应该是废弃的-----2022-7-13最新注释:这个字段最开始应该是星级,后来升星功能改变用curStar字段了 /// 这个字段是废弃的 /// 0 1 2 3 4 5 /// 绿 蓝 红 紫 橙 /// [Obsolete("新规划只有等级和等阶两个强化 维度 ")] public int strengthLevel { get; set; } /// /// //升星 /// 当前星级 默认是0星 /// public int curStar { get; set; } /// /// 默认的当前神血等级 /// 默认是0 /// 最大是9 ~~~ /// [Obsolete("新规划只有等级和等阶两个强化 维度 ")] public int curBloodId { get; set; } /// /// 当前星级限制的等级 /// public int starLimitLv { get { sm_heroextra_level_tupo mo = sm_heroextra_level_tupo.GetMoById(int.Parse(this.typeId), this.curStar); if (mo == null) { return 0; } return mo.promoteLv; } } /// /// 突破的玩家等级限制 /// public int userLimitLv { get { if (this.curStar >= 5) { return 0; } sm_heroextra_level_tupo mo = sm_heroextra_level_tupo.GetMoById(int.Parse(this.typeId), this.curStar + 1); return mo.userlvLimit; } } /// /// 是不是升级按钮 true:是 /// public bool isUpgrade { get { if (this.curStar >= 5) { return true; } //&& UserProxy.Instance.player.baseInfo.level >= sm_heroextra_level_tupo.GetMoById(int.Parse(this.typeId), this.curStar + 1).userlvLimit if (this.level >= this.starLimitLv) { return false; } return true; } } /// /// 消耗的道具----突破 /// public List costItem_tupo { get { List list = new List(); if (this.curStar >= 5) { return list; } sm_heroextra_level_tupo mo = sm_heroextra_level_tupo.GetMoById(int.Parse(this.typeId), this.curStar + 1); string[] sList = mo.costItems.Split(';'); foreach (string item in sList) { string[] str = item.Split(','); ItemVo vo = new ItemVo(); vo.typeId = str[0]; vo.count = int.Parse(str[1]); list.Add(vo); } ItemVo itVo = new ItemVo(); itVo.typeId = mo.segID.ToString(); itVo.count = mo.segNum; list.Add(itVo); return list; } } /// /// 升级消耗道具 /// public List costItem_up { get { List list = new List(); Dictionary item_stonesMo = GameConfigData.Ins.item_stones; Dictionary cDic = UserProxy.Instance.player.collectItem.collectItemDic; foreach (KeyValuePair kv in item_stonesMo) { if (cDic.ContainsKey(kv.Key.ToString())) { list.Add(cDic[kv.Key.ToString()]); } } return list; } } /// /// 当前金币值 /// public int curGold { get { return UserProxy.Instance.player.baseInfo.gold; } } /// /// 突破需要的金币 /// public int costGold_tupo { get { if (this.curStar >= 5) { return 0; } sm_heroextra_level_tupo mo = sm_heroextra_level_tupo.GetMoById(int.Parse(this.typeId), this.curStar + 1); return mo.gold; } } /// /// 唤灵师星级限制的等级下的经验最大值 /// public int lvLimitMaxExp { get { Dictionary hero_levelexp = GameConfigData.Ins.hero_levelexp; int n = 0; foreach (KeyValuePair kv in hero_levelexp) { if (kv.Key <= this.level) { continue; } n += kv.Value.needExp; if (kv.Key > this.starLimitLv) { break; } } return n; } } #endregion #region 新增 方法 /// /// 英雄增加经验 /// /// /// public int AddExp(int add) { var maxLevel = GlobalParameter.Instance.Hero_Upgrade_BasicMaxLevel; // 最大等级 if (this.level >= maxLevel) { return 0; // 已达顶级 } var lvMo = GameConfigData.Ins.Gethero_levelexpMo(this.level + 1); this.xp += add; Debug.Assert(this.xp >= 0, "[" + this.uid + "] : HeroExp is negative!"); while (this.xp >= lvMo.needExp) { if (this.level < maxLevel) { // 如果未到达最大等级 //var nextlv = this.level + 1; this.level += 1; if (this.level >= maxLevel) { this.xp = lvMo.needExp; } else { this.xp -= lvMo.needExp; } //this.maxXp = lvMo.needExp; lvMo = GameConfigData.Ins.Gethero_levelexpMo(this.level + 1); } else { // 如果已到达最大等级则仅补齐缺失的经验即可 this.xp = this.maxXp; // 经验不能超过最大值 break; } } return this.xp; } /// /// 克隆方法 /// /// public GameHeroVo Clone() { return (GameHeroVo)this.MemberwiseClone(); } /// /// 是否已经拥有(解锁)此英雄 /// public bool IsOwned { get { return (!string.IsNullOrWhiteSpace(this.uid) && int.Parse(this.uid) > 0); // 拥有实例id代表已经拥有此英雄 } } #region undone: 装备、言灵 /// /// 获取英雄装备的武器信息(待补完) /// /// public HeroGameVo_Equip GetWeapon() { return this.equips["weapon"]; //// todo: 待武器模块补完后, 修补这里. --wg 2019年12月4日13:50:40 //return null; } /// /// 获取已经装备的言灵信息 /// public void GetYanlingInfo() { // todo: 待言灵模块添加后, 修补这里. --王刚 2019年12月4日 } #endregion #region 升级与进阶 /// /// 废弃 /// public sm_heroextra_level mo_Grade_cur { get { return sm_heroextra_level.GetMoById(this.mo.heroId, this.grade); } } public string nextGrade { get { var cur = (EHeroQuality)Enum.Parse(typeof(EHeroQuality), this.grade); return (cur + 1).ToString(); } } public sm_heroextra_level nextGradeMo { get { return sm_heroextra_level.GetMoById(this.mo.heroId, this.nextGrade); } } /// /// 下一等级 /// public int nextLevel { get { var next = this.level + 1; if (next > sm_hero_levelexp.GetMaxLevel()) // 最大等级校验 -wg 2019年12月4日17:26:19 { next = sm_hero_levelexp.GetMaxLevel(); } return next; } } public sm_hero_levelexp mo_HeroLevelExp_cur { get { return sm_hero_levelexp.GetMoById(this.level); } } public sm_hero_levelexp mo_HeroLevelExp_next { get { return sm_hero_levelexp.GetMoById(this.nextLevel); } } /// /// 想要升阶还需再获得多少个碎片 /// public int upGradeNeedMoreSegments { get { if (this.grade == "S") { return 0; // 已经达到顶级 } var needNum = this.NextGradeRequireSegNumber - HasSegNub; return needNum > 0 ? needNum : 0; } } /// /// 拥有碎片数量 /// public int HasSegNub { get { return UserProxy.Instance.player.collectItem.GetItemCount(this.mo_segment.typeId.ToString()); } } /// /// 进阶到下一阶要求的碎片数量 /// public int NextGradeRequireSegNumber { get { return this.nextGradeMo.segNum; } } /// /// 对应的碎片mo /// public sm_item_base mo_segment { get { var seg = sm_item_segment.GetMoByHeroId(int.Parse(this.typeId)); return sm_item_base.GetMoById(seg.typeId); } } /// /// 碎片图标 /// public string SegmentIcon { get { return mo_segment.icon; } } #endregion #endregion #region 方法 // todo: 下面的代码尚未整理 -wg 2019年12月4日 /// /// 根据查询的技能类型,获取该类型技能对应的等级信息 /// /// "normalSkill","manuSkill1","manuSkill2","passiveSkill", /// [Obsolete("2019年12月31日", true)] public int GetSkillLevel(string skillType) { int level = 1; if (skillDic.ContainsKey(skillType)) { level = skillDic[skillType]; } return level; } /// /// 获取该角色战斗力数值 /// 生命值+物理攻击*4+魔法强度*4+护甲*5+魔抗*5 /// /// public int GetPower() { return (int)(getHpForBattle() * 1.0f + getNengLiangZhiJiForBattle() * 0 + getWuLiGongJiForBattle() * 4 + getFaShuQiangDuForBattle() * 4 + getFangYuHuJiaForBattle() * 5 + getMoFaKangXingForBattle() * 5 ); } /// /// 获得角色装备的 物品提供的属性加成 /// /// /// protected float getEquipExtraProperty(EHeroProperties attribute) { float result = 0; if (this.equips.Count == 0) { return result; } Player player = UserProxy.Instance.player; foreach (string key in equips.Keys) { HeroGameVo_Equip vo = equips[key]; if (player.collectEquip.equipments.ContainsKey(int.Parse(vo.equipItemUID))) { Dictionary baseAttr = player.collectEquip.equipments[int.Parse(vo.equipItemUID)].baseAttr; if (baseAttr.ContainsKey(attribute)) { result += baseAttr[attribute]; } } } return result; #region /* if (!IsMyOwnerHero) { foreach (string key in equips.Keys) { //todo: 这两处, 通过itemId去Ref里面查找实例,计算加成. HeroGameVo_Equip vo = equips[key]; if (EquipRef.equipments.ContainsKey(int.Parse(vo.equipItemUID))) { ItemVo item = EquipRef.equipments[int.Parse(vo.equipItemUID)]; var wp = item.nMo.GetWeaponExt(); switch (attribute) { case EHeroProperties.WULIGONGJI: result += wp.phyAtk; break; case EHeroProperties.FASHUQIANGDU: result += wp.fashuqiangdu; break; case EHeroProperties.CRICITAL: result += wp.crit; break; } } } } else { Player player = UserProxy.Instance.player; foreach (string key in equips.Keys) { HeroGameVo_Equip vo = equips[key]; if (player.collectEquip.equipments.ContainsKey(int.Parse(vo.equipItemUID))) { ItemVo item = player.collectEquip.equipments[int.Parse(vo.equipItemUID)]; var wp = item.nMo.GetWeaponExt(); switch (attribute) { case EHeroProperties.WULIGONGJI: result += wp.phyAtk; break; case EHeroProperties.FASHUQIANGDU: result += wp.fashuqiangdu; break; case EHeroProperties.CRICITAL: result += wp.crit; break; } } } } return result; */ #endregion } /// /// 获得角色装备的言灵提供的属性加成 /// /// /// protected float getYanlingExtraProperty(EHeroProperties attribute) { float result = 0; if (this.hero_yanling.Count == 0) { return result; } foreach (KeyValuePair kv in this.hero_yanling) { if (kv.Value.typeId != null) { Dictionary baseAttr = kv.Value.baseAttr; if (baseAttr.ContainsKey(attribute)) { int baseNum = baseAttr[attribute]; Dictionary rAttr = kv.Value.randAttr; Dictionary gRandAttr = kv.Value.gemrRandAttr; List ylComposeAttr = kv.Value.yanlingComposeAttr; int attr = (int)attribute; int add = 0; if (rAttr.ContainsKey((EHeroAddProperties)attr)) { add += rAttr[(EHeroAddProperties)attr]; } if (gRandAttr.ContainsKey((EHeroAddProperties)attr)) { add += gRandAttr[(EHeroAddProperties)attr]; } if (ylComposeAttr.Count != 0) { foreach (yanlingComposeDataVo vo in ylComposeAttr) { if (vo.isShow == false) { continue; } if (vo.attr == (EHeroAddProperties)attr) { add += vo.val; } } } result += 1.0f * add / 100 * baseNum + baseNum; } } } return result; #region /* if (IsMyOwnerHero) { foreach (var yl in this.yanling) { if (yl.Value != null && yl.Value.itemuid > 0) // 判断是否装备了言灵 { var mo = yl.Value.Mo().GetYanlingExt(); if (mo != null) { switch (attribute) { case EHeroProperties.HP: result += mo.TrueHp; break; case EHeroProperties.WULIGONGJI: result += mo.TruePhyAtk; break; case EHeroProperties.FASHUQIANGDU: result += mo.TrueFashuqiangdu; break; case EHeroProperties.CRICITAL: result += mo.TrueCrit; break; case EHeroProperties.FANGYUHUJIA: result += mo.TruePhyDef; break; case EHeroProperties.MOFAKANGXING: result += mo.TrueMofakangxing; break; default: break; } } } } } else { // 非玩家数据,暂定为空 foreach (var yl in this.yanling) { if (yl.Value.itemuid > 0) // 判断是否装备了言灵 { var itemId = yl.Value.typeId; var mo = sm_item_base.GetMoById(itemId).GetYanlingExt(); if (mo != null) { switch (attribute) { case EHeroProperties.HP: result += mo.TrueHp; break; case EHeroProperties.WULIGONGJI: result += mo.TruePhyAtk; break; case EHeroProperties.FASHUQIANGDU: result += mo.TrueFashuqiangdu; break; case EHeroProperties.CRICITAL: result += mo.TrueCrit; break; case EHeroProperties.FANGYUHUJIA: result += mo.TruePhyDef; break; case EHeroProperties.MOFAKANGXING: result += mo.TrueMofakangxing; break; default: break; } } } } } return result; */ #endregion } /// /// 血量 /// /// protected float getHp() { return HeroProxy.Instance.getHeroProperty(typeId, EHeroProperties.HP, level, grade); } /// /// 言能 /// /// public float getNengLiangZhi() { return HeroProxy.Instance.getHeroProperty(typeId, EHeroProperties.NENGLIANGZHI, level, grade); } /// /// 言攻 /// /// protected float getFaShuQiangDu() { return HeroProxy.Instance.getHeroProperty(typeId, EHeroProperties.FASHUQIANGDU, level, grade); } /// /// 言抗 /// /// protected float getMoFaKangXing() { return HeroProxy.Instance.getHeroProperty(typeId, EHeroProperties.MOFAKANGXING, level, grade); } /// /// 物攻 /// /// protected float getWuLiGongJi() { return HeroProxy.Instance.getHeroProperty(typeId, EHeroProperties.WULIGONGJI, level, grade); } /// /// 物抗 /// /// protected float getFangYuHuJia() { return HeroProxy.Instance.getHeroProperty(typeId, EHeroProperties.FANGYUHUJIA, level, grade); } /// /// 暴击 /// /// protected float getCritical() { return HeroProxy.Instance.getHeroProperty(typeId, EHeroProperties.CRICITAL, level, grade); } [Obsolete("去掉攻速了-2019年12月4日")] protected float getGongJiSuDu() { return HeroProxy.Instance.getHeroProperty(typeId, EHeroProperties.GONGJISUDU, level, grade); } protected float getKangbaoji() { return HeroProxy.Instance.getHeroProperty(typeId, EHeroProperties.KANGBAOJI, level, grade); } protected float getYanli() { return HeroProxy.Instance.getHeroProperty(typeId, EHeroProperties.YANLI, level, grade); } #region 战斗战斗 为战斗提供的人物的属性数值 基础属性 * 升级加成 + 升星加成 + 升阶加成 + 装备加成 + 言灵加成 、、、 /* 2019年12月4日 大概公式: 基础值*等级加成 + 武器加成 + 言灵加成 后面补完. */ /// /// 当前的属性值 【2022-1-19】 /// /// public int getHpForBattle() { //基础值+ 升级给的加成+ return (int)(getHp() // 英雄数据 + getEquipExtraProperty(EHeroProperties.HP) // 武器数据 + getYanlingExtraProperty(EHeroProperties.HP) ); // 言灵数据 } /// /// 角色突破升星时当前的属性---2022-7-13修改 /// /// public float getHpForBattle_PrimaryGrade() { return this.getHp(); // 言灵数据 } /// /// 突破后的唤灵师的属性 /// /// public float getHpForBattle_NextGrade() { string gradeNew = "S"; if (this.curStar < 5) { gradeNew = sm_heroextra_level_tupo.GetMoById(int.Parse(this.typeId), this.curStar + 1).quality; } return HeroProxy.Instance.getHeroProperty(typeId, EHeroProperties.HP, this.level, gradeNew); ////基础值+ 升级给的加成+ //return (int)(heroAr // 英雄数据 // + getEquipExtraProperty(EHeroProperties.HP) // 武器数据 // + getYanlingExtraProperty(EHeroProperties.HP) // ); // 言灵数据 } public int getNengLiangZhiJiForBattle() { return (int)(getNengLiangZhi() // 英雄本身 + getEquipExtraProperty(EHeroProperties.NENGLIANGZHI) // + 武器加成 + getYanlingExtraProperty(EHeroProperties.NENGLIANGZHI) // + 言灵加成 ); } public float getNengliangzhi_PrimaryGrade() { return this.getNengLiangZhi(); } /// /// 突破后的唤灵师的属性 /// /// public float getNengliangzhiForBattle_NextGrade() { string gradeNew = "S"; if (this.curStar < 5) { gradeNew = sm_heroextra_level_tupo.GetMoById(int.Parse(this.typeId), this.curStar + 1).quality; } return HeroProxy.Instance.getHeroProperty(typeId, EHeroProperties.NENGLIANGZHI, this.level, gradeNew); //return (int)(heroAr // 英雄数据 // + getEquipExtraProperty(EHeroProperties.NENGLIANGZHI) // 武器数据 // + getYanlingExtraProperty(EHeroProperties.NENGLIANGZHI) // ); } /// /// 当前唤灵师属性 /// /// public int getWuLiGongJiForBattle() { return (int)(getWuLiGongJi() + getEquipExtraProperty(EHeroProperties.WULIGONGJI) + getYanlingExtraProperty(EHeroProperties.WULIGONGJI) ); } public float getWuLiGongJiForBattle_PrimaryGrade() { return this.getWuLiGongJi(); } /// /// 突破后的唤灵师的属性 /// /// public float getWuLiGongJiForBattle_NextGrade() { string gradeNew = "S"; if (this.curStar < 5) { gradeNew = sm_heroextra_level_tupo.GetMoById(int.Parse(this.typeId), this.curStar + 1).quality; } return HeroProxy.Instance.getHeroProperty(typeId, EHeroProperties.WULIGONGJI, this.level, gradeNew); //return (int)(heroAr // 英雄数据 // + getEquipExtraProperty(EHeroProperties.WULIGONGJI) // 武器数据 // + getYanlingExtraProperty(EHeroProperties.WULIGONGJI) // ); } public int getFaShuQiangDuForBattle() { return (int)(getFaShuQiangDu() + getEquipExtraProperty(EHeroProperties.FASHUQIANGDU) + getYanlingExtraProperty(EHeroProperties.FASHUQIANGDU) ); } public float getFaShuQiangDuForBattle_PrimaryGrade() { return this.getFaShuQiangDu(); } public float getFaShuQiangDuForBattle_NextGrade() { string gradeNew = "S"; if (this.curStar < 5) { gradeNew = sm_heroextra_level_tupo.GetMoById(int.Parse(this.typeId), this.curStar + 1).quality; } return HeroProxy.Instance.getHeroProperty(typeId, EHeroProperties.FASHUQIANGDU, level, gradeNew); //return (int)(heroAr // + getEquipExtraProperty(EHeroProperties.FASHUQIANGDU) // + getYanlingExtraProperty(EHeroProperties.FASHUQIANGDU) // ); } public int getMoFaKangXingForBattle() { return (int)(getMoFaKangXing() + getEquipExtraProperty(EHeroProperties.MOFAKANGXING) + getYanlingExtraProperty(EHeroProperties.MOFAKANGXING) ); } public float getMoFaKangXingForBattle_PrimaryGrade() { return this.getMoFaKangXing(); } public float getMoFaKangXingForBattle_NextGrade() { string gradeNew = "S"; if (this.curStar < 5) { gradeNew = sm_heroextra_level_tupo.GetMoById(int.Parse(this.typeId), this.curStar + 1).quality; } return HeroProxy.Instance.getHeroProperty(typeId, EHeroProperties.MOFAKANGXING, level, gradeNew); } /// /// 当前唤灵师属性 /// /// public int getFangYuHuJiaForBattle() { return (int)(getFangYuHuJia() + getEquipExtraProperty(EHeroProperties.FANGYUHUJIA) + getYanlingExtraProperty(EHeroProperties.FANGYUHUJIA) ); } public float getFangYuHuJiaForBattle_PrimaryGrade() { return this.getFangYuHuJia(); } /// /// 突破后的唤灵师属性 /// /// public float getFangYuHuJiaForBattle_NextGrade() { string gradeNew = "S"; if (this.curStar < 5) { gradeNew = sm_heroextra_level_tupo.GetMoById(int.Parse(this.typeId), this.curStar + 1).quality; } return HeroProxy.Instance.getHeroProperty(typeId, EHeroProperties.FANGYUHUJIA, level, gradeNew); //return (int)(heroAr // + getEquipExtraProperty(EHeroProperties.FANGYUHUJIA) // + getYanlingExtraProperty(EHeroProperties.FANGYUHUJIA) // ); } [Obsolete("取消攻速了")] public float getGongJiSuDuForBattle() { return (getGongJiSuDu() + getEquipExtraProperty(EHeroProperties.GONGJISUDU)); } /// /// 暴击 /// /// public int getCriticalForBattle() { Debug.Log("基础暴击:" + getCritical()); Debug.Log("武器暴击:" + getEquipExtraProperty(EHeroProperties.CRICITAL)); Debug.Log("言灵暴击:" + getYanlingExtraProperty(EHeroProperties.CRICITAL)); return (int)(getCritical() + getEquipExtraProperty(EHeroProperties.CRICITAL) + getYanlingExtraProperty(EHeroProperties.CRICITAL) ); } public float getCriticalForBattle_PrimaryGrade() { return this.getCritical(); } public float getCriticalForBattle_NextGrade() { string gradeNew = "S"; if (this.curStar < 5) { gradeNew = sm_heroextra_level_tupo.GetMoById(int.Parse(this.typeId), this.curStar + 1).quality; } return HeroProxy.Instance.getHeroProperty(typeId, EHeroProperties.CRICITAL, level, gradeNew); //return (int)(heroAr // + getEquipExtraProperty(EHeroProperties.CRICITAL) // + getYanlingExtraProperty(EHeroProperties.CRICITAL) // ); } public int getKangbaojiForBattle() { return (int)(getKangbaoji() //+ getEquipExtraProperty(EHeroProperties.KANGBAOJI)//武器没有抗暴击 + getYanlingExtraProperty(EHeroProperties.KANGBAOJI) ); } public float getKangbaojiForBattle_PrimaryGrade() { return this.getKangbaoji(); } public float getKangbaojiForBattle_NextGrade() { string gradeNew = "S"; if (this.curStar < 5) { gradeNew = sm_heroextra_level_tupo.GetMoById(int.Parse(this.typeId), this.curStar + 1).quality; } return HeroProxy.Instance.getHeroProperty(typeId, EHeroProperties.KANGBAOJI, level, gradeNew); //return (int)(heroAr // + getYanlingExtraProperty(EHeroProperties.KANGBAOJI) // ); } public int getYanliForBattle() { return (int)(getYanli() + getEquipExtraProperty(EHeroProperties.YANLI) + getYanlingExtraProperty(EHeroProperties.YANLI) ); } public float getYanliForBattle_PrimaryGrade() { return this.getYanli(); } public float getYanliForBattle_NextGrade() { string gradeNew = "S"; if (this.curStar < 5) { gradeNew = sm_heroextra_level_tupo.GetMoById(int.Parse(this.typeId), this.curStar + 1).quality; } return HeroProxy.Instance.getHeroProperty(typeId, EHeroProperties.YANLI, level, gradeNew); //return (int)(heroAr // +getEquipExtraProperty(EHeroProperties.YANLI) // + getYanlingExtraProperty(EHeroProperties.YANLI) // ); } /// /// 获取暴击率(战斗中使用)(2020.6.3) /// /// public float getCriticalRatioInBattle() { return this.getCriticalForBattle() / (75 + level * 5); } #endregion /// /// 获取唤灵师下所有言灵的属性信息 /// public Dictionary GetYanLingBaseAttr { get { Dictionary dic = new Dictionary(); if (this.yanling.Count <= 0) { return dic; } Dictionary items = UserProxy.Instance.player.collectYanling.items; int hp = 0; int crit = 0; int phyAtk = 0; int phyDef = 0; int atkSpeed = 0; int fashuqiangdu = 0; int mofakangxing = 0; foreach (KeyValuePair kv in this.yanling) { if (!items.ContainsKey(kv.Value.itemuid)) { continue; } Dictionary baseAttr = items[kv.Value.itemuid].baseAttr; if (baseAttr.ContainsKey(EHeroProperties.HP)) { hp += baseAttr[EHeroProperties.HP]; } if (baseAttr.ContainsKey(EHeroProperties.CRICITAL)) { crit += baseAttr[EHeroProperties.CRICITAL]; } if (baseAttr.ContainsKey(EHeroProperties.WULIGONGJI)) { phyAtk += baseAttr[EHeroProperties.WULIGONGJI]; } if (baseAttr.ContainsKey(EHeroProperties.FANGYUHUJIA)) { phyDef += baseAttr[EHeroProperties.FANGYUHUJIA]; } if (baseAttr.ContainsKey(EHeroProperties.ATKSPEED)) { atkSpeed += baseAttr[EHeroProperties.ATKSPEED]; } if (baseAttr.ContainsKey(EHeroProperties.FASHUQIANGDU)) { fashuqiangdu += baseAttr[EHeroProperties.FASHUQIANGDU]; } if (baseAttr.ContainsKey(EHeroProperties.MOFAKANGXING)) { mofakangxing += baseAttr[EHeroProperties.MOFAKANGXING]; } } if (hp != 0) { dic[EHeroProperties.HP] = hp; } if (crit != 0) { dic[EHeroProperties.CRICITAL] = crit; } if (phyAtk != 0) { dic[EHeroProperties.WULIGONGJI] = phyAtk; } if (phyDef != 0) { dic[EHeroProperties.FANGYUHUJIA] = phyDef; } if (atkSpeed != 0) { dic[EHeroProperties.ATKSPEED] = atkSpeed; } if (fashuqiangdu != 0) { dic[EHeroProperties.FASHUQIANGDU] = fashuqiangdu; } if (mofakangxing != 0) { dic[EHeroProperties.MOFAKANGXING] = mofakangxing; } return dic; } } /// /// 获取唤灵师下所有言灵的随机属性 /// public Dictionary GetYanLingRandAttr { get { Dictionary dic = new Dictionary(); if (this.yanling.Count <= 0) { return dic; } Dictionary items = UserProxy.Instance.player.collectYanling.items; int hp = 0; int manaUpperlimit = 0; int phyDamage = 0; int magDamage = 0; int phyDefend = 0; int magDefend = 0; int phyDamagereduce = 0; int magDamagereduce = 0; int additional_monsterExp = 0; int additional_atkSpeed = 0; int additional_moveSpeed = 0; int additional_critProbability = 0; int additional_critDamage = 0; int skillCoolTs = 0; foreach (KeyValuePair kv in this.yanling) { if (!items.ContainsKey(kv.Value.itemuid)) { continue; } Dictionary randAttr = items[kv.Value.itemuid].randAttr; if (randAttr.ContainsKey(EHeroAddProperties.additional_hpUpperlimit)) { hp += randAttr[EHeroAddProperties.additional_hpUpperlimit]; } if (randAttr.ContainsKey(EHeroAddProperties.additional_manaUpperlimit)) { manaUpperlimit += randAttr[EHeroAddProperties.additional_manaUpperlimit]; } if (randAttr.ContainsKey(EHeroAddProperties.additional_phyDamage)) { phyDamage += randAttr[EHeroAddProperties.additional_phyDamage]; } if (randAttr.ContainsKey(EHeroAddProperties.additional_magDamage)) { magDamage += randAttr[EHeroAddProperties.additional_magDamage]; } if (randAttr.ContainsKey(EHeroAddProperties.additional_phyDefend)) { phyDefend += randAttr[EHeroAddProperties.additional_phyDefend]; } if (randAttr.ContainsKey(EHeroAddProperties.additional_magDefend)) { magDefend += randAttr[EHeroAddProperties.additional_magDefend]; } if (randAttr.ContainsKey(EHeroAddProperties.additional_phyDamagereduce)) { phyDamagereduce += randAttr[EHeroAddProperties.additional_phyDamagereduce]; } if (randAttr.ContainsKey(EHeroAddProperties.additional_magDamagereduce)) { magDamagereduce += randAttr[EHeroAddProperties.additional_magDamagereduce]; } if (randAttr.ContainsKey(EHeroAddProperties.additional_monsterExp)) { additional_monsterExp += randAttr[EHeroAddProperties.additional_monsterExp]; } if (randAttr.ContainsKey(EHeroAddProperties.additional_atkSpeed)) { additional_atkSpeed += randAttr[EHeroAddProperties.additional_atkSpeed]; } if (randAttr.ContainsKey(EHeroAddProperties.additional_moveSpeed)) { additional_moveSpeed += randAttr[EHeroAddProperties.additional_moveSpeed]; } if (randAttr.ContainsKey(EHeroAddProperties.additional_critProbability)) { additional_critProbability += randAttr[EHeroAddProperties.additional_critProbability]; } if (randAttr.ContainsKey(EHeroAddProperties.additional_critDamage)) { additional_critDamage += randAttr[EHeroAddProperties.additional_critDamage]; } if (randAttr.ContainsKey(EHeroAddProperties.skillCoolTs)) { additional_critDamage += randAttr[EHeroAddProperties.skillCoolTs]; } } if (hp != 0) { dic[EHeroAddProperties.additional_hpUpperlimit] = hp; } if (manaUpperlimit != 0) { dic[EHeroAddProperties.additional_manaUpperlimit] = manaUpperlimit; } if (phyDamage != 0) { dic[EHeroAddProperties.additional_phyDamage] = phyDamage; } if (magDamage != 0) { dic[EHeroAddProperties.additional_magDamage] = magDamage; } if (phyDefend != 0) { dic[EHeroAddProperties.additional_phyDefend] = phyDefend; } if (magDefend != 0) { dic[EHeroAddProperties.additional_magDefend] = magDefend; } if (phyDamagereduce != 0) { dic[EHeroAddProperties.additional_phyDamagereduce] = phyDamagereduce; } if (magDamagereduce != 0) { dic[EHeroAddProperties.additional_magDamagereduce] = magDamagereduce; } if (additional_monsterExp != 0) { dic[EHeroAddProperties.additional_monsterExp] = additional_monsterExp; } if (additional_atkSpeed != 0) { dic[EHeroAddProperties.additional_atkSpeed] = additional_atkSpeed; } if (additional_moveSpeed != 0) { dic[EHeroAddProperties.additional_moveSpeed] = additional_moveSpeed; } if (additional_critProbability != 0) { dic[EHeroAddProperties.additional_critProbability] = additional_critProbability; } if (additional_critDamage != 0) { dic[EHeroAddProperties.additional_critDamage] = additional_critDamage; } if (skillCoolTs != 0) { dic[EHeroAddProperties.skillCoolTs] = skillCoolTs; } return dic; } } public void ReloadData(GameHeroVo from) { var tp = typeof(GameHeroVo); var pps = tp.GetProperties(); foreach (var p in pps) { if (p.CanWrite) { p.SetValue(this, p.GetValue(from)); } } } #endregion } /// /// 英雄品阶枚举 /// public enum EHeroQuality { D = 1, C = 2, B = 3, A = 4, S = 5 } /// /// 英雄属性 /// public enum EHeroProperties { /// /// 生命值 /// HP, /// /// 能量值 /// NENGLIANGZHI, /// /// 物理攻击 /// WULIGONGJI, /// /// 防御护甲 /// FANGYUHUJIA, /// /// 敏捷---废弃 /// GONGJISUDU, /// /// 暴击 /// CRICITAL, /// /// 法术强度 /// FASHUQIANGDU, /// /// 魔法抗性 /// MOFAKANGXING, /// ///攻击速度--废弃 /// ATKSPEED, /// /// 抗暴击 /// KANGBAOJI, /// /// 言力 /// YANLI, } /// /// 随机属性 /// public enum EHeroAddProperties { /// /// 生命上限加成 /// additional_hpUpperlimit, /// /// 言能上限加成 /// additional_manaUpperlimit, /// /// 物攻伤害加成 /// additional_phyDamage, /// /// 护甲加成 /// additional_phyDefend, /// /// 敏捷 /// additional_moveSpeed, /// /// 暴击伤害加成 /// additional_critDamage, /// /// 言攻伤害加成 /// additional_magDamage, /// /// 言抗加成 /// additional_magDefend, /// /// 攻击速度加成 /// additional_atkSpeed, /// /// 物伤减免加成 /// additional_phyDamagereduce, /// /// 言伤减免加成 /// additional_magDamagereduce, /// ///怪物经验加成 /// additional_monsterExp, /// /// 暴击几率加成 /// additional_critProbability, /// /// 冷却时间 /// skillCoolTs, } public class PropertiesComparison : Singleton { public static Dictionary Comparison = new Dictionary { { EHeroAddProperties.additional_hpUpperlimit,"生命上限"}, { EHeroAddProperties.additional_manaUpperlimit,"言能上限"}, { EHeroAddProperties.additional_phyDamage,"物攻伤害"}, { EHeroAddProperties.additional_magDamage,"言攻伤害"}, { EHeroAddProperties.additional_phyDefend,"护甲加成"}, { EHeroAddProperties.additional_magDefend,"言抗加成"}, { EHeroAddProperties.additional_phyDamagereduce,"物伤减免"}, { EHeroAddProperties.additional_magDamagereduce,"言伤减免"}, { EHeroAddProperties.additional_monsterExp,"经验加成"}, { EHeroAddProperties.additional_atkSpeed,"攻击速度"}, { EHeroAddProperties.additional_moveSpeed,"移动速度"}, { EHeroAddProperties.additional_critProbability,"暴击几率"}, { EHeroAddProperties.additional_critDamage,"暴击伤害"}, { EHeroAddProperties.skillCoolTs,"冷却时间"}, }; } /// /// 英雄的职业类别 /// public enum HeroZhiye { 战士 = 1, //防 法师 = 2, 辅助 = 3, //辅 坦克 = 4, //突 刺客 = 5, //攻 } /// /// 英雄的所属元素元素类型//0 空的//1 金 //2 冰 //3 火 //4 风 //5 雷 //6 毒 //7 黑暗 //8 亡灵 // 9 物理 /// public enum HeroYuansu { 金系 = 1, 冰系 = 2, 火系 = 3, 风系 = 4, 雷系 = 5, 毒系 = 6, 黑暗系 = 7, 亡灵系 = 8, 物理系 = 9, } /// /// 英雄自身的装备数据 /// public class HeroGameVo_Equip { /// /// 装备的类型 /// public string equipType { get; set; } /// /// 装备的物品UID /// public string equipItemUID { get; set; } /// /// 物品类型 /// public int typeId { get { var player = UserProxy.Instance.player; var uid = int.Parse(this.equipItemUID); if (player.collectEquip.equipments.ContainsKey(uid)) { return int.Parse(player.collectEquip.equipments[uid].typeId); } return 0; } } /// /// 物品等级 /// public int level { get; set; } /// /// 获取装备的Mo(基础数据), 武器扩展数据请继续.GetWeaponExt(); /// /// public sm_item_base EquipMo() { return sm_item_base.GetMoById(this.typeId); } /// /// 把int隐式转换为HeroGameVo_Yanling对象 /// /// public static implicit operator HeroGameVo_Equip(int i) { return i > 0 ? new HeroGameVo_Equip() { equipItemUID = i.ToString() } : null; } /// /// 隐式转换为int值 /// /// public static implicit operator int(HeroGameVo_Equip o) { return int.Parse(o.equipItemUID); } } /// /// 英雄自身的言灵数据 /// public class HeroGameVo_Yanling { /// /// 言灵的实例唯一ID /// public int itemuid { get; set; } /// /// 当前能量值 /// public int sp_now { get; set; } /// /// 当前CD /// public float cd_now { get; set; } /// /// 物品类型 /// public int typeId; //{ private int getTypeIdFromUID() { var player = UserProxy.Instance.player; var uid = this.itemuid; if (player.collectYanling.items.ContainsKey(uid)) { return int.Parse(player.collectYanling.items[uid].typeId); } return 0; } //} /// /// 获取言灵的Mo(基础数据), 获取扩展数据请继续.GetYanlingExt(); /// /// public sm_item_base Mo() { return sm_item_base.GetMoById(this.typeId); } /// /// 把int隐式转换为HeroGameVo_Yanling对象 /// /// public static implicit operator HeroGameVo_Yanling(int i) { if (i > 0) { var p = UserProxy.Instance.player; var hvo = new HeroGameVo_Yanling() { itemuid = i }; hvo.typeId = hvo.getTypeIdFromUID(); return hvo; } return null; } /// /// 把int隐式转换为HeroGameVo_Yanling对象 /// /// public static implicit operator HeroGameVo_Yanling(long i) { if (i > 0) { var p = UserProxy.Instance.player; var hvo = new HeroGameVo_Yanling() { itemuid = (int)i }; hvo.typeId = hvo.getTypeIdFromUID(); return hvo; } return null; } /// /// 隐式转换为int值 /// /// public static implicit operator int(HeroGameVo_Yanling o) { return o.itemuid; } }