예제 #1
0
        //某个战斗单位点击了移动
        public void BattleUnitMove(BattleUnit battleUnit)
        {
            if (battleUnit == null ||
                battleUnit.battleUnitRenderer == null ||
                !battleUnit.battleUnitRenderer.Equals(manualOperatingBattleUnitRenderer))
            {
                UtilityHelper.LogError("Battle unit move failed.");
                return;
            }

            //显示移动范围
            SetCircularRangeRenderStateActive(
                true,
                GridRenderType.MoveRange,
                battleUnit.mapGrid.row,
                battleUnit.mapGrid.column,
                battleUnit.battleUnitAttribute.mobility);

            //设定为移动状态
            manualOperationState = ManualOperationState.Move;

            //关闭选择操作界面
            HideManualActionList();
        }
예제 #2
0
        //点击了地块、战斗单位
        private void OnBattleUnitAndGridTouched(GridUnit gridTouched, BattleUnit battleUnitTouched)
        {
#if TEST_NAV
            Test_Nav(gridTouched);
            return;
#endif
#if TEST_RANGE
            Test_Range(gridTouched);
            return;
#endif
#if TEST_REMOTE_RANGE
            Test_RemoteRange(gridTouched);
            return;
#endif
            if (battleUnitTouched != null && battleUnitTouched.battleBehaviourSystem != null)
            {
                battleUnitTouched.battleBehaviourSystem.Think();
            }

            UIViewManager.Instance.ShowView(UIViewName.BattleFieldUnitInfo, gridTouched, battleUnitTouched);

            //通知helper处理点击反馈逻辑
            manualOperationHelper.OnBattleUnitAndGridTouched(gridTouched, battleUnitTouched);
        }
예제 #3
0
        //开始战斗
        private void Fight()
        {
            battleState = BattleState.Fighting;

            BattleUnit actionUnit = null;

            do
            {
                //连接渲染器,则一步一更新
                //没有连接渲染器,则一直计算直到结束
                actionUnit = actionQueue.Peek();
                if (firstFight)
                {
                    firstFight = false;
                }
                else
                {
                    if (actionUnit.BPStage)
                    {
                        UtilityHelper.Log("We are in BP stage, continue to fight");
                        actionUnit.battleUnitAttribute.BPUsed();
                    }
                    else
                    {
                        UtilityHelper.Log("change queue order");
                        if (actionUnit.battleUnitAttribute.BPUsingStage())
                        {
                            actionUnit.battleUnitAttribute.OutOfBPAction();
                        }
                        actionQueue.Dequeue();
                        CalculateNextAction(actionUnit);
                        actionUnit = actionQueue.Peek();
                    }
                }

                //增加BP值
                if (actionUnit.battleUnitAttribute.manualOperation &&
                    actionUnit.battleUnitAttribute.BPUsingStage() == false)
                {
                    if (actionUnit.battleUnitAttribute.BP < EGameConstL.BPMax)
                    {
                        actionUnit.battleUnitAttribute.BP++;
                    }
                }

                if (actionUnit == null)
                {
                    battleState = BattleState.End;
                    break;
                }

                if (actionUnit.CanAction)
                {
                    HeroActionState state = actionUnit.BattleAction();

                    switch (state)
                    {
                    case HeroActionState.Normal:
                        battleState = BattleState.Fighting;
                        break;

                    case HeroActionState.WaitForPlayerChoose:
                        battleState = BattleState.WaitForPlayer;
                        break;

                    case HeroActionState.Error:
                        battleState = BattleState.Exception;
                        break;

                    case HeroActionState.Warn:
                        battleState = BattleState.Exception;
                        UtilityHelper.LogWarning(string.Format("Warning: battle action state warning -> {0}", actionUnit.ToString()));
                        break;

                    default:
                        break;
                    }
                }

                if (battleFieldEvents.Count > EGameConstL.BattleFieldMaxActions)
                {
                    UtilityHelper.LogError("Battle actions overflow max limit.");
                    battleState = BattleState.Exception;
                }
                else
                {
                    //只在这种情况下做战斗结束的判断
                    if (!actionUnit.CanAction ||
                        actionUnit.targetBattleUnit == null ||
                        !actionUnit.targetBattleUnit.CanAction)
                    {
                        CheckBattleEnd();
                    }
                }
            } while (battleFieldRenderer == null &&
                     battleState != BattleState.End &&
                     battleState != BattleState.Exception);

            //连接了渲染器,一步一表现
            if (battleFieldRenderer != null)
            {
                if (battleState == BattleState.WaitForPlayer)
                {
                    battleFieldRenderer.PlayBattle(null);
                }

                else
                {
                    battleFieldRenderer.PlayBattle(Run);
                }
            }
            else
            {
                Run();
            }
        }
