FixSunflowers() 개인적인 메소드

private FixSunflowers ( ) : void
리턴 void
예제 #1
0
        public static World LoadWorld(string filename)
        {
            var w = new World();

            try
            {
                lock (_fileLock)
                {
                    using (var b = new BinaryReader(File.OpenRead(filename)))
                    {
                        w.Version = b.ReadUInt32(); //now we care about the version
                        uint version = w.Version;
                        w.Title   = b.ReadString();
                        w.WorldId = b.ReadInt32();

                        w.Rand = new Random(w.WorldId);

                        w.LeftWorld   = (float)b.ReadInt32();
                        w.RightWorld  = (float)b.ReadInt32();
                        w.TopWorld    = (float)b.ReadInt32();
                        w.BottomWorld = (float)b.ReadInt32();
                        w.TilesHigh   = b.ReadInt32();
                        w.TilesWide   = b.ReadInt32();

                        //if (w.TilesHigh > 10000 || w.TilesWide > 10000 || w.TilesHigh <= 0 || w.TilesWide <= 0)
                        //    throw new FileLoadException(string.Format("Invalid File: {0}", filename));



                        if (version >= 63)
                        {
                            w.MoonType = (int)b.ReadByte();
                        }
                        else
                        {
                            w.MoonType = w.Rand.Next(MaxMoons);
                        }


                        if (version >= 44)
                        {
                            w.TreeX[0]     = b.ReadInt32();
                            w.TreeX[1]     = b.ReadInt32();
                            w.TreeX[2]     = b.ReadInt32();
                            w.TreeStyle[0] = b.ReadInt32();
                            w.TreeStyle[1] = b.ReadInt32();
                            w.TreeStyle[2] = b.ReadInt32();
                            w.TreeStyle[3] = b.ReadInt32();
                        }
                        if (version >= 60)
                        {
                            w.CaveBackX[0]     = b.ReadInt32();
                            w.CaveBackX[1]     = b.ReadInt32();
                            w.CaveBackX[2]     = b.ReadInt32();
                            w.CaveBackStyle[0] = b.ReadInt32();
                            w.CaveBackStyle[1] = b.ReadInt32();
                            w.CaveBackStyle[2] = b.ReadInt32();
                            w.CaveBackStyle[3] = b.ReadInt32();
                            w.IceBackStyle     = b.ReadInt32();
                            if (version >= 61)
                            {
                                w.JungleBackStyle = b.ReadInt32();
                                w.HellBackStyle   = b.ReadInt32();
                            }
                        }
                        else
                        {
                            w.CaveBackX[0]     = w.TilesWide / 2;
                            w.CaveBackX[1]     = w.TilesWide;
                            w.CaveBackX[2]     = w.TilesWide;
                            w.CaveBackStyle[0] = 0;
                            w.CaveBackStyle[1] = 1;
                            w.CaveBackStyle[2] = 2;
                            w.CaveBackStyle[3] = 3;
                            w.IceBackStyle     = 0;
                            w.JungleBackStyle  = 0;
                            w.HellBackStyle    = 0;
                        }

                        w.SpawnX      = b.ReadInt32();
                        w.SpawnY      = b.ReadInt32();
                        w.GroundLevel = (int)b.ReadDouble();
                        w.RockLevel   = (int)b.ReadDouble();

                        // read world flags
                        w.Time      = b.ReadDouble();
                        w.DayTime   = b.ReadBoolean();
                        w.MoonPhase = b.ReadInt32();
                        w.BloodMoon = b.ReadBoolean();

                        if (version >= 70)
                        {
                            w.IsEclipse = b.ReadBoolean();
                        }

                        w.DungeonX = b.ReadInt32();
                        w.DungeonY = b.ReadInt32();

                        if (version >= 56)
                        {
                            w.IsCrimson = b.ReadBoolean();
                        }
                        else
                        {
                            w.IsCrimson = false;
                        }

                        w.DownedBoss1 = b.ReadBoolean();
                        w.DownedBoss2 = b.ReadBoolean();
                        w.DownedBoss3 = b.ReadBoolean();

                        if (version >= 66)
                        {
                            w.DownedQueenBee = b.ReadBoolean();
                        }
                        if (version >= 44)
                        {
                            w.DownedMechBoss1   = b.ReadBoolean();
                            w.DownedMechBoss2   = b.ReadBoolean();
                            w.DownedMechBoss3   = b.ReadBoolean();
                            w.DownedMechBossAny = b.ReadBoolean();
                        }
                        if (version >= 64)
                        {
                            w.DownedPlantBoss = b.ReadBoolean();
                            w.DownedGolemBoss = b.ReadBoolean();
                        }
                        if (version >= 29)
                        {
                            w.SavedGoblin = b.ReadBoolean();
                            w.SavedWizard = b.ReadBoolean();
                            if (version >= 34)
                            {
                                w.SavedMech = b.ReadBoolean();
                            }
                            w.DownedGoblins = b.ReadBoolean();
                        }
                        if (version >= 32)
                        {
                            w.DownedClown = b.ReadBoolean();
                        }
                        if (version >= 37)
                        {
                            w.DownedFrost = b.ReadBoolean();
                        }
                        if (version >= 56)
                        {
                            w.DownedPirates = b.ReadBoolean();
                        }


                        w.ShadowOrbSmashed = b.ReadBoolean();
                        w.SpawnMeteor      = b.ReadBoolean();
                        w.ShadowOrbCount   = (int)b.ReadByte();

                        if (version >= 23)
                        {
                            w.AltarCount = b.ReadInt32();
                            w.HardMode   = b.ReadBoolean();
                        }

                        w.InvasionDelay = b.ReadInt32();
                        w.InvasionSize  = b.ReadInt32();
                        w.InvasionType  = b.ReadInt32();
                        w.InvasionX     = b.ReadDouble();

                        if (version >= 53)
                        {
                            w.TempRaining  = b.ReadBoolean();
                            w.TempRainTime = b.ReadInt32();
                            w.TempMaxRain  = b.ReadSingle();
                        }
                        if (version >= 54)
                        {
                            w.OreTier1 = b.ReadInt32();
                            w.OreTier2 = b.ReadInt32();
                            w.OreTier3 = b.ReadInt32();
                        }
                        else if (version < 23 || w.AltarCount != 0)
                        {
                            w.OreTier1 = 107;
                            w.OreTier2 = 108;
                            w.OreTier3 = 111;
                        }
                        else
                        {
                            w.OreTier1 = -1;
                            w.OreTier2 = -1;
                            w.OreTier3 = -1;
                        }

                        if (version >= 55)
                        {
                            w.BgTree       = b.ReadByte();
                            w.BgCorruption = b.ReadByte();
                            w.BgJungle     = b.ReadByte();
                        }
                        if (version >= 60)
                        {
                            w.BgSnow       = b.ReadByte();
                            w.BgHallow     = b.ReadByte();
                            w.BgCorruption = b.ReadByte();
                            w.BgDesert     = b.ReadByte();
                            w.BgOcean      = b.ReadByte();
                        }

                        if (version >= 60)
                        {
                            w.CloudBgActive = (float)b.ReadInt32();
                        }
                        else
                        {
                            w.CloudBgActive = -w.Rand.Next(8640, 86400);
                        }

                        if (version >= 62)
                        {
                            w.NumClouds    = b.ReadInt16();
                            w.WindSpeedSet = b.ReadSingle();
                        }

                        w.Tiles = new Tile[w.TilesWide, w.TilesHigh];
                        for (int i = 0; i < w.TilesWide; i++)
                        {
                            for (int j = 0; j < w.TilesHigh; j++)
                            {
                                w.Tiles[i, j] = new Tile();
                            }
                        }


                        for (int x = 0; x < w.TilesWide; ++x)
                        {
                            OnProgressChanged(null, new ProgressChangedEventArgs(x.ProgressPercentage(w.TilesWide), "Loading Tiles..."));

                            for (int y = 0; y < w.TilesHigh; y++)
                            {
                                var tile = ReadTileDataFromStream(b, version);

                                // read complete, start compression
                                w.Tiles[x, y] = tile;

                                if (version >= 25)
                                {
                                    int rle = b.ReadInt16();

                                    if (rle < 0)
                                    {
                                        throw new ApplicationException("Invalid Tile Data!");
                                    }

                                    if (rle > 0)
                                    {
                                        for (int k = y + 1; k < y + rle + 1; k++)
                                        {
                                            var tcopy = (Tile)tile.Clone();
                                            w.Tiles[x, k] = tcopy;
                                        }
                                        y = y + rle;
                                    }
                                }
                            }
                        }

                        if (version < 67)
                        {
                            w.FixSunflowers();
                        }
                        if (version < 72)
                        {
                            w.FixChand();
                        }

                        OnProgressChanged(null, new ProgressChangedEventArgs(100, "Loading Chests..."));
                        w.Chests.Clear();
                        w.Chests.AddRange(ReadChestDataFromStream(b, version));

                        OnProgressChanged(null, new ProgressChangedEventArgs(100, "Loading Signs..."));
                        w.Signs.Clear();

                        foreach (var sign in ReadSignDataFromStream(b))
                        {
                            if (w.Tiles[sign.X, sign.Y].IsActive && ((int)w.Tiles[sign.X, sign.Y].Type == 55 || (int)w.Tiles[sign.X, sign.Y].Type == 85))
                            {
                                w.Signs.Add(sign);
                            }
                        }


                        w.NPCs.Clear();
                        OnProgressChanged(null, new ProgressChangedEventArgs(100, "Loading NPC Data..."));
                        while (b.ReadBoolean())
                        {
                            var npc = new NPC();
                            npc.Name       = b.ReadString();
                            npc.Position   = new Vector2(b.ReadSingle(), b.ReadSingle());
                            npc.IsHomeless = b.ReadBoolean();
                            npc.Home       = new Vector2Int32(b.ReadInt32(), b.ReadInt32());
                            npc.SpriteId   = 0;
                            if (NpcIds.ContainsKey(npc.Name))
                            {
                                npc.SpriteId = NpcIds[npc.Name];
                            }

                            w.NPCs.Add(npc);
                        }
                        // if (version>=0x1f) read the names of the following npcs:
                        // merchant, nurse, arms dealer, dryad, guide, clothier, demolitionist,
                        // tinkerer and wizard
                        // if (version>=0x23) read the name of the mechanic


                        if (version >= 31)
                        {
                            OnProgressChanged(null, new ProgressChangedEventArgs(100, "Loading NPC Names..."));
                            w.CharacterNames.Add(new NpcName(17, b.ReadString()));
                            w.CharacterNames.Add(new NpcName(18, b.ReadString()));
                            w.CharacterNames.Add(new NpcName(19, b.ReadString()));
                            w.CharacterNames.Add(new NpcName(20, b.ReadString()));
                            w.CharacterNames.Add(new NpcName(22, b.ReadString()));
                            w.CharacterNames.Add(new NpcName(54, b.ReadString()));
                            w.CharacterNames.Add(new NpcName(38, b.ReadString()));
                            w.CharacterNames.Add(new NpcName(107, b.ReadString()));
                            w.CharacterNames.Add(new NpcName(108, b.ReadString()));
                            if (version >= 35)
                            {
                                w.CharacterNames.Add(new NpcName(124, b.ReadString()));
                            }
                            else
                            {
                                w.CharacterNames.Add(new NpcName(124, "Nancy"));
                            }

                            if (version >= 65)
                            {
                                w.CharacterNames.Add(new NpcName(160, b.ReadString()));
                                w.CharacterNames.Add(new NpcName(178, b.ReadString()));
                                w.CharacterNames.Add(new NpcName(207, b.ReadString()));
                                w.CharacterNames.Add(new NpcName(208, b.ReadString()));
                                w.CharacterNames.Add(new NpcName(209, b.ReadString()));
                                w.CharacterNames.Add(new NpcName(227, b.ReadString()));
                                w.CharacterNames.Add(new NpcName(228, b.ReadString()));
                                w.CharacterNames.Add(new NpcName(229, b.ReadString()));
                            }
                            else
                            {
                                w.CharacterNames.Add(GetNewNpc(160));
                                w.CharacterNames.Add(GetNewNpc(178));
                                w.CharacterNames.Add(GetNewNpc(207));
                                w.CharacterNames.Add(GetNewNpc(208));
                                w.CharacterNames.Add(GetNewNpc(209));
                                w.CharacterNames.Add(GetNewNpc(227));
                                w.CharacterNames.Add(GetNewNpc(228));
                                w.CharacterNames.Add(GetNewNpc(229));
                            }
                        }
                        else
                        {
                            w.CharacterNames.Add(GetNewNpc(17));
                            w.CharacterNames.Add(GetNewNpc(18));
                            w.CharacterNames.Add(GetNewNpc(19));
                            w.CharacterNames.Add(GetNewNpc(20));
                            w.CharacterNames.Add(GetNewNpc(22));
                            w.CharacterNames.Add(GetNewNpc(54));
                            w.CharacterNames.Add(GetNewNpc(38));
                            w.CharacterNames.Add(GetNewNpc(107));
                            w.CharacterNames.Add(GetNewNpc(108));
                            w.CharacterNames.Add(GetNewNpc(124));
                            w.CharacterNames.Add(GetNewNpc(160));
                            w.CharacterNames.Add(GetNewNpc(178));
                            w.CharacterNames.Add(GetNewNpc(207));
                            w.CharacterNames.Add(GetNewNpc(208));
                            w.CharacterNames.Add(GetNewNpc(209));
                            w.CharacterNames.Add(GetNewNpc(227));
                            w.CharacterNames.Add(GetNewNpc(228));
                            w.CharacterNames.Add(GetNewNpc(229));
                        }
                        if (version >= 7)
                        {
                            OnProgressChanged(null, new ProgressChangedEventArgs(100, "Validating File..."));
                            bool   validation   = b.ReadBoolean();
                            string checkTitle   = b.ReadString();
                            int    checkVersion = b.ReadInt32();
                            if (validation && checkTitle == w.Title && checkVersion == w.WorldId)
                            {
                                //w.loadSuccess = true;
                            }
                            else
                            {
                                b.Close();
                                throw new FileLoadException(string.Format("Error reading world file validation parameters! {0}", filename));
                            }
                        }
                        OnProgressChanged(null, new ProgressChangedEventArgs(0, "World Load Complete."));
                    }
                    w.LastSave = File.GetLastWriteTimeUtc(filename);
                }
            }
            catch (Exception err)
            {
                string msg = "There was an error reading the world file, do you wish to force it to load anyway?\r\n\r\n" +
                             "WARNING: This may have unexpected results including corrupt world files and program crashes.\r\n\r\n" +
                             "The error is :\r\n";
                if (MessageBox.Show(msg + err, "World File Error", MessageBoxButton.YesNo, MessageBoxImage.Error) != MessageBoxResult.Yes)
                {
                    return(null);
                }
            }
            return(w);
        }
