Exemple #1
0
        //拾起道具
        public void PickupItemFromGrid(GridUnit fromGrid)
        {
            if (fromGrid == null || fromGrid.gridItem == null || package == null)
            {
                return;
            }

            int  itemID     = fromGrid.gridItem.item.itemID;
            int  itemCount  = fromGrid.gridItem.count;
            int  finalCount = 0;
            bool result     = package.TryAddItem(itemID, itemCount, ref finalCount);

            //成功捡起道具
            if (result)
            {
                //先生成道具格子的事件
                if (fromGrid != null)
                {
                    fromGrid.OnItemPicked();
                }

                BattleUnitPickupItemAction action = BattleUnitActionEvent.CreateEvent <BattleUnitPickupItemAction>(BattleUnitActionType.PickupItem, this);
                action.itemID     = itemID;
                action.addCount   = itemCount;
                action.finalCount = finalCount;
                battleField.AppendBattleAction(action);
            }
        }
        //运行英雄动作
        public IEnumerator RunHeroAction(BattleUnitActionEvent heroAction)
        {
            if (heroAction == null)
            {
                yield break;
            }

            switch (heroAction.battleUnitActionType)
            {
            case BattleUnitActionType.EnterBattleField:
                yield return(PlayEnterBattleFieldAction(heroAction as BattleUnitEnterBattleFieldAction));

                break;

            case BattleUnitActionType.ChangeTarget:
                yield return(PlayChangeTargetAction(heroAction as BattleUnitChangeTargetAction));

                break;

            case BattleUnitActionType.MoveToTarget:
                yield return(PlayMotionAction(heroAction as BattleUnitMotionAction));

                break;

            case BattleUnitActionType.UseSkill:
                yield return(PlaySkillAction(heroAction as BattleUnitSkillAction));

                break;

            case BattleUnitActionType.AttributeUpdate:
                yield return(PlayAttributeUpdateAction(heroAction as BattleUnitAttributeUpdate));

                break;

            case BattleUnitActionType.ManualOperate:
                yield return(PlayManualAction(heroAction as BattleUnitManualAction));

                break;

            case BattleUnitActionType.PickupItem:
                yield return(PlayPickupItemAction(heroAction as BattleUnitPickupItemAction));

                break;

            case BattleUnitActionType.UseItem:
                yield return(PlayUseItemAction(heroAction as BattleUnitUseItemAction));

                break;

            case BattleUnitActionType.Warning:
                UtilityHelper.LogWarning(heroAction.ToString());
                yield return(EGameConstL.WaitForTouchScreen);

                break;

            default:
                break;
            }
            yield return(null);
        }
Exemple #3
0
        //向目标格子移动
        public void MoveToTargetGrid(BattleUnit targetUnit, GridUnit targetGrid, GridUnit[] gridPath)
        {
            BattleUnitMotionAction action = BattleUnitActionEvent.CreateEvent <BattleUnitMotionAction>(BattleUnitActionType.MoveToTarget, this);

            action.targetUnit = targetUnit;
            action.fromGrid   = mapGrid;
            action.gridPath   = gridPath;
            action.moveRange  = battleUnitAttribute.mobility;

            battleField.AppendBattleAction(action);

            //进入格子,直接设置数据
            EnterGrid(targetGrid);
        }
Exemple #4
0
        //手动操作
        private HeroActionState ManualAction()
        {
            //重置手动操作状态
            manualActionState |= ManualActionState.Move;
            manualActionState |= ManualActionState.SkillOrItem;
            BroadcastManualStateChanged();

            //创建一个手动操作的行动用于显示
            BattleUnitManualAction action = BattleUnitActionEvent.CreateEvent <BattleUnitManualAction>(BattleUnitActionType.ManualOperate, this);

            battleField.AppendBattleAction(action);

            return(HeroActionState.WaitForPlayerChoose);
        }
