Ejemplo n.º 1
0
        public static void nonbattleUseHealSkillAction(UITeamMember uiTeamMember, CharacterInfoData attacker, List <CharacterInfoData> defender, int index, SkillData skill)
        {
            Heluo.Logger.LogError("nonbattleUseHealSkillAction start");

            //mp不足
            if (attacker.MP < skill.Item.RequestMP)
            {
                string text2 = Game.Data.Get <StringTable>("SecondaryInterface1207").Text;
                Game.UI.AddMessage(text2, UIPromptMessage.PromptType.Normal);
                return;
            }

            //最小距离大于0则不能给自己治疗
            if (selectSkill.Item.MinRange > 0 && defender[index] == attacker)
            {
                Game.UI.AddMessage("该技能不能给自己治疗", UIPromptMessage.PromptType.Normal);
                return;
            }

            //最大距离等于0则只能给自己治疗
            if (selectSkill.Item.MaxRange == 0 && defender[index] != attacker)
            {
                Game.UI.AddMessage("该技能只能给自己治疗", UIPromptMessage.PromptType.Normal);
                return;
            }


            //是否群体回复
            int startIndex = index;
            int endIndex   = index + 1;

            if (skill.Item.TargetArea == TargetArea.Fan || skill.Item.TargetArea == TargetArea.LineGroup || skill.Item.TargetArea == TargetArea.RingGroup)
            {
                startIndex = 0;
                endIndex   = defender.Count;
            }

            //所有加血对象是否已满血
            bool isAllFullHp = true;

            for (int i = startIndex; i < endIndex; i++)
            {
                if (defender[i].HP < defender[i].Property[CharacterProperty.Max_HP].Value)
                {
                    isAllFullHp = false;
                    break;
                }
            }
            if (isAllFullHp)
            {
                Game.UI.AddMessage("HP已满", UIPromptMessage.PromptType.Normal);
                return;
            }

            BattleComputer        battleComputer         = Singleton <BattleComputer> .Instance;
            BattleComputerFormula BattleComputerFormula  = Traverse.Create(battleComputer).Field("BattleComputerFormula").GetValue <BattleComputerFormula>();
            BattleFormulaProperty BattleComputerProperty = Traverse.Create(battleComputer).Field("BattleComputerProperty").GetValue <BattleFormulaProperty>();

            attacker.MP -= skill.Item.RequestMP;

            for (int i = startIndex; i < endIndex; i++)
            {
                //原代码用WuxiaUnit参与计算,涉及Grid格子数据,直接调用比较麻烦,所以我这边就把逻辑抄一遍
                //只留下和回复技能有关的数据(删来删去发现好像只剩下暴击了),如果有遗漏以后再补(真的会有人发现么)
                battleComputer.Initialize();

                AttachBattleComputerProperty(attacker, defender[i]);              //记录攻击者和防御者的属性

                float basic_damage = battleComputer.Calculate_Basic_Damage(true); //基础回复值


                float num = BattleComputerFormula["critical_rate"].Evaluate(BattleComputerProperty.GetDictionary());
                num = Mathf.Clamp(num, 0f, 100f);
                int  probability = UnityEngine.Random.Range(1, 100);;
                bool IsCritical  = probability <= num;//是否暴击


                float skill_coefficient = battleComputer.Calculate_Skill_Coefficient(skill);//技能倍率

                float num2 = IsCritical ? BattleComputerFormula["damage_coefficient_of_critical"].Evaluate(BattleComputerProperty.GetDictionary()) : 1f;

                float num7 = basic_damage * num2;

                int final_damage = 1;
                //实际上回血技能应该都是+倍率
                if (skill.Item.Algorithm == Algorithm.Addition)
                {
                    final_damage = (int)(num7 + skill_coefficient);
                }
                else
                {
                    final_damage = (int)(num7 * skill_coefficient);
                }

                if (selectSkill.Item.DamageType == DamageType.Heal)
                {
                    defender[i].HP += final_damage;
                }
                else if (selectSkill.Item.DamageType == DamageType.MpRecover)
                {
                    defender[i].MP += final_damage;
                }
            }


            //刷新左侧ui
            CtrlTeamMember controller = Traverse.Create(uiTeamMember).Field("controller").GetValue <CtrlTeamMember>();

            controller.OnShow();

            //刷新主界面角色信息
            homeController.UpdateCharacterProperty(true);

            Heluo.Logger.LogError("nonbattleUseHealSkillAction end");
        }
Ejemplo n.º 2
0
        //显示左侧队友UI
        public static void showUITeamMember(CharacterInfoData source, SkillData selectSkill)
        {
            Heluo.Logger.LogError("showUITeamMember start");
            //先销毁原UI
            if (uiTeamMember != null)
            {
                UnityEngine.Object.DestroyImmediate(uiTeamMember.gameObject);
            }

            //如果是恢复技能且伤害公式不为0
            if ((selectSkill.Item.DamageType == DamageType.Heal || selectSkill.Item.DamageType == DamageType.MpRecover) && selectSkill.Item.Damage != "nodamage" && selectSkill.Item.Damage != "0damage")
            {
                List <CharacterInfoData> list = new List <CharacterInfoData>();
                //暂时不做养成界面的非队友治疗,角色太多左边UI放不下,界面更新也麻烦
                //养成界面队伍中只有自己,但应该可以互相治疗

                /* if (Game.GameData.Round.CurrentStage == Heluo.Manager.TimeStage.Free)
                 * {
                 *   foreach (KeyValuePair<string,CommunityData> community in Game.GameData.Community)
                 *   {
                 *       CharacterInfoData target = Game.GameData.Character[community.Key];
                 *       list.Add(target);
                 *   }
                 * }
                 * //大地图的话只有队伍中能互相治疗
                 * else
                 * {*/
                //获得当前队友
                foreach (string text in Game.GameData.Party)
                {
                    CharacterInfoData target = Game.GameData.Character[text];
                    list.Add(target);
                }
                //}

                //如果当前角色不在队伍中则不能用恢复技能,防止远程治疗。如果是乖乖的回血技能则看锺若昕是否在队伍中
                if (!list.Contains(source) && (source.Id == "in91001" && !list.Contains(Game.GameData.Character["in0103"])))
                {
                    return;
                }


                //展示左侧的队友列表UI
                uiTeamMember = Game.UI.Open <UITeamMember>();

                //给每个队友的头像加上按钮和点击事件
                List <UITeamMemberInfo> infos = Traverse.Create(uiTeamMember).Field("infos").GetValue <List <UITeamMemberInfo> >();
                for (int i = 0; i < infos.Count; i++)
                {
                    GameObject buttonGO = new GameObject("buttonGO");
                    buttonGO.transform.SetParent(infos[i].Protrait.transform, false);
                    Button button = buttonGO.AddComponent <Button>();

                    //给按钮随便添加一个透明的图,否则没法点击
                    Image image = buttonGO.AddComponent <Image>();
                    image.sprite = Game.Resource.Load <Sprite>("Image/UI/UIAlchemy/alchemy_stove.png");
                    image.color  = new Color(255, 255, 255, 0);

                    int partyIndex = i;//临时变量存储,否则下一步addListener传不过去

                    button.onClick.AddListener(delegate {
                        nonbattleUseHealSkillAction(uiTeamMember, source, list, partyIndex, selectSkill);
                    });
                }
            }
            Heluo.Logger.LogError("showUITeamMember end");
        }