/// <summary> /// /// </summary> /// <param name="batch"></param> /// <param name="field"></param> /// <param name="position"></param> /// <param name="direction"></param> public override void Draw(SpriteBatch batch, ViewField field, ViewFieldPosition position, CardinalPoint direction) { // Foreach wall side foreach (TileDrawing td in DisplayCoordinates.GetWalls(position)) { // Not the good side if (Compass.GetDirectionFromView(direction, td.Side) != Side) { continue; } DecorationSet decoset = field.Maze.Decoration; if (decoset == null) { return; } Decoration deco = decoset.GetDecoration(IsActivated ? ActivatedDecoration : DeactivatedDecoration); if (deco == null) { return; } deco.DrawDecoration(batch, decoset, position, Compass.IsSideFacing(direction, Side)); } }
/// <summary> /// /// </summary> /// <param name="batch"></param> /// <param name="field"></param> /// <param name="position"></param> /// <param name="direction"></param> public override void Draw(SpriteBatch batch, ViewField field, ViewFieldPosition position, CardinalPoint direction) { if (Decoration == null || IsHidden) { return; } TileDrawing td = DisplayCoordinates.GetPit(position); if (td == null) { return; } if (IsActivated) { //batch.FillRectangle(new Rectangle(td.Location, new Size(50, 50)), Color.Red); Decoration.Draw(batch, field.Maze.FloorPitDeco, position); } //TODO //if (td != null && !IsHidden) // batch.DrawTile(TileSet, td.ID, td.Location, Color.White, 0.0f, td.Effect, 0.0f); }
/// <summary> /// /// </summary> /// <param name="batch"></param> /// <param name="field"></param> /// <param name="position"></param> /// <param name="direction"></param> public override void Draw(SpriteBatch batch, ViewField field, ViewFieldPosition position, CardinalPoint direction) { if (Decoration == null || IsHidden) return; TileDrawing td = DisplayCoordinates.GetFloorPlate(position); if (td == null) return; Decoration.Draw(batch, DecorationPrimary, position); }
/// <summary> /// /// </summary> /// <param name="batch"></param> /// <param name="field"></param> /// <param name="position"></param> /// <param name="direction"></param> public override void Draw(SpriteBatch batch, ViewField field, ViewFieldPosition position, CardinalPoint direction) { if (TileSet == null) return; // Upstair or downstair ? int delta = Type == StairType.Up ? 0 : 13; foreach (TileDrawing tmp in DisplayCoordinates.GetStairs(position)) batch.DrawTile(TileSet, tmp.ID + delta, tmp.Location, Color.White, 0.0f, tmp.Effect, 0.0f); }
/// <summary> /// /// </summary> /// <param name="batch"></param> /// <param name="field"></param> /// <param name="position"></param> /// <param name="direction"></param> public override void Draw(SpriteBatch batch, ViewField field, ViewFieldPosition position, CardinalPoint direction) { if (TileSet == null) { return; } // Upstair or downstair ? int delta = Type == StairType.Up ? 0 : 13; foreach (TileDrawing tmp in DisplayCoordinates.GetStairs(position)) { batch.DrawTile(TileSet, tmp.ID + delta, tmp.Location, Color.White, 0.0f, tmp.Effect, 0.0f); } }
/// <summary> /// /// </summary> /// <param name="batch"></param> /// <param name="field"></param> /// <param name="position"></param> /// <param name="direction"></param> public override void Draw(SpriteBatch batch, ViewField field, ViewFieldPosition position, CardinalPoint direction) { if (Decoration == null || IsHidden) { return; } TileDrawing td = DisplayCoordinates.GetFloorPlate(position); if (td == null) { return; } Decoration.Draw(batch, DecorationPrimary, position); }
/// <summary> /// Draws all alcoves according to the view point /// </summary> /// <param name="batch">Spritebatch handle</param> /// <param name="field">Field of view handle</param> /// <param name="position">Position in the field of view</param> /// <param name="direction">Looking direction</param> public override void Draw(SpriteBatch batch, ViewField field, ViewFieldPosition position, CardinalPoint direction) { if (field.Maze.Decoration == null) { return; } // For each wall side, draws the decoration foreach (CardinalPoint side in DisplayCoordinates.DrawingWallSides[(int)position]) { Alcove alcove = GetAlcove(Compass.GetDirectionFromView(direction, side)); // Get the decoration Decoration deco = field.Maze.Decoration.GetDecoration(alcove.Decoration); if (deco == null) { continue; } // Draw the decoration deco.DrawDecoration(batch, field.Maze.Decoration, position, side == CardinalPoint.South); // Hide items if (alcove.HideItems || side != CardinalPoint.South) { continue; } // Offset the item locations according to the distance Vector2 vect = DisplayCoordinates.GetMonsterScaleFactor(position); Point loc = deco.PrepareLocation(position); loc.Offset((int)(deco.ItemLocation.X * vect.X), (int)(deco.ItemLocation.Y * vect.Y)); // Draw items in the alcove in front of the team foreach (Item item in Square.GetItemsFromSide(direction, side)) { batch.DrawTile(Square.Maze.Dungeon.ItemTileSet, item.GroundTileID, loc, DisplayCoordinates.GetDistantColor(position), 0.0f, DisplayCoordinates.GetItemScaleFactor(position), SpriteEffects.None, 0.0f); } } }
/// <summary> /// Draw the door /// </summary> /// <param name="batch">Spritebatch to use</param> /// <param name="field">View field</param> /// <param name="position">Position in the view filed</param> /// <param name="view">Looking direction of the team</param> public override void Draw(SpriteBatch batch, ViewField field, ViewFieldPosition position, CardinalPoint direction) { if (!IsVisible) { return; } TileDrawing td = DisplayCoordinates.GetTeleporter(position); if (td == null) { return; } Anim.Draw(batch, td.Location, 0.0f, SpriteEffects.None, DisplayCoordinates.GetDistantColor(position), DisplayCoordinates.GetMonsterScaleFactor(position)); }
/// <summary> /// /// </summary> /// <param name="batch"></param> /// <param name="field"></param> /// <param name="position"></param> /// <param name="direction"></param> public override void Draw(SpriteBatch batch, ViewField field, ViewFieldPosition position, CardinalPoint direction) { if (Decoration == null || IsHidden) return; TileDrawing td = DisplayCoordinates.GetPit(position); if (td == null) return; if (IsActivated) //batch.FillRectangle(new Rectangle(td.Location, new Size(50, 50)), Color.Red); Decoration.Draw(batch, field.Maze.FloorPitDeco, position); //TODO //if (td != null && !IsHidden) // batch.DrawTile(TileSet, td.ID, td.Location, Color.White, 0.0f, td.Effect, 0.0f); }
/// <summary> /// Draws all alcoves according to the view point /// </summary> /// <param name="batch">Spritebatch handle</param> /// <param name="field">Field of view handle</param> /// <param name="position">Position in the field of view</param> /// <param name="direction">Looking direction</param> public override void Draw(SpriteBatch batch, ViewField field, ViewFieldPosition position, CardinalPoint direction) { if (field.Maze.Decoration == null) return; // For each wall side, draws the decoration foreach (CardinalPoint side in DisplayCoordinates.DrawingWallSides[(int) position]) { Alcove alcove = GetAlcove(Compass.GetDirectionFromView(direction, side)); // Get the decoration Decoration deco = field.Maze.Decoration.GetDecoration(alcove.Decoration); if (deco == null) continue; // Draw the decoration deco.DrawDecoration(batch, field.Maze.Decoration, position, side == CardinalPoint.South); // Hide items if (alcove.HideItems || side != CardinalPoint.South) continue; // Offset the item locations according to the distance Vector2 vect = DisplayCoordinates.GetMonsterScaleFactor(position); Point loc = deco.PrepareLocation(position); loc.Offset((int) (deco.ItemLocation.X * vect.X), (int) (deco.ItemLocation.Y * vect.Y)); // Draw items in the alcove in front of the team foreach (Item item in Square.GetItemsFromSide(direction, side)) { batch.DrawTile(Square.Maze.Dungeon.ItemTileSet, item.GroundTileID, loc, DisplayCoordinates.GetDistantColor(position), 0.0f, DisplayCoordinates.GetItemScaleFactor(position), SpriteEffects.None, 0.0f); } } }
/// <summary> /// Draw the actor /// </summary> /// <param name="batch">Spritebatch to use</param> /// <param name="field">View field</param> /// <param name="position">Position in the view field</param> /// <param name="view">Looking direction of the team</param> public virtual void Draw(SpriteBatch batch, ViewField field, ViewFieldPosition position, CardinalPoint direction) { }
/// <summary> /// Draws a square /// </summary> /// <param name="batch">Spritebatch handle</param> /// <param name="field">View field</param> /// <param name="position">Position of the square in the view field</param> /// <param name="view">Looking direction of the team</param> void DrawSquare(SpriteBatch batch, ViewField field, ViewFieldPosition position, CardinalPoint view) { if (field == null) return; Square square = field.Blocks[(int)position]; Point point; Decoration deco = null; List<Item>[] list = square.GetItems(view); #region ceiling pit if (square.IsPitTarget) { //TODO TileDrawing td = DisplayCoordinates.GetCeilingPit(position); //if (td != null) // batch.DrawTile(OverlayTileset, td.ID, td.Location, Color.White, 0.0f, td.Effect, 0.0f); //***batch.DrawTile(ItemsTileset, td.ID, td.Location, td.SwapX, td.SwapY); } #endregion #region Items on ground before a door // If there is a deco that hide ground items, skip deco = GetDecoration(square.Location, Compass.GetOppositeDirection(view)); if (deco == null || (deco != null && !deco.HideItems)) { if (!square.IsWall || (deco != null && !deco.HideItems)) { for (int i = 0; i < 2; i++) { if (list[i].Count == 0) continue; foreach (Item item in list[i]) { point = DisplayCoordinates.GetGroundPosition(position, (SquarePosition)i); if (!point.IsEmpty) { batch.DrawTile(Dungeon.ItemTileSet, item.GroundTileID, point, DisplayCoordinates.GetDistantColor(position), 0.0f, DisplayCoordinates.GetItemScaleFactor(position), SpriteEffects.None, 0.0f); } } } } } #endregion #region Walls if (square.IsWall) { // Walls foreach (TileDrawing tmp in DisplayCoordinates.GetWalls(position)) { Color color = Color.White; int tileid = tmp.ID; //if (swap) //{ // color = Color.Red; // tileid += 9; //} batch.DrawTile(WallTileset, tileid, tmp.Location, color, 0.0f, tmp.Effect, 0.0f); } } #endregion #region Decoration if (square.HasDecorations) { // Is there a forced decoration for (int i = 0; i < 4; i++) { deco = Decoration.GetDecoration(square.GetDecorationId((CardinalPoint)i)); if (deco != null && deco.ForceDisplay) deco.DrawDecoration(batch, Decoration, position, true); } // For each directions, draws the decoration foreach (CardinalPoint side in DisplayCoordinates.DrawingWallSides[(int)position]) { // Decoration informations deco = Decoration.GetDecoration(square.GetDecorationId(view, side)); if (deco == null) continue; deco.DrawDecoration(batch, Decoration, position, side == CardinalPoint.South); } } #endregion #region Actor if (square.Actor != null) square.Actor.Draw(batch, field, position, view); #endregion #region Items on ground after a door if (!square.IsWall) { // If there is a deco that hide ground items, skip deco = GetDecoration(square.Location, Compass.GetOppositeDirection(view)); if (deco == null || (deco != null && !deco.HideItems)) { // Both ground positions for (int i = 2; i < 4; i++) { // No items if (list[i].Count == 0) continue; // Foreach item on the ground foreach (Item item in list[i]) { // Get screen coordinate point = DisplayCoordinates.GetGroundPosition(position, (SquarePosition)i); if (!point.IsEmpty) { batch.DrawTile(Dungeon.ItemTileSet, item.GroundTileID, point, DisplayCoordinates.GetDistantColor(position), 0.0f, DisplayCoordinates.GetItemScaleFactor(position), SpriteEffects.None, 0.0f); } } } } } #endregion #region Monsters if (square.MonsterCount > 0) { // Drawing order for monsters int[][] order = new int[][] { new int[] {0, 1, 2, 3}, // North new int[] {3, 2, 1, 0}, // South new int[] {2, 0, 3, 1}, // West new int[] {1, 3, 0, 2}, // East }; for (int i = 0; i < 4; i++) { Monster monster = square.Monsters[order[(int)view][i]]; if (monster != null) monster.Draw(batch, view, position); } } #endregion #region Flying items List<ThrownItem>[] flyings = GetFlyingItems(square.Location, view); foreach (SquarePosition pos in Enum.GetValues(typeof(SquarePosition))) { point = DisplayCoordinates.GetFlyingItem(position, pos); // if (point == Point.Empty) // continue; // Swap the tile if throwing on the right side SpriteEffects fx = SpriteEffects.None; if (pos == SquarePosition.NorthEast || pos == SquarePosition.SouthEast) fx = SpriteEffects.FlipHorizontally; foreach (ThrownItem fi in flyings[(int)pos]) batch.DrawTile(Dungeon.ItemTileSet, fi.Item.ThrowTileID, point, DisplayCoordinates.GetDistantColor(position), 0.0f, DisplayCoordinates.GetItemScaleFactor(position), fx, 0.0f); } #endregion }
/// <summary> /// Draw the maze /// </summary> /// <param name="batch">SpriteBatch to use</param> /// <param name="location">Location to display from</param> /// <see cref="http://eob.wikispaces.com/eob.vmp"/> public void Draw(SpriteBatch batch, DungeonLocation location) { if (WallTileset == null) return; // Clear the spritebatch batch.End(); Display.PushScissor(new Rectangle(0, 0, 352, 240)); batch.Begin(); // // // ViewField pov = new ViewField(this, location); // TODO Backdrop // The background is assumed to be x-flipped when party.x & party.y & party.direction = 1. // I.e. all kind of moves and rotations from the current position will result in the background being x-flipped. bool flipbackdrop = ((location.Coordinate.X + location.Coordinate.Y + (int)location.Direction) & 1) == 0; SpriteEffects effect = flipbackdrop ? SpriteEffects.FlipHorizontally : SpriteEffects.None; batch.DrawTile(WallTileset, 0, Point.Empty, Color.White, 0.0f, effect, 0.0f); // maze block draw order // A E B D C // F J G I H // K M L // N ^ O #region row -3 DrawSquare(batch, pov, ViewFieldPosition.A, location.Direction); DrawSquare(batch, pov, ViewFieldPosition.E, location.Direction); DrawSquare(batch, pov, ViewFieldPosition.B, location.Direction); DrawSquare(batch, pov, ViewFieldPosition.D, location.Direction); DrawSquare(batch, pov, ViewFieldPosition.C, location.Direction); #endregion #region row -2 DrawSquare(batch, pov, ViewFieldPosition.F, location.Direction); DrawSquare(batch, pov, ViewFieldPosition.J, location.Direction); DrawSquare(batch, pov, ViewFieldPosition.G, location.Direction); DrawSquare(batch, pov, ViewFieldPosition.I, location.Direction); DrawSquare(batch, pov, ViewFieldPosition.H, location.Direction); #endregion #region row -1 DrawSquare(batch, pov, ViewFieldPosition.K, location.Direction); DrawSquare(batch, pov, ViewFieldPosition.M, location.Direction); DrawSquare(batch, pov, ViewFieldPosition.L, location.Direction); #endregion #region row 0 DrawSquare(batch, pov, ViewFieldPosition.N, location.Direction); DrawSquare(batch, pov, ViewFieldPosition.Team, location.Direction); DrawSquare(batch, pov, ViewFieldPosition.O, location.Direction); #endregion // Clear the spritebatch batch.End(); Display.PopScissor(); batch.Begin(); }
/// <summary> /// Draw the door /// </summary> /// <param name="batch">Spritebatch to use</param> /// <param name="field">View field</param> /// <param name="position">Position in the view filed</param> /// <param name="view">Looking direction of the team</param> public override void Draw(SpriteBatch batch, ViewField field, ViewFieldPosition position, CardinalPoint view) { if (TileSet == null) { return; } TileDrawing td = null; TileSet wall = Square.Maze.WallTileset; // TODO: Under the door, draw sides if (field.GetBlock(ViewFieldPosition.L).IsWall&& position == ViewFieldPosition.Team) { // td = DisplayCoordinates.GetDoor(ViewFieldPosition.Team); // if (td != null) // batch.DrawTile(overlay, td.ID, td.Location, Color.White, 0.0f, td.Effect, 0.0f); if (field.Maze.Decoration != null) { field.Maze.Decoration.Draw(batch, field.Maze.DoorDeco, position); } } // Draw the door else if (((field.Maze.IsDoorNorthSouth(Square.Location) && (view == CardinalPoint.North || view == CardinalPoint.South)) || (!field.Maze.IsDoorNorthSouth(Square.Location) && (view == CardinalPoint.East || view == CardinalPoint.West))) && position != ViewFieldPosition.Team) { td = DisplayCoordinates.GetDoor(position); if (td != null) { batch.DrawTile(wall, td.ID, td.Location, Color.White, 0.0f, td.Effect, 0.0f); //block.Door.Draw(batch, td.Location, position, view); switch (Type) { case DoorType.Grid: DrawSimpleDoor(batch, 1, td.Location, position); break; case DoorType.Forest: DrawSimpleDoor(batch, 6, td.Location, position); break; case DoorType.Iron: DrawSimpleDoor(batch, 0, td.Location, position); break; case DoorType.Monster: DrawUpDownDoor(batch, 2, td.Location, position); break; case DoorType.Azure: DrawSimpleDoor(batch, 8, td.Location, position); break; case DoorType.Crimson: DrawSimpleDoor(batch, 9, td.Location, position); break; case DoorType.Temple: DrawSimpleDoor(batch, 10, td.Location, position); break; case DoorType.Silver: DrawSimpleDoor(batch, 11, td.Location, position); break; case DoorType.Mantis: DrawSimpleDoor(batch, 12, td.Location, position); break; } } } }
/// <summary> /// Draw the door /// </summary> /// <param name="batch">Spritebatch to use</param> /// <param name="field">View field</param> /// <param name="position">Position in the view filed</param> /// <param name="view">Looking direction of the team</param> public override void Draw(SpriteBatch batch, ViewField field, ViewFieldPosition position, CardinalPoint direction) { if (!IsVisible) return; TileDrawing td = DisplayCoordinates.GetTeleporter(position); if (td == null) return; Anim.Draw(batch, td.Location, 0.0f, SpriteEffects.None, DisplayCoordinates.GetDistantColor(position), DisplayCoordinates.GetMonsterScaleFactor(position)); }
/// <summary> /// Draw the door /// </summary> /// <param name="batch">Spritebatch to use</param> /// <param name="field">View field</param> /// <param name="position">Position in the view filed</param> /// <param name="view">Looking direction of the team</param> public override void Draw(SpriteBatch batch, ViewField field, ViewFieldPosition position, CardinalPoint view) { if (TileSet == null) return; TileDrawing td = null; TileSet wall = Square.Maze.WallTileset; // TODO: Under the door, draw sides if (field.GetBlock(ViewFieldPosition.L).IsWall && position == ViewFieldPosition.Team) { // td = DisplayCoordinates.GetDoor(ViewFieldPosition.Team); // if (td != null) // batch.DrawTile(overlay, td.ID, td.Location, Color.White, 0.0f, td.Effect, 0.0f); if (field.Maze.Decoration != null) { field.Maze.Decoration.Draw(batch, field.Maze.DoorDeco, position); } } // Draw the door else if (((field.Maze.IsDoorNorthSouth(Square.Location) && (view == CardinalPoint.North || view == CardinalPoint.South)) || (!field.Maze.IsDoorNorthSouth(Square.Location) && (view == CardinalPoint.East || view == CardinalPoint.West))) && position != ViewFieldPosition.Team) { td = DisplayCoordinates.GetDoor(position); if (td != null) { batch.DrawTile(wall, td.ID, td.Location, Color.White, 0.0f, td.Effect, 0.0f); //block.Door.Draw(batch, td.Location, position, view); switch (Type) { case DoorType.Grid: DrawSimpleDoor(batch, 1, td.Location, position); break; case DoorType.Forest: DrawSimpleDoor(batch, 6, td.Location, position); break; case DoorType.Iron: DrawSimpleDoor(batch, 0, td.Location, position); break; case DoorType.Monster: DrawUpDownDoor(batch, 2, td.Location, position); break; case DoorType.Azure: DrawSimpleDoor(batch, 8, td.Location, position); break; case DoorType.Crimson: DrawSimpleDoor(batch, 9, td.Location, position); break; case DoorType.Temple: DrawSimpleDoor(batch, 10, td.Location, position); break; case DoorType.Silver: DrawSimpleDoor(batch, 11, td.Location, position); break; case DoorType.Mantis: DrawSimpleDoor(batch, 12, td.Location, position); break; } } } }
/// <summary> /// /// </summary> /// <param name="batch"></param> /// <param name="field"></param> /// <param name="position"></param> /// <param name="direction"></param> public override void Draw(SpriteBatch batch, ViewField field, ViewFieldPosition position, CardinalPoint direction) { // Foreach wall side foreach (TileDrawing td in DisplayCoordinates.GetWalls(position)) { // Not the good side if (Compass.GetDirectionFromView(direction, td.Side) != Side) continue; DecorationSet decoset = field.Maze.Decoration; if (decoset == null) return; Decoration deco = decoset.GetDecoration(IsActivated ? ActivatedDecoration : DeactivatedDecoration); if (deco == null) return; deco.DrawDecoration(batch, decoset, position, Compass.IsSideFacing(direction, Side)); } }