/// <summary> /// Constructor /// </summary> /// <param name="maze">Maze handle</param> /// <param name="location">View's location</param> public ViewField(Maze maze, DungeonLocation location) { Maze = maze; Blocks = new Square[16]; // Cone of vision : 15 blocks + 1 block for the Point of View // // ABCDE // FGHIJ // KLM // N^O // // ^ => Point of view switch (location.Direction) { #region North case CardinalPoint.North: { Blocks[0] = maze.GetSquare(new Point(location.Coordinate.X - 2, location.Coordinate.Y - 3)); Blocks[1] = maze.GetSquare(new Point(location.Coordinate.X - 1, location.Coordinate.Y - 3)); Blocks[2] = maze.GetSquare(new Point(location.Coordinate.X, location.Coordinate.Y - 3)); Blocks[3] = maze.GetSquare(new Point(location.Coordinate.X + 1, location.Coordinate.Y - 3)); Blocks[4] = maze.GetSquare(new Point(location.Coordinate.X + 2, location.Coordinate.Y - 3)); Blocks[5] = maze.GetSquare(new Point(location.Coordinate.X - 2, location.Coordinate.Y - 2)); Blocks[6] = maze.GetSquare(new Point(location.Coordinate.X - 1, location.Coordinate.Y - 2)); Blocks[7] = maze.GetSquare(new Point(location.Coordinate.X, location.Coordinate.Y - 2)); Blocks[8] = maze.GetSquare(new Point(location.Coordinate.X + 1, location.Coordinate.Y - 2)); Blocks[9] = maze.GetSquare(new Point(location.Coordinate.X + 2, location.Coordinate.Y - 2)); Blocks[10] = maze.GetSquare(new Point(location.Coordinate.X - 1, location.Coordinate.Y - 1)); Blocks[11] = maze.GetSquare(new Point(location.Coordinate.X, location.Coordinate.Y - 1)); Blocks[12] = maze.GetSquare(new Point(location.Coordinate.X + 1, location.Coordinate.Y - 1)); Blocks[13] = maze.GetSquare(new Point(location.Coordinate.X - 1, location.Coordinate.Y)); Blocks[15] = maze.GetSquare(new Point(location.Coordinate.X + 1, location.Coordinate.Y)); } break; #endregion #region South case CardinalPoint.South: { Blocks[0] = maze.GetSquare(new Point(location.Coordinate.X + 2, location.Coordinate.Y + 3)); Blocks[1] = maze.GetSquare(new Point(location.Coordinate.X + 1, location.Coordinate.Y + 3)); Blocks[2] = maze.GetSquare(new Point(location.Coordinate.X, location.Coordinate.Y + 3)); Blocks[3] = maze.GetSquare(new Point(location.Coordinate.X - 1, location.Coordinate.Y + 3)); Blocks[4] = maze.GetSquare(new Point(location.Coordinate.X - 2, location.Coordinate.Y + 3)); Blocks[5] = maze.GetSquare(new Point(location.Coordinate.X + 2, location.Coordinate.Y + 2)); Blocks[6] = maze.GetSquare(new Point(location.Coordinate.X + 1, location.Coordinate.Y + 2)); Blocks[7] = maze.GetSquare(new Point(location.Coordinate.X, location.Coordinate.Y + 2)); Blocks[8] = maze.GetSquare(new Point(location.Coordinate.X - 1, location.Coordinate.Y + 2)); Blocks[9] = maze.GetSquare(new Point(location.Coordinate.X - 2, location.Coordinate.Y + 2)); Blocks[10] = maze.GetSquare(new Point(location.Coordinate.X + 1, location.Coordinate.Y + 1)); Blocks[11] = maze.GetSquare(new Point(location.Coordinate.X, location.Coordinate.Y + 1)); Blocks[12] = maze.GetSquare(new Point(location.Coordinate.X - 1, location.Coordinate.Y + 1)); Blocks[13] = maze.GetSquare(new Point(location.Coordinate.X + 1, location.Coordinate.Y)); Blocks[15] = maze.GetSquare(new Point(location.Coordinate.X - 1, location.Coordinate.Y)); } break; #endregion #region East case CardinalPoint.East: { Blocks[0] = maze.GetSquare(new Point(location.Coordinate.X + 3, location.Coordinate.Y - 2)); Blocks[1] = maze.GetSquare(new Point(location.Coordinate.X + 3, location.Coordinate.Y - 1)); Blocks[2] = maze.GetSquare(new Point(location.Coordinate.X + 3, location.Coordinate.Y)); Blocks[3] = maze.GetSquare(new Point(location.Coordinate.X + 3, location.Coordinate.Y + 1)); Blocks[4] = maze.GetSquare(new Point(location.Coordinate.X + 3, location.Coordinate.Y + 2)); Blocks[5] = maze.GetSquare(new Point(location.Coordinate.X + 2, location.Coordinate.Y - 2)); Blocks[6] = maze.GetSquare(new Point(location.Coordinate.X + 2, location.Coordinate.Y - 1)); Blocks[7] = maze.GetSquare(new Point(location.Coordinate.X + 2, location.Coordinate.Y)); Blocks[8] = maze.GetSquare(new Point(location.Coordinate.X + 2, location.Coordinate.Y + 1)); Blocks[9] = maze.GetSquare(new Point(location.Coordinate.X + 2, location.Coordinate.Y + 2)); Blocks[10] = maze.GetSquare(new Point(location.Coordinate.X + 1, location.Coordinate.Y - 1)); Blocks[11] = maze.GetSquare(new Point(location.Coordinate.X + 1, location.Coordinate.Y)); Blocks[12] = maze.GetSquare(new Point(location.Coordinate.X + 1, location.Coordinate.Y + 1)); Blocks[13] = maze.GetSquare(new Point(location.Coordinate.X, location.Coordinate.Y - 1)); Blocks[15] = maze.GetSquare(new Point(location.Coordinate.X, location.Coordinate.Y + 1)); } break; #endregion #region West case CardinalPoint.West: { Blocks[0] = maze.GetSquare(new Point(location.Coordinate.X - 3, location.Coordinate.Y + 2)); Blocks[1] = maze.GetSquare(new Point(location.Coordinate.X - 3, location.Coordinate.Y + 1)); Blocks[2] = maze.GetSquare(new Point(location.Coordinate.X - 3, location.Coordinate.Y)); Blocks[3] = maze.GetSquare(new Point(location.Coordinate.X - 3, location.Coordinate.Y - 1)); Blocks[4] = maze.GetSquare(new Point(location.Coordinate.X - 3, location.Coordinate.Y - 2)); Blocks[5] = maze.GetSquare(new Point(location.Coordinate.X - 2, location.Coordinate.Y + 2)); Blocks[6] = maze.GetSquare(new Point(location.Coordinate.X - 2, location.Coordinate.Y + 1)); Blocks[7] = maze.GetSquare(new Point(location.Coordinate.X - 2, location.Coordinate.Y)); Blocks[8] = maze.GetSquare(new Point(location.Coordinate.X - 2, location.Coordinate.Y - 1)); Blocks[9] = maze.GetSquare(new Point(location.Coordinate.X - 2, location.Coordinate.Y - 2)); Blocks[10] = maze.GetSquare(new Point(location.Coordinate.X - 1, location.Coordinate.Y + 1)); Blocks[11] = maze.GetSquare(new Point(location.Coordinate.X - 1, location.Coordinate.Y)); Blocks[12] = maze.GetSquare(new Point(location.Coordinate.X - 1, location.Coordinate.Y - 1)); Blocks[13] = maze.GetSquare(new Point(location.Coordinate.X, location.Coordinate.Y + 1)); Blocks[15] = maze.GetSquare(new Point(location.Coordinate.X, location.Coordinate.Y - 1)); } break; #endregion } // Team's position Blocks[14] = maze.GetSquare(location.Coordinate); }
/// <summary> /// Update the flying item /// </summary> /// <param name="time">Game time</param> /// <param name="maze">Maze where the flying item is</param> /// <returns>True if the blocked or false if nothing happened</rereturns> public bool Update(GameTime time, Maze maze) { // Item can't move any more if (Distance == 0) return true; LastUpdate += time.ElapsedGameTime; if (LastUpdate > Speed) { LastUpdate -= Speed; // Find the next block according to the direction Point dst = Point.Empty; switch (Location.Direction) { case CardinalPoint.North: dst = new Point(Location.Coordinate.X, Location.Coordinate.Y - 1); break; case CardinalPoint.East: dst = new Point(Location.Coordinate.X + 1, Location.Coordinate.Y); break; case CardinalPoint.South: dst = new Point(Location.Coordinate.X, Location.Coordinate.Y + 1); break; case CardinalPoint.West: dst = new Point(Location.Coordinate.X - 1, Location.Coordinate.Y); break; } // Blocked by a wall, fall before the block Square square = maze.GetSquare(dst); // Can item pass through a door ? if (square.Actor != null && square.Actor is Door) { Door door = square.Actor as Door; if (!door.CanItemsPassThrough(Item)) { Distance = 0; } } // Wall is blocking else if (square.IsBlocking) { Distance = 0; } // Blocked by an obstacle, but fall on the block if ((square.Actor != null && square.Actor.CanPassThrough) || square.MonsterCount > 0) { Location.Coordinate = dst; SquarePosition gp = Location.Position; switch (Location.Direction) { case CardinalPoint.North: if (gp == SquarePosition.NorthEast || gp == SquarePosition.SouthEast) Location.Position = SquarePosition.SouthEast; else Location.Position = SquarePosition.SouthWest; break; case CardinalPoint.South: if (gp == SquarePosition.NorthEast || gp == SquarePosition.SouthEast) Location.Position = SquarePosition.NorthEast; else Location.Position = SquarePosition.NorthWest; break; case CardinalPoint.West: if (gp == SquarePosition.NorthEast || gp == SquarePosition.NorthWest) Location.Position = SquarePosition.NorthEast; else Location.Position = SquarePosition.SouthEast; break; case CardinalPoint.East: if (gp == SquarePosition.NorthEast || gp == SquarePosition.NorthWest) Location.Position = SquarePosition.NorthWest; else Location.Position = SquarePosition.SouthWest; break; } // Get monster and hit it if (square.MonsterCount > 0) { Monster[] monsters = maze.GetSquare(Location.Coordinate).Monsters; foreach(Monster monster in monsters) if (monster != null) { Attack attack = new Attack(Caster, monster, Item); if (attack.IsAHit) Distance = 0; } } return true; } // Drop the item at good ground position if (Distance == 0) { SquarePosition gp = Location.Position; switch (Location.Direction) { case CardinalPoint.North: if (gp == SquarePosition.NorthEast || gp == SquarePosition.SouthEast) Location.Position = SquarePosition.NorthEast; else Location.Position = SquarePosition.NorthWest; break; case CardinalPoint.South: if (gp == SquarePosition.NorthEast || gp == SquarePosition.SouthEast) Location.Position = SquarePosition.SouthEast; else Location.Position = SquarePosition.SouthWest; break; case CardinalPoint.West: if (gp == SquarePosition.NorthEast || gp == SquarePosition.NorthWest) Location.Position = SquarePosition.NorthWest; else Location.Position = SquarePosition.SouthWest; break; case CardinalPoint.East: if (gp == SquarePosition.NorthEast || gp == SquarePosition.NorthWest) Location.Position = SquarePosition.NorthEast; else Location.Position = SquarePosition.SouthEast; break; } return true; } else { Distance--; Location.Coordinate = dst; } } return false; }