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.SavedOreTiersCobalt = reader.ReadInt32(); w.SavedOreTiersMythril = reader.ReadInt32(); w.SavedOreTiersAdamantite = reader.ReadInt32(); } else if (version < 23 || w.AltarCount != 0) { w.SavedOreTiersCobalt = 107; w.SavedOreTiersMythril = 108; w.SavedOreTiersAdamantite = 111; } else { w.SavedOreTiersCobalt = -1; w.SavedOreTiersMythril = -1; w.SavedOreTiersAdamantite = -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( $"Error reading world file validation parameters! {filename}"); } } OnProgressChanged(null, new ProgressChangedEventArgs(0, "World Load Complete.")); }
public void Validate() { var t = TaskFactoryHelper.UiTaskFactory.StartNew(() => { for (int x = 0; x < TilesWide; x++) { OnProgressChanged(this, new ProgressChangedEventArgs((int)(x / (float)TilesWide * 100.0), "Validating World...")); for (int y = 0; y < TilesHigh; y++) { Tile curTile = Tiles[x, y]; if (curTile.Type == (int)TileType.IceByRod) { curTile.IsActive = false; } ValSpecial(x, y); } } }); foreach (Chest chest in Chests.ToArray()) { bool removed = false; for (int x = chest.X; x < chest.X + 1; x++) { for (int y = chest.Y; y < chest.Y + 1; y++) { if (!Tiles[x, y].IsActive || !Tile.IsChest(Tiles[x, y].Type)) { Chests.Remove(chest); removed = true; break; } } if (removed) { break; } } } foreach (Sign sign in Signs.ToArray()) { if (sign.Text == null) { Signs.Remove(sign); continue; } bool removed = false; for (int x = sign.X; x < sign.X + 1; x++) { for (int y = sign.Y; y < sign.Y + 1; y++) { if (!Tiles[x, y].IsActive || !Tile.IsSign(Tiles[x, y].Type)) { Signs.Remove(sign); removed = true; break; } } if (removed) { break; } } } foreach (TileEntity tileEntity in TileEntities.ToArray()) { int x = tileEntity.PosX; int y = tileEntity.PosY; var anchor = GetAnchor(x, y); if (!Tiles[anchor.X, anchor.Y].IsActive || !Tile.IsTileEntity(Tiles[anchor.X, anchor.Y].Type)) { TaskFactoryHelper.ExecuteUiTask(() => TileEntities.Remove(tileEntity)); } } OnProgressChanged(this, new ProgressChangedEventArgs(0, "Validating Complete...")); if (Chests.Count > World.MaxChests) { throw new ArgumentOutOfRangeException($"Chest Count is {Chests.Count} which is greater than 1000"); } if (Signs.Count > World.MaxSigns) { throw new ArgumentOutOfRangeException($"Sign Count is {Signs.Count} which is greater than 1000"); } }
private static void LoadObjectDbXml(string file) { var xmlSettings = XElement.Load(file); // Load Colors foreach (var xElement in xmlSettings.Elements("GlobalColors").Elements("GlobalColor")) { string name = (string)xElement.Attribute("Name"); XNA.Color color = XnaColorFromString((string)xElement.Attribute("Color")); GlobalColors.Add(name, color); } foreach (var xElement in xmlSettings.Elements("Tiles").Elements("Tile")) { var curTile = new TileProperty(); // Read XML attributes curTile.Color = ColorFromString((string)xElement.Attribute("Color")); curTile.Name = (string)xElement.Attribute("Name"); curTile.Id = (int?)xElement.Attribute("Id") ?? 0; curTile.IsFramed = (bool?)xElement.Attribute("Framed") ?? false; curTile.IsSolid = (bool?)xElement.Attribute("Solid") ?? false; curTile.IsSolidTop = (bool?)xElement.Attribute("SolidTop") ?? false; curTile.IsLight = (bool?)xElement.Attribute("Light") ?? false; curTile.IsAnimated = (bool?)xElement.Attribute("IsAnimated") ?? false; curTile.FrameSize = StringToVector2ShortArray((string)xElement.Attribute("Size"), 1, 1); // curTile.FrameSize = StringToVector2Short((string)xElement.Attribute("Size"), 1, 1); curTile.Placement = InLineEnumTryParse <FramePlacement>((string)xElement.Attribute("Placement")); curTile.TextureGrid = StringToVector2Short((string)xElement.Attribute("TextureGrid"), 16, 16); curTile.FrameGap = StringToVector2Short((string)xElement.Attribute("FrameGap"), 0, 0); curTile.IsGrass = "Grass".Equals((string)xElement.Attribute("Special")); /* Heathtech */ curTile.IsPlatform = "Platform".Equals((string)xElement.Attribute("Special")); /* Heathtech */ curTile.IsCactus = "Cactus".Equals((string)xElement.Attribute("Special")); /* Heathtech */ curTile.IsStone = (bool?)xElement.Attribute("Stone") ?? false; /* Heathtech */ curTile.CanBlend = (bool?)xElement.Attribute("Blends") ?? false; /* Heathtech */ curTile.MergeWith = (int?)xElement.Attribute("MergeWith") ?? null; /* Heathtech */ string frameNamePostfix = (string)xElement.Attribute("FrameNamePostfix") ?? null; foreach (var elementFrame in xElement.Elements("Frames").Elements("Frame")) { var curFrame = new FrameProperty(); // Read XML attributes curFrame.Name = (string)elementFrame.Attribute("Name"); curFrame.Variety = (string)elementFrame.Attribute("Variety"); curFrame.UV = StringToVector2Short((string)elementFrame.Attribute("UV"), 0, 0); curFrame.Anchor = InLineEnumTryParse <FrameAnchor>((string)elementFrame.Attribute("Anchor")); var frameSize = StringToVector2Short((string)elementFrame.Attribute("FrameSize"), curTile.FrameSize[0].X, curTile.FrameSize[0].Y); // Assign a default name if none existed if (string.IsNullOrWhiteSpace(curFrame.Name)) { curFrame.Name = curTile.Name; } curTile.Frames.Add(curFrame); string spriteName = null; if (curFrame.Name == curTile.Name) { if (!string.IsNullOrWhiteSpace(curFrame.Variety)) { spriteName += curFrame.Variety; } } else { spriteName += curFrame.Name; if (!string.IsNullOrWhiteSpace(curFrame.Variety)) { spriteName += " - " + curFrame.Variety; } } Sprites.Add(new Sprite { Anchor = curFrame.Anchor, IsPreviewTexture = false, Name = spriteName, Origin = curFrame.UV, Size = frameSize, Tile = (ushort)curTile.Id, /* SBlogic */ TileName = curTile.Name }); } if (curTile.Frames.Count == 0 && curTile.IsFramed) { var curFrame = new FrameProperty(); // Read XML attributes curFrame.Name = curTile.Name; curFrame.Variety = string.Empty; curFrame.UV = new Vector2Short(0, 0); //curFrame.Anchor = InLineEnumTryParse<FrameAnchor>((string)xElement.Attribute("Anchor")); curTile.Frames.Add(curFrame); Sprites.Add(new Sprite { Anchor = curFrame.Anchor, IsPreviewTexture = false, Name = null, Origin = curFrame.UV, Size = curTile.FrameSize[0], Tile = (ushort)curTile.Id, TileName = curTile.Name }); } TileProperties.Add(curTile); if (!curTile.IsFramed) { TileBricks.Add(curTile); } } for (int i = TileProperties.Count; i < 255; i++) { TileProperties.Add(new TileProperty(i, "UNKNOWN", Color.FromArgb(255, 255, 0, 255), true)); } foreach (var xElement in xmlSettings.Elements("Walls").Elements("Wall")) { var curWall = new WallProperty(); curWall.Color = ColorFromString((string)xElement.Attribute("Color")); curWall.Name = (string)xElement.Attribute("Name"); curWall.Id = (int?)xElement.Attribute("Id") ?? -1; WallProperties.Add(curWall); } foreach (var xElement in xmlSettings.Elements("Items").Elements("Item")) { var curItem = new ItemProperty(); curItem.Id = (int?)xElement.Attribute("Id") ?? -1; curItem.Name = (string)xElement.Attribute("Name"); curItem.Scale = (float?)xElement.Attribute("Scale") ?? 1f; ItemProperties.Add(curItem); _itemLookup.Add(curItem.Id, curItem); int tally = (int?)xElement.Attribute("Tally") ?? 0; if (tally > 0) { _tallynames.Add(tally, curItem.Name); } int head = (int?)xElement.Attribute("Head") ?? -1; if (head >= 0) { _armorHeadNames.Add(head, curItem.Name); } int body = (int?)xElement.Attribute("Body") ?? -1; if (body >= 0) { _armorBodyNames.Add(body, curItem.Name); } int legs = (int?)xElement.Attribute("Legs") ?? -1; if (legs >= 0) { _armorLegsNames.Add(legs, curItem.Name); } bool rack = (bool?)xElement.Attribute("Rack") ?? false; if (rack) { _rackable.Add(curItem.Id, curItem.Name); } bool food = (bool?)xElement.Attribute("IsFood") ?? false; if (food) { _foodNames.Add(curItem.Id, curItem.Name); curItem.IsFood = true; } bool acc = (bool?)xElement.Attribute("Accessory") ?? false; if (acc) { _accessoryNames.Add(curItem.Id, curItem.Name); } if (curItem.Name.Contains("Dye")) { _dyeNames.Add(curItem.Id, curItem.Name); } } foreach (var xElement in xmlSettings.Elements("Paints").Elements("Paint")) { var curPaint = new PaintProperty(); curPaint.Id = (int?)xElement.Attribute("Id") ?? -1; curPaint.Name = (string)xElement.Attribute("Name"); curPaint.Color = ColorFromString((string)xElement.Attribute("Color")); PaintProperties.Add(curPaint); } int chestId = 0; foreach (var tileElement in xmlSettings.Elements("Tiles").Elements("Tile")) { string tileName = (string)tileElement.Attribute("Name"); int type = (int)tileElement.Attribute("Id"); if (Tile.IsChest(type)) { foreach (var xElement in tileElement.Elements("Frames").Elements("Frame")) { var curItem = new ChestProperty(); curItem.Name = (string)xElement.Attribute("Name"); string variety = (string)xElement.Attribute("Variety"); if (variety != null) { if (tileName == "Dresser") { curItem.Name = variety + " " + "Dresser"; } else { curItem.Name = curItem.Name + " " + variety; } } curItem.ChestId = chestId++; curItem.UV = StringToVector2Short((string)xElement.Attribute("UV"), 0, 0); curItem.TileType = (ushort)type; ChestProperties.Add(curItem); } } } int signId = 0; foreach (var tileElement in xmlSettings.Elements("Tiles").Elements("Tile")) { var tileId = (int?)tileElement.Attribute("Id") ?? 0; string tileName = (string)tileElement.Attribute("Name"); if (Tile.IsSign(tileId)) { ushort type = (ushort)((int?)tileElement.Attribute("Id") ?? 55); foreach (var xElement in tileElement.Elements("Frames").Elements("Frame")) { var curItem = new SignProperty(); string variety = (string)xElement.Attribute("Variety"); string anchor = (string)xElement.Attribute("Anchor"); curItem.Name = $"{tileName} {variety} {anchor}"; curItem.SignId = signId++; curItem.UV = StringToVector2Short((string)xElement.Attribute("UV"), 0, 0); curItem.TileType = type; SignProperties.Add(curItem); } } } foreach (var xElement in xmlSettings.Elements("Npcs").Elements("Npc")) { int id = (int?)xElement.Attribute("Id") ?? -1; string name = (string)xElement.Attribute("Name"); NpcIds[name] = id; NpcNames[id] = name; var frames = StringToVector2Short((string)xElement.Attribute("Size"), 16, 40); NpcFrames[id] = frames; } foreach (var xElement in xmlSettings.Elements("ItemPrefix").Elements("Prefix")) { int id = (int?)xElement.Attribute("Id") ?? -1; string name = (string)xElement.Attribute("Name"); ItemPrefix.Add((byte)id, name); } foreach (var xElement in xmlSettings.Elements("ShortCutKeys").Elements("Shortcut")) { var key = InLineEnumTryParse <Key>((string)xElement.Attribute("Key")); var modifier = InLineEnumTryParse <ModifierKeys>((string)xElement.Attribute("Modifier")); var tool = (string)xElement.Attribute("Action"); ShortcutKeys.Add(tool, key, modifier); } XElement appSettings = xmlSettings.Element("App"); int appWidth = (int?)appSettings.Attribute("Width") ?? 800; int appHeight = (int?)appSettings.Attribute("Height") ?? 600; int clipboardSize = (int)XNA.MathHelper.Clamp((int?)appSettings.Attribute("ClipboardRenderSize") ?? 512, 64, 4096); _appSize = new Vector2(appWidth, appHeight); ClipboardBuffer.ClipboardRenderSize = clipboardSize; ToolDefaultData.LoadSettings(xmlSettings.Elements("Tools")); AltC = (string)xmlSettings.Element("AltC"); SteamUserId = (int?)xmlSettings.Element("SteamUserId") ?? null; }