예제 #2
0
        public static World LoadWorld(string filename)
        {
            var w = new World();
            try
            {
                lock (_fileLock)
                {
                    using (var b = new BinaryReader(File.OpenRead(filename)))
                    {
                        w.Version = b.ReadUInt32(); //now we care about the version
                        uint version = w.Version;
                        w.Title = b.ReadString();
                        w.WorldId = b.ReadInt32();

                        w.Rand = new Random(w.WorldId);

                        w.LeftWorld = (float)b.ReadInt32();
                        w.RightWorld = (float)b.ReadInt32();
                        w.TopWorld = (float)b.ReadInt32();
                        w.BottomWorld = (float)b.ReadInt32();
                        w.TilesHigh = b.ReadInt32();
                        w.TilesWide = b.ReadInt32();

                        //if (w.TilesHigh > 10000 || w.TilesWide > 10000 || w.TilesHigh <= 0 || w.TilesWide <= 0)
                        //    throw new FileLoadException(string.Format("Invalid File: {0}", filename));

                        if (version >= 63)
                            w.MoonType = (int)b.ReadByte();
                        else
                            w.MoonType = w.Rand.Next(MaxMoons);

                        if (version >= 44)
                        {
                            w.TreeX[0] = b.ReadInt32();
                            w.TreeX[1] = b.ReadInt32();
                            w.TreeX[2] = b.ReadInt32();
                            w.TreeStyle[0] = b.ReadInt32();
                            w.TreeStyle[1] = b.ReadInt32();
                            w.TreeStyle[2] = b.ReadInt32();
                            w.TreeStyle[3] = b.ReadInt32();
                        }
                        if (version >= 60)
                        {
                            w.CaveBackX[0] = b.ReadInt32();
                            w.CaveBackX[1] = b.ReadInt32();
                            w.CaveBackX[2] = b.ReadInt32();
                            w.CaveBackStyle[0] = b.ReadInt32();
                            w.CaveBackStyle[1] = b.ReadInt32();
                            w.CaveBackStyle[2] = b.ReadInt32();
                            w.CaveBackStyle[3] = b.ReadInt32();
                            w.IceBackStyle = b.ReadInt32();
                            if (version >= 61)
                            {
                                w.JungleBackStyle = b.ReadInt32();
                                w.HellBackStyle = b.ReadInt32();
                            }
                        }
                        else
                        {
                            w.CaveBackX[0] = w.TilesWide / 2;
                            w.CaveBackX[1] = w.TilesWide;
                            w.CaveBackX[2] = w.TilesWide;
                            w.CaveBackStyle[0] = 0;
                            w.CaveBackStyle[1] = 1;
                            w.CaveBackStyle[2] = 2;
                            w.CaveBackStyle[3] = 3;
                            w.IceBackStyle = 0;
                            w.JungleBackStyle = 0;
                            w.HellBackStyle = 0;
                        }

                        w.SpawnX = b.ReadInt32();
                        w.SpawnY = b.ReadInt32();
                        w.GroundLevel = (int)b.ReadDouble();
                        w.RockLevel = (int)b.ReadDouble();

                        // read world flags
                        w.Time = b.ReadDouble();
                        w.DayTime = b.ReadBoolean();
                        w.MoonPhase = b.ReadInt32();
                        w.BloodMoon = b.ReadBoolean();

                        if (version >= 70)
                        {
                            w.IsEclipse = b.ReadBoolean();
                        }

                        w.DungeonX = b.ReadInt32();
                        w.DungeonY = b.ReadInt32();

                        if (version >= 56)
                        {
                            w.IsCrimson = b.ReadBoolean();
                        }
                        else
                        {
                            w.IsCrimson = false;
                        }

                        w.DownedBoss1 = b.ReadBoolean();
                        w.DownedBoss2 = b.ReadBoolean();
                        w.DownedBoss3 = b.ReadBoolean();

                        if (version >= 66)
                        {
                            w.DownedQueenBee = b.ReadBoolean();
                        }
                        if (version >= 44)
                        {
                            w.DownedMechBoss1 = b.ReadBoolean();
                            w.DownedMechBoss2 = b.ReadBoolean();
                            w.DownedMechBoss3 = b.ReadBoolean();
                            w.DownedMechBossAny = b.ReadBoolean();
                        }
                        if (version >= 64)
                        {
                            w.DownedPlantBoss = b.ReadBoolean();
                            w.DownedGolemBoss = b.ReadBoolean();
                        }
                        if (version >= 29)
                        {
                            w.SavedGoblin = b.ReadBoolean();
                            w.SavedWizard = b.ReadBoolean();
                            if (version >= 34)
                            {
                                w.SavedMech = b.ReadBoolean();
                            }
                            w.DownedGoblins = b.ReadBoolean();
                        }
                        if (version >= 32)
                            w.DownedClown = b.ReadBoolean();
                        if (version >= 37)
                            w.DownedFrost = b.ReadBoolean();
                        if (version >= 56)
                            w.DownedPirates = b.ReadBoolean();

                        w.ShadowOrbSmashed = b.ReadBoolean();
                        w.SpawnMeteor = b.ReadBoolean();
                        w.ShadowOrbCount = (int)b.ReadByte();

                        if (version >= 23)
                        {
                            w.AltarCount = b.ReadInt32();
                            w.HardMode = b.ReadBoolean();
                        }

                        w.InvasionDelay = b.ReadInt32();
                        w.InvasionSize = b.ReadInt32();
                        w.InvasionType = b.ReadInt32();
                        w.InvasionX = b.ReadDouble();

                        if (version >= 53)
                        {
                            w.TempRaining = b.ReadBoolean();
                            w.TempRainTime = b.ReadInt32();
                            w.TempMaxRain = b.ReadSingle();
                        }
                        if (version >= 54)
                        {
                            w.OreTier1 = b.ReadInt32();
                            w.OreTier2 = b.ReadInt32();
                            w.OreTier3 = b.ReadInt32();
                        }
                        else if (version < 23 || w.AltarCount != 0)
                        {
                            w.OreTier1 = 107;
                            w.OreTier2 = 108;
                            w.OreTier3 = 111;
                        }
                        else
                        {
                            w.OreTier1 = -1;
                            w.OreTier2 = -1;
                            w.OreTier3 = -1;
                        }

                        if (version >= 55)
                        {
                            w.BgTree = b.ReadByte();
                            w.BgCorruption = b.ReadByte();
                            w.BgJungle = b.ReadByte();
                        }
                        if (version >= 60)
                        {
                            w.BgSnow = b.ReadByte();
                            w.BgHallow = b.ReadByte();
                            w.BgCorruption = b.ReadByte();
                            w.BgDesert = b.ReadByte();
                            w.BgOcean = b.ReadByte();
                        }

                        if (version >= 60)
                        {
                            w.CloudBgActive = (float)b.ReadInt32();
                        }
                        else
                        {
                            w.CloudBgActive = -w.Rand.Next(8640, 86400);
                        }

                        if (version >= 62)
                        {
                            w.NumClouds = b.ReadInt16();
                            w.WindSpeedSet = b.ReadSingle();
                        }

                        w.Tiles = new Tile[w.TilesWide, w.TilesHigh];
                        for (int i = 0; i < w.TilesWide; i++)
                        {
                            for (int j = 0; j < w.TilesHigh; j++)
                            {
                                w.Tiles[i, j] = new Tile();
                            }
                        }

                        for (int x = 0; x < w.TilesWide; ++x)
                        {
                            OnProgressChanged(null, new ProgressChangedEventArgs(x.ProgressPercentage(w.TilesWide), "Loading Tiles..."));

                            for (int y = 0; y < w.TilesHigh; y++)
                            {
                                var tile = ReadTileDataFromStream(b, version);

                                // read complete, start compression
                                w.Tiles[x, y] = tile;

                                if (version >= 25)
                                {
                                    int rle = b.ReadInt16();

                                    if (rle < 0)
                                        throw new ApplicationException("Invalid Tile Data!");

                                    if (rle > 0)
                                    {
                                        for (int k = y + 1; k < y + rle + 1; k++)
                                        {
                                            var tcopy = (Tile)tile.Clone();
                                            w.Tiles[x, k] = tcopy;
                                        }
                                        y = y + rle;
                                    }
                                }
                            }
                        }

                        if (version < 67)
                            w.FixSunflowers();
                        if (version < 72)
                            w.FixChand();

                        OnProgressChanged(null, new ProgressChangedEventArgs(100, "Loading Chests..."));
                        w.Chests.Clear();
                        w.Chests.AddRange(ReadChestDataFromStream(b, version));

                        OnProgressChanged(null, new ProgressChangedEventArgs(100, "Loading Signs..."));
                        w.Signs.Clear();

                        foreach (var sign in ReadSignDataFromStream(b))
                        {
                            if (w.Tiles[sign.X, sign.Y].IsActive && ((int)w.Tiles[sign.X, sign.Y].Type == 55 || (int)w.Tiles[sign.X, sign.Y].Type == 85))
                                w.Signs.Add(sign);
                        }

                        w.NPCs.Clear();
                        OnProgressChanged(null, new ProgressChangedEventArgs(100, "Loading NPC Data..."));
                        while (b.ReadBoolean())
                        {
                            var npc = new NPC();
                            npc.Name = b.ReadString();
                            npc.Position = new Vector2(b.ReadSingle(), b.ReadSingle());
                            npc.IsHomeless = b.ReadBoolean();
                            npc.Home = new Vector2Int32(b.ReadInt32(), b.ReadInt32());
                            npc.SpriteId = 0;
                            if (NpcIds.ContainsKey(npc.Name))
                                npc.SpriteId = NpcIds[npc.Name];

                            w.NPCs.Add(npc);
                        }
                        // if (version>=0x1f) read the names of the following npcs:
                        // merchant, nurse, arms dealer, dryad, guide, clothier, demolitionist,
                        // tinkerer and wizard
                        // if (version>=0x23) read the name of the mechanic

                        if (version >= 31)
                        {
                            OnProgressChanged(null, new ProgressChangedEventArgs(100, "Loading NPC Names..."));
                            w.CharacterNames.Add(new NpcName(17, b.ReadString()));
                            w.CharacterNames.Add(new NpcName(18, b.ReadString()));
                            w.CharacterNames.Add(new NpcName(19, b.ReadString()));
                            w.CharacterNames.Add(new NpcName(20, b.ReadString()));
                            w.CharacterNames.Add(new NpcName(22, b.ReadString()));
                            w.CharacterNames.Add(new NpcName(54, b.ReadString()));
                            w.CharacterNames.Add(new NpcName(38, b.ReadString()));
                            w.CharacterNames.Add(new NpcName(107, b.ReadString()));
                            w.CharacterNames.Add(new NpcName(108, b.ReadString()));
                            if (version >= 35)
                                w.CharacterNames.Add(new NpcName(124, b.ReadString()));
                            else
                                w.CharacterNames.Add(new NpcName(124, "Nancy"));

                            if (version >= 65)
                            {
                                w.CharacterNames.Add(new NpcName(160, b.ReadString()));
                                w.CharacterNames.Add(new NpcName(178, b.ReadString()));
                                w.CharacterNames.Add(new NpcName(207, b.ReadString()));
                                w.CharacterNames.Add(new NpcName(208, b.ReadString()));
                                w.CharacterNames.Add(new NpcName(209, b.ReadString()));
                                w.CharacterNames.Add(new NpcName(227, b.ReadString()));
                                w.CharacterNames.Add(new NpcName(228, b.ReadString()));
                                w.CharacterNames.Add(new NpcName(229, b.ReadString()));
                            }
                            else
                            {
                                w.CharacterNames.Add(GetNewNpc(160));
                                w.CharacterNames.Add(GetNewNpc(178));
                                w.CharacterNames.Add(GetNewNpc(207));
                                w.CharacterNames.Add(GetNewNpc(208));
                                w.CharacterNames.Add(GetNewNpc(209));
                                w.CharacterNames.Add(GetNewNpc(227));
                                w.CharacterNames.Add(GetNewNpc(228));
                                w.CharacterNames.Add(GetNewNpc(229));
                            }
                        }
                        else
                        {
                            w.CharacterNames.Add(GetNewNpc(17));
                            w.CharacterNames.Add(GetNewNpc(18));
                            w.CharacterNames.Add(GetNewNpc(19));
                            w.CharacterNames.Add(GetNewNpc(20));
                            w.CharacterNames.Add(GetNewNpc(22));
                            w.CharacterNames.Add(GetNewNpc(54));
                            w.CharacterNames.Add(GetNewNpc(38));
                            w.CharacterNames.Add(GetNewNpc(107));
                            w.CharacterNames.Add(GetNewNpc(108));
                            w.CharacterNames.Add(GetNewNpc(124));
                            w.CharacterNames.Add(GetNewNpc(160));
                            w.CharacterNames.Add(GetNewNpc(178));
                            w.CharacterNames.Add(GetNewNpc(207));
                            w.CharacterNames.Add(GetNewNpc(208));
                            w.CharacterNames.Add(GetNewNpc(209));
                            w.CharacterNames.Add(GetNewNpc(227));
                            w.CharacterNames.Add(GetNewNpc(228));
                            w.CharacterNames.Add(GetNewNpc(229));

                        }
                        if (version >= 7)
                        {
                            OnProgressChanged(null, new ProgressChangedEventArgs(100, "Validating File..."));
                            bool validation = b.ReadBoolean();
                            string checkTitle = b.ReadString();
                            int checkVersion = b.ReadInt32();
                            if (validation && checkTitle == w.Title && checkVersion == w.WorldId)
                            {
                                //w.loadSuccess = true;
                            }
                            else
                            {
                                b.Close();
                                throw new FileLoadException(string.Format("Error reading world file validation parameters! {0}", filename));
                            }
                        }
                        OnProgressChanged(null, new ProgressChangedEventArgs(0, "World Load Complete."));

                    }
                    w.LastSave = File.GetLastWriteTimeUtc(filename);
                }
            }
            catch (Exception err)
            {
                string msg = "There was an error reading the world file, do you wish to force it to load anyway?\r\n\r\n" +
                             "WARNING: This may have unexpected results including corrupt world files and program crashes.\r\n\r\n" +
                             "The error is :\r\n";
                if (MessageBox.Show(msg + err, "World File Error", MessageBoxButton.YesNo, MessageBoxImage.Error) != MessageBoxResult.Yes)
                    return null;
            }
            return w;
        }
        private static void LoadV1(BinaryReader reader, string filename, World w)
        {
            uint version = w.Version;
            w.Title = reader.ReadString();
            w.WorldId = reader.ReadInt32();

            w.Rand = new Random(w.WorldId);

            w.LeftWorld = reader.ReadInt32();
            w.RightWorld = reader.ReadInt32();
            w.TopWorld = reader.ReadInt32();
            w.BottomWorld = reader.ReadInt32();
            w.TilesHigh = reader.ReadInt32();
            w.TilesWide = reader.ReadInt32();

            //if (w.TilesHigh > 10000 || w.TilesWide > 10000 || w.TilesHigh <= 0 || w.TilesWide <= 0)
            //    throw new FileLoadException(string.Format("Invalid File: {0}", filename));


            if (version >= 63)
                w.MoonType = reader.ReadByte();
            else
                w.MoonType = (byte)w.Rand.Next(MaxMoons);


            if (version >= 44)
            {
                w.TreeX0 = reader.ReadInt32();
                w.TreeX1 = reader.ReadInt32();
                w.TreeX2 = reader.ReadInt32();
                w.TreeStyle0 = reader.ReadInt32();
                w.TreeStyle1 = reader.ReadInt32();
                w.TreeStyle2 = reader.ReadInt32();
                w.TreeStyle3 = reader.ReadInt32();
            }
            if (version >= 60)
            {
                w.CaveBackX0 = reader.ReadInt32();
                w.CaveBackX1 = reader.ReadInt32();
                w.CaveBackX2 = reader.ReadInt32();
                w.CaveBackStyle0 = reader.ReadInt32();
                w.CaveBackStyle1 = reader.ReadInt32();
                w.CaveBackStyle2 = reader.ReadInt32();
                w.CaveBackStyle3 = reader.ReadInt32();
                w.IceBackStyle = reader.ReadInt32();
                if (version >= 61)
                {
                    w.JungleBackStyle = reader.ReadInt32();
                    w.HellBackStyle = reader.ReadInt32();
                }
            }
            else
            {
                w.CaveBackX[0] = w.TilesWide/2;
                w.CaveBackX[1] = w.TilesWide;
                w.CaveBackX[2] = w.TilesWide;
                w.CaveBackStyle0 = 0;
                w.CaveBackStyle1 = 1;
                w.CaveBackStyle2 = 2;
                w.CaveBackStyle3 = 3;
                w.IceBackStyle = 0;
                w.JungleBackStyle = 0;
                w.HellBackStyle = 0;
            }

            w.SpawnX = reader.ReadInt32();
            w.SpawnY = reader.ReadInt32();
            w.GroundLevel = (int) reader.ReadDouble();
            w.RockLevel = (int) reader.ReadDouble();

            // read world flags
            w.Time = reader.ReadDouble();
            w.DayTime = reader.ReadBoolean();
            w.MoonPhase = reader.ReadInt32();
            w.BloodMoon = reader.ReadBoolean();

            if (version >= 70)
            {
                w.IsEclipse = reader.ReadBoolean();
            }

            w.DungeonX = reader.ReadInt32();
            w.DungeonY = reader.ReadInt32();

            if (version >= 56)
            {
                w.IsCrimson = reader.ReadBoolean();
            }
            else
            {
                w.IsCrimson = false;
            }

            w.DownedBoss1 = reader.ReadBoolean();
            w.DownedBoss2 = reader.ReadBoolean();
            w.DownedBoss3 = reader.ReadBoolean();

            if (version >= 66)
            {
                w.DownedQueenBee = reader.ReadBoolean();
            }
            if (version >= 44)
            {
                w.DownedMechBoss1 = reader.ReadBoolean();
                w.DownedMechBoss2 = reader.ReadBoolean();
                w.DownedMechBoss3 = reader.ReadBoolean();
                w.DownedMechBossAny = reader.ReadBoolean();
            }
            if (version >= 64)
            {
                w.DownedPlantBoss = reader.ReadBoolean();
                w.DownedGolemBoss = reader.ReadBoolean();
            }
            if (version >= 29)
            {
                w.SavedGoblin = reader.ReadBoolean();
                w.SavedWizard = reader.ReadBoolean();
                if (version >= 34)
                {
                    w.SavedMech = reader.ReadBoolean();
                }
                w.DownedGoblins = reader.ReadBoolean();
            }
            if (version >= 32)
                w.DownedClown = reader.ReadBoolean();
            if (version >= 37)
                w.DownedFrost = reader.ReadBoolean();
            if (version >= 56)
                w.DownedPirates = reader.ReadBoolean();


            w.ShadowOrbSmashed = reader.ReadBoolean();
            w.SpawnMeteor = reader.ReadBoolean();
            w.ShadowOrbCount = reader.ReadByte();

            if (version >= 23)
            {
                w.AltarCount = reader.ReadInt32();
                w.HardMode = reader.ReadBoolean();
            }

            w.InvasionDelay = reader.ReadInt32();
            w.InvasionSize = reader.ReadInt32();
            w.InvasionType = reader.ReadInt32();
            w.InvasionX = reader.ReadDouble();

            if (version >= 53)
            {
                w.TempRaining = reader.ReadBoolean();
                w.TempRainTime = reader.ReadInt32();
                w.TempMaxRain = reader.ReadSingle();
            }
            if (version >= 54)
            {
                w.OreTier1 = reader.ReadInt32();
                w.OreTier2 = reader.ReadInt32();
                w.OreTier3 = reader.ReadInt32();
            }
            else if (version < 23 || w.AltarCount != 0)
            {
                w.OreTier1 = 107;
                w.OreTier2 = 108;
                w.OreTier3 = 111;
            }
            else
            {
                w.OreTier1 = -1;
                w.OreTier2 = -1;
                w.OreTier3 = -1;
            }

            if (version >= 55)
            {
                w.BgTree = reader.ReadByte();
                w.BgCorruption = reader.ReadByte();
                w.BgJungle = reader.ReadByte();
            }
            if (version >= 60)
            {
                w.BgSnow = reader.ReadByte();
                w.BgHallow = reader.ReadByte();
                w.BgCorruption = reader.ReadByte();
                w.BgDesert = reader.ReadByte();
                w.BgOcean = reader.ReadByte();
            }

            if (version >= 60)
            {
                w.CloudBgActive = reader.ReadInt32();
            }
            else
            {
                w.CloudBgActive = -w.Rand.Next(8640, 86400);
            }

            if (version >= 62)
            {
                w.NumClouds = reader.ReadInt16();
                w.WindSpeedSet = reader.ReadSingle();
            }

            w.Tiles = new Tile[w.TilesWide, w.TilesHigh];
            for (int i = 0; i < w.TilesWide; i++)
            {
                for (int j = 0; j < w.TilesHigh; j++)
                {
                    w.Tiles[i, j] = new Tile();
                }
            }


            for (int x = 0; x < w.TilesWide; ++x)
            {
                OnProgressChanged(null,
                    new ProgressChangedEventArgs(x.ProgressPercentage(w.TilesWide), "Loading UndoTiles..."));

                for (int y = 0; y < w.TilesHigh; y++)
                {
                    Tile tile = ReadTileDataFromStreamV1(reader, version);

                    // read complete, start compression
                    w.Tiles[x, y] = tile;

                    if (version >= 25)
                    {
                        int rle = reader.ReadInt16();

                        if (rle < 0)
                            throw new ApplicationException("Invalid Tile Data!");

                        if (rle > 0)
                        {
                            for (int k = y + 1; k < y + rle + 1; k++)
                            {
                                var tcopy = (Tile) tile.Clone();
                                w.Tiles[x, k] = tcopy;
                            }
                            y = y + rle;
                        }
                    }
                }
            }

            if (version < 67)
                w.FixSunflowers();
            if (version < 72)
                w.FixChand();

            OnProgressChanged(null, new ProgressChangedEventArgs(100, "Loading Chests..."));
            w.Chests.Clear();
            ((ObservableCollection<Chest>)w.Chests).AddRange(ReadChestDataFromStreamV1(reader, version));

            OnProgressChanged(null, new ProgressChangedEventArgs(100, "Loading Signs..."));
            w.Signs.Clear();

            foreach (Sign sign in ReadSignDataFromStreamV1(reader))
            {
                if (w.Tiles[sign.X, sign.Y].IsActive && Tile.IsSign(w.Tiles[sign.X, sign.Y].Type))
                {
                    w.Signs.Add(sign);
                }
            }

            w.NPCs.Clear();
            OnProgressChanged(null, new ProgressChangedEventArgs(100, "Loading NPC Data..."));
            while (reader.ReadBoolean())
            {
                var npc = new NPC();
                npc.Name = reader.ReadString();
                npc.Position = new Vector2(reader.ReadSingle(), reader.ReadSingle());
                npc.IsHomeless = reader.ReadBoolean();
                npc.Home = new Vector2Int32(reader.ReadInt32(), reader.ReadInt32());
                npc.SpriteId = 0;
                if (NpcIds.ContainsKey(npc.Name))
                    npc.SpriteId = NpcIds[npc.Name];

                w.NPCs.Add(npc);
            }
            // if (version>=0x1f) read the names of the following npcs:
            // merchant, nurse, arms dealer, dryad, guide, clothier, demolitionist,
            // tinkerer and wizard
            // if (version>=0x23) read the name of the mechanic


            if (version >= 31)
            {
                OnProgressChanged(null, new ProgressChangedEventArgs(100, "Loading NPC Names..."));
                w.CharacterNames.Add(new NpcName(17, reader.ReadString()));
                w.CharacterNames.Add(new NpcName(18, reader.ReadString()));
                w.CharacterNames.Add(new NpcName(19, reader.ReadString()));
                w.CharacterNames.Add(new NpcName(20, reader.ReadString()));
                w.CharacterNames.Add(new NpcName(22, reader.ReadString()));
                w.CharacterNames.Add(new NpcName(54, reader.ReadString()));
                w.CharacterNames.Add(new NpcName(38, reader.ReadString()));
                w.CharacterNames.Add(new NpcName(107, reader.ReadString()));
                w.CharacterNames.Add(new NpcName(108, reader.ReadString()));
                if (version >= 35)
                    w.CharacterNames.Add(new NpcName(124, reader.ReadString()));
                else
                    w.CharacterNames.Add(new NpcName(124, "Nancy"));

                if (version >= 65)
                {
                    w.CharacterNames.Add(new NpcName(160, reader.ReadString()));
                    w.CharacterNames.Add(new NpcName(178, reader.ReadString()));
                    w.CharacterNames.Add(new NpcName(207, reader.ReadString()));
                    w.CharacterNames.Add(new NpcName(208, reader.ReadString()));
                    w.CharacterNames.Add(new NpcName(209, reader.ReadString()));
                    w.CharacterNames.Add(new NpcName(227, reader.ReadString()));
                    w.CharacterNames.Add(new NpcName(228, reader.ReadString()));
                    w.CharacterNames.Add(new NpcName(229, reader.ReadString()));
                }
                else
                {
                    w.CharacterNames.Add(GetNewNpc(160));
                    w.CharacterNames.Add(GetNewNpc(178));
                    w.CharacterNames.Add(GetNewNpc(207));
                    w.CharacterNames.Add(GetNewNpc(208));
                    w.CharacterNames.Add(GetNewNpc(209));
                    w.CharacterNames.Add(GetNewNpc(227));
                    w.CharacterNames.Add(GetNewNpc(228));
                    w.CharacterNames.Add(GetNewNpc(229));
                }
            }
            else
            {
                w.CharacterNames.Add(GetNewNpc(17));
                w.CharacterNames.Add(GetNewNpc(18));
                w.CharacterNames.Add(GetNewNpc(19));
                w.CharacterNames.Add(GetNewNpc(20));
                w.CharacterNames.Add(GetNewNpc(22));
                w.CharacterNames.Add(GetNewNpc(54));
                w.CharacterNames.Add(GetNewNpc(38));
                w.CharacterNames.Add(GetNewNpc(107));
                w.CharacterNames.Add(GetNewNpc(108));
                w.CharacterNames.Add(GetNewNpc(124));
                w.CharacterNames.Add(GetNewNpc(160));
                w.CharacterNames.Add(GetNewNpc(178));
                w.CharacterNames.Add(GetNewNpc(207));
                w.CharacterNames.Add(GetNewNpc(208));
                w.CharacterNames.Add(GetNewNpc(209));
                w.CharacterNames.Add(GetNewNpc(227));
                w.CharacterNames.Add(GetNewNpc(228));
                w.CharacterNames.Add(GetNewNpc(229));
            }
            if (version >= 7)
            {
                OnProgressChanged(null, new ProgressChangedEventArgs(100, "Validating File..."));
                bool validation = reader.ReadBoolean();
                string checkTitle = reader.ReadString();
                int checkVersion = reader.ReadInt32();
                if (validation && checkTitle == w.Title && checkVersion == w.WorldId)
                {
                    //w.loadSuccess = true;
                }
                else
                {
                    reader.Close();
                    throw new FileLoadException(
                        string.Format("Error reading world file validation parameters! {0}", filename));
                }
            }
            OnProgressChanged(null, new ProgressChangedEventArgs(0, "World Load Complete."));
        }