Exemple #5
0
        //进入战场
        public void EnterBattleField(BattleField battleField, GridUnit bornGrid)
        {
            if (battleField != null && bornGrid != null)
            {
                this.battleField = battleField;

                //设置敌方队伍
                enemyTeam = battleField.GetBattleTeam(this, false);

                //重置属性
                battleUnitAttribute.RandomAttributes();
                battleUnitAttribute.Reset();

                //创建背包
                if (package == null)
                {
                    package = BattleUnitPackage.CreateInstance(this, 2);
                }

                package.Clear();

                //进入战场
                BattleUnitEnterBattleFieldAction enterBattleFieldAction = BattleUnitActionEvent.CreateEvent <BattleUnitEnterBattleFieldAction>(BattleUnitActionType.EnterBattleField, this);
                enterBattleFieldAction.battleField             = battleField;
                enterBattleFieldAction.bornGrid                = bornGrid;
                enterBattleFieldAction.attribute               = new BattleUnitSyncAttribute();
                enterBattleFieldAction.attribute.hpChanged     = 0;
                enterBattleFieldAction.attribute.currentHP     = battleUnitAttribute.hp;
                enterBattleFieldAction.attribute.energyChanged = 0;
                enterBattleFieldAction.attribute.currentEnergy = 0;
                battleField.AppendBattleAction(enterBattleFieldAction);

                //进入格子
                EnterGrid(bornGrid);

                //初始化战斗行为系统
                if (battleBehaviourSystem != null)
                {
                    battleBehaviourSystem.Init(this, battleField);
                }

                //重置bbsys
                if (battleBehaviourSystem != null)
                {
                    battleBehaviourSystem.ResetSystem();
                }
            }
        }
Exemple #6
0
        //使用道具
        public bool UseItem(int itemID, int itemCount)
        {
            if (package != null)
            {
                var item = PackageItemManager.Instance.GetItem(itemID);
                if (item == null)
                {
                    return(false);
                }

                int finalCount = 0;
                int usedCount  = package.TryUseItem(itemID, itemCount, ref finalCount);
                if (usedCount > 0)
                {
                    BattleUnitUseItemAction action = BattleUnitActionEvent.CreateEvent <BattleUnitUseItemAction>(BattleUnitActionType.UseItem, this);
                    action.itemID      = itemID;
                    action.useCount    = usedCount;
                    action.remainCount = finalCount;
                    switch (item.itemType)
                    {
                    case PackageItemType.Recover:
                        action.attributeUpdate               = new BattleUnitSyncAttribute();
                        action.attributeUpdate.hpChanged     = Mathf.Min(battleUnitAttribute.maxHp - battleUnitAttribute.hp, item.hpRecovery);
                        action.attributeUpdate.energyChanged = Mathf.Min(battleUnitAttribute.maxEnergy - battleUnitAttribute.energy, item.energyRecovery);
                        action.attributeUpdate.currentHP     = battleUnitAttribute.hp + action.attributeUpdate.hpChanged;
                        action.attributeUpdate.currentEnergy = battleUnitAttribute.energy + action.attributeUpdate.energyChanged;

                        //自身属性更新
                        battleUnitAttribute.hp     = action.attributeUpdate.currentHP;
                        battleUnitAttribute.energy = action.attributeUpdate.currentEnergy;

                        break;

                    default:
                        break;
                    }
                    battleField.AppendBattleAction(action);
                }

                return(usedCount > 0);
            }
            else
            {
                UtilityHelper.LogError(string.Format("Use item failed, no package : {0} -> {1}", battleUnitAttribute.battleUnitName, itemID));
                return(false);
            }
        }
        //播放战场动作
        private IEnumerator PlayBattleByCoroutine(System.Action callback)
        {
            if (battleField == null ||
                battleField.battleFieldEvents == null ||
                battleField.battleFieldEvents.Count == 0)
            {
                UtilityHelper.LogError(string.Format("Play battle action failed. -> {0}", battleField.ID));
                yield break;
            }

            //遍历所有战斗动作
            while (currentActionIndex < battleField.battleFieldEvents.Count)
            {
                //一个英雄行动事件
                if (battleField.battleFieldEvents[currentActionIndex] is BattleUnitActionEvent)
                {
                    BattleUnitActionEvent actionEvent = (BattleUnitActionEvent)battleField.battleFieldEvents[currentActionIndex];
                    if (actionEvent.battleUnitActionType != BattleUnitActionType.EnterBattleField)
                    {
                        hotPointGridUnit   = actionEvent.actionUnit.mapGrid;
                        hotPointBattleUnit = actionEvent.actionUnit;
                    }

                    //有对应的战斗单位,且这个战斗单位已经连接了战斗单位渲染器
                    if (actionEvent.actionUnit != null && actionEvent.actionUnit.battleUnitRenderer != null)
                    {
                        yield return(actionEvent.actionUnit.battleUnitRenderer.RunHeroAction(actionEvent));
                    }
                }
                //一个格子事件
                else if (battleField.battleFieldEvents[currentActionIndex] is GridUnitEvent)
                {
                    GridUnitEvent gridUnitEvent = (GridUnitEvent)battleField.battleFieldEvents[currentActionIndex];
                    if (gridUnitEvent.grid != null && gridUnitEvent.grid.gridUnitRenderer != null)
                    {
                        yield return(gridUnitEvent.grid.gridUnitRenderer.RunGridEvent(gridUnitEvent));
                    }
                }
                ++currentActionIndex;
            }

            if (callback != null)
            {
                callback();
            }
        }