예제 #4
0
        /// <summary>
        /// 计算单个效果
        /// </summary>
        /// <param name="releaser">释放者</param>
        /// <param name="target">目标</param>
        /// <param name="battleSkill">技能</param>
        /// <param name="mainEffect">是否主要伤害</param>
        /// <returns>技能结果</returns>
        public BattleUnitSkillResult CalcSingle(BattleUnit releaser, BattleUnit target, SO_BattleSkill battleSkill, bool mainEffect)
        {
            BattleUnitSkillResult result = new BattleUnitSkillResult();

            result.battleUnit    = target;
            result.battleSkill   = battleSkill;
            result.syncAttribute = new BattleUnitSyncAttribute();
            //简单计算生命值
            switch (battleSkill.damageType)
            {
            case BattleSkillDamageType.Physical:
            case BattleSkillDamageType.Move:
            case BattleSkillDamageType.Skill:
                float critRatio = releaser.battleUnitAttribute.GetTargetCritRatio(target);              //判断是否暴击
                float critNum   = Random.Range(0.0f, 1.0f);
                if (critNum < critRatio)
                {
                    result.crit = true;
                }
                else
                {
                    result.crit = false;
                }

                float hpChanged = releaser.battleUnitAttribute.power * battleSkill.powerModulus;        //力量补正
                hpChanged += releaser.battleUnitAttribute.speed * battleSkill.speedModulus;             //速度补正
                hpChanged += releaser.battleUnitAttribute.technic * battleSkill.technicModulus;         //技巧补正
                hpChanged += releaser.battleUnitAttribute.power * EGameConstL.PowerCommonModulus;       //力量值附加补正
                hpChanged *= releaser.battleUnitAttribute.AtkUpRatio;                                   //通用攻击力提升
                hpChanged *= releaser.battleUnitAttribute.GetDamageTypeModulus(target);                 //属性克制补正
                hpChanged  = Mathf.Max(0, hpChanged - target.battleUnitAttribute.Def);                  //直接减去目标防御值
                if (result.crit)
                {
                    hpChanged *= 2;                                  //判断是否暴击
                }
                result.syncAttribute.hpChanged = (int)-hpChanged;    //(Mathf.Max(0, releaser.battleUnitAttribute.Atk - target.battleUnitAttribute.Def + battleSkill.mainValue));
                //能量不变
                result.syncAttribute.energyChanged = 0;
                result.syncAttribute.currentEnergy = target.battleUnitAttribute.energy;

                float avoidRatio = releaser.battleUnitAttribute.GetTargetAvoidRatio(target);            //判断是否闪避
                float avoidNum   = Random.Range(0.0f, 1.0f);
                if (!result.crit && avoidNum < avoidRatio)
                {
                    result.syncAttribute.hpChanged = 0;
                    result.avoid = true;
                }
                else
                {
                    result.avoid = false;
                }
                UtilityHelper.LogFormat("Is critical: {0}, Is avoid: {1}", result.crit, result.avoid);
                break;

            case BattleSkillDamageType.Heal:
                result.syncAttribute.hpChanged = Mathf.Min(battleSkill.mainValue, target.battleUnitAttribute.maxHp - target.battleUnitAttribute.hp);
                //能量不变
                result.syncAttribute.energyChanged = 0;
                result.syncAttribute.currentEnergy = target.battleUnitAttribute.energy;
                break;

            default:
                break;
            }
            //hp变化
            target.battleUnitAttribute.hp += result.syncAttribute.hpChanged;
            target.battleUnitAttribute.hp  = Mathf.Clamp(target.battleUnitAttribute.hp, 0, target.battleUnitAttribute.maxHp);
            //记录变化
            result.syncAttribute.currentHP = target.battleUnitAttribute.hp;
            return(result);
        }