예제 #4
0
        private static void LoadV1(BinaryReader reader, string filename, World w)
        {
            uint version = w.Version;

            w.Title   = reader.ReadString();
            w.WorldId = reader.ReadInt32();

            w.Rand = new Random(w.WorldId);

            w.LeftWorld   = reader.ReadInt32();
            w.RightWorld  = reader.ReadInt32();
            w.TopWorld    = reader.ReadInt32();
            w.BottomWorld = reader.ReadInt32();
            w.TilesHigh   = reader.ReadInt32();
            w.TilesWide   = reader.ReadInt32();

            //if (w.TilesHigh > 10000 || w.TilesWide > 10000 || w.TilesHigh <= 0 || w.TilesWide <= 0)
            //    throw new FileLoadException(string.Format("Invalid File: {0}", filename));


            if (version >= 63)
            {
                w.MoonType = reader.ReadByte();
            }
            else
            {
                w.MoonType = w.Rand.Next(MaxMoons);
            }


            if (version >= 44)
            {
                w.TreeX[0]     = reader.ReadInt32();
                w.TreeX[1]     = reader.ReadInt32();
                w.TreeX[2]     = reader.ReadInt32();
                w.TreeStyle[0] = reader.ReadInt32();
                w.TreeStyle[1] = reader.ReadInt32();
                w.TreeStyle[2] = reader.ReadInt32();
                w.TreeStyle[3] = reader.ReadInt32();
            }
            if (version >= 60)
            {
                w.CaveBackX[0]     = reader.ReadInt32();
                w.CaveBackX[1]     = reader.ReadInt32();
                w.CaveBackX[2]     = reader.ReadInt32();
                w.CaveBackStyle[0] = reader.ReadInt32();
                w.CaveBackStyle[1] = reader.ReadInt32();
                w.CaveBackStyle[2] = reader.ReadInt32();
                w.CaveBackStyle[3] = reader.ReadInt32();
                w.IceBackStyle     = reader.ReadInt32();
                if (version >= 61)
                {
                    w.JungleBackStyle = reader.ReadInt32();
                    w.HellBackStyle   = reader.ReadInt32();
                }
            }
            else
            {
                w.CaveBackX[0]     = w.TilesWide / 2;
                w.CaveBackX[1]     = w.TilesWide;
                w.CaveBackX[2]     = w.TilesWide;
                w.CaveBackStyle[0] = 0;
                w.CaveBackStyle[1] = 1;
                w.CaveBackStyle[2] = 2;
                w.CaveBackStyle[3] = 3;
                w.IceBackStyle     = 0;
                w.JungleBackStyle  = 0;
                w.HellBackStyle    = 0;
            }

            w.SpawnX      = reader.ReadInt32();
            w.SpawnY      = reader.ReadInt32();
            w.GroundLevel = (int)reader.ReadDouble();
            w.RockLevel   = (int)reader.ReadDouble();

            // read world flags
            w.Time      = reader.ReadDouble();
            w.DayTime   = reader.ReadBoolean();
            w.MoonPhase = reader.ReadInt32();
            w.BloodMoon = reader.ReadBoolean();

            if (version >= 70)
            {
                w.IsEclipse = reader.ReadBoolean();
            }

            w.DungeonX = reader.ReadInt32();
            w.DungeonY = reader.ReadInt32();

            if (version >= 56)
            {
                w.IsCrimson = reader.ReadBoolean();
            }
            else
            {
                w.IsCrimson = false;
            }

            w.DownedBoss1 = reader.ReadBoolean();
            w.DownedBoss2 = reader.ReadBoolean();
            w.DownedBoss3 = reader.ReadBoolean();

            if (version >= 66)
            {
                w.DownedQueenBee = reader.ReadBoolean();
            }
            if (version >= 44)
            {
                w.DownedMechBoss1   = reader.ReadBoolean();
                w.DownedMechBoss2   = reader.ReadBoolean();
                w.DownedMechBoss3   = reader.ReadBoolean();
                w.DownedMechBossAny = reader.ReadBoolean();
            }
            if (version >= 64)
            {
                w.DownedPlantBoss = reader.ReadBoolean();
                w.DownedGolemBoss = reader.ReadBoolean();
            }
            if (version >= 29)
            {
                w.SavedGoblin = reader.ReadBoolean();
                w.SavedWizard = reader.ReadBoolean();
                if (version >= 34)
                {
                    w.SavedMech = reader.ReadBoolean();
                }
                w.DownedGoblins = reader.ReadBoolean();
            }
            if (version >= 32)
            {
                w.DownedClown = reader.ReadBoolean();
            }
            if (version >= 37)
            {
                w.DownedFrost = reader.ReadBoolean();
            }
            if (version >= 56)
            {
                w.DownedPirates = reader.ReadBoolean();
            }


            w.ShadowOrbSmashed = reader.ReadBoolean();
            w.SpawnMeteor      = reader.ReadBoolean();
            w.ShadowOrbCount   = reader.ReadByte();

            if (version >= 23)
            {
                w.AltarCount = reader.ReadInt32();
                w.HardMode   = reader.ReadBoolean();
            }

            w.InvasionDelay = reader.ReadInt32();
            w.InvasionSize  = reader.ReadInt32();
            w.InvasionType  = reader.ReadInt32();
            w.InvasionX     = reader.ReadDouble();

            if (version >= 53)
            {
                w.TempRaining  = reader.ReadBoolean();
                w.TempRainTime = reader.ReadInt32();
                w.TempMaxRain  = reader.ReadSingle();
            }
            if (version >= 54)
            {
                w.OreTier1 = reader.ReadInt32();
                w.OreTier2 = reader.ReadInt32();
                w.OreTier3 = reader.ReadInt32();
            }
            else if (version < 23 || w.AltarCount != 0)
            {
                w.OreTier1 = 107;
                w.OreTier2 = 108;
                w.OreTier3 = 111;
            }
            else
            {
                w.OreTier1 = -1;
                w.OreTier2 = -1;
                w.OreTier3 = -1;
            }

            if (version >= 55)
            {
                w.BgTree       = reader.ReadByte();
                w.BgCorruption = reader.ReadByte();
                w.BgJungle     = reader.ReadByte();
            }
            if (version >= 60)
            {
                w.BgSnow       = reader.ReadByte();
                w.BgHallow     = reader.ReadByte();
                w.BgCorruption = reader.ReadByte();
                w.BgDesert     = reader.ReadByte();
                w.BgOcean      = reader.ReadByte();
            }

            if (version >= 60)
            {
                w.CloudBgActive = reader.ReadInt32();
            }
            else
            {
                w.CloudBgActive = -w.Rand.Next(8640, 86400);
            }

            if (version >= 62)
            {
                w.NumClouds    = reader.ReadInt16();
                w.WindSpeedSet = reader.ReadSingle();
            }

            w.Tiles = new Tile[w.TilesWide, w.TilesHigh];
            for (int i = 0; i < w.TilesWide; i++)
            {
                for (int j = 0; j < w.TilesHigh; j++)
                {
                    w.Tiles[i, j] = new Tile();
                }
            }


            for (int x = 0; x < w.TilesWide; ++x)
            {
                OnProgressChanged(null,
                                  new ProgressChangedEventArgs(x.ProgressPercentage(w.TilesWide), "Loading UndoTiles..."));

                for (int y = 0; y < w.TilesHigh; y++)
                {
                    Tile tile = ReadTileDataFromStreamV1(reader, version);

                    // read complete, start compression
                    w.Tiles[x, y] = tile;

                    if (version >= 25)
                    {
                        int rle = reader.ReadInt16();

                        if (rle < 0)
                        {
                            throw new ApplicationException("Invalid Tile Data!");
                        }

                        if (rle > 0)
                        {
                            for (int k = y + 1; k < y + rle + 1; k++)
                            {
                                var tcopy = (Tile)tile.Clone();
                                w.Tiles[x, k] = tcopy;
                            }
                            y = y + rle;
                        }
                    }
                }
            }

            if (version < 67)
            {
                w.FixSunflowers();
            }
            if (version < 72)
            {
                w.FixChand();
            }

            OnProgressChanged(null, new ProgressChangedEventArgs(100, "Loading Chests..."));
            w.Chests.Clear();
            ((ObservableCollection <Chest>)w.Chests).AddRange(ReadChestDataFromStreamV1(reader, version));

            OnProgressChanged(null, new ProgressChangedEventArgs(100, "Loading Signs..."));
            w.Signs.Clear();

            foreach (Sign sign in ReadSignDataFromStreamV1(reader))
            {
                if (w.Tiles[sign.X, sign.Y].IsActive &&
                    (w.Tiles[sign.X, sign.Y].Type == 55 || w.Tiles[sign.X, sign.Y].Type == 85))
                {
                    w.Signs.Add(sign);
                }
            }


            w.NPCs.Clear();
            OnProgressChanged(null, new ProgressChangedEventArgs(100, "Loading NPC Data..."));
            while (reader.ReadBoolean())
            {
                var npc = new NPC();
                npc.Name       = reader.ReadString();
                npc.Position   = new Vector2(reader.ReadSingle(), reader.ReadSingle());
                npc.IsHomeless = reader.ReadBoolean();
                npc.Home       = new Vector2Int32(reader.ReadInt32(), reader.ReadInt32());
                npc.SpriteId   = 0;
                if (NpcIds.ContainsKey(npc.Name))
                {
                    npc.SpriteId = NpcIds[npc.Name];
                }

                w.NPCs.Add(npc);
            }
            // if (version>=0x1f) read the names of the following npcs:
            // merchant, nurse, arms dealer, dryad, guide, clothier, demolitionist,
            // tinkerer and wizard
            // if (version>=0x23) read the name of the mechanic


            if (version >= 31)
            {
                OnProgressChanged(null, new ProgressChangedEventArgs(100, "Loading NPC Names..."));
                w.CharacterNames.Add(new NpcName(17, reader.ReadString()));
                w.CharacterNames.Add(new NpcName(18, reader.ReadString()));
                w.CharacterNames.Add(new NpcName(19, reader.ReadString()));
                w.CharacterNames.Add(new NpcName(20, reader.ReadString()));
                w.CharacterNames.Add(new NpcName(22, reader.ReadString()));
                w.CharacterNames.Add(new NpcName(54, reader.ReadString()));
                w.CharacterNames.Add(new NpcName(38, reader.ReadString()));
                w.CharacterNames.Add(new NpcName(107, reader.ReadString()));
                w.CharacterNames.Add(new NpcName(108, reader.ReadString()));
                if (version >= 35)
                {
                    w.CharacterNames.Add(new NpcName(124, reader.ReadString()));
                }
                else
                {
                    w.CharacterNames.Add(new NpcName(124, "Nancy"));
                }

                if (version >= 65)
                {
                    w.CharacterNames.Add(new NpcName(160, reader.ReadString()));
                    w.CharacterNames.Add(new NpcName(178, reader.ReadString()));
                    w.CharacterNames.Add(new NpcName(207, reader.ReadString()));
                    w.CharacterNames.Add(new NpcName(208, reader.ReadString()));
                    w.CharacterNames.Add(new NpcName(209, reader.ReadString()));
                    w.CharacterNames.Add(new NpcName(227, reader.ReadString()));
                    w.CharacterNames.Add(new NpcName(228, reader.ReadString()));
                    w.CharacterNames.Add(new NpcName(229, reader.ReadString()));
                }
                else
                {
                    w.CharacterNames.Add(GetNewNpc(160));
                    w.CharacterNames.Add(GetNewNpc(178));
                    w.CharacterNames.Add(GetNewNpc(207));
                    w.CharacterNames.Add(GetNewNpc(208));
                    w.CharacterNames.Add(GetNewNpc(209));
                    w.CharacterNames.Add(GetNewNpc(227));
                    w.CharacterNames.Add(GetNewNpc(228));
                    w.CharacterNames.Add(GetNewNpc(229));
                }
            }
            else
            {
                w.CharacterNames.Add(GetNewNpc(17));
                w.CharacterNames.Add(GetNewNpc(18));
                w.CharacterNames.Add(GetNewNpc(19));
                w.CharacterNames.Add(GetNewNpc(20));
                w.CharacterNames.Add(GetNewNpc(22));
                w.CharacterNames.Add(GetNewNpc(54));
                w.CharacterNames.Add(GetNewNpc(38));
                w.CharacterNames.Add(GetNewNpc(107));
                w.CharacterNames.Add(GetNewNpc(108));
                w.CharacterNames.Add(GetNewNpc(124));
                w.CharacterNames.Add(GetNewNpc(160));
                w.CharacterNames.Add(GetNewNpc(178));
                w.CharacterNames.Add(GetNewNpc(207));
                w.CharacterNames.Add(GetNewNpc(208));
                w.CharacterNames.Add(GetNewNpc(209));
                w.CharacterNames.Add(GetNewNpc(227));
                w.CharacterNames.Add(GetNewNpc(228));
                w.CharacterNames.Add(GetNewNpc(229));
            }
            if (version >= 7)
            {
                OnProgressChanged(null, new ProgressChangedEventArgs(100, "Validating File..."));
                bool   validation   = reader.ReadBoolean();
                string checkTitle   = reader.ReadString();
                int    checkVersion = reader.ReadInt32();
                if (validation && checkTitle == w.Title && checkVersion == w.WorldId)
                {
                    //w.loadSuccess = true;
                }
                else
                {
                    reader.Close();
                    throw new FileLoadException(
                              string.Format("Error reading world file validation parameters! {0}", filename));
                }
            }
            OnProgressChanged(null, new ProgressChangedEventArgs(0, "World Load Complete."));
        }
