private List <Node> GetNeighbors(Node node) { List <Node> neighbors = new List <Node>(); foreach (Direction direction in _directions) { int destinationX = node.X; int destinationY = node.Y; bool isOnGround = node.IsOnGround; bool isSurfing = node.IsSurfing; direction.ApplyToCoordinates(ref destinationX, ref destinationY); Map.MoveResult result = _client.Map.CanMove(direction, destinationX, destinationY, isOnGround, isSurfing, _client.CanUseCut, _client.CanUseSmashRock); if (_client.Map.ApplyMovement(direction, result, ref destinationX, ref destinationY, ref isOnGround, ref isSurfing)) { if (result == Map.MoveResult.Icing) { _client.Map.ApplyCompleteIceMovement(direction, ref destinationX, ref destinationY, ref isOnGround); } else if (result == Map.MoveResult.Sliding) { _client.Map.ApplyCompleteSliderMovement(ref destinationX, ref destinationY, ref isOnGround); } neighbors.Add(new Node(destinationX, destinationY, isOnGround, isSurfing, direction)); } } if (!node.IsSurfing && _hasSurfAbility && _client.Map.CanSurf(node.X, node.Y, node.IsOnGround)) { neighbors.Add(new Node(node.X, node.Y, node.IsOnGround, true)); } return(neighbors); }
public bool MoveToSameCell() { Map.MoveResult result = _client.Map.CanMove(Direction.Right, _client.PlayerX + 1, _client.PlayerY, _client.IsSurfing, _client.Npcs); if (result == Map.MoveResult.Success || result == Map.MoveResult.NoLongerSurfing) { _client.Move(Direction.Right); _client.Move(Direction.Left); return(true); } result = _client.Map.CanMove(Direction.Left, _client.PlayerX - 1, _client.PlayerY, _client.IsSurfing, _client.Npcs); if (result == Map.MoveResult.Success || result == Map.MoveResult.NoLongerSurfing) { _client.Move(Direction.Left); _client.Move(Direction.Right); return(true); } result = _client.Map.CanMove(Direction.Down, _client.PlayerX, _client.PlayerY + 1, _client.IsSurfing, _client.Npcs); if (result == Map.MoveResult.Success || result == Map.MoveResult.NoLongerSurfing) { _client.Move(Direction.Down); _client.Move(Direction.Up); return(true); } result = _client.Map.CanMove(Direction.Up, _client.PlayerX, _client.PlayerY - 1, _client.IsSurfing, _client.Npcs); if (result == Map.MoveResult.Success || result == Map.MoveResult.NoLongerSurfing) { _client.Move(Direction.Up); _client.Move(Direction.Down); return(true); } return(false); }
private bool ApplyMovement(Direction direction) { int destinationX = PlayerX; int destinationY = PlayerY; switch (direction) { case Direction.Up: destinationY--; break; case Direction.Down: destinationY++; break; case Direction.Left: destinationX--; break; case Direction.Right: destinationX++; break; } Map.MoveResult result = Map.CanMove(direction, destinationX, destinationY, IsSurfing, Npcs); bool isSuccess = false; switch (result) { case Map.MoveResult.Success: isSuccess = true; break; case Map.MoveResult.Jump: isSuccess = true; destinationY += 1; break; case Map.MoveResult.NoLongerSurfing: isSuccess = true; IsSurfing = false; break; } if (isSuccess) { PlayerX = destinationX; PlayerY = destinationY; PositionUpdated?.Invoke(MapName, PlayerX, PlayerY); } return(isSuccess); }
private List <Node> GetNeighbors(Node node) { List <Node> neighbors = new List <Node>(); Map.MoveResult result = _client.Map.CanMove(Direction.Up, node.X, node.Y - 1, node.IsSurfing, _client.Npcs); if (result == Map.MoveResult.Success || result == Map.MoveResult.NoLongerSurfing) { bool surfing = (result == Map.MoveResult.NoLongerSurfing ? false : node.IsSurfing); neighbors.Add(new Node(node.X, node.Y - 1, surfing, Direction.Up)); } result = _client.Map.CanMove(Direction.Down, node.X, node.Y + 1, node.IsSurfing, _client.Npcs); if (result == Map.MoveResult.Success || result == Map.MoveResult.NoLongerSurfing) { bool surfing = (result == Map.MoveResult.NoLongerSurfing ? false : node.IsSurfing); neighbors.Add(new Node(node.X, node.Y + 1, surfing, Direction.Down)); } else if (result == Map.MoveResult.Jump) { neighbors.Add(new Node(node.X, node.Y + 2, node.IsSurfing, Direction.Down)); } result = _client.Map.CanMove(Direction.Left, node.X - 1, node.Y, node.IsSurfing, _client.Npcs); if (result == Map.MoveResult.Success || result == Map.MoveResult.NoLongerSurfing) { bool surfing = (result == Map.MoveResult.NoLongerSurfing ? false : node.IsSurfing); neighbors.Add(new Node(node.X - 1, node.Y, surfing, Direction.Left)); } else if (result == Map.MoveResult.Jump) { neighbors.Add(new Node(node.X - 2, node.Y, node.IsSurfing, Direction.Left)); } result = _client.Map.CanMove(Direction.Right, node.X + 1, node.Y, node.IsSurfing, _client.Npcs); if (result == Map.MoveResult.Success || result == Map.MoveResult.NoLongerSurfing) { bool surfing = (result == Map.MoveResult.NoLongerSurfing ? false : node.IsSurfing); neighbors.Add(new Node(node.X + 1, node.Y, surfing, Direction.Right)); } else if (result == Map.MoveResult.Jump) { neighbors.Add(new Node(node.X + 2, node.Y, node.IsSurfing, Direction.Right)); } /*if (!node.IsSurfing && _hasSurfAbility && _client.Map.CanSurf(node.X, node.Y, node.IsOnGround)) * { * neighbors.Add(new Node(node.X, node.Y, node.IsOnGround, true)); * } TODO SURF*/ return(neighbors); }
public bool MoveToSameCell() { foreach (Direction direction in _directions) { int destinationX = _client.PlayerX; int destinationY = _client.PlayerY; direction.ApplyToCoordinates(ref destinationX, ref destinationY); Map.MoveResult result = _client.Map.CanMove(direction, destinationX, destinationY, _client.IsOnGround, _client.IsSurfing, _client.CanUseCut, _client.CanUseSmashRock); if (result == Map.MoveResult.Success || result == Map.MoveResult.OnGround || result == Map.MoveResult.NoLongerOnGround) { _client.Move(direction); _client.Move(direction.GetOpposite()); return(true); } } return(false); }