예제 #5
0
        public BattleSkillEffectAnalysis AnalyseBattleSkillEffect(SO_BattleSkill battleSkill, BattleUnit releaser = null, BattleUnit targetBattleUnit = null, GridUnit targetGridUnit = null)
        {
            battleSkillEffectAnalysis.Reset();

            if (releaser == null)
            {
                UtilityHelper.LogError("Analyse Battle Skill Effect error.Releaser is none.");
                return(null);
            }

            switch (battleSkill.targetType)
            {
            //对战斗单位
            case BattleSkillTargetType.BattleUnit:
                if (targetBattleUnit == null)
                {
                    return(null);
                }
                else
                {
                    battleSkillEffectAnalysis.battleSkill = battleSkill;
                    //记录主要影响
                    battleSkillEffectAnalysis.mainReceiver.Add(targetBattleUnit);
                    if (battleSkill.effectRadius > 0)
                    {
                        //暂时定为次要目标与主要目标同类
                        BattleTeam battleTeam = targetBattleUnit.battleField.GetBattleTeam(targetBattleUnit, true);
                        if (battleTeam != null)
                        {
                            for (int i = 0; i < battleTeam.battleUnits.Count; ++i)
                            {
                                if (!battleTeam.battleUnits[i].CanAction || battleTeam.battleUnits[i].Equals(targetBattleUnit))
                                {
                                    continue;
                                }
                                //有次要影响
                                if (battleTeam.battleUnits[i].mapGrid.Distance(targetBattleUnit.mapGrid) <= battleSkill.effectRadius)
                                {
                                    battleSkillEffectAnalysis.minorReceiver.Add(battleTeam.battleUnits[i]);
                                }
                            }
                        }
                    }
                }
                break;

            //对自己
            case BattleSkillTargetType.Self:
                battleSkillEffectAnalysis.battleSkill = battleSkill;
                //记录主要影响
                battleSkillEffectAnalysis.mainReceiver.Add(releaser);
                if (battleSkill.effectRadius > 0)
                {
                    //暂时定为次要目标与主要目标同类
                    BattleTeam battleTeam = releaser.battleField.GetBattleTeam(releaser, true);
                    if (battleTeam != null)
                    {
                        for (int i = 0; i < battleTeam.battleUnits.Count; ++i)
                        {
                            if (!battleTeam.battleUnits[i].CanAction || battleTeam.battleUnits[i].Equals(releaser))
                            {
                                continue;
                            }
                            //有次要影响
                            if (battleTeam.battleUnits[i].mapGrid.Distance(releaser.mapGrid) <= battleSkill.effectRadius)
                            {
                                battleSkillEffectAnalysis.minorReceiver.Add(battleTeam.battleUnits[i]);
                            }
                        }
                    }
                }
                break;

            //对某个地点
            case BattleSkillTargetType.GridUnit:
                if (targetGridUnit == null)
                {
                    return(null);
                }
                else
                {
                    battleSkillEffectAnalysis.battleSkill = battleSkill;
                    if (battleSkill.effectRadius > 0)
                    {
                        BattleTeam battleTeam = releaser.battleField.GetBattleTeam(releaser, battleSkill.damageType == BattleSkillDamageType.Heal);
                        if (battleTeam != null)
                        {
                            for (int i = 0; i < battleTeam.battleUnits.Count; ++i)
                            {
                                if (!battleTeam.battleUnits[i].CanAction || battleTeam.battleUnits[i].Equals(releaser))
                                {
                                    continue;
                                }
                                //记录主要影响
                                if (battleTeam.battleUnits[i].mapGrid.Distance(targetGridUnit) <= battleSkill.effectRadius)
                                {
                                    battleSkillEffectAnalysis.mainReceiver.Add(battleTeam.battleUnits[i]);
                                }
                            }
                        }
                    }
                }
                break;

            default:
                break;
            }

            return(battleSkillEffectAnalysis);
        }
예제 #6
0
 public void OnEnter(BattleUnit battleUnit)
 {
     this.battleUnit = battleUnit;
     UpdateRuntimePasses(false);
 }
예제 #7
0
 public void BattleUnitUseItem(BattleUnit battleUnit, SO_PackageItem item, int count)
 {
     manualOperationHelper.BattleUnitUseItem(battleUnit, item, count);
 }
예제 #8
0
 //某个战斗单位点击了待命
 public void BattleUnitStay(BattleUnit battleUnit)
 {
     manualOperationHelper.BattleUnitStay(battleUnit);
 }
