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); }
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.")); }
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.")); }
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; }