/// <summary>
        /// Initiates loading of floors.
        /// </summary>
        public void Init()
        {
            /**
             * TODO: We can make this lazy load a bit better. Inside the far archives we
             * could just keep far entry pointers rather than processing them. Assuming each file
             * in the far only contains 1 floor style. If its variable this may not be possible
             */

            this.ById   = new Dictionary <ushort, Floor>();
            this.Floors = new List <Floor>();

            var floorGlobalsPath = ContentManager.GetPath("objectdata/globals/floors.iff");
            var floorGlobals     = new Iff(floorGlobalsPath);

            /** There is a small handful of floors in a global file for some reason **/
            ushort floorID = 1;

            for (ushort i = 1; i < 30; i++)
            {
                var far    = floorGlobals.Get <SPR2>(i);
                var medium = floorGlobals.Get <SPR2>((ushort)(i + 256));
                var near   = floorGlobals.Get <SPR2>((ushort)(2048));

                this.AddFloor(new Floor
                {
                    ID     = floorID,
                    Far    = far,
                    Medium = medium,
                    Near   = near
                });
                floorID++;
            }

            floorID = 256;

            var archives = new string[]
            {
                "housedata/floors/floors.far",
                "housedata/floors2/floors2.far",
                "housedata/floors3/floors3.far",
                "housedata/floors4/floors4.far"
            };

            for (var i = 0; i < archives.Length; i++)
            {
                var archivePath = ContentManager.GetPath(archives[i]);
                var archive     = new FAR1Archive(archivePath);
                var entries     = archive.GetAllEntries();

                foreach (var entry in entries)
                {
                    var iff   = new Iff();
                    var bytes = archive.GetEntry(entry);
                    using (var stream = new MemoryStream(bytes))
                    {
                        iff.Read(stream);
                    }

                    var far    = iff.Get <SPR2>(1);
                    var medium = iff.Get <SPR2>(257);
                    var near   = iff.Get <SPR2>(513);

                    AddFloor(new Floor {
                        ID     = floorID,
                        Near   = near,
                        Medium = medium,
                        Far    = far
                    });
                    floorID++;
                }
            }
        }
        /// <summary>
        /// Initiates loading of walls.
        /// </summary>
        public void Init()
        {
            /**
             * See floor for suggestions for implementation that doesn't load everything.
             */

            this.ById       = new Dictionary <ushort, Wall>();
            this.Walls      = new List <Wall>();
            this.StyleById  = new Dictionary <ushort, WallStyle>();
            this.WallStyles = new List <WallStyle>();

            var wallGlobalsPath = ContentManager.GetPath("objectdata/globals/walls.iff");
            var wallGlobals     = new Iff(wallGlobalsPath);

            /** Get wall styles from globals file **/
            ushort wallID = 1;

            for (ushort i = 2; i < 512; i += 2)
            {
                var far    = wallGlobals.Get <SPR>((ushort)(i));
                var medium = wallGlobals.Get <SPR>((ushort)(i + 512));
                var near   = wallGlobals.Get <SPR>((ushort)(i + 1024));

                var fard    = wallGlobals.Get <SPR>((ushort)(i + 1));
                var mediumd = wallGlobals.Get <SPR>((ushort)(i + 513));
                var neard   = wallGlobals.Get <SPR>((ushort)(i + 1025));

                if (fard == null)
                { //no walls down, just render exactly the same
                    fard    = far;
                    mediumd = medium;
                    neard   = near;
                }

                this.AddWallStyle(new WallStyle
                {
                    ID              = wallID,
                    WallsUpFar      = far,
                    WallsUpMedium   = medium,
                    WallsUpNear     = near,
                    WallsDownFar    = fard,
                    WallsDownMedium = mediumd,
                    WallsDownNear   = neard
                });

                wallID++;
            }

            DynamicStyleID = 256; //styles loaded from objects start at 256. The objd reference is dynamically altered to reference this new id,
            //so only refresh wall cache at same time as obj cache! (do this on lot unload)

            /** Get wall patterns from globals file **/

            wallID = 0;
            for (ushort i = 0; i < 256; i++)
            {
                var far    = wallGlobals.Get <SPR>((ushort)(i + 1536));
                var medium = wallGlobals.Get <SPR>((ushort)(i + 1536 + 256));
                var near   = wallGlobals.Get <SPR>((ushort)(i + 1536 + 512));

                this.AddWall(new Wall
                {
                    ID     = wallID,
                    Far    = far,
                    Medium = medium,
                    Near   = near,
                });

                wallID++;
            }

            Junctions = new Wall
            {
                ID     = wallID,
                Far    = wallGlobals.Get <SPR>(4096),
                Medium = wallGlobals.Get <SPR>(4097),
                Near   = wallGlobals.Get <SPR>(4098),
            };

            wallID = 256;

            var archives = new string[]
            {
                "housedata/walls/walls.far",
                "housedata/walls2/walls2.far",
                "housedata/walls3/walls3.far",
                "housedata/walls4/walls4.far"
            };

            for (var i = 0; i < archives.Length; i++)
            {
                var archivePath = ContentManager.GetPath(archives[i]);
                var archive     = new FAR1Archive(archivePath);
                var entries     = archive.GetAllEntries();

                foreach (var entry in entries)
                {
                    var iff   = new Iff();
                    var bytes = archive.GetEntry(entry);
                    using (var stream = new MemoryStream(bytes))
                    {
                        iff.Read(stream);
                    }

                    var far    = iff.Get <SPR>(1);
                    var medium = iff.Get <SPR>(1793);
                    var near   = iff.Get <SPR>(2049);

                    AddWall(new Wall {
                        ID     = wallID,
                        Near   = near,
                        Medium = medium,
                        Far    = far
                    });
                    wallID++;
                }
            }
        }