#region ================== Copyright (c) 2021 Boris Iwanski /* * 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 3 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, see. */ #endregion #region ================== Namespaces using System.Collections; using System.Collections.Generic; using CodeImp.DoomBuilder.IO; #endregion namespace CodeImp.DoomBuilder.Dehacked { public class DehackedData { #region ================== Variables private Dictionary things; private Dictionary frames; private Dictionary sprites; private Dictionary bitmnemonics; private DehackedFrame defaultframe; private Configuration cfg; private string root; #endregion #region ================== Properties public Dictionary Things { get { return things; } } public Dictionary Frames { get { return frames; } } public Dictionary Sprites { get { return sprites; } } public Dictionary BitMnemonics { get { return bitmnemonics; } } #endregion #region ================== Constructor internal DehackedData(Configuration cfg, string root) { things = new Dictionary(); frames = new Dictionary(); sprites = new Dictionary(); bitmnemonics = new Dictionary(); this.cfg = cfg; this.root = root; IDictionary thingblocks = cfg.ReadSetting(root + ".things", new Hashtable()); foreach(DictionaryEntry tb in thingblocks) { int dehackedid = int.Parse(tb.Key.ToString()); things[dehackedid] = LoadThing(tb); } IDictionary frameblocks = cfg.ReadSetting(root + ".frames", new Hashtable()); foreach (DictionaryEntry fb in frameblocks) { if (fb.Key.ToString() == "default") defaultframe = LoadFrame(fb); else { int frameindex = int.Parse(fb.Key.ToString()); frames[frameindex] = LoadFrame(fb); } } IDictionary spriteblock = cfg.ReadSetting(root + ".sprites", new Hashtable()); foreach (DictionaryEntry sb in spriteblock) { int key; if (int.TryParse(sb.Key.ToString(), out key)) sprites[key] = cfg.ReadSetting(root + ".sprites." + key, "----"); } IDictionary bitmnemonicsblock = cfg.ReadSetting(root + ".bitmnemonics", new Hashtable()); foreach (DictionaryEntry bmb in bitmnemonicsblock) { int key; if (int.TryParse(bmb.Key.ToString(), out key)) bitmnemonics[key] = cfg.ReadSetting(root + ".bitmnemonics." + key, "unset"); } } #endregion #region ================== Methods private DehackedThing LoadThing(DictionaryEntry entry) { int dehackedid = int.Parse(entry.Key.ToString()); string path = string.Format("{0}.things.{1}.", root, dehackedid); string name = cfg.ReadSetting(path + "name", ""); int doomednum = cfg.ReadSetting(path + "doomednum", -1); int height = cfg.ReadSetting(path + "height", 0); int width = cfg.ReadSetting(path + "width", 0); int initialframe = cfg.ReadSetting(path + "initialframe", 0); long bits = cfg.ReadSetting(path + "bits", 0L); Dictionary props = new Dictionary { { "id #", doomednum.ToString() }, { "initial frame", initialframe.ToString() }, { "width", width.ToString() }, { "height", height.ToString() }, { "bits", bits.ToString() } }; return new DehackedThing(dehackedid, name, props); } private DehackedFrame LoadFrame(DictionaryEntry entry) { int frameid; int.TryParse(entry.Key.ToString(), out frameid); string path = string.Format("{0}.frames.{1}.", root, entry.Key.ToString()); int spritenumber = cfg.ReadSetting(path + "spritenumber", 0); long spritesubnumber = cfg.ReadSetting(path + "spritesubnumber", 0L); if (spritesubnumber >= 32768) spritesubnumber -= 32768; Dictionary props = new Dictionary { { "sprite number", spritenumber.ToString() }, { "sprite subnumber", spritesubnumber.ToString() } }; return new DehackedFrame(frameid, props); } #endregion } }