Example #1
0
 /// <summary>
 /// 设置回合目标角色
 /// </summary>
 /// <param name="roundActionCharacter"></param>
 public void SetRoundTargetCharacter(NpcAIMiniGameCombatCpt roundActionCharacter)
 {
     SetRoundTargetCharacter(new List <NpcAIMiniGameCombatCpt>()
     {
         roundActionCharacter
     });
 }
Example #2
0
    /// <summary>
    /// 回合准备
    /// </summary>
    public IEnumerator RoundForPre(MiniGameCharacterForCombatBean gameCharacterData)
    {
        //获取角色
        NpcAIMiniGameCombatCpt npcCpt = GetCharacter(gameCharacterData);

        //设置当前回合行动的角色
        miniGameData.SetRoundActionCharacter(npcCpt);
        //执行效果
        yield return(StartCoroutine(npcCpt.CombatEffectExecute()));

        //如果角色死亡
        if (gameCharacterData.characterCurrentLife <= 0)
        {
            StartNextRound();
        }
        else
        {
            //如果是敌方
            if (gameCharacterData.characterType == 0)
            {
                //电脑开始行动
                miniGameData.SetCombatStatus(MiniGameCombatStatusEnum.EnemyRound);
                npcCpt.OpenAI();
            }
            //如果是友方
            else if (gameCharacterData.characterType == 1)
            {
                //友方行动
                miniGameData.SetCombatStatus(MiniGameCombatStatusEnum.OurRound);
                uiMiniGameCombat.OpenCombatCommand();
            }
            //开启选中特效
            SelectCharacter(npcCpt);
        }
    }
 public override void Close()
 {
     base.Close();
     uiComponent.isSelecting = false;
     listSelectNpc.Clear();
     CptUtil.RemoveChildsByActive(objSelectIconContainer);
     currentSelectNpc = null;
 }
Example #4
0
    /// <summary>
    /// 创建角色
    /// </summary>
    /// <param name="miniGameCharacterData"></param>
    public NpcAIMiniGameCombatCpt CreateCharacter(Vector3 combatPosition, MiniGameCharacterBean miniGameCharacterData)
    {
        GameObject             objPlayer = Instantiate(objPlayerContainer, objPlayerModel, combatPosition);
        NpcAIMiniGameCombatCpt npcCpt    = objPlayer.GetComponent <NpcAIMiniGameCombatCpt>();

        npcCpt.SetData((MiniGameCharacterForCombatBean)miniGameCharacterData);
        return(npcCpt);
    }
Example #5
0
 /// <summary>
 /// 结束回合
 /// </summary>
 public void EndRound()
 {
     roundActionCharacter     = null;
     roundListTargetCharacter = null;
     roundActionPowerTest     = 0;
     roundActionItemsId       = 0;
     roundActionSkill         = null;
     roundCombatCommand       = MiniGameCombatCommand.None;
 }
Example #6
0
    /// <summary>
    /// 协程 战斗
    /// </summary>
    /// <returns></returns>
    private IEnumerator CoroutineForCommandFight()
    {
        NpcAIMiniGameCombatCpt actionNpc = miniGameData.GetRoundActionCharacter();
        NpcAIMiniGameCombatCpt targetNpc = miniGameData.GetRoundTargetCharacter();

        //获取属性
        actionNpc.characterData.GetAttributes(actionNpc.characterMiniGameData, out CharacterAttributesBean actionCharacterAttributes);

        //让行动角色移动到被攻击对象面前
        Vector3 offsetPosition;

        //根据角色朝向决定位置
        if (targetNpc.GetCharacterFace() == 1)
        {
            offsetPosition = new Vector3(-1, 0);
        }
        else
        {
            offsetPosition = new Vector3(1, 0);
        }
        //记录之前的位置
        Vector3 oldPosition = actionNpc.transform.position;

        //行动角色移动到目标角色面前
        actionNpc.transform.DOMove(targetNpc.transform.position + offsetPosition, 0.5f);
        yield return(new WaitForSeconds(0.5f));

        //TODO 计算闪避(待定)
        float dodgeRate = UnityEngine.Random.Range(0f, 1f);

        if (dodgeRate <= 1)
        {
            //力量测试加成
            float damagePowerRate = (miniGameData.GetRoundActionPowerTest() + 0.2f);
            //计算伤害
            int damage = (int)(damagePowerRate * actionCharacterAttributes.force);
            //伤害减免
            damage = targetNpc.characterMiniGameData.GetTotalDef(damage);
            //角色伤害
            targetNpc.UnderAttack(damagePowerRate, damage);
            AudioHandler.Instance.PlaySound(AudioSoundEnum.Fight);
        }
        else
        {
            //角色闪避了
            targetNpc.ShowTextInfo(TextHandler.Instance.manager.GetTextById(14001), Color.blue);
        }
        //行动角色回到自己的位置
        yield return(new WaitForSeconds(0.5f));

        actionNpc.transform.DOMove(oldPosition, 0.5f);
    }