예제 #9
0
        //点击了技能,在单体带环绕的技能情况下
        private void OnBattleUnitAndGridTouched_StateSkill_SurroundBattleUnit(GridUnit gridTouched, BattleUnit battleUnitTouched)
        {
            //没有点中战斗单位
            if (battleUnitTouched == null)
            {
                return;
            }

            //是否是有效单位
            if (usedManualReleaseAnalysisor.suitableUnits.Contains(battleUnitTouched))
            {
                //重复点击同一个有效的战斗单位,则释放技能
                if (battleUnitTouched.battleUnitRenderer.Equals(selectedBattleUnitRenderer))
                {
                    ManualSkill(battleUnitTouched);
                    return;
                }
                else if (selectedBattleUnitRenderer != null)
                {
                    //取消选中
                    selectedBattleUnitRenderer.UpdateRenderState(BattleUnitRenderState.Normal);
                }
                //显示新的范围
                selectedBattleUnitRenderer = battleUnitTouched.battleUnitRenderer;
                //范围内战斗单位设置为选中
                for (int i = 0; i < usedManualReleaseAnalysisor.suitableUnits.Count; ++i)
                {
                    if (usedManualReleaseAnalysisor.suitableUnits[i].mapGrid.Distance(gridTouched) <= usedManualReleaseAnalysisor.battleSkill.effectRadius)
                    {
                        usedManualReleaseAnalysisor.suitableUnits[i].battleUnitRenderer.UpdateRenderState(BattleUnitRenderState.Selected);
                    }
                }
                SetCircularRangeRenderStateActive(
                    true,
                    GridRenderType.SkillEffectRange,
                    gridTouched.row,
                    gridTouched.column,
                    usedManualReleaseAnalysisor.battleSkill.effectRadius);
            }
            //不是有效单位
            else if (usedManualReleaseAnalysisor.distanceLimit.Contains(battleUnitTouched))
            {
                UtilityHelper.Log("目标超出攻击范围");
            }

            //队伍不符合
            else if (usedManualReleaseAnalysisor.teamLimit.Contains(battleUnitTouched))
            {
                UtilityHelper.Log("不能对同一个队伍的单位使用这个技能");
            }

            else
            {
                UtilityHelper.Log("目标单位无效");
            }
        }
예제 #10
0
        //点击了技能,在单体目标技能情况下
        private void OnBattleUnitAndGridTouched_StateSkill_SingleBattleUnitTarget(GridUnit gridTouched, BattleUnit battleUnitTouched)
        {
            //没有点中战斗单位
            if (battleUnitTouched == null)
            {
                return;
            }

            //点中了可以被使用技能的单位
            if (usedManualReleaseAnalysisor.suitableUnits.Contains(battleUnitTouched))
            {
                ManualSkill(battleUnitTouched);
            }

            //点中了超出距离的
            else if (usedManualReleaseAnalysisor.distanceLimit.Contains(battleUnitTouched))
            {
                UtilityHelper.Log("目标超出攻击范围");
            }

            //同一个队伍
            else if (usedManualReleaseAnalysisor.teamLimit.Contains(battleUnitTouched))
            {
                UtilityHelper.Log("不能对同一个队伍的单位使用这个技能");
            }

            else
            {
                UtilityHelper.Log("无效的目标单位");
            }
        }
예제 #11
0
        //点击了地块、战斗单位 -- 在当前是选择移动目标的情况下
        private void OnBattleUnitAndGridTouched_StateMove(GridUnit gridTouched, BattleUnit battleUnitTouched)
        {
            //点中了战斗单位
            if (battleUnitTouched != null)
            {
                //显示战斗单位的详情
                UIViewManager.Instance.ShowView(UIViewName.BattleFieldUnitInfo, gridTouched, battleUnitTouched);
            }
            //点中了地图
            else
            {
                //障碍物不能作为移动目标(暂时)
                if (gridTouched.GridType == GridType.Obstacle)
                {
                    UIViewManager.Instance.ShowView(UIViewName.BattleFieldUnitInfo, gridTouched, battleUnitTouched);
                }
                else
                {
                    //点击是否超出了范围
                    GridUnit fromGrid = manualOperatingBattleUnitRenderer.battleUnit.mapGrid;
                    if (fromGrid.Distance(gridTouched) > manualOperatingBattleUnitRenderer.battleUnit.battleUnitAttribute.mobility)
                    {
                        UtilityHelper.Log("超出了移动半径!");
                        UIViewManager.Instance.ShowView(UIViewName.BattleFieldUnitInfo, gridTouched, battleUnitTouched);
                    }
                    else
                    {
                        MapNavigator.Instance.NewNavigate(
                            manualOperatingBattleUnitRenderer.battleUnit,
                            fieldRenderer.battleField.battleMap,
                            fromGrid,
                            gridTouched,
                            UtilityObjs.gridUnits);
                        //判断移动是否可以到达
                        //bool result = MapNavigator.Instance.Navigate(
                        //    fieldRenderer.battleField.battleMap,
                        //    fromGrid,
                        //    gridTouched,
                        //    UtilityObjs.gridUnits,
                        //    null,
                        //    manualOperatingBattleUnitRenderer.battleUnit.battleUnitAttribute.mobility
                        //    );

                        bool result = MapNavigator.Instance.NewNavigate(
                            manualOperatingBattleUnitRenderer.battleUnit,
                            fieldRenderer.battleField.battleMap,
                            fromGrid,
                            gridTouched,
                            UtilityObjs.gridUnits);

                        //判断是否可以到达(导航成功且可以可以到达)
                        if (result && UtilityObjs.gridUnits[UtilityObjs.gridUnits.Count - 1].Equals(gridTouched))
                        {
                            //可以到达
                            ManualMoveTo(gridTouched, UtilityObjs.gridUnits.ToArray());
                            UtilityObjs.gridUnits.Clear();
                        }
                        else
                        {
                            //不可以到达
                            UtilityHelper.Log("点击位置不可到达!");
                            UIViewManager.Instance.ShowView(UIViewName.BattleFieldUnitInfo, gridTouched, battleUnitTouched);
                        }
                    }
                }
            }
        }
