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); }
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); }
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; } } } }