Exemple #8
0
        private void RecoverEnergy()
        {
            //数值改变
            battleUnitAttribute.energy += EGameConstL.EnergyRecoverPerRound;
            battleUnitAttribute.energy  = battleUnitAttribute.energy > battleUnitAttribute.maxEnergy ? battleUnitAttribute.maxEnergy : battleUnitAttribute.energy;

            //创建一个Action
            BattleUnitAttributeUpdate action = BattleUnitActionEvent.CreateEvent <BattleUnitAttributeUpdate>(BattleUnitActionType.AttributeUpdate, this);

            action.attribute               = new BattleUnitSyncAttribute();
            action.attribute.hpChanged     = 0;
            action.attribute.currentHP     = battleUnitAttribute.hp;
            action.attribute.energyChanged = EGameConstL.EnergyRecoverPerRound;
            action.attribute.currentEnergy = battleUnitAttribute.energy;
            action.attribute.currentBP     = battleUnitAttribute.BP;

            battleField.AppendBattleAction(action);
        }
Exemple #9
0
        //自动
        private HeroActionState AutoAction()
        {
            BattleBehaviourSystem.BattleDecision decision = battleBehaviourSystem.Think();

            if (decision == null)
            {
                BattleUnitAttributeUpdate action = BattleUnitActionEvent.CreateEvent <BattleUnitAttributeUpdate>(BattleUnitActionType.AttributeUpdate, this);
                action.attribute               = new BattleUnitSyncAttribute();
                action.attribute.hpChanged     = 0;
                action.attribute.currentHP     = battleUnitAttribute.hp;
                action.attribute.energyChanged = 0;
                action.attribute.currentEnergy = battleUnitAttribute.energy;
                action.attribute.currentBP     = battleUnitAttribute.BP;
                battleField.AppendBattleAction(action);
                return(HeroActionState.Normal);
            }

            //判断是否切换目标
            if (decision.targetBattleUnit != null && !decision.targetBattleUnit.Equals(targetBattleUnit))
            {
                BattleUnitChangeTargetAction action = BattleUnitActionEvent.CreateEvent <BattleUnitChangeTargetAction>(BattleUnitActionType.ChangeTarget, this);
                action.lastTargetUnit = targetBattleUnit;
                action.newTargetUnit  = decision.targetBattleUnit;
                battleField.AppendBattleAction(action);

                targetBattleUnit = decision.targetBattleUnit;
            }

            //需要移动
            if (decision.movePath != null && decision.movePath.Length > 0)
            {
                MoveToTargetGrid(targetBattleUnit, decision.movePath[decision.movePath.Length - 1], decision.movePath);
            }

            //自动搓招儿
            AutoUseSkill(decision);

            return(HeroActionState.Normal);
        }