Example #7
0
    /// <summary>
    /// 指令 技能
    /// </summary>
    public void CommandSkill()
    {
        AudioHandler.Instance.PlaySound(AudioSoundEnum.ButtonForNormal);
        uiComponent.miniGameData.SetRoundActionCommand(MiniGameCombatCommand.Skill);
        NpcAIMiniGameCombatCpt npcCpt = uiComponent.miniGameData.GetRoundActionCharacter();
        //获取角色拥有的技能
        List <long> listSkill = npcCpt.characterMiniGameData.characterData.attributes.listSkills;

        DialogBean             dialogData         = new DialogBean();
        PickForSkillDialogView pickForSkillDialog = DialogHandler.Instance.CreateDialog <PickForSkillDialogView>(DialogEnum.PickForSkill, this, dialogData);
        Dictionary <long, int> listUsedSkill      = npcCpt.characterMiniGameData.listUsedSkill;

        pickForSkillDialog.SetData(listSkill, listUsedSkill);
    }
Example #8
0
    /// <summary>
    /// 获取某一个角色
    /// </summary>
    /// <param name="gameCharacterData"></param>
    public NpcAIMiniGameCombatCpt GetCharacter(MiniGameCharacterBean gameCharacterData)
    {
        List <NpcAIMiniGameCombatCpt> listCharacter = miniGameBuilder.GetAllCharacter();

        for (int i = 0; i < listCharacter.Count; i++)
        {
            NpcAIMiniGameCombatCpt itemNpc = listCharacter[i];
            if (itemNpc.characterMiniGameData == gameCharacterData)
            {
                return(itemNpc);
            }
        }
        return(null);
    }
Example #9
0
    /// <summary>
    /// 增加效果
    /// </summary>
    /// <param name="effectTypeData"></param>
    /// <param name="effectDetailsData"></param>
    public void AddCombatEffect(NpcAIMiniGameCombatCpt actionCharacter, string effectTypeData, string effectDetailsData, Sprite spIcon)
    {
        List <EffectTypeBean> listTypeData = EffectTypeEnumTools.GetListEffectData(effectTypeData);

        EffectDetailsEnumTools.GetEffectDetailsForCombat(effectDetailsData, out string effectPSName, out int durationForRound);
        MiniGameCombatEffectBean gameCombatEffectData = new MiniGameCombatEffectBean();

        gameCombatEffectData.listEffectTypeData = listTypeData;
        gameCombatEffectData.durationForRound   = durationForRound;
        gameCombatEffectData.effectPSName       = effectPSName;
        gameCombatEffectData.iconMarkId         = SystemUtil.GetUUID(SystemUtil.UUIDTypeEnum.N);
        gameCombatEffectData.actionCharacter    = actionCharacter;
        gameCombatEffectData.targetCharacter    = this;

        foreach (EffectTypeBean itemType in listTypeData)
        {
            //设置技能的备用图标
            EffectTypeEnumTools.GetEffectDetails(itemType, spIcon);
            //如果是持续 则需要加上BUFF图标
            if (durationForRound > 0)
            {
                Sprite spEffect;
                if (itemType.spIconRemark != null)
                {
                    spEffect = itemType.spIconRemark;
                }
                else
                {
                    spEffect = itemType.spIcon;
                }
                AddStatusIconForEffect(spEffect, Color.white, gameCombatEffectData.iconMarkId);
            }
        }
        //播放粒子特效
        if (!CheckUtil.StringIsNull(effectPSName))
        {
            MiniGameHandler.Instance.handlerForCombat.miniGameBuilder.CreateCombatEffect(effectPSName, transform.position + new Vector3(0, 0.5f));
        }
        if (durationForRound > 0)
        {
            characterMiniGameData.listCombatEffect.Add(gameCombatEffectData);
        }
        else
        {
            //回合数小于0的立即执行
            CombatEffectExecute(gameCombatEffectData, out bool isDead);
        }
    }
