Ejemplo n.º 1
0
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Vector3 worldPos   = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            Vector2 unitVector = ((Vector2)worldPos - (Vector2)gameObject.transform.position).normalized;

            if (unitVector.y > m_fReagan)
            {
                SkillBox skillBox = m_skillBoxDic [Direction.Up];
                skillBox.UseSkill();
            }
            else if (unitVector.x > m_fReagan)
            {
                SkillBox skillBox = m_skillBoxDic [Direction.Right];
                skillBox.UseSkill();
            }
            else if (unitVector.y < -m_fReagan)
            {
                SkillBox skillBox = m_skillBoxDic [Direction.Down];
                skillBox.UseSkill();
            }
            else
            {
                SkillBox skillBox = m_skillBoxDic [Direction.Left];
                skillBox.UseSkill();
            }
        }
    }
Ejemplo n.º 2
0
    public void UpdateSkillLevel(Skill skillUpgraded)
    {
        SkillBox skillBoxUpgraded = findSkillInBoxes(skillUpgraded);

        if (skillBoxUpgraded)
        {
            skillBoxUpgraded.UpdateSkillLevel();
        }
    }
Ejemplo n.º 3
0
        public void SelectSkill(Key key)
        {
            char k = (key.ToString()[key.ToString().Length - 1]);

            if (_mapping.ContainsKey(k))
            {
                SkillBox s = _mapping[k];
                if (Callback != null)
                {
                    Callback(s);
                }
            }
        }
Ejemplo n.º 4
0
 void Start()
 {
     for (int i = 0; i < attackSideParent.childCount; i++)
     {
         SkillBox tmp = attackSideParent.GetChild(i).GetComponent <SkillBox>();
         if (tmp)
         {
             attackSkillBoxes.Add(tmp);
         }
     }
     for (int i = 0; i < defenseSideParent.childCount; i++)
     {
         SkillBox tmp = defenseSideParent.GetChild(i).GetComponent <SkillBox>();
         if (tmp)
         {
             defenseSkillBoxes.Add(tmp);
         }
     }
 }
Ejemplo n.º 5
0
    // Update is called once per frame
    void Update()
    {
        healthPercent      = health / maxHealth;
        barMask.localScale = new Vector3(healthPercent * maskOriginScale, maskYScale, 1);
        if (health <= 0)
        {
            if (EnemyDie == true)
            {
                return;
            }

            if (gameObject.tag == "King")
            {
                UIControl.Instance().SetGameOver(false);
            }

            //无尽模式刷新计分板
            if (gameObject.layer == 9)
            {
                UIControl.Instance().EnemyDeadScore();
            }


            SkillBox skillBox = this.GetComponentInParent <SkillBox>();
            if (skillBox != null)
            {
                skillBox.Relese();
            }

            if (gameObject.tag == "Player")
            {
                StartCoroutine(SoldierGoToHell());
            }
            else if (gameObject.tag == "Enemy")
            {
                StartCoroutine(EnemyGoToHell());
            }

            EnemyDie = true;
        }
    }