Exemple #10
0
        //使用技能
        public void UseSkill(SO_BattleSkill battleSkill, BattleUnit targetBattleUnit = null, GridUnit targetGridUnit = null)
        {
            if (battleSkill == null)
            {
                UtilityHelper.LogError("Use skill error. Battle skill is none.");
                return;
            }

            GridUnit temp = targetGridUnit;

            if (temp == null && targetBattleUnit != null)
            {
                temp = targetBattleUnit.mapGrid;
            }
            if (temp != null && mapGrid.Distance(temp) > battleSkill.GetReleaseRadius(mapGrid))
            {
                return;
            }

            BattleSkillEffectAnalysis analysis = BattleCalculator.Instance.AnalyseBattleSkillEffect(battleSkill, this, targetBattleUnit, targetGridUnit);

            if (analysis == null)
            {
                UtilityHelper.LogError("Use skill error. Analysis failed:" + battleSkill.skillName);
                return;
            }

            skillResults.Clear();

            //主要影响
            for (int i = 0; i < analysis.mainReceiver.Count; ++i)
            {
                skillResults.Add(BattleCalculator.Instance.CalcSingle(this, analysis.mainReceiver[i], battleSkill, true));
            }
            //次要影响
            for (int i = 0; i < analysis.minorReceiver.Count; ++i)
            {
                skillResults.Add(BattleCalculator.Instance.CalcSingle(this, analysis.minorReceiver[i], battleSkill, false));
            }

            //连招combo统计
            if (battleUnitAttribute.manualOperation)
            {
                UtilityHelper.Log("Check combo now");

                //返回真表示连招成立,则调用连招效果
                int comboID = battleUnitAttribute.comboJudge((int)battleSkill.damageType);
                if (comboID != -1)
                {
                    //对于即时生效的技能需要直接改变skillResult
                    ComboEffect(comboID, battleUnitAttribute);
                }
            }

            //产生使用技能的动作
            BattleUnitSkillAction skillAction = BattleUnitActionEvent.CreateEvent <BattleUnitSkillAction>(BattleUnitActionType.UseSkill, this);

            skillAction.battleSkill      = battleSkill;
            skillAction.skillResult      = skillResults.ToArray();
            skillAction.targetBattleUnit = targetBattleUnit;
            skillAction.targetGrid       = targetGridUnit;
            skillAction.selfAttribute    = BattleSkillCostEnergy(battleSkill);
            battleField.AppendBattleAction(skillAction);

            //伤害产生效果,计算仇恨
            for (int i = 0; i < skillResults.Count; ++i)
            {
                //接收伤害,属性变更
                skillResults[i].battleUnit.AcceptSkillResult(skillResults[i].syncAttribute);

                //产生仇恨
                if (battleSkill.damageType != BattleSkillDamageType.Heal && !skillResults[i].battleUnit.Equals(this))
                {
                    //新仇记录
                    for (int j = 0; j < enemyTeam.battleUnits.Count; ++j)
                    {
                        if (!enemyTeam.battleUnits[j].CanAction)
                        {
                            continue;
                        }

                        //每个战斗单位都需要知道发生了什么
                        if (!enemyTeam.battleUnits[j].battleUnitAttribute.manualOperation)
                        {
                            enemyTeam.battleUnits[j].battleBehaviourSystem.RecordSkillResult(this, skillResults[i]);
                        }
                    }
                }
            }
        }