예제 #12
0
 //使用道具
 public void UseItem(BattleUnit battleUnit, SO_PackageItem item, int count)
 {
 }
예제 #13
0
        //某个战斗单位点击了使用技能
        public void BattleUnitUseSkill(BattleUnit battleUnit, SO_BattleSkill skill)
        {
            if (battleUnit == null ||
                battleUnit.battleUnitRenderer == null ||
                !battleUnit.battleUnitRenderer.Equals(manualOperatingBattleUnitRenderer))
            {
                UtilityHelper.LogError("Battle unit use skill failed.");
                HideManualActionList();
                return;
            }

            //获取推算的技能释放结果
            usedManualReleaseAnalysisor = BattleCalculator.Instance.ManualReleaseAnalysisor;

            //分析结果
            usedManualReleaseAnalysisor.Analysis(manualOperatingBattleUnitRenderer.battleUnit, skill);

            //显示技能释放范围
            if (skill.GetReleaseRadius(battleUnit.mapGrid) > 0)
            {
                SetCircularRangeRenderStateActive(
                    true,
                    GridRenderType.SkillReleaseRange,
                    battleUnit.mapGrid.row,
                    battleUnit.mapGrid.column,
                    skill.GetReleaseRadius(battleUnit.mapGrid));
            }

            //根据类型判断技能显示状态
            switch (skill.targetType)
            {
            //对单个目标
            case BattleSkillTargetType.BattleUnit:
                //可以被选中的
                for (int i = 0; i < usedManualReleaseAnalysisor.suitableUnits.Count; ++i)
                {
                    usedManualReleaseAnalysisor.suitableUnits[i].battleUnitRenderer.UpdateRenderState(BattleUnitRenderState.Selectable);
                }

                //不可以被选中的
                for (int i = 0; i < usedManualReleaseAnalysisor.distanceLimit.Count; ++i)
                {
                    usedManualReleaseAnalysisor.distanceLimit[i].battleUnitRenderer.UpdateRenderState(BattleUnitRenderState.NotSelectable);
                }

                //队伍不合适的
                for (int i = 0; i < usedManualReleaseAnalysisor.teamLimit.Count; ++i)
                {
                    usedManualReleaseAnalysisor.teamLimit[i].battleUnitRenderer.UpdateRenderState(BattleUnitRenderState.Normal);
                }

                //设定技能操作类型
                skillOperationType = skill.effectRadius > 0 ? SkillOperationType.SurroundBattleUnit : SkillOperationType.SingleBattleUnitTarget;
                break;

            //对范围(某一个位置)目标
            case BattleSkillTargetType.GridUnit:
                skillOperationType = SkillOperationType.GridUnitTarget;
                //如果没有位置可选,则直接打开范围
                if (skill.GetReleaseRadius(battleUnit.mapGrid) <= 0)
                {
                    //可以被选中,标记为已被选中
                    for (int i = 0; i < usedManualReleaseAnalysisor.suitableUnits.Count; ++i)
                    {
                        usedManualReleaseAnalysisor.suitableUnits[i].battleUnitRenderer.UpdateRenderState(BattleUnitRenderState.Selected);
                    }

                    //不可以被选中的
                    for (int i = 0; i < usedManualReleaseAnalysisor.distanceLimit.Count; ++i)
                    {
                        usedManualReleaseAnalysisor.distanceLimit[i].battleUnitRenderer.UpdateRenderState(BattleUnitRenderState.NotSelectable);
                    }

                    //队伍不合适的
                    for (int i = 0; i < usedManualReleaseAnalysisor.teamLimit.Count; ++i)
                    {
                        usedManualReleaseAnalysisor.teamLimit[i].battleUnitRenderer.UpdateRenderState(BattleUnitRenderState.Normal);
                    }

                    OnBattleUnitAndGridTouched_StateSkill_GridUnitTarget(battleUnit.mapGrid, null);
                }
                else
                {
                    //需要指定范围,需要点击目标地块
                }
                break;

            //以自身为中心的
            case BattleSkillTargetType.Self:
                //可以被选中,标记为已被选中
                for (int i = 0; i < usedManualReleaseAnalysisor.suitableUnits.Count; ++i)
                {
                    usedManualReleaseAnalysisor.suitableUnits[i].battleUnitRenderer.UpdateRenderState(BattleUnitRenderState.Selected);
                }

                //不可以被选中的
                for (int i = 0; i < usedManualReleaseAnalysisor.distanceLimit.Count; ++i)
                {
                    usedManualReleaseAnalysisor.distanceLimit[i].battleUnitRenderer.UpdateRenderState(BattleUnitRenderState.NotSelectable);
                }

                //队伍不合适的
                for (int i = 0; i < usedManualReleaseAnalysisor.teamLimit.Count; ++i)
                {
                    usedManualReleaseAnalysisor.teamLimit[i].battleUnitRenderer.UpdateRenderState(BattleUnitRenderState.Normal);
                }

                skillOperationType = SkillOperationType.SurroundSelf;

                //省去一步点击操作,直接展示区域
                OnBattleUnitAndGridTouched_StateSkill_SurroundSelf(battleUnit.mapGrid, battleUnit);
                break;

            default:
                break;
            }

            //切换操作状态
            manualOperationState = ManualOperationState.Skill;
            HideManualActionList();
        }
