コード例 #1
0
        private Boolean TryOpenDoor(GridSlot p_slot, EDirection p_dir)
        {
            List <InteractiveObject> doors = p_slot.GetDoors();

            for (Int32 i = 0; i < doors.Count; i++)
            {
                Door door = (Door)doors[i];
                if (door.Location == p_dir && door.State == EInteractiveObjectState.DOOR_CLOSED && door.Commands.Count > 0)
                {
                    door.Execute(LegacyLogic.Instance.MapLoader.Grid);
                    door.Update();
                    return(true);
                }
            }
            GridSlot neighborSlot = p_slot.GetNeighborSlot(LegacyLogic.Instance.MapLoader.Grid, p_dir);

            doors = neighborSlot.GetDoors();
            for (Int32 j = 0; j < doors.Count; j++)
            {
                Door door2 = (Door)doors[j];
                if (door2.Location == EDirectionFunctions.GetOppositeDir(p_dir) && door2.State == EInteractiveObjectState.DOOR_CLOSED && door2.Commands.Count > 0)
                {
                    door2.Execute(LegacyLogic.Instance.MapLoader.Grid);
                    door2.Update();
                    return(true);
                }
            }
            return(false);
        }
コード例 #2
0
        public override List <GridSlot> GetMeleeTargets(Grid p_grid, Party p_party)
        {
            List <GridSlot> list = new List <GridSlot>();
            GridSlot        slot = p_grid.GetSlot(p_party.Position);

            for (Int32 i = 0; i <= 3; i++)
            {
                GridSlot neighborSlot = slot.GetNeighborSlot(p_grid, (EDirection)i);
                if (neighborSlot.IsPassable(m_owner, false))
                {
                    list.Add(neighborSlot);
                }
            }
            return(list);
        }
コード例 #3
0
 protected virtual void DoRanged(Boolean p_isMagic, Party p_party, Grid p_grid, GridSlot p_startSlot, out Boolean p_isMelee)
 {
     p_isMelee = true;
     if (m_decision == EMonsterStrategyDecision.RANGED || m_decision == EMonsterStrategyDecision.CALCULATE_STRATEGY)
     {
         if (m_owner.DistanceToParty <= 1.6f)
         {
             m_decision = EMonsterStrategyDecision.MELEE;
             p_isMelee  = true;
         }
         if (!p_isMagic && m_owner.StaticData.SpellRanges > m_owner.CombatHandler.AttackRange && m_owner.DistanceToParty > 1.6f)
         {
             if (m_targetSlot == null)
             {
                 List <GridSlot> rangedTargets = GetRangedTargets(p_grid, p_party, m_owner.StaticData.SpellRanges);
                 if (rangedTargets.Count > 0)
                 {
                     rangedTargets.Sort(new Comparison <GridSlot>(DistSortAsc));
                     if (TryMove(rangedTargets, p_grid, p_startSlot, p_party))
                     {
                         p_isMelee = false;
                         return;
                     }
                     p_isMelee  = true;
                     m_decision = EMonsterStrategyDecision.MELEE;
                 }
                 else
                 {
                     p_isMelee  = true;
                     m_decision = EMonsterStrategyDecision.MELEE;
                 }
             }
         }
         else
         {
             m_decision = EMonsterStrategyDecision.MELEE;
             p_isMelee  = true;
         }
         if (!p_isMagic && m_owner.CombatHandler.AttackRange > 1f && m_owner.DistanceToParty > 1.6f)
         {
             p_isMelee  = false;
             m_decision = EMonsterStrategyDecision.RANGED;
             if (p_grid.LineOfSight(m_owner.Position, p_party.Position, true) && Position.Distance(m_owner.Position, p_party.Position) <= m_owner.CombatHandler.AttackRange && m_owner.DistanceToParty >= 2f)
             {
                 m_owner.CombatHandler.AttackRanged();
                 return;
             }
             if (m_targetSlot == null && (m_owner.Position.X == p_party.Position.X || m_owner.Position.Y == p_party.Position.Y))
             {
                 EDirection direction = EDirectionFunctions.GetDirection(p_party.Position, m_owner.Position);
                 GridSlot   gridSlot  = p_grid.GetSlot(p_party.Position);
                 for (Int32 i = 0; i < m_owner.StaticData.AttackRange; i++)
                 {
                     GridSlot neighborSlot = gridSlot.GetNeighborSlot(p_grid, direction);
                     if (neighborSlot == null)
                     {
                         break;
                     }
                     gridSlot = neighborSlot;
                 }
                 if (gridSlot != null)
                 {
                     m_targetSlot = gridSlot;
                 }
             }
             if (m_targetSlot == null)
             {
                 List <GridSlot> rangedTargets2 = GetRangedTargets(p_grid, p_party);
                 if (rangedTargets2.Count > 0)
                 {
                     rangedTargets2.Sort(new Comparison <GridSlot>(DistSortAsc));
                     if (TryMove(rangedTargets2, p_grid, p_startSlot, p_party))
                     {
                         return;
                     }
                     p_isMelee  = true;
                     m_decision = EMonsterStrategyDecision.MELEE;
                 }
                 else
                 {
                     p_isMelee  = true;
                     m_decision = EMonsterStrategyDecision.MELEE;
                 }
             }
             else
             {
                 if (!(m_owner.Position != m_targetSlot.Position))
                 {
                     p_isMelee  = true;
                     m_decision = EMonsterStrategyDecision.MELEE;
                     return;
                 }
                 if (TryMove(new List <GridSlot>
                 {
                     m_targetSlot
                 }, p_grid, p_startSlot, p_party))
                 {
                     return;
                 }
                 p_isMelee    = true;
                 m_targetSlot = null;
                 m_decision   = EMonsterStrategyDecision.CALCULATE_STRATEGY;
             }
         }
     }
 }