コード例 #1
0
    void RefreshSkill()
    {
        m_curItemList.Clear();
        var zhaoshis = m_currentRole.GetZhaoshis(true).ToList();

        childMgr.RefreshChildCount(zhaoshis.Count);
        List <Transform> childTransList = childMgr.GetUsingTransList();

        for (int i = 0; i < zhaoshis.Count; i++)
        {
            SkillUIItem item = GameUtil.GetOrAddComponent <SkillUIItem>(childTransList[i]);
            item.RefreshSkill(zhaoshis[i]);
            item.SetSelect(m_selectItem == item);

            Button btn = item.GetComponent <Button>();
            BindListener(btn, () =>
            {
                OnItemClick(item);
            });
            m_curItemList.Add(item);
        }
    }
コード例 #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;
    }