#region Copyright & License Information /* * Copyright 2007,2009,2010 Chris Forbes, Robert Pepperell, Matthew Bowra-Dean, Paul Chote, Alli Witheford. * This file is part of OpenRA. * * OpenRA 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 3 of the License, or * (at your option) any later version. * * OpenRA 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 OpenRA. If not, see . */ #endregion using System; using System.Collections.Generic; using System.Linq; using System.Xml; using System.IO; using OpenRA.FileFormats; namespace OpenRA.Graphics { static class SequenceProvider { static Dictionary> units; static Dictionary cursors; static string currentTheater; public static void Initialize(string[] sequenceFiles, string theater) { units = new Dictionary>(); cursors = new Dictionary(); currentTheater = theater; foreach (var f in sequenceFiles) LoadSequenceSource(f); } static void LoadSequenceSource(string filename) { XmlDocument document = new XmlDocument(); document.Load(FileSystem.Open(filename)); foreach (XmlElement eUnit in document.SelectNodes("/sequences/unit")) LoadSequencesForUnit(eUnit); foreach (XmlElement eCursor in document.SelectNodes("/sequences/cursor")) LoadSequencesForCursor(eCursor); } static void LoadSequencesForCursor(XmlElement eCursor) { string cursorSrc = eCursor.GetAttribute("src"); foreach (XmlElement eSequence in eCursor.SelectNodes("./sequence")) cursors.Add(eSequence.GetAttribute("name"), new CursorSequence(cursorSrc, eSequence)); } static void LoadSequencesForUnit(XmlElement eUnit) { string unitName = eUnit.GetAttribute("name"); try { var sequences = eUnit.SelectNodes("./sequence").OfType() .Select(e => new Sequence(unitName, e)) .ToDictionary(s => s.Name); units.Add(unitName, sequences); } catch (FileNotFoundException) {} // Do nothing; we can crash later if we actually wanted art } public static Sequence GetSequence(string unitName, string sequenceName) { try { return units[unitName+"@"+currentTheater][sequenceName]; } catch (KeyNotFoundException) { try { return units[unitName][sequenceName]; } catch (KeyNotFoundException) { throw new InvalidOperationException( "Unit `{0}` does not have a sequence `{1}`".F(unitName, sequenceName)); } } } public static bool HasSequence(string unit, string seq) { if (units.ContainsKey(unit+"@"+currentTheater)) return units[unit+"@"+currentTheater].ContainsKey(seq); return units[unit].ContainsKey(seq); } public static CursorSequence GetCursorSequence(string cursor) { try { return cursors[cursor]; } catch (KeyNotFoundException) { throw new InvalidOperationException( "Cursor does not have a sequence `{0}`".F(cursor)); } } } }