static IEnumerable <ILump> CreateWadContents( IEnumerable <Func <TextureQueue, MapData> > mapCreators) { var textureQueue = new TextureQueue(); var maps = mapCreators.Select(creator => creator(textureQueue)).ToList(); var textureLumps = new List <ILump>(); if (textureQueue.RenderQueue.Any()) { textureLumps.Add(new Marker("P_START")); textureLumps.AddRange(textureQueue.RenderQueue.Select(r => DataLump.ReadFromStream(r.Item2.Name, r.Item1.RenderTo))); textureLumps.Add(new Marker("P_END")); } var lumps = new List <ILump> { DataLump.ReadFromStream("TEXTURES", stream => TexturesWriter.Write(textureQueue.Definitions, stream)), }; lumps.AddRangeAndContinue(textureLumps) .AddRangeAndContinue(maps.SelectMany((map, index) => new ILump[] { new Marker($"MAP{index + 1:00}"), new UwmfLump("TEXTMAP", map), new Marker("ENDMAP") })); return(lumps); }
private static string GetText(CompositeTexture compositeTexture) { using var ms = new MemoryStream(); using (var writer = new StreamWriter(ms, Encoding.ASCII, leaveOpen: true)) { TexturesWriter.Write(compositeTexture, writer); } ms.Position = 0; using var reader = new StreamReader(ms); return(reader.ReadToEnd()); }
public void CaveMap() { var textureQueue = new TextureQueue(); textureQueue.Add( new CompositeTexture("CRSFA0", Width: 35, Height: 37, Namespace: TextureNamespace.Sprite, XScale: 2, YScale: 2, Offset: new TextureOffset(17, 32), Patches: ImmutableArray.Create(new Patch("CRYSTAL", 0, 0))), new CompositeTexture("CRSCA0", Width: 35, Height: 37, Namespace: TextureNamespace.Sprite, XScale: 2, YScale: 2, Offset: new TextureOffset(17, 133), Patches: ImmutableArray.Create(new Patch("CRYSTAL", 0, 0, FlipY: true)))); var map = WolfCaveMapGenerator.Create(seed: 13, texturePrefix: "TILE", textureQueue: textureQueue); Load(new List <ILump> { new Marker("P_START") } .AddRangeAndContinue( Enumerable.Range(0, 16) .Select(i => new DataLump( $"TILE{i:d2}", (byte[])(Resource.ResourceManager.GetObject($"tile{i:00}", CultureInfo.InvariantCulture) ?? throw new ArgumentException("Somehow the name was wrong"))))) .AddRangeAndContinue(textureQueue.RenderQueue.Select(r => DataLump.ReadFromStream(r.Item2.Name, r.Item1.RenderTo))) .AddRangeAndContinue(new ILump[] { new Marker("P_END"), new Marker("S_START"), new DataLump("CRYSTAL", Resource.crystal), new Marker("S_END"), DataLump.ReadFromStream("TEXTURES", stream => TexturesWriter.Write(textureQueue.Definitions, stream)), new DataLump("DECORATE", @"actor CeilingCrystal { states { Spawn: CRSC A -1 stop } } actor FloorCrystal { states { Spawn: CRSF A -1 stop } }"), new Marker("MAP01"), new UwmfLump("TEXTMAP", map), new Marker("ENDMAP") })); }