Beispiel #1
0
    void OnUseItemClick()
    {
        Func <Jyx2Item, bool> filter = (item) => {
            //Ò©Îï»ò°µÆ÷
            return(item.ItemType == 3 || item.ItemType == 4);
        };

        Jyx2_UIManager.Instance.ShowUI("BagUIPanel", GameRuntimeData.Instance.Items, new Action <int>((itemId) =>
        {
            if (itemId == -1)
            {
                return;
            }

            var item = ConfigTable.Get <Jyx2Item>(itemId);
            //Ò©Æ·
            if (item.ItemType == 3)
            {
                if (m_currentRole.CanUseItem(itemId))
                {
                    BattleStateMechine.Instance.BindItem(item);
                    BattleStateMechine.Instance.SwitchState(BattleManager.BattleViewStates.UseItem);
                }
            }
            //°µÆ÷
            else if (item.ItemType == 4)
            {
                var zhaoshi = new AnqiZhaoshiInstance(m_currentRole.Anqi, item);
                m_chooseBtn = true;
                BattleStateMechine.Instance.BindSkill(zhaoshi);
                CheckNeedChangeState();
            }
        }), filter);
    }
Beispiel #2
0
    public void GetAIResultClassic(RoleInstance role, Action <AIResult> callback)
    {
        //初始化范围逻辑
        //rangeLogic = new RangeLogic(BattleboxHelper.Instance.IsBlockExists, BattleModel.BlockHasRole);

        //获得角色移动能力
        int moveAbility = role.GetMoveAbility();

        //行动范围
        var range = rangeLogic.GetMoveRange(role.Pos.X, role.Pos.Y, moveAbility);

        //可使用招式
        var zhaoshis = role.GetZhaoshis(false);

        //TODO:攻击计算缓存 by Cherubinxxx
        //AttackResultCache cache = new AttackResultCache(currentSprite, Field);

        //AI算法:穷举每个点,使用招式,取最大收益
        AIResult result   = null;
        double   maxscore = 0;

        foreach (var zhaoshi in zhaoshis)
        {
            if (zhaoshi.GetStatus() != BattleZhaoshiInstance.ZhaoshiStatus.OK)
            {
                continue;
            }

            GetMoveAndCastPos(role, zhaoshi, range);

            BattleBlockVector[] tmp = m_GetMoveAndCastPosResult;
            if (tmp != null && tmp.Length == 2 && tmp[0] != null)
            {
                BattleBlockVector movePos = tmp[0];
                BattleBlockVector castPos = tmp[1];
                double            score   = GetSkillCastResultScore(role, zhaoshi, movePos.X, movePos.Y, castPos.X, castPos.Y, true);
                // yield return 0; //分帧
                //if (score <= 0 && rst.HitEnemyCount > 0)
                //{
                //    score = ToolsShared.GetRandom(0, 1);
                //}
                if (score > maxscore)
                {
                    maxscore = score;
                    result   = new AIResult
                    {
                        AttackX = castPos.X,
                        AttackY = castPos.Y,
                        MoveX   = movePos.X,
                        MoveY   = movePos.Y,
                        Zhaoshi = zhaoshi,
                        IsRest  = false
                    };
                }
            }
        }

        //考虑吃药
        if (role.Items.Count > 0 && (role.Hp < 0.2 * role.MaxHp || role.Mp < 0.2 * role.MaxMp || role.Tili < 0.2 * Jyx2Consts.MaxTili))
        {
            List <Jyx2Item> items = GetAvailableItems(role, 3); //只使用药物
            foreach (var item in items)
            {
                double score = 0;
                //尽量吃刚刚好的药
                if (item.AddHp > 0)
                {
                    score += Mathf.Min(item.AddHp, role.MaxHp - role.Hp) - item.AddHp / 10;
                }
                if (item.AddMp > 0)
                {
                    score += Mathf.Min(item.AddMp, role.MaxMp - role.Mp) / 2 - item.AddMp / 10;
                }
                if (item.AddTili > 0)
                {
                    score += Mathf.Min(item.AddTili, Jyx2Consts.MaxTili - role.Tili) - item.AddTili / 10;
                }

                if (score > 0)
                {
                    score *= 1.5;//自保系数大
                }

                if (score > maxscore)
                {
                    maxscore = score;
                    var tmp = GetFarestEnemyBlock(role, range);
                    result = new AIResult
                    {
                        MoveX  = tmp.X,
                        MoveY  = tmp.Y,
                        IsRest = false,
                        Item   = item
                    };
                }
            }
        }

        List <Jyx2Item> anqis = GetAvailableItems(role, 4); //获取暗器

        //使用暗器
        if (anqis.Count > 0)
        {
            foreach (var anqi in anqis)
            {
                BattleZhaoshiInstance anqizhaoshi = new AnqiZhaoshiInstance(role.Anqi, anqi);

                if (anqizhaoshi.GetStatus() != BattleZhaoshiInstance.ZhaoshiStatus.OK)
                {
                    continue;
                }

                GetMoveAndCastPos(role, anqizhaoshi, range);

                BattleBlockVector[] tmp = m_GetMoveAndCastPosResult;
                if (tmp != null && tmp.Length == 2 && tmp[0] != null)
                {
                    BattleBlockVector movePos = tmp[0];
                    BattleBlockVector castPos = tmp[1];
                    double            score   = GetSkillCastResultScore(role, anqizhaoshi, movePos.X, movePos.Y, castPos.X, castPos.Y, true);

                    if (score > maxscore)
                    {
                        maxscore = score;
                        result   = new AIResult
                        {
                            AttackX = castPos.X,
                            AttackY = castPos.Y,
                            MoveX   = movePos.X,
                            MoveY   = movePos.Y,
                            Zhaoshi = anqizhaoshi,
                            IsRest  = false
                        };
                    }
                }
            }
        }

        //Debug.Log(Time.realtimeSinceStartup);

        if (result != null)
        {
            callback(result);
            return;
        }

        //否则靠近自己最近的敌人
        result = MoveToNearestEnemy(role, range);
        if (result != null)
        {
            callback(result);
            return;
        }

        //否则原地休息
        callback(Rest(role));
        return;
    }