public static World Load(string name) { if (!Directory.Exists("worlds")) { Directory.CreateDirectory("worlds"); } World world; if (!File.Exists("worlds/" + name.ToLower() + ".world")) { world = Generate(name); world.Save(); return(world); } using var fs = File.OpenRead("worlds/" + name.ToLower() + ".world"); using var br = new BinaryReader(fs); var worldVersion = br.ReadUInt64(); if (br.ReadUInt64() != 0x444C524F57) { Console.WriteLine($"World {name} is corrupted! create new empty world"); return(Generate(name)); } world = new World(string.Empty, 0, 0) { Name = br.ReadString(), Width = br.ReadInt32(), Height = br.ReadInt32(), Spawn = new Vector2(br.ReadSingle(), br.ReadSingle()), Status = (WorldStatus)br.ReadInt32() }; var blockCount = br.ReadInt32(); for (var i = 0; i < blockCount; i++) { var wb = new WorldBlock { Foreground = ItemDatabase.Instance.Find(br.ReadInt32()), Background = ItemDatabase.Instance.Find(br.ReadInt32()), Status = (WorldBlockStatus)br.ReadInt32() }; world.Blocks.Add(wb); } return(world); }
public static World Generate(string name, int width = 100, int height = 60, WorldType worldType = WorldType.Normal) { var world = new World(name, width, height); var random = new Random(); var bedrockStart = height < 7 ? 1 : height - 6; var floorStart = bedrockStart - height / 2 < 1 ? 1 : bedrockStart - height / 2; var doorX = random.Next(width); var doorY = floorStart - 1; for (var y = 0; y < height; y++) { for (var x = 0; x < width; x++) { var worldBlock = new WorldBlock { Status = 0 }; switch (worldType) { case WorldType.Normal: if (y >= bedrockStart) { worldBlock.Foreground = ItemDatabase.Instance.Find(ItemId.i8_Bedrock); worldBlock.Background = ItemDatabase.Instance.Find(ItemId.i14_CaveBackground); } else if (y >= floorStart + 1 && y >= bedrockStart - 4 && random.Next(3) == 0) { worldBlock.Foreground = ItemDatabase.Instance.Find(ItemId.i4_Lava); worldBlock.Background = ItemDatabase.Instance.Find(ItemId.i14_CaveBackground); } else if (y >= floorStart + 1 && random.Next(30) == 0) { worldBlock.Foreground = ItemDatabase.Instance.Find(ItemId.i10_Rock); worldBlock.Background = ItemDatabase.Instance.Find(ItemId.i14_CaveBackground); } else if (y >= floorStart) { worldBlock.Foreground = ItemDatabase.Instance.Find(ItemId.i2_Dirt); worldBlock.Background = ItemDatabase.Instance.Find(ItemId.i14_CaveBackground); } else { worldBlock.Foreground = ItemDatabase.Instance.Find(ItemId.i0_Blank); worldBlock.Background = ItemDatabase.Instance.Find(ItemId.i0_Blank); } break; case WorldType.Empty: if (y >= bedrockStart) { worldBlock.Foreground = ItemDatabase.Instance.Find(ItemId.i8_Bedrock); worldBlock.Background = ItemDatabase.Instance.Find(ItemId.i14_CaveBackground); } else { worldBlock.Foreground = ItemDatabase.Instance.Find(ItemId.i0_Blank); worldBlock.Background = ItemDatabase.Instance.Find(ItemId.i0_Blank); } break; default: throw new ArgumentOutOfRangeException(nameof(worldType), worldType, null); } world.Blocks.Add(worldBlock); } } world.Spawn = new Vector2(doorX, doorY); //world.Blocks[doorX + doorY * width].Foreground = ItemDatabase.Instance.Find(ItemId.i6_MainDoor); //world.Blocks[doorX + (doorY + 1) * width].Foreground = ItemDatabase.Instance.Find(ItemId.i8_Bedrock); return(world); }