Ejemplo n.º 6
0
        public override void OnEnabled()
        {
            LandmarkSearchWindow = new PoiLookupWindow(this)
            {
                Parent   = GameService.Graphics.SpriteScreen,
                Location = GameService.Graphics.SpriteScreen.Size / new Point(2)
            };

            LandmarkSearch = new SkillBox()
            {
                Location = new Point(GameService.Graphics.WindowWidth / 4 * 1 - 30, 0),
                Icon     = GameService.Content.GetTexture("landmark-search-icon"),
                Parent   = GameService.Graphics.SpriteScreen,
                Menu     = new ContextMenuStrip(),
                Visible  = false
            };

            LandmarkSearch.Menu.AddMenuItem("Use small icon").Click += delegate {
                LandmarkSearch.Visible     = false;
                landmarkSearchIcon.Visible = true;
            };

            landmarkSearchIcon = new CornerIcon()
            {
                Icon             = GameService.Content.GetTexture("landmark-search"),
                HoverIcon        = GameService.Content.GetTexture("landmark-search-hover"),
                Menu             = new ContextMenuStrip(),
                BasicTooltipText = "Landmark Search",
                Priority         = 5,
            };

            landmarkSearchIcon.Menu.AddMenuItem("Use large icon").Click += delegate {
                LandmarkSearch.Visible     = true;
                landmarkSearchIcon.Visible = false;
            };

            landmarkSearchIcon.Click += delegate {
                LandmarkSearchWindow.ToggleWindow();
            };

            GameService.Graphics.SpriteScreen.Resized += delegate { LandmarkSearch.Location = new Point(GameService.Graphics.WindowWidth / 4 * 1 - 30, 0); };

            LandmarkSearch.LeftMouseButtonReleased += delegate {
                LandmarkSearchWindow.ToggleWindow();
            };

            var floorInfo = BHGw2Api.Floor.FloorFromContinentAndId(1, 1);

            if (floorInfo == null)
            {
                GameService.Debug.WriteWarningLine("PoiLookup: Could not load landmark information from API. Aborting.");
                return;
            }

            foreach (var region in floorInfo.Regions)
            {
                foreach (var map in region.Maps)
                {
                    foreach (var upoi in map.Landmarks)
                    {
                        if (upoi.Name?.Length > 0 && !PointsOfInterest.ContainsKey(upoi.Name))
                        {
                            PointsOfInterest.Add(upoi.Name, upoi);
                        }
                    }
                }
            }
        }
        private void AddSkill(SkillBox box, bool isEnable = true)
        {
            TextBlock skillButton = new TextBlock()
            {
                Text       = string.Format("{0}", box.Name),
                Foreground = null,
                FontSize   = 12,
                FontFamily = new FontFamily("SimHei")
            };

            if (box.StatusInfo != string.Empty)
            {
                ToolTipService.SetToolTip(skillButton, box.StatusInfo);
            }
            if (box.IsSwitchInternalSkill)
            {
                skillButton.Foreground = new SolidColorBrush(Colors.Purple);
            }
            else if (box.IsUnique)
            {
                skillButton.Foreground = new SolidColorBrush(Colors.Red);
            }
            else if (box.IsSpecial)
            {
                skillButton.Foreground = new SolidColorBrush(Colors.Cyan);
            }
            else
            {
                skillButton.Foreground = new SolidColorBrush(Colors.White);
            }

            if (box.Status == SkillStatus.Ok && isEnable)
            {
                skillButton.MouseLeftButtonUp += (s, e) =>
                {
                    Callback(box);
                };
            }
            else
            {
                skillButton.Opacity = 0.35;
            }
            skillButton.MouseEnter += (s, e) =>
            {
                skillButton.Foreground = new SolidColorBrush(Colors.Orange);

                skillinfo.Xaml = box.GenerateToolTip(false).Xaml.Replace("#FF000000", "#FFFFFFFF");     //将黑色的字变成白色的
                //skillinfo.Blocks.Add(box.GenerateToolTip().Blocks[0]);
            };
            skillButton.MouseLeave += (s, e) =>
            {
                if (box.IsSwitchInternalSkill)
                {
                    skillButton.Foreground = new SolidColorBrush(Colors.Purple);
                }
                else if (box.IsUnique)
                {
                    skillButton.Foreground = new SolidColorBrush(Colors.Red);
                }
                else if (box.IsSpecial)
                {
                    skillButton.Foreground = new SolidColorBrush(Colors.Cyan);
                }
                else
                {
                    skillButton.Foreground = new SolidColorBrush(Colors.White);
                }
                skillinfo.Blocks.Clear();
            };

            SkillContainer.Children.Add(skillButton);
        }
Ejemplo n.º 8
0
        public AIResult GetAIResult()
        {
            AIResult             rst   = new AIResult();
            List <LocationBlock> range = this.GetMoveRange(Field.currentSpirit.X, Field.currentSpirit.Y);

            //若HP低下,则概率逃跑
            if ((double)Field.currentSpirit.Hp / (double)Field.currentSpirit.Role.Attributes["maxhp"] < 0.3 &&
                Tools.ProbabilityTest(0.5))
            {
                int max = 0;
                //寻找一个点离敌人最远
                foreach (var r in range)
                {
                    int min = int.MaxValue;
                    foreach (Spirit sp in Field.Spirits)
                    {
                        int distance = GetDistance(sp.X, sp.Y, r.X, r.Y);
                        if (sp.Team != Field.currentSpirit.Team && distance < min)
                        {
                            min = distance;
                        }
                    }
                    if (min > max)
                    {
                        max        = min;
                        rst.MoveX  = r.X;
                        rst.MoveY  = r.Y;
                        rst.IsRest = true;
                    }
                }
                return(rst);
            }

            //AI策略:穷举移动到每一个能移动的点,并且使用技能攻击,选择伤害最大的攻击
            double maxAttack = 0;

            List <SkillBox> useSkills = new List <SkillBox>();

            //对AI进行减枝,控制技能数量
            foreach (var skill in Field.currentSpirit.Role.GetAvaliableSkills())
            {
                if (!(skill.Status == SkillStatus.Ok))
                {
                    continue;
                }
                if (useSkills.Count < CommonSettings.AI_MAX_COMPUTE_SKILL)
                {
                    useSkills.Add(skill);
                }
                else
                {
                    //替换一个攻击最低的技能
                    double   min           = double.MaxValue;
                    SkillBox minPowerSkill = null;
                    foreach (var s in useSkills)
                    {
                        if (s.Power < min)
                        {
                            min           = s.Power;
                            minPowerSkill = s;
                        }
                    }
                    if (minPowerSkill != null && skill.Power > minPowerSkill.Power)
                    {
                        useSkills.Remove(minPowerSkill);
                        useSkills.Add(skill);
                    }
                }
            }

            //对走位进行剪枝,控制NPC行走
            List <LocationBlock> useMoveRange = new List <LocationBlock>();

            useMoveRange.Add(new LocationBlock()
            {
                X = Field.currentSpirit.X, Y = Field.currentSpirit.Y
            });                                                                                             //默认的把不移动加上
            if (range.Count > CommonSettings.AI_MAX_COMPUTE_MOVERANGE)
            {
                while (useMoveRange.Count < CommonSettings.AI_MAX_COMPUTE_MOVERANGE)
                {
                    LocationBlock block = range[Tools.GetRandomInt(0, range.Count - 1)];
                    if (!useMoveRange.Contains(block))
                    {
                        useMoveRange.Add(block);
                    }
                }
            }
            else
            {
                useMoveRange = range;
            }

            foreach (var skill in useSkills) //选技能
            {
                if (!(skill.Status == SkillStatus.Ok))
                {
                    continue;
                }
                //DateTime t1 = DateTime.Now;
                foreach (var r in useMoveRange) //走位
                {
                    int x = r.X;
                    int y = r.Y;
                    List <LocationBlock> castRange = skill.GetSkillCastBlocks(x, y);
                    foreach (var cast in castRange)
                    {
                        double totalHit = 0;
                        List <LocationBlock> hitRange = skill.GetSkillCoverBlocks(cast.X, cast.Y, x, y);
                        foreach (var hit in hitRange)
                        {
                            Spirit target = Field.GetSpirit(hit.X, hit.Y);
                            if (target == null || target == Field.currentSpirit)
                            {
                                continue;
                            }

                            AttackResult attackResult = skill.Attack(Field.currentSpirit, target);
                            rst.totalAttackComputeNum++;
                            if (target.Team != Field.currentSpirit.Team)
                            {
                                totalHit += attackResult.Hp; //攻击到敌人
                            }
                            else if (target.Team == Field.currentSpirit.Team &&
                                     RuntimeData.Instance.FriendlyFire)
                            {
                                totalHit -= attackResult.Hp / 2; //攻击到友方
                            }
                        }
                        if (totalHit > maxAttack)
                        {
                            rst.MoveX   = x;
                            rst.MoveY   = y;
                            rst.skill   = skill;
                            rst.IsRest  = false;
                            rst.AttackX = cast.X;
                            rst.AttackY = cast.Y;
                            maxAttack   = totalHit;
                        }
                    }
                }

                //DateTime t2 = DateTime.Now;
                //MessageBox.Show((t2 - t1).TotalMilliseconds.ToString());
            }
            if (rst.skill != null)
            {
                return(rst);//攻击对手
            }

            //否则靠近自己最近的敌人
            int    minDistance = int.MaxValue;
            Spirit targetRole  = null;

            //寻找离自己最近的敌人
            foreach (Spirit sp in Field.Spirits)
            {
                if (sp.Team == Field.currentSpirit.Team)
                {
                    continue;
                }
                int distance = GetDistance(sp, Field.currentSpirit);
                if (distance < minDistance)
                {
                    minDistance = distance;
                    targetRole  = sp;
                }
            }

            if (targetRole != null)
            {
                int minDis2 = int.MaxValue;
                int movex = Field.currentSpirit.X, movey = Field.currentSpirit.Y;
                //寻找离对手最近的一点
                foreach (var mr in range)
                {
                    int distance = GetDistance(mr.X, mr.Y, targetRole.X, targetRole.Y);
                    if (distance <= minDis2)
                    {
                        minDis2 = distance;
                        movex   = mr.X;
                        movey   = mr.Y;
                    }
                }
                rst.skill  = null;
                rst.MoveX  = movex;
                rst.MoveY  = movey;
                rst.IsRest = true; //靠近对手


                //如果有增益性技能,则一定概率使用
                if (Tools.ProbabilityTest(0.5))
                {
                    foreach (var s in Field.currentSpirit.Role.SpecialSkills)
                    {
                        SkillBox sb = new SkillBox()
                        {
                            SpecialSkill = s
                        };
                        if (sb.Status == SkillStatus.Ok && s.Skill.HitSelf)
                        {
                            rst.skill   = sb;
                            rst.AttackX = movex;
                            rst.AttackY = movey;
                            rst.IsRest  = false;
                        }
                    }
                }

                return(rst);
            }
            else
            {
                //否则休息
                rst.MoveX  = Field.currentSpirit.X;
                rst.MoveY  = Field.currentSpirit.Y;
                rst.IsRest = true; //没有对手,休息
                return(rst);
            }
        }
        public static SkillHotKeysItem Create(SkillBox box, char hotKey, SkillHotKeysPanel parent)
        {
            SkillHotKeysItem rst = new SkillHotKeysItem();

            ToolTipService.SetToolTip(rst, box.GenerateToolTip());
            if (box.Name.Length > 14)
            {
                rst.NameText.Text = box.Name.Substring(0, 3) + "...";
            }
            else
            {
                rst.NameText.Text = box.Name;
            }
            rst.HotKeyText.Text = hotKey.ToString();
            if (box.Instance != null && !box.IsUnique) //外功
            {
                switch (box.Instance.Skill.Type)
                {
                case CommonSettings.SKILLTYPE_JIAN:
                    rst.TypeImageJian.Visibility = Visibility.Visible;
                    break;

                case CommonSettings.SKILLTYPE_DAO:
                    rst.TypeImageDao.Visibility = Visibility.Visible;
                    break;

                case CommonSettings.SKILLTYPE_QUAN:
                    rst.TypeImageQuan.Visibility = Visibility.Visible;
                    break;

                case CommonSettings.SKILLTYPE_QIMEN:
                    rst.TypeImageQimen.Visibility = Visibility.Visible;
                    break;

                default:
                    break;
                }
            }
            else if (box.IsUnique) //绝技
            {
                rst.NameText.Foreground = new SolidColorBrush(Colors.Red);
                switch (box.Type)
                {
                case CommonSettings.SKILLTYPE_JIAN:
                    rst.TypeImageJian.Visibility = Visibility.Visible;
                    break;

                case CommonSettings.SKILLTYPE_DAO:
                    rst.TypeImageDao.Visibility = Visibility.Visible;
                    break;

                case CommonSettings.SKILLTYPE_QUAN:
                    rst.TypeImageQuan.Visibility = Visibility.Visible;
                    break;

                case CommonSettings.SKILLTYPE_QIMEN:
                    rst.TypeImageQimen.Visibility = Visibility.Visible;
                    break;

                case CommonSettings.SKILLTYPE_NEIGONG:
                    rst.TypeImageNeigong.Visibility = Visibility.Visible;
                    break;

                default:
                    break;
                }
            }
            else if (box.IsSpecial)
            {
                rst.NameText.Foreground         = new SolidColorBrush(Colors.Cyan);
                rst.TypeImageSpecial.Visibility = Visibility.Visible;
            }

            rst.MouseLeftButtonDown += (ss, ee) =>
            {
                parent.Callback(box);
            };

            return(rst);
        }
Ejemplo n.º 10
0
        /// <summary>
        /// 装备过滤,影响到战斗计算
        /// </summary>
        /// <param name="isAttacker">攻击者/防御者</param>
        /// <param name="skillType">技能类型</param>
        /// <param name="attackLow">攻击下限评估</param>
        /// <param name="attackUp">攻击上限评估</param>
        /// <param name="criticalHit">致命一击概率</param>
        /// <param name="defence">防御评估</param>
        public void EquipFilter(bool isAttacker, SkillBox skill, ref double attackLow,
                                ref double attackUp, ref double criticalHit, ref double criticalPower, ref double defence)
        {
            int skillType = skill.Type;

            foreach (var trigger in this.AllTriggers)
            {
                switch (trigger.Name)
                {
                case "defence":
                    if (!isAttacker)
                    {
                        defence     += double.Parse(trigger.Argvs[0]);
                        criticalHit -= double.Parse(trigger.Argvs[1]) / 100;
                        if (criticalHit < 0)
                        {
                            criticalHit = 0;
                        }
                    }
                    break;

                case "attack":
                    if (isAttacker)
                    {
                        if (this.Type == (int)ItemType.Weapon)
                        {
                            if (this.HasTalent("拳系装备") && skillType != CommonSettings.SKILLTYPE_QUAN)
                            {
                                break;
                            }
                            if (this.HasTalent("剑系装备") && skillType != CommonSettings.SKILLTYPE_JIAN)
                            {
                                break;
                            }
                            if (this.HasTalent("刀系装备") && skillType != CommonSettings.SKILLTYPE_DAO)
                            {
                                break;
                            }
                            if (this.HasTalent("奇门装备") && skillType != CommonSettings.SKILLTYPE_QIMEN)
                            {
                                break;
                            }
                        }
                        attackLow   += double.Parse(trigger.Argvs[0]) / 2;
                        attackUp    += double.Parse(trigger.Argvs[0]);
                        criticalHit += double.Parse(trigger.Argvs[1]) / 100;
                    }
                    break;

                case "powerup_skill":
                    if (isAttacker)
                    {
                        if (skill.Name.Contains(trigger.Argvs[0]))
                        {
                            double rate = (1 + (int.Parse(trigger.Argvs[1])) / 100.0);
                            attackLow *= rate;
                            attackUp  *= rate;
                        }
                    }
                    break;

                case "powerup_quanzhang":
                    if (isAttacker)
                    {
                        if (skill.Type == CommonSettings.SKILLTYPE_QUAN)
                        {
                            double rate = (1 + (int.Parse(trigger.Argvs[0])) / 100.0);
                            attackLow *= rate;
                            attackUp  *= rate;
                        }
                    }
                    break;

                case "powerup_jianfa":
                    if (isAttacker)
                    {
                        if (skill.Type == CommonSettings.SKILLTYPE_JIAN)
                        {
                            double rate = (1 + (int.Parse(trigger.Argvs[0])) / 100.0);
                            attackLow *= rate;
                            attackUp  *= rate;
                        }
                    }
                    break;

                case "powerup_daofa":
                    if (isAttacker)
                    {
                        if (skill.Type == CommonSettings.SKILLTYPE_DAO)
                        {
                            double rate = (1 + (int.Parse(trigger.Argvs[0])) / 100.0);
                            attackLow *= rate;
                            attackUp  *= rate;
                        }
                    }
                    break;

                case "powerup_qimen":
                    if (isAttacker)
                    {
                        if (skill.Type == CommonSettings.SKILLTYPE_QIMEN)
                        {
                            double rate = (1 + (int.Parse(trigger.Argvs[0])) / 100.0);
                            attackLow *= rate;
                            attackUp  *= rate;
                        }
                    }
                    break;

                case "critical":
                    if (isAttacker)
                    {
                        criticalPower += int.Parse(trigger.Argvs[0]) / 100.0;
                    }
                    break;

                default:
                    break;
                }
            }
        }