mirror of
https://git.do.srb2.org/STJr/UltimateZoneBuilder.git
synced 2024-11-26 13:51:40 +00:00
123 lines
2.9 KiB
C#
123 lines
2.9 KiB
C#
using CodeImp.DoomBuilder.Config;
|
|
using CodeImp.DoomBuilder.Data;
|
|
using CodeImp.DoomBuilder.Types;
|
|
using ScintillaNET;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Globalization;
|
|
using System.Linq;
|
|
using System.Text;
|
|
|
|
namespace CodeImp.DoomBuilder.ZDoom
|
|
{
|
|
|
|
public sealed class SOCMobjStructure : ActorStructure
|
|
{
|
|
#region ================== SOC Mobj Structure parsing
|
|
|
|
internal SOCMobjStructure(ZDTextParser zdparser, string objname)
|
|
{
|
|
classname = string.Empty;
|
|
|
|
SOCParser parser = (SOCParser)zdparser;
|
|
//General.WriteLogLine(objname);
|
|
|
|
if (string.IsNullOrEmpty(objname))
|
|
{
|
|
parser.ReportError("SOC object structure has no object name or map thing number");
|
|
return;
|
|
}
|
|
else
|
|
props["$title"] = new List<string> { objname };
|
|
|
|
// Skip initial newline & comments
|
|
parser.ReadLine();
|
|
|
|
// Now parse the contents of actor structure
|
|
while (parser.SkipWhitespace(false, true))
|
|
{
|
|
string token = parser.ReadToken();
|
|
token = token.ToLowerInvariant();
|
|
|
|
// SOC definitions are terminated by an empty line. Blegh.
|
|
if (token == "\n")
|
|
{
|
|
//General.WriteLogLine("object definition done");
|
|
break;
|
|
}
|
|
|
|
// Property begins with $? Then the whole line is a single value
|
|
if (token.Contains("$"))
|
|
{
|
|
token = token.ToLowerInvariant().Trim(new char[] { '#' });
|
|
|
|
switch (token)
|
|
{
|
|
case "$wallsprite":
|
|
case "$flatsprite":
|
|
case "$spawnceiling":
|
|
flags[token.Substring(1)] = true;
|
|
parser.ReadLine();
|
|
break;
|
|
case "$name":
|
|
token = "$title";
|
|
goto default;
|
|
default:
|
|
props[token] = new List<string> { parser.SkipWhitespace(false, true) ? parser.ReadLine() : "" };
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
string tokenname = token;
|
|
parser.SkipWhitespace(false, true);
|
|
token = parser.ReadToken();
|
|
|
|
if (token != "=")
|
|
{
|
|
parser.ReportError("Invalid SOC object parameter definition, missing =");
|
|
return;
|
|
}
|
|
|
|
parser.SkipWhitespace(true, true);
|
|
token = parser.ReadLine();
|
|
|
|
// Strip comments
|
|
int comment = token.IndexOf('#');
|
|
if (comment >= 0)
|
|
token = token.Substring(0, comment);
|
|
|
|
tokenname = tokenname.ToLowerInvariant();
|
|
|
|
List<string> values = new List<string>() { token.TrimEnd(new char[] { ',' }) };
|
|
|
|
//mxd. Translate scale to xscale and yscale
|
|
switch (tokenname)
|
|
{
|
|
case "scale":
|
|
props["xscale"] = values;
|
|
props["yscale"] = values;
|
|
break;
|
|
case "doomednum":
|
|
case "mapthingnum":
|
|
if (!int.TryParse(values[0], out doomednum))
|
|
doomednum = 0;
|
|
goto default;
|
|
case "height":
|
|
case "radius":
|
|
props[tokenname] = new List<string>() { ReadFracunit(values[0], parser) };
|
|
break;
|
|
default:
|
|
props[tokenname] = values;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
// parsing done, process thing arguments
|
|
ParseCustomArguments();
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
}
|