/* * StorageBuilding.cs * Authors: Bradley Blankenship * Copyright (c) 2007-2008 Cornell University This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ using System; using System.Collections.Generic; using System.Text; using Microsoft.Xna.Framework.Content; using System.Xml; namespace ColonySim.Buildings { /// /// Represents a building for storing certain types of resources. /// internal class StorageBuilding : Building { #region Fields // The string of possible storable resources and their max values string mStorageString; // The types of resources we can store and their max amounts Resource mStorableResources; // The types of resources stored and their actual amounts Resource mStoredResources; #endregion #region Properties /// /// Allows access to the storable resources and the maximum values. /// public Resource StorableResources { get { return mStorableResources; } set { mStorableResources = value; } } /// /// Allows access to use the currently stored resources. /// public Resource StoredResources { get { return mStoredResources; } } #endregion #region Constructs /// /// Base constructor. /// public StorageBuilding() { // Initialize the map of storable and stored resources mStorableResources = new Resource(); mStoredResources = new Resource(); } #endregion #region Initialization /// /// Initialize the building. /// public override void Initialize() { // Base call base.Initialize(); // Split up the string of resources string[] stringArray = mStorageString.Split(';'); // Now generate the resources based on the pairs foreach (string pair in stringArray) { // Get the string for the resource name and the storage value string name = pair.Split(',')[0].Trim(); float value = float.Parse(pair.Split(',')[1].Trim()); // Add the new resource mStorableResources += new SimpleResource((Resources)Enum.Parse(typeof(Resources), name), value); } } #endregion #region Update /// /// Update the game based on the given time. /// /// The current game time. public override void Update(Microsoft.Xna.Framework.GameTime gameTime) { } #endregion #region Utility /// /// Reads in the base data for a given building into the values. Requires /// that the input text reader is already at the proper position for reading the data. /// /// The reader to read the data. protected override void ReadData(XmlTextReader input) { // Base call base.ReadData(input); // Read the specific building values this.mStorageString = input.GetAttribute("StorableResources"); } public override string ToString() { // Get the base value StringBuilder retVal = new StringBuilder(base.ToString()); // State the gatherable resources retVal.Append("Storable Resources:"); retVal.Append('\n'); // Now add each of the gatherable resources retVal.Append(mStorableResources.ToString()); // Return the value return retVal.ToString(); } /// /// The reader for reading in resource storage buildings from file. /// public static List Read(string file) { // The return value List retVal = new List(); // Create the XML reader for the XML file XmlTextReader input = new XmlTextReader(file); input.WhitespaceHandling = WhitespaceHandling.None; // Read in the values for the input while (input.Read()) { // If this is the item we need if (input.Name == "Building" && input.NodeType == XmlNodeType.Element && input.HasAttributes) { // Create the building StorageBuilding item = new StorageBuilding(); // Read in the data item.ReadData(input); // Initialize the item item.Initialize(); // Add the item retVal.Add(item); } } // Close the input stream input.Close(); // Return the new entertainment building return retVal; } #endregion } }