예제 #14
0
 public void OnLeave()
 {
     this.battleUnit = null;
     UpdateRuntimePasses(false);
 }
 public float GetTargetAvoidRatio(BattleUnit target)
 {
     return(Mathf.Clamp((target.battleUnitAttribute.speed / speed) * 0.5f, 0.0f, 1.0f));      //待修改的公式
 }
 public float GetTargetCritRatio(BattleUnit target)
 {
     return(Mathf.Clamp((technic / target.battleUnitAttribute.technic) * 0.2f, 0.0f, 1.0f));  //待修改的公式
 }
예제 #17
0
 //点击了技能,在以自身为原点的技能情况下
 private void OnBattleUnitAndGridTouched_StateSkill_SurroundSelf(GridUnit gridTouched, BattleUnit battleUnitTouched)
 {
     //当前选定的战斗单位为空,表示还没有显示攻击范围
     if (selectedBattleUnitRenderer == null)
     {
         selectedBattleUnitRenderer = battleUnitTouched.battleUnitRenderer;
         //展示攻击区域
         SetCircularRangeRenderStateActive(
             true,
             GridRenderType.SkillEffectRange,
             selectedBattleUnitRenderer.battleUnit.mapGrid.row,
             selectedBattleUnitRenderer.battleUnit.mapGrid.column,
             usedManualReleaseAnalysisor.battleSkill.effectRadius);
     }
     else
     {
         //点击任意位置判断为释放
         ManualSkill(manualOperatingBattleUnitRenderer.battleUnit.mapGrid);
     }
 }
예제 #18
0
 //某个战斗单位点击了移动
 public void BattleUnitMove(BattleUnit battleUnit)
 {
     manualOperationHelper.BattleUnitMove(battleUnit);
 }
