Mercurial > repos > IBDev-IBBoard.WarFoundry.API
view API/Objects/GameSystem.cs @ 430:7e95b880f9cc
Re #356: Stack overflow with certain equipment limits
* Set sensible default equipment cost multiplier
author | IBBoard <dev@ibboard.co.uk> |
---|---|
date | Sun, 06 Nov 2011 20:44:53 +0000 |
parents | b622937ac879 |
children | 2fc99446f9c9 |
line wrap: on
line source
// This file (GameSystem.cs) is a part of the IBBoard.WarFoundry.API project and is copyright 2007, 2008, 2009, 2010, 2011 IBBoard. // // The file and the library/program it is in are licensed and distributed, without warranty, under the GNU Affero GPL license, either version 3 of the License or (at your option) any later version. Please see COPYING for more information and the full license. using System.Collections.Generic; using IBBoard.WarFoundry.API.Factories; using Col = IBBoard.Collections; namespace IBBoard.WarFoundry.API.Objects { /// <summary> /// Summary description for GameSystem. /// </summary> public class GameSystem : WarFoundryStagedLoadingObject { private static readonly int SYSTEM_DEFAULT_ARMY_SIZE = 1000; private bool warnOnError = true; private bool allowAllies = false; private Dictionary<string, Category> categories = new Dictionary<string, Category>(); private Dictionary<string, SystemStats> stats = new Dictionary<string, SystemStats>(); private string defaultStats = ""; private int defaultArmySize = SYSTEM_DEFAULT_ARMY_SIZE; public GameSystem(string systemID, string systemName, IWarFoundryFactory creatingFactory) : base(systemID, systemName, creatingFactory) { //Do nothing special } public int SystemArmyDefaultSize { get { return defaultArmySize; } set { if (value == 0) { defaultArmySize = SYSTEM_DEFAULT_ARMY_SIZE; } else { defaultArmySize = value; } } } public string SystemPtsAbbrevSingle { get; set; } public string SystemPtsAbbrevPlural { get; set; } public string SystemPtsNameSingle { get; set; } public string SystemPtsNamePlural { get; set; } public bool AllowAllies { get { return allowAllies; } set { allowAllies = value; } } public void AddCategory(Category cat) { RawCategories[cat.ID] = cat; } public Category GetCategory(string id) { EnsureFullyLoaded(); Category cat = null; RawCategories.TryGetValue(id, out cat); return cat; } public void SetCategory(Category cat) { Category old; RawCategories.TryGetValue(cat.ID, out old); if (old == null) { AddCategory(cat); } else { if (!old.Equals(cat)) { RawCategories[old.ID] = cat; } } } public void RemoveCategory(string id) { RawCategories.Remove(id); } public Category[] Categories { get { EnsureFullyLoaded(); return DictionaryUtils.ToArray<string, Category>(RawCategories); } } protected Dictionary<string, Category> RawCategories { get { return categories; } } public bool WarnOnError { get { return warnOnError; } set { warnOnError = value; } } public void AddSystemStats(SystemStats sysStats) { stats[sysStats.ID] = sysStats; } public SystemStats StandardSystemStats { get { EnsureFullyLoaded(); return stats[defaultStats]; } } public string StandardSystemStatsID { get { EnsureFullyLoaded(); return defaultStats; } set { if (value != null && value.Trim().Length > 0) { defaultStats = value; } } } public SystemStats[] SystemStats { get { EnsureFullyLoaded(); SystemStats[] statsArray = new SystemStats[stats.Count]; stats.Values.CopyTo(statsArray, 0); return statsArray; } } public SystemStats GetSystemStatsForID(string id) { EnsureFullyLoaded(); SystemStats statsForID; stats.TryGetValue(id, out statsForID); return statsForID; } public void SetSystemStats(SystemStats newStats) { SystemStats old; stats.TryGetValue(newStats.ID, out old); if (old == null) { AddSystemStats(newStats); } else { if (!old.Equals(newStats)) { stats[old.ID] = newStats; } } } public void RemoveSystemStats(string id) { stats.Remove(id); } public Race SystemDefaultRace { get { return WarFoundryLoader.GetDefault().GetRace(this, Race.SYSTEM_DEFAULT_RACE_ID); } } public bool Matches(GameSystem otherSystem) { if (otherSystem == null) { return false; } return this.ID == otherSystem.ID; } public override bool Equals(object obj) { if (obj == null) { return false; } if (obj.GetType().Equals(this.GetType())) { GameSystem otherSystem = (GameSystem)obj; if (!ID.Equals(otherSystem.ID) || !Name.Equals(otherSystem.Name) || !Col.Collections.AreEqual(RawCategories, otherSystem.RawCategories)) { return false; } else { return true; } } else { return false; } } public override int GetHashCode() { return ID.GetHashCode() + Name.GetHashCode(); } public bool UnitTypeMaxed(UnitType unitType, Army army) { return unitType.MaxNumber != WarFoundryCore.INFINITY && army.GetUnitTypeCount(unitType) >= unitType.MaxNumber; } public bool UnitTypeMinned(UnitType unitType, Army army) { return army.GetUnitTypeCount(unitType) <= unitType.MinNumber; } public List<EquipmentItem> GetSystemEquipmentList() { List<EquipmentItem> items = new List<EquipmentItem>(); Race defaultRace = SystemDefaultRace; if (defaultRace != null) { items = defaultRace.GetEquipmentList(); } return items; } public EquipmentItem GetSystemEquipmentItem(string id) { EquipmentItem item = null; Race defaultRace = SystemDefaultRace; if (defaultRace != null) { item = defaultRace.GetEquipmentItem(id); } return item; } public UnitType[] GetSystemUnitTypes(Category cat) { UnitType[] items = new UnitType[0]; Race defaultRace = SystemDefaultRace; if (defaultRace != null) { items = defaultRace.GetUnitTypes(cat); } return items; } public UnitType GetSystemUnitType(string id) { UnitType unit = null; Race defaultRace = SystemDefaultRace; if (defaultRace != null) { unit = defaultRace.GetUnitType(id); } return unit; } public List<Ability> GetSystemAbilityList() { List<Ability> items = new List<Ability>(); Race defaultRace = SystemDefaultRace; if (defaultRace != null) { items = defaultRace.GetAbilityList(); } return items; } public Ability GetSystemAbility(string id) { Ability ability = null; Race defaultRace = SystemDefaultRace; if (defaultRace != null) { ability = defaultRace.GetAbility(id); } return ability; } public string GetPointsAbbrev(double pointTemp) { string abbrev = (pointTemp == 1 ? GetPreferredString(SystemPtsAbbrevSingle, SystemPtsAbbrevPlural) : GetPreferredString(SystemPtsAbbrevPlural, SystemPtsAbbrevSingle)); return abbrev; } public string GetPointsName(double pointTemp) { string ptsName = (pointTemp == 1 ? GetPreferredString(SystemPtsNameSingle, SystemPtsNamePlural) : GetPreferredString(SystemPtsNamePlural, SystemPtsNameSingle)); return ptsName; } private string GetPreferredString(string str1, string str2) { string preferred = ""; if (str1 != null) { preferred = str1; } else if (str2 != null) { preferred = str2; } return preferred; } } }