UltimateZoneBuilder/Source/Core/SRB2/SOCLevelHeader.cs

93 lines
2.1 KiB
C#

using CodeImp.DoomBuilder.Config;
using CodeImp.DoomBuilder.Data;
using CodeImp.DoomBuilder.GZBuilder.Data;
using CodeImp.DoomBuilder.Types;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
namespace CodeImp.DoomBuilder.ZDoom
{
public sealed class SOCLevelHeader
{
#region ================== Variables
private MapInfo mapinfo;
#endregion
#region ================== Properties
public MapInfo MapInfo { get { return mapinfo; } }
#endregion
#region ================== SOC level header parsing
internal SOCLevelHeader(ZDTextParser zdparser)
{
mapinfo = new MapInfo();
string levelname = "Unnamed map";
int actnum = 0;
bool nozone = false;
SOCParser parser = (SOCParser)zdparser;
// Parse contents of level header
string line = parser.ReadLine();
while (line != null)
{
line = parser.ReadLine();
if (string.IsNullOrEmpty(line) || line.StartsWith("\n")) break;
if (line.StartsWith("#")) continue;
line = line.Split(new char[] { '#' })[0];
string[] tokens = line.Split(new char[] { '=' });
if (tokens.Length != 2)
{
parser.ReportError("Invalid line");
return;
}
tokens[0] = tokens[0].Trim().ToLowerInvariant();
tokens[1] = tokens[1].Trim();
switch (tokens[0])
{
case "levelname":
levelname = tokens[1];
break;
case "act":
if (!int.TryParse(tokens[1], out actnum) || actnum > 99)
{
parser.LogWarning("Invalid act number (" + tokens[1] + ") found; must be a number ranging from 0 to 99");
actnum = 0;
}
break;
case "nozone":
string value = tokens[1].ToLowerInvariant();
nozone = (value.StartsWith("t") || value.StartsWith("y"));
break;
case "skynum":
mapinfo.Sky1 = "SKY" + tokens[1];
break;
case "objectscale":
mapinfo.ObjectScale = 1.0f; // SRB2 todo: add proper conversion from FRACUNIT-based values to float
break;
default:
break;
}
}
mapinfo.Title = levelname + (nozone ? "" : " Zone") + (actnum > 0 ? ", Act " + actnum : "");
}
#endregion
}
}