Example #10
0
    /// <summary>
    /// 创建敌方角色
    /// </summary>
    /// <param name="listCharacterData"></param>
    public void CreateEnemyCharacter(Vector3 combatPosition, List <MiniGameCharacterBean> listCharacterData)
    {
        listEnemyCharacter.Clear();
        float characterPositionY = combatPosition.y + ((listCharacterData.Count - 1) / 2f) * 1.5f;

        for (int i = 0; i < listCharacterData.Count; i++)
        {
            Vector3 characterPosition = new Vector3(combatPosition.x + 3, characterPositionY);
            characterPositionY -= 1.5f;
            MiniGameCharacterBean  itemData = listCharacterData[i];
            NpcAIMiniGameCombatCpt npcCpt   = CreateCharacter(characterPosition, itemData);
            listEnemyCharacter.Add(npcCpt);
            //设置角色朝向
            npcCpt.SetCharacterFace(1);
        }
    }
Example #11
0
    /// <summary>
    /// 获取角色造成的总伤害
    /// </summary>
    /// <param name="gameItemsManager"></param>
    /// <param name="actionCharacterData"></param>
    /// <param name="listData"></param>
    /// <returns></returns>
    public static int GetTotalDamage(NpcAIMiniGameCombatCpt actionNpc, List <EffectTypeBean> listData)
    {
        float damageAdd     = 0;
        float damageAddRate = 1;

        actionNpc.characterData.GetAttributes(actionNpc.characterMiniGameData, out CharacterAttributesBean characterAttributes);
        foreach (EffectTypeBean itemData in listData)
        {
            switch (itemData.dataType)
            {
            case EffectTypeEnum.Damage:
                damageAdd += float.Parse(itemData.data);
                break;

            case EffectTypeEnum.DamageRate:
                damageAddRate += float.Parse(itemData.data);
                break;

            case EffectTypeEnum.DamageRateForLucky:
                damageAdd += characterAttributes.lucky * float.Parse(itemData.data);
                break;

            case EffectTypeEnum.DamageRateForCook:
                damageAdd += characterAttributes.cook * float.Parse(itemData.data);
                break;

            case EffectTypeEnum.DamageRateForSpeed:
                damageAdd += characterAttributes.speed * float.Parse(itemData.data);
                break;

            case EffectTypeEnum.DamageRateForAccount:
                damageAdd += characterAttributes.account * float.Parse(itemData.data);
                break;

            case EffectTypeEnum.DamageRateForCharm:
                damageAdd += characterAttributes.charm * float.Parse(itemData.data);
                break;

            case EffectTypeEnum.DamageRateForForce:
                damageAdd += characterAttributes.force * float.Parse(itemData.data);
                break;
            }
        }
        return((int)Mathf.Round(damageAdd * damageAddRate));
    }
Example #12
0
    /// <summary>
    /// 协程 技能使用
    /// </summary>
    /// <returns></returns>
    private IEnumerator CoroutineForCommandSkill()
    {
        NpcAIMiniGameCombatCpt        actionNpc     = miniGameData.GetRoundActionCharacter();
        List <NpcAIMiniGameCombatCpt> listTargetNpc = miniGameData.GetRoundTargetListCharacter();
        SkillInfoBean skillData = miniGameData.GetRoundActionSkill();
        Sprite        spSkill   = IconDataHandler.Instance.manager.GetIconSpriteByName(skillData.icon_key);

        //喊出技能名字
        actionNpc.SetShout(skillData.name);
        yield return(new WaitForSeconds(1f));

        actionNpc.characterMiniGameData.AddUsedSkill(skillData.id, 1);
        //增加技能效果
        foreach (NpcAIMiniGameCombatCpt itemNpc in listTargetNpc)
        {
            itemNpc.AddCombatEffect(actionNpc, skillData.effect, skillData.effect_details, spSkill);
        }
        yield return(new WaitForSeconds(1f));
    }
    private void Update()
    {
        //设置选中角色图标
        if (listSelectNpc != null && listSelectNpc.Count != 0)
        {
            foreach (var itemSelect in listSelectNpc)
            {
                NpcAIMiniGameCombatCpt itemNpc   = itemSelect.Key;
                GameObject             objCursor = itemSelect.Value;

                GameUtil.WorldPointToUILocalPoint(UIHandler.Instance.manager.GetContainer(), itemNpc.transform.position + new Vector3(0, 0.5f), (RectTransform)objCursor.transform);
            }
        }
        //设置指定角色图标
        if (currentSelectCursor != null && currentSelectNpc != null)
        {
            GameUtil.WorldPointToUILocalPoint(UIHandler.Instance.manager.GetContainer(), currentSelectNpc.transform.position + new Vector3(0, 0.5f), (RectTransform)currentSelectCursor.transform);
        }
    }
Example #14
0
    /// <summary>
    /// 协程 物品使用
    /// </summary>
    /// <returns></returns>
    private IEnumerator CoroutineForCommandItems()
    {
        NpcAIMiniGameCombatCpt        actionNpc     = miniGameData.GetRoundActionCharacter();
        List <NpcAIMiniGameCombatCpt> listTargetNpc = miniGameData.GetRoundTargetListCharacter();

        long          itemsId   = miniGameData.GetRoundActionItemsId();
        ItemsInfoBean itemsInfo = GameItemsHandler.Instance.manager.GetItemsById(itemsId);
        //从物品栏移除物品
        GameDataBean gameData = GameDataHandler.Instance.manager.GetGameData();

        gameData.AddItemsNumber(itemsInfo.id, -1);
        Sprite spItems = GeneralEnumTools.GetGeneralSprite(itemsInfo);

        //增加物品效果
        foreach (NpcAIMiniGameCombatCpt itemNpc in listTargetNpc)
        {
            itemNpc.AddCombatEffect(actionNpc, itemsInfo.effect, itemsInfo.effect_details, spItems);
        }
        yield return(new WaitForSeconds(1f));
    }
Example #15
0
    /// <summary>
    /// 协程意图-攻击
    /// </summary>
    public IEnumerator CoroutineForIntentFight(List <NpcAIMiniGameCombatCpt> relativeOurList, List <NpcAIMiniGameCombatCpt> relativeEnemyList)
    {
        MiniGameHandler.Instance.handlerForCombat.miniGameData.SetRoundActionCommand(MiniGameCombatCommand.Fight);
        MiniGameHandler.Instance.handlerForCombat.miniGameData.SetRoundActionPowerTest(0.8f);
        //选择血最少的
        NpcAIMiniGameCombatCpt targetNpc = null;

        //for (int i = 0; i < relativeEnemyList.Count; i++)
        //{
        //    NpcAIMiniGameCombatCpt itemNPC = relativeEnemyList[i];
        //    if (targetNpc == null)
        //    {
        //        targetNpc = itemNPC;
        //    }
        //    else
        //    {
        //        //选择血少的
        //        if (targetNpc.characterMiniGameData.characterCurrentLife > itemNPC.characterMiniGameData.characterCurrentLife)
        //        {
        //            targetNpc = itemNPC;
        //        }
        //        else if (targetNpc.characterMiniGameData.characterCurrentLife == itemNPC.characterMiniGameData.characterCurrentLife)
        //        {
        //            if (Random.Range(0, 2) == 1)
        //            {
        //                targetNpc = itemNPC;
        //            }
        //        }
        //    }
        //}
        //随机选一个
        targetNpc = RandomUtil.GetRandomDataByList(relativeEnemyList);
        MiniGameHandler.Instance.handlerForCombat.miniGameData.SetRoundTargetCharacter(targetNpc);
        yield return(new WaitForSeconds(1));

        MiniGameHandler.Instance.handlerForCombat.RoundForAction();
    }
Example #16
0
 /// <summary>
 /// 选择角色
 /// </summary>
 /// <param name="character"></param>
 public void SelectCharacter(NpcAIMiniGameCombatCpt character)
 {
     miniGameBuilder.DeleteAllEffect();
     miniGameBuilder.CreateSelectEffect(character.transform.position);
     SetCameraPosition(character.transform.position);
 }
    /// <summary>
    /// 改变选择的角色
    /// </summary>
    /// <param name="selectType"></param>
    /// <param name="isAddCurrent">是否增加上一个角色</param>
    public void ChangeCharacter(int next)
    {
        AudioHandler.Instance.PlaySound(AudioSoundEnum.ChangeSelect);
        List <NpcAIMiniGameCombatCpt> listData = new List <NpcAIMiniGameCombatCpt>();

        //友方
        if (selectType == 1)
        {
            listData = MiniGameHandler.Instance.handlerForCombat.miniGameBuilder.GetUserCharacter();
        }
        //敌方
        else if (selectType == 2)
        {
            listData = MiniGameHandler.Instance.handlerForCombat.miniGameBuilder.GetEnemyCharacter();
        }
        //通用
        else
        {
            listData = MiniGameHandler.Instance.handlerForCombat.miniGameBuilder.GetAllCharacter();
        }
        //如果选择的人数大于=一共的对象,那么默认选择全部
        if (selectNumber >= listData.Count)
        {
            selectNumber = 0;
        }
        //如果还没有选择角色 则选择第一个
        if (currentSelectNpc == null)
        {
            currentSelectNpc = listData[0];
        }
        //如果有选择角色则改变为下一个
        else
        {
            //如果不是全选 则先删除上一个
            if (selectNumber != 0)
            {
                if (currentSelectCursor != null)
                {
                    Destroy(currentSelectCursor);
                }
            }
            int changeNumber = 0;
            for (int i = 0; i < listData.Count; i++)
            {
                NpcAIMiniGameCombatCpt itemCharacter = listData[i];
                if (itemCharacter == currentSelectNpc)
                {
                    changeNumber = (i + next);
                    if (changeNumber >= listData.Count)
                    {
                        changeNumber = 0;
                    }
                    else if (changeNumber < 0)
                    {
                        changeNumber = listData.Count - 1;
                    }
                    break;
                }
            }
            currentSelectNpc = listData[changeNumber];
        }
        //镜头对准选中的角色
        MiniGameHandler.Instance.handlerForCombat.SetCameraPosition(currentSelectNpc.transform.position);

        //如果是全选
        if (selectNumber == 0)
        {
            //如果还没有选中所有
            if (listSelectNpc == null || listSelectNpc.Count == 0)
            {
                foreach (NpcAIMiniGameCombatCpt itemNpc in listData)
                {
                    GameObject itemCursor = Instantiate(objSelectIconContainer, objSelectIconModel);
                    listSelectNpc.Add(itemNpc, itemCursor);
                }
            }
        }
        else
        {
            if (!listSelectNpc.ContainsKey(currentSelectNpc))
            {
                currentSelectCursor = Instantiate(objSelectIconContainer, objSelectIconModel);
            }
        }
    }
Example #18
0
 /// <summary>
 /// 设置回合行动角色
 /// </summary>
 /// <param name="roundActionCharacter"></param>
 public void SetRoundActionCharacter(NpcAIMiniGameCombatCpt roundActionCharacter)
 {
     this.roundActionCharacter = roundActionCharacter;
 }
 /// <summary>
 /// 选中一个角色
 /// </summary>
 /// <param name="npcAI"></param>
 public void ChangeCharacter(NpcAIMiniGameCombatCpt currentNpc)
 {
 }