예제 #19
0
        //点击了技能,在以固定地点为原点的技能情况下
        private void OnBattleUnitAndGridTouched_StateSkill_GridUnitTarget(GridUnit gridTouched, BattleUnit battleUnitTouched)
        {
            //如果当前有点中的格子
            if (selectedGridUnitRenderer != null &&
                (selectedGridUnitRenderer.Equals(gridTouched.gridUnitRenderer) || usedManualReleaseAnalysisor.battleSkill.GetReleaseRadius(usedManualReleaseAnalysisor.releaser.mapGrid) <= 0))
            {
                //如果当前的释放距离为0,表示无需二次点击确认,直接释放
                if (usedManualReleaseAnalysisor.battleSkill.GetReleaseRadius(usedManualReleaseAnalysisor.releaser.mapGrid) <= 0)
                {
                    ManualSkill(manualOperatingBattleUnitRenderer.battleUnit.mapGrid);
                    return;
                }

                //点中了重复的格子,判断是否有目标
                bool hasTarget = false;
                for (int i = 0; i < usedManualReleaseAnalysisor.suitableUnits.Count; ++i)
                {
                    if (usedManualReleaseAnalysisor.suitableUnits[i].mapGrid.Distance(gridTouched) <= usedManualReleaseAnalysisor.battleSkill.effectRadius)
                    {
                        hasTarget = true;
                        break;
                    }
                }
                //有目标,则释放
                if (hasTarget)
                {
                    ManualSkill(gridTouched);
                }
                else
                {
                    UtilityHelper.Log("范围内没有目标");
                }
            }
            else
            {
                //这个格子不在范围内
                if (manualOperatingBattleUnitRenderer.battleUnit.mapGrid.Distance(gridTouched) <= usedManualReleaseAnalysisor.battleSkill.GetReleaseRadius(usedManualReleaseAnalysisor.releaser.mapGrid))
                {
                    if (selectedGridUnitRenderer != null)
                    {
                        //取消上一个范围显示
                        SetCircularRangeRenderStateActive(false, GridRenderType.SkillEffectRange);
                        //取消可被攻击单位的显示
                        for (int i = 0; i < usedManualReleaseAnalysisor.suitableUnits.Count; ++i)
                        {
                            usedManualReleaseAnalysisor.suitableUnits[i].battleUnitRenderer.UpdateRenderState(BattleUnitRenderState.Normal);
                        }
                    }
                    //设置新的范围显示
                    selectedGridUnitRenderer = gridTouched.gridUnitRenderer;
                    SetCircularRangeRenderStateActive(
                        true,
                        GridRenderType.SkillEffectRange,
                        gridTouched.row,
                        gridTouched.column,
                        usedManualReleaseAnalysisor.battleSkill.effectRadius
                        );
                    //设置新的可被攻击单位的显示
                    for (int i = 0; i < usedManualReleaseAnalysisor.suitableUnits.Count; ++i)
                    {
                        if (usedManualReleaseAnalysisor.suitableUnits[i].mapGrid.Distance(gridTouched) <= usedManualReleaseAnalysisor.battleSkill.effectRadius)
                        {
                            usedManualReleaseAnalysisor.suitableUnits[i].battleUnitRenderer.UpdateRenderState(BattleUnitRenderState.Selected);
                        }
                    }
                }
                else
                {
                    UtilityHelper.Log("超出区域");
                    UIViewManager.Instance.ShowView(UIViewName.BattleFieldUnitInfo, gridTouched, battleUnitTouched);
                }
            }
        }
예제 #20
0
 //某个战斗单位点击了使用技能
 public void BattleUnitUseSkill(BattleUnit battleUnit, SO_BattleSkill skill)
 {
     manualOperationHelper.BattleUnitUseSkill(battleUnit, skill);
 }
예제 #21
0
        //设置某个圆形区域的显示状态(每种类型只能显示一个)
        public void SetCircularRangeRenderStateActive(bool active, GridRenderType gridRenderType, int centerRow = -1, int centerColumn = -1, int radius = -1)
        {
            //确定是哪种范围
            List <GridUnit> rangeHighlightGridUnits = null;

            switch (gridRenderType)
            {
            case GridRenderType.MoveRange:
                if (centerRow != -1 && centerColumn != -1)
                {
                    BattleUnit battleUnit = fieldRenderer.battleField.battleMap.GetGridData(centerRow, centerColumn).battleUnit;
                    moveRangeGridUnits = MapNavigator.Instance.GetAccessibleGrids(battleUnit, fieldRenderer.battleField.battleMap);
                }
                rangeHighlightGridUnits = moveRangeGridUnits;
                break;

            case GridRenderType.SkillReleaseRange:
                rangeHighlightGridUnits = skillReleaseRangeGridUnits;
                break;

            case GridRenderType.SkillEffectRange:
                rangeHighlightGridUnits = skillEffectRangeGridUnits;
                break;

            default:
                UtilityHelper.LogError(string.Format("SetRangeHighlightActive error grid render type : {0}", gridRenderType));
                return;
            }

            //当前是取消激活
            if (!active)
            {
                for (int i = 0; i < rangeHighlightGridUnits.Count; ++i)
                {
                    if (rangeHighlightGridUnits[i].gridUnitRenderer != null)
                    {
                        rangeHighlightGridUnits[i].gridUnitRenderer.RemoveGridRenderType(gridRenderType);
                    }
                }
                //rangeHighlightGridUnits.Clear();
            }
            else
            {
                //当前存在上一个激活,先隐藏
                if (rangeHighlightGridUnits.Count > 0)
                {
                    SetCircularRangeRenderStateActive(false, gridRenderType);
                }
                //获取格子
                if (gridRenderType != GridRenderType.MoveRange)
                {
                    fieldRenderer.battleField.battleMap.GetCircularGrids(centerRow, centerColumn, radius, 0, true, rangeHighlightGridUnits);
                }
                //设置高亮状态
                for (int i = 0; i < rangeHighlightGridUnits.Count; ++i)
                {
                    if (rangeHighlightGridUnits[i].gridUnitRenderer != null)
                    {
                        rangeHighlightGridUnits[i].gridUnitRenderer.AppendGridRenderType(gridRenderType);
                    }
                }
            }
        }
예제 #22
0
 public override void OnExit()
 {
     base.OnExit();
     battleUnit = null;
 }
예제 #23
0
        //寻找某点到另一点的路径
        public bool NewNavigate(
            BattleUnit battleUnit,
            BattleMap battleMap,
            GridUnit from,
            GridUnit to,
            List <GridUnit> path,
            int stopDistance = 0)
        {
            PathTraceData[,] flag = new PathTraceData[battleMap.mapWidth, battleMap.mapHeight];
            PriorityQueue <PathTraceData> checkList = new PriorityQueue <PathTraceData>();
            PathTraceData currentUnit = new PathTraceData(battleUnit.battleUnitAttribute.mobility, from);

            flag[from.column, from.row] = currentUnit;
            bool isFind = false;

            checkList.Push(currentUnit);
            while (checkList.Count > 0)
            {
                currentUnit = checkList.Pop();
                if (currentUnit.currentGridUnit.Distance(to) <= stopDistance)
                {
                    isFind = true;
                    break;
                }
                List <GridUnit> gridUnitList = battleMap.GetNearbyGrid(currentUnit.currentGridUnit);
                foreach (GridUnit gridUnit in gridUnitList)
                {
                    float MovePointRemainder = currentUnit.MovePointRemainder - currentUnit.currentGridUnit.m_GridAttribute.m_CrossCost;
                    //绝对障碍不可通过
                    if (gridUnit.GridType == GridType.Obstacle)
                    {
                        continue;
                    }
                    //不能跳过去,高度太高
                    if (gridUnit.m_GridAttribute.m_Height - currentUnit.currentGridUnit.m_GridAttribute.m_Height > battleUnit.battleUnitAttribute.springPower)
                    {
                        continue;
                    }
                    //体积太大穿不过去
                    if (gridUnit.m_GridAttribute.m_MaxPassVolume < battleUnit.battleUnitAttribute.volume)
                    {
                        continue;
                    }
                    //剩余移动点数不足
                    //if (MovePointRemainder <= 0) continue;
                    //有敌人挡着(暂时还没判是否是友方)
                    if (gridUnit.battleUnit != null && gridUnit.battleUnit.CanAction && !gridUnit.NavigationPassable)
                    {
                        continue;
                    }

                    if (flag[gridUnit.column, gridUnit.row] == null || flag[gridUnit.column, gridUnit.row].MovePointRemainder < MovePointRemainder)
                    {
                        flag[gridUnit.column, gridUnit.row] = currentUnit;
                        checkList.Push(new PathTraceData(MovePointRemainder, gridUnit));
                    }
                }
            }

            if (!isFind)
            {
                return(false);
            }
            path.Clear();
            Stack <GridUnit> temp = new Stack <GridUnit>();

            while (!currentUnit.currentGridUnit.Equals(from))
            {
                if (currentUnit.MovePointRemainder >= 0)
                {
                    temp.Push(currentUnit.currentGridUnit);
                }
                currentUnit = flag[currentUnit.currentGridUnit.column, currentUnit.currentGridUnit.row];
            }
            while (temp.Count != 0)
            {
                path.Add(temp.Pop());
            }
            return(true);
        }