예제 #5
0
        public static World LoadWorld(string filename)
        {
            var w = new World();
            try
            {
                lock (_fileLock)
                {
                    using (var b = new BinaryReader(File.OpenRead(filename)))
                    {
                        w.Version = b.ReadUInt32(); //now we care about the version
                        w.Title = b.ReadString();
                        w.WorldId = b.ReadInt32();

                        w.Rand = new Random(w.WorldId);

                        w.LeftWorld = (float)b.ReadInt32();
                        w.RightWorld = (float)b.ReadInt32();
                        w.TopWorld = (float)b.ReadInt32();
                        w.BottomWorld = (float)b.ReadInt32();
                        w.TilesHigh = b.ReadInt32();
                        w.TilesWide = b.ReadInt32();

                        //if (w.TilesHigh > 10000 || w.TilesWide > 10000 || w.TilesHigh <= 0 || w.TilesWide <= 0)
                        //    throw new FileLoadException(string.Format("Invalid File: {0}", filename));

                        if (w.Version >= 63)
                            w.MoonType = (int)b.ReadByte();
                        else
                            w.MoonType = w.Rand.Next(MaxMoons);

                        if (w.Version >= 44)
                        {
                            w.TreeX[0] = b.ReadInt32();
                            w.TreeX[1] = b.ReadInt32();
                            w.TreeX[2] = b.ReadInt32();
                            w.TreeStyle[0] = b.ReadInt32();
                            w.TreeStyle[1] = b.ReadInt32();
                            w.TreeStyle[2] = b.ReadInt32();
                            w.TreeStyle[3] = b.ReadInt32();
                        }
                        if (w.Version >= 60)
                        {
                            w.CaveBackX[0] = b.ReadInt32();
                            w.CaveBackX[1] = b.ReadInt32();
                            w.CaveBackX[2] = b.ReadInt32();
                            w.CaveBackStyle[0] = b.ReadInt32();
                            w.CaveBackStyle[1] = b.ReadInt32();
                            w.CaveBackStyle[2] = b.ReadInt32();
                            w.CaveBackStyle[3] = b.ReadInt32();
                            w.IceBackStyle = b.ReadInt32();
                            if (w.Version >= 61)
                            {
                                w.JungleBackStyle = b.ReadInt32();
                                w.HellBackStyle = b.ReadInt32();
                            }
                        }
                        else
                        {
                            w.CaveBackX[0] = w.TilesWide / 2;
                            w.CaveBackX[1] = w.TilesWide;
                            w.CaveBackX[2] = w.TilesWide;
                            w.CaveBackStyle[0] = 0;
                            w.CaveBackStyle[1] = 1;
                            w.CaveBackStyle[2] = 2;
                            w.CaveBackStyle[3] = 3;
                            w.IceBackStyle = 0;
                            w.JungleBackStyle = 0;
                            w.HellBackStyle = 0;
                        }

                        w.SpawnX = b.ReadInt32();
                        w.SpawnY = b.ReadInt32();
                        w.GroundLevel = (int)b.ReadDouble();
                        w.RockLevel = (int)b.ReadDouble();

                        // read world flags
                        w.Time = b.ReadDouble();
                        w.DayTime = b.ReadBoolean();
                        w.MoonPhase = b.ReadInt32();
                        w.BloodMoon = b.ReadBoolean();

                        if (w.Version >= 70)
                        {
                            w.IsEclipse = b.ReadBoolean();
                        }

                        w.DungeonX = b.ReadInt32();
                        w.DungeonY = b.ReadInt32();

                        if (w.Version >= 56)
                        {
                            w.IsCrimson = b.ReadBoolean();
                        }
                        else
                        {
                            w.IsCrimson = false;
                        }

                        w.DownedBoss1 = b.ReadBoolean();
                        w.DownedBoss2 = b.ReadBoolean();
                        w.DownedBoss3 = b.ReadBoolean();

                        if (w.Version >= 66)
                        {
                            w.DownedQueenBee = b.ReadBoolean();
                        }
                        if (w.Version >= 44)
                        {
                            w.DownedMechBoss1 = b.ReadBoolean();
                            w.DownedMechBoss2 = b.ReadBoolean();
                            w.DownedMechBoss3 = b.ReadBoolean();
                            w.DownedMechBossAny = b.ReadBoolean();
                        }
                        if (w.Version >= 64)
                        {
                            w.DownedPlantBoss = b.ReadBoolean();
                            w.DownedGolemBoss = b.ReadBoolean();
                        }
                        if (w.Version >= 29)
                        {
                            w.SavedGoblin = b.ReadBoolean();
                            w.SavedWizard = b.ReadBoolean();
                            if (w.Version >= 34)
                            {
                                w.SavedMech = b.ReadBoolean();
                            }
                            w.DownedGoblins = b.ReadBoolean();
                        }
                        if (w.Version >= 32)
                            w.DownedClown = b.ReadBoolean();
                        if (w.Version >= 37)
                            w.DownedFrost = b.ReadBoolean();
                        if (w.Version >= 56)
                            w.DownedPirates = b.ReadBoolean();

                        w.ShadowOrbSmashed = b.ReadBoolean();
                        w.SpawnMeteor = b.ReadBoolean();
                        w.ShadowOrbCount = (int)b.ReadByte();

                        if (w.Version >= 23)
                        {
                            w.AltarCount = b.ReadInt32();
                            w.HardMode = b.ReadBoolean();
                        }

                        w.InvasionDelay = b.ReadInt32();
                        w.InvasionSize = b.ReadInt32();
                        w.InvasionType = b.ReadInt32();
                        w.InvasionX = b.ReadDouble();

                        if (w.Version >= 53)
                        {
                            w.TempRaining = b.ReadBoolean();
                            w.TempRainTime = b.ReadInt32();
                            w.TempMaxRain = b.ReadSingle();
                        }
                        if (w.Version >= 54)
                        {
                            w.OreTier1 = b.ReadInt32();
                            w.OreTier2 = b.ReadInt32();
                            w.OreTier3 = b.ReadInt32();
                        }
                        else if (w.Version < 23 || w.AltarCount != 0)
                        {
                            w.OreTier1 = 107;
                            w.OreTier2 = 108;
                            w.OreTier3 = 111;
                        }
                        else
                        {
                            w.OreTier1 = -1;
                            w.OreTier2 = -1;
                            w.OreTier3 = -1;
                        }

                        if (w.Version >= 55)
                        {
                            w.BgTree = b.ReadByte();
                            w.BgCorruption = b.ReadByte();
                            w.BgJungle = b.ReadByte();
                        }
                        if (w.Version >= 60)
                        {
                            w.BgSnow = b.ReadByte();
                            w.BgHallow = b.ReadByte();
                            w.BgCorruption = b.ReadByte();
                            w.BgDesert = b.ReadByte();
                            w.BgOcean = b.ReadByte();
                        }

                        if (w.Version >= 60)
                        {
                            w.CloudBgActive = (float)b.ReadInt32();
                        }
                        else
                        {
                            w.CloudBgActive = -w.Rand.Next(8640, 86400);
                        }

                        if (w.Version >= 62)
                        {
                            w.NumClouds = b.ReadInt16();
                            w.WindSpeedSet = b.ReadSingle();
                        }

                        w.Tiles = new Tile[w.TilesWide, w.TilesHigh];
                        for (int i = 0; i < w.TilesWide; i++)
                        {
                            for (int j = 0; j < w.TilesHigh; j++)
                            {
                                w.Tiles[i, j] = new Tile();
                            }
                        }

                        for (int x = 0; x < w.TilesWide; ++x)
                        {
                            OnProgressChanged(null, new ProgressChangedEventArgs(x.ProgressPercentage(w.TilesWide), "Loading Tiles..."));

                            for (int y = 0; y < w.TilesHigh; y++)
                            {
                                var tile = new Tile();

                                tile.IsActive = b.ReadBoolean();

                                if (!tile.IsActive)
                                    DebugLog(string.Format("Reading Empty Tile [{0},{1}]", x, y));

                                TileProperty tileProperty = null;
                                if (tile.IsActive)
                                {
                                    tile.Type = b.ReadByte();
                                    tileProperty = TileProperties[tile.Type];

                                    DebugLog(string.Format("Reading Tile {2} [{0},{1}] {3}", x, y, tile.Type, tileProperty.IsFramed ? "Framed" : ""));

                                    if (tile.Type == 127)
                                        tile.IsActive = false;

                                    if (tileProperty.IsFramed)
                                    {
                                        if (w.Version < 28 && tile.Type == 4)
                                        {
                                            // torches didn't have extra in older versions.
                                            tile.U = 0;
                                            tile.V = 0;
                                        }
                                        else if (w.Version < 40 && tile.Type == 19)
                                        {
                                            tile.U = 0;
                                            tile.V = 0;
                                        }
                                        else
                                        {
                                            tile.U = b.ReadInt16();
                                            tile.V = b.ReadInt16();

                                            if (tile.Type == 144) //timer
                                                tile.V = 0;
                                        }
                                    }
                                    else
                                    {
                                        tile.U = -1;
                                        tile.V = -1;
                                    }

                                    if (w.Version >= 48 && b.ReadBoolean())
                                    {
                                        tile.Color = b.ReadByte();
                                    }
                                }

                                //skip obsolete hasLight
                                if (w.Version <= 25)
                                    b.ReadBoolean();

                                if (b.ReadBoolean())
                                {
                                    tile.Wall = b.ReadByte();
                                    if (w.Version >= 48 && b.ReadBoolean())
                                        tile.WallColor = b.ReadByte();
                                }

                                if (b.ReadBoolean())
                                {
                                    tile.Liquid = b.ReadByte();
                                    tile.IsLava = b.ReadBoolean();
                                    if (w.Version >= 51)
                                    {
                                        tile.IsHoney = b.ReadBoolean();
                                    }
                                }

                                if (w.Version >= 33)
                                {
                                    tile.HasWire = b.ReadBoolean();
                                }
                                if (w.Version >= 43)
                                {
                                    tile.HasWire2 = b.ReadBoolean();
                                    tile.HasWire3 = b.ReadBoolean();
                                }

                                if (w.Version >= 41)
                                {
                                    tile.HalfBrick = b.ReadBoolean();

                                    if (tileProperty == null || !tileProperty.IsSolid)
                                        tile.HalfBrick = false;

                                    if (w.Version >= 49)
                                    {
                                        tile.Slope = b.ReadByte();

                                        if (tileProperty == null || !tileProperty.IsSolid)
                                            tile.Slope = 0;
                                    }
                                }
                                if (w.Version >= 42)
                                {
                                    tile.Actuator = b.ReadBoolean();
                                    tile.InActive = b.ReadBoolean();
                                }

                                // read complete, start compression
                                w.Tiles[x, y] = tile;

                                if (w.Version >= 25)
                                {
                                    int rle = b.ReadInt16();

                                    if (rle < 0)
                                        throw new ApplicationException("Invalid Tile Data!");

                                    DebugLog(string.Format("RLE {0}", rle));
                                    if (rle > 0)
                                    {
                                        for (int k = y + 1; k < y + rle + 1; k++)
                                        {
                                            var tcopy = (Tile)tile.Clone();
                                            w.Tiles[x, k] = tcopy;
                                        }
                                        y = y + rle;
                                    }
                                }
                            }
                        }

                        if (w.Version < 67)
                            w.FixSunflowers();
                        int chestSize = Chest.MaxItems;
                        if (w.Version < 58)
                            chestSize = 20;
                        w.Chests.Clear();
                        OnProgressChanged(null, new ProgressChangedEventArgs(100, "Loading Chests..."));
                        for (int i = 0; i < 1000; i++)
                        {
                            if (b.ReadBoolean())
                            {
                                var chest = new Chest(b.ReadInt32(), b.ReadInt32());
                                for (int slot = 0; slot < Chest.MaxItems; slot++)
                                {
                                    if (slot < chestSize)
                                    {

                                        int stackSize = w.Version < 59 ? b.ReadByte() : (int)b.ReadInt16();
                                        chest.Items[slot].StackSize = stackSize;

                                        if (chest.Items[slot].StackSize > 0)
                                        {
                                            if (w.Version >= 38)
                                                chest.Items[slot].NetId = b.ReadInt32();
                                            else
                                                chest.Items[slot].SetFromName(b.ReadString());

                                            chest.Items[slot].StackSize = stackSize;
                                            // Read prefix
                                            if (w.Version >= 36)
                                                chest.Items[slot].Prefix = b.ReadByte();
                                        }
                                    }
                                }
                                w.Chests.Add(chest);
                            }
                        }
                        w.Signs.Clear();
                        OnProgressChanged(null, new ProgressChangedEventArgs(100, "Loading Signs..."));
                        for (int i = 0; i < 1000; i++)
                        {
                            if (b.ReadBoolean())
                            {
                                Sign sign = new Sign();
                                sign.Text = b.ReadString();
                                sign.X = b.ReadInt32();
                                sign.Y = b.ReadInt32();

                                if (w.Tiles[sign.X, sign.Y].IsActive && (int)w.Tiles[sign.X, sign.Y].Type == 55 && (int)w.Tiles[sign.X, sign.Y].Type == 85)
                                    w.Signs.Add(sign);
                            }
                        }
                        w.NPCs.Clear();
                        OnProgressChanged(null, new ProgressChangedEventArgs(100, "Loading NPC Data..."));
                        while (b.ReadBoolean())
                        {
                            var npc = new NPC();
                            npc.Name = b.ReadString();
                            npc.Position = new Vector2(b.ReadSingle(), b.ReadSingle());
                            npc.IsHomeless = b.ReadBoolean();
                            npc.Home = new Vector2Int32(b.ReadInt32(), b.ReadInt32());
                            npc.SpriteId = 0;
                            if (NpcIds.ContainsKey(npc.Name))
                                npc.SpriteId = NpcIds[npc.Name];

                            w.NPCs.Add(npc);
                        }
                        // if (version>=0x1f) read the names of the following npcs:
                        // merchant, nurse, arms dealer, dryad, guide, clothier, demolitionist,
                        // tinkerer and wizard
                        // if (version>=0x23) read the name of the mechanic

                        if (w.Version >= 31)
                        {
                            OnProgressChanged(null, new ProgressChangedEventArgs(100, "Loading NPC Names..."));
                            w.CharacterNames.Add(new NpcName(17, b.ReadString()));
                            w.CharacterNames.Add(new NpcName(18, b.ReadString()));
                            w.CharacterNames.Add(new NpcName(19, b.ReadString()));
                            w.CharacterNames.Add(new NpcName(20, b.ReadString()));
                            w.CharacterNames.Add(new NpcName(22, b.ReadString()));
                            w.CharacterNames.Add(new NpcName(54, b.ReadString()));
                            w.CharacterNames.Add(new NpcName(38, b.ReadString()));
                            w.CharacterNames.Add(new NpcName(107, b.ReadString()));
                            w.CharacterNames.Add(new NpcName(108, b.ReadString()));
                            if (w.Version >= 35)
                                w.CharacterNames.Add(new NpcName(124, b.ReadString()));
                            else
                                w.CharacterNames.Add(new NpcName(124, "Nancy"));

                            if (w.Version >= 65)
                            {
                                w.CharacterNames.Add(new NpcName(160, b.ReadString()));
                                w.CharacterNames.Add(new NpcName(178, b.ReadString()));
                                w.CharacterNames.Add(new NpcName(207, b.ReadString()));
                                w.CharacterNames.Add(new NpcName(208, b.ReadString()));
                                w.CharacterNames.Add(new NpcName(209, b.ReadString()));
                                w.CharacterNames.Add(new NpcName(227, b.ReadString()));
                                w.CharacterNames.Add(new NpcName(228, b.ReadString()));
                                w.CharacterNames.Add(new NpcName(229, b.ReadString()));
                            }
                            else
                            {
                                w.CharacterNames.Add(new NpcName(160, "Truffle"));
                                w.CharacterNames.Add(new NpcName(178, "Steampunker"));
                                w.CharacterNames.Add(new NpcName(207, "Dye Trader"));
                                w.CharacterNames.Add(new NpcName(208, "Party Girl"));
                                w.CharacterNames.Add(new NpcName(209, "Cyborg"));
                                w.CharacterNames.Add(new NpcName(227, "Painter"));
                                w.CharacterNames.Add(new NpcName(228, "Witch Doctor"));
                                w.CharacterNames.Add(new NpcName(229, "Pirate"));
                            }
                        }
                        else
                        {
                            w.CharacterNames.Add(new NpcName(17, "Harold"));
                            w.CharacterNames.Add(new NpcName(18, "Molly"));
                            w.CharacterNames.Add(new NpcName(19, "Dominique"));
                            w.CharacterNames.Add(new NpcName(20, "Felicitae"));
                            w.CharacterNames.Add(new NpcName(22, "Steve"));
                            w.CharacterNames.Add(new NpcName(54, "Fitz"));
                            w.CharacterNames.Add(new NpcName(38, "Gimut"));
                            w.CharacterNames.Add(new NpcName(107, "Knogs"));
                            w.CharacterNames.Add(new NpcName(108, "Fizban"));
                            w.CharacterNames.Add(new NpcName(124, "Nancy"));
                            w.CharacterNames.Add(new NpcName(160, "Truffle"));
                            w.CharacterNames.Add(new NpcName(178, "Steampunker"));
                            w.CharacterNames.Add(new NpcName(207, "Dye Trader"));
                            w.CharacterNames.Add(new NpcName(208, "Party Girl"));
                            w.CharacterNames.Add(new NpcName(209, "Cyborg"));
                            w.CharacterNames.Add(new NpcName(227, "Painter"));
                            w.CharacterNames.Add(new NpcName(228, "Witch Doctor"));
                            w.CharacterNames.Add(new NpcName(229, "Pirate"));

                        }
                        if (w.Version >= 7)
                        {
                            OnProgressChanged(null, new ProgressChangedEventArgs(100, "Validating File..."));
                            bool validation = b.ReadBoolean();
                            string checkTitle = b.ReadString();
                            int checkVersion = b.ReadInt32();
                            if (validation && checkTitle == w.Title && checkVersion == w.WorldId)
                            {
                                //w.loadSuccess = true;
                            }
                            else
                            {
                                b.Close();
                                throw new FileLoadException(string.Format("Error reading world file validation parameters! {0}", filename));
                            }
                        }
                        OnProgressChanged(null, new ProgressChangedEventArgs(0, "World Load Complete."));

                    }
                    w.LastSave = File.GetLastWriteTimeUtc(filename);
                }
            }
            catch (Exception err)
            {
                string msg = "There was an error reading the world file, do you wish to force it to load anyway?\r\n\r\n" +
                             "WARNING: This may have unexpected results including corrupt world files and program crashes.\r\n\r\n" +
                             "The error is :\r\n";
                if (MessageBox.Show(msg + err, "World File Error", MessageBoxButton.YesNo, MessageBoxImage.Error) != MessageBoxResult.Yes)
                    return null;
            }
            return w;
        }