public CounterSheet(int id, CounterSheetProperties properties, List <Piece> pieceList) : base(id) { this.properties = properties; base.Name = properties.Name; counterSections = new CounterSection[properties.CounterSections.Length + properties.CardSections.Length]; for (int i = 0; i < properties.CounterSections.Length; ++i) { counterSections[i] = new CounterSection(this, properties.CounterSections[i], pieceList); } for (int i = 0; i < properties.CardSections.Length; ++i) { counterSections[properties.CounterSections.Length + i] = new CounterSection(this, properties.CardSections[i], pieceList); } }
/// <summary>Saves the current game.</summary> /// <param name="outputStream">The stream to write this game data to.</param> /// <param name="indented">True to write indentation.</param> public void Save(Stream outputStream, bool indented) { XmlTextWriter writer = null; try { writer = new XmlTextWriter(outputStream, Encoding.GetEncoding("windows-1252")); if (indented) { writer.Formatting = Formatting.Indented; writer.IndentChar = ' '; writer.Indentation = 1; } writer.WriteStartDocument(true); writer.WriteStartElement("game"); //writer.WriteAttributeString("version", "1.0"); writer.WriteAttributeString("game-box", gameBox.Reference.Name); writer.WriteAttributeString("hash", Convert.ToBase64String(gameBox.Reference.Hash)); writer.WriteAttributeString("scenario-name", scenarioName); if (scenarioDescription != null && scenarioDescription != "") { writer.WriteAttributeString("scenario-description", scenarioDescription); } if (scenarioCopyright != null && scenarioCopyright != "") { writer.WriteAttributeString("scenario-copyright", scenarioCopyright); } if (mode != Mode.Default) { writer.WriteAttributeString("mode", mode.ToString()); } if (!stackingEnabled) { writer.WriteAttributeString("stacking", "disabled"); } foreach (Board board in boards) { writer.WriteStartElement("layout"); if (board is Map) { MapProperties mapProperties = ((Map)board).Properties; if (mapProperties != null) { writer.WriteAttributeString("board", mapProperties.Name); if (mapProperties.Name != board.Name) { writer.WriteAttributeString("tab", board.Name); } } else { writer.WriteAttributeString("tab", board.Name); } } else { CounterSheetProperties counterSheetProperties = ((CounterSheet)board).Properties; writer.WriteAttributeString("board", counterSheetProperties.Name); if (counterSheetProperties.Name != board.Name) { writer.WriteAttributeString("tab", board.Name); } } writer.WriteAttributeString("left", board.VisibleArea.Left.ToString("F2", NumberFormatInfo.InvariantInfo)); writer.WriteAttributeString("top", board.VisibleArea.Top.ToString("F2", NumberFormatInfo.InvariantInfo)); writer.WriteAttributeString("right", board.VisibleArea.Right.ToString("F2", NumberFormatInfo.InvariantInfo)); writer.WriteAttributeString("bottom", board.VisibleArea.Bottom.ToString("F2", NumberFormatInfo.InvariantInfo)); if (board is CounterSheet && ((CounterSheet)board).Side == Side.Back) { writer.WriteAttributeString("side", Side.Back.ToString()); } if (board == visibleBoard) { writer.WriteAttributeString("visible", "true"); } if (board.Owner != Guid.Empty) { writer.WriteAttributeString("owner", board.Owner.ToString()); } foreach (Stack stack in board.Stacks) { if (!stack.AttachedToCounterSection) { if (stack.Pieces.Length == 1) { Piece piece = (Piece)stack.Pieces[0]; writer.WriteStartElement("counter"); writer.WriteAttributeString("id", XmlConvert.ToString(piece.Id)); if (piece.Side == Side.Back) { writer.WriteAttributeString("side", Side.Back.ToString()); } writer.WriteAttributeString("x", stack.Position.X.ToString("F2", NumberFormatInfo.InvariantInfo)); writer.WriteAttributeString("y", stack.Position.Y.ToString("F2", NumberFormatInfo.InvariantInfo)); if (piece.RotationAngle != 0.0f) { writer.WriteAttributeString("rot", (piece.RotationAngle * (180.0f / (float)Math.PI)).ToString("F0", NumberFormatInfo.InvariantInfo)); } writer.WriteEndElement(); } else { writer.WriteStartElement("stack"); writer.WriteAttributeString("x", stack.Position.X.ToString("F2", NumberFormatInfo.InvariantInfo)); writer.WriteAttributeString("y", stack.Position.Y.ToString("F2", NumberFormatInfo.InvariantInfo)); for (int i = 0; i < stack.Pieces.Length; ++i) { Piece piece = (Piece)stack.Pieces[i]; writer.WriteStartElement("counter"); writer.WriteAttributeString("id", XmlConvert.ToString(piece.Id)); if (piece.Side == Side.Back) { writer.WriteAttributeString("side", Side.Back.ToString()); } if (piece.RotationAngle != 0.0f) { writer.WriteAttributeString("rot", (piece.RotationAngle * (180.0f / (float)Math.PI)).ToString("F0", NumberFormatInfo.InvariantInfo)); } writer.WriteEndElement(); } writer.WriteEndElement(); } } } writer.WriteEndElement(); } foreach (KeyValuePair <Guid, PlayerHand> playerHand in playerHands) { writer.WriteStartElement("hand"); writer.WriteAttributeString("owner", playerHand.Key.ToString()); if (playerHand.Value.Count > 0) { foreach (Piece piece in playerHand.Value.Pieces) { writer.WriteStartElement("counter"); writer.WriteAttributeString("id", XmlConvert.ToString(piece.Id)); if (piece.Side == Side.Back) { writer.WriteAttributeString("side", Side.Back.ToString()); } if (piece.RotationAngle != 0.0f) { writer.WriteAttributeString("rot", (piece.RotationAngle * (180.0f / (float)Math.PI)).ToString("F0", NumberFormatInfo.InvariantInfo)); } writer.WriteEndElement(); } } writer.WriteEndElement(); } writer.WriteEndElement(); writer.WriteEndDocument(); } finally { if (writer != null) { writer.Close(); } } }