Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }