Small refactor of dialogue parser.
This commit is contained in:
parent
b349911345
commit
529fa48243
2 changed files with 28 additions and 30 deletions
|
|
@ -12,26 +12,18 @@ Class SWWMDialogues abstract
|
|||
}
|
||||
// load the lump for parsing
|
||||
Array<String> lines;
|
||||
Array<int> lnums;
|
||||
int cur = -1;
|
||||
for ( int lmp = Wads.FindLumpFullName("swwmdialogue",0,true); lmp != -1; lmp = Wads.FindLumpFullName("swwmdialogue",lmp+1,true) )
|
||||
{
|
||||
String dat = Wads.ReadLump(lmp);
|
||||
dat.Replace("\r",""); // just in case
|
||||
lines.Clear();
|
||||
dat.Split(lines,"\n",0);
|
||||
lnums.Clear();
|
||||
// for the error output
|
||||
for ( int i=0; i<lines.Size(); i++ ) lnums.Push(i+1);
|
||||
// strip comments and trim whitespace
|
||||
for ( int i=0; i<lines.Size(); i++ )
|
||||
{
|
||||
if ( lines[i].Left(1) == "#" )
|
||||
{
|
||||
lines.Delete(i);
|
||||
lnums.Delete(i);
|
||||
i--;
|
||||
continue;
|
||||
}
|
||||
int cmm = lines[i].IndexOf("#");
|
||||
if ( cmm != -1 ) lines[i].Truncate(cmm);
|
||||
lines[i].StripLeftRight();
|
||||
}
|
||||
cur = -1;
|
||||
|
|
@ -60,11 +52,17 @@ Class SWWMDialogues abstract
|
|||
SWWMDirectMessage msg, lastmsg;
|
||||
while ( cur < lines.Size() )
|
||||
{
|
||||
// skip empty lines
|
||||
if ( lines[cur] == "" )
|
||||
{
|
||||
cur++;
|
||||
continue;
|
||||
}
|
||||
// dialogue ends here
|
||||
if ( lines[cur].Left(6) == "ENDDLG" )
|
||||
{
|
||||
if ( inseq ) ThrowAbortException("dialogue '%s', line %d, premature end of sequence.",dlg,lnums[cur]);
|
||||
if ( !gotseq ) ThrowAbortException("dialogue '%s', line %d, dialogue is empty.",dlg,lnums[cur]);
|
||||
if ( inseq ) ThrowAbortException("dialogue '%s', line %d, premature end of sequence.",dlg,cur+1);
|
||||
if ( !gotseq ) ThrowAbortException("dialogue '%s', line %d, dialogue is empty.",dlg,cur+1);
|
||||
return;
|
||||
}
|
||||
if ( inseq )
|
||||
|
|
@ -73,9 +71,9 @@ Class SWWMDialogues abstract
|
|||
if ( lines[cur].Left(6) == "ENDSEQ" )
|
||||
{
|
||||
// put out the sequence
|
||||
if ( sname == "" ) ThrowAbortException("dialogue '%s', line %d, sequence has no name.",dlg,lnums[cur]);
|
||||
if ( sname == "" ) ThrowAbortException("dialogue '%s', line %d, sequence has no name.",dlg,cur+1);
|
||||
msg.seqname = sname;
|
||||
if ( scnt <= 0 ) ThrowAbortException("dialogue '%s', line %d, sequence has invalid count.",dlg,lnums[cur]);
|
||||
if ( scnt <= 0 ) ThrowAbortException("dialogue '%s', line %d, sequence has invalid count.",dlg,cur+1);
|
||||
msg.seqcnt = scnt;
|
||||
if ( sdelay > 0 ) msg.delay = sdelay;
|
||||
if ( sstartdelay > 0 ) msg.startdelay = sstartdelay;
|
||||
|
|
@ -91,7 +89,7 @@ Class SWWMDialogues abstract
|
|||
else
|
||||
{
|
||||
// additional message? append to last
|
||||
if ( !lastmsg ) ThrowAbortException("dialogue '%s', line %d, lastmsg is null, this should not happen.",dlg,lnums[cur]);
|
||||
if ( !lastmsg ) ThrowAbortException("dialogue '%s', line %d, lastmsg is null, this should not happen.",dlg,cur+1);
|
||||
lastmsg.nextmsg = msg;
|
||||
lastmsg.nextdirect = !sindirect;
|
||||
}
|
||||
|
|
@ -100,50 +98,50 @@ Class SWWMDialogues abstract
|
|||
}
|
||||
else if ( lines[cur].Left(5) == "NAME " )
|
||||
{
|
||||
if ( sname != "" ) ThrowAbortException("dialogue '%s', line %d, duplicate 'NAME' parameter.",dlg,lnums[cur]);
|
||||
if ( sname != "" ) ThrowAbortException("dialogue '%s', line %d, duplicate 'NAME' parameter.",dlg,cur+1);
|
||||
sname = lines[cur].Mid(5);
|
||||
}
|
||||
else if ( lines[cur].Left(4) == "CNT " )
|
||||
{
|
||||
if ( scnt > 0 ) ThrowAbortException("dialogue '%s', line %d, duplicate 'CNT' parameter.",dlg,lnums[cur]);
|
||||
if ( scnt > 0 ) ThrowAbortException("dialogue '%s', line %d, duplicate 'CNT' parameter.",dlg,cur+1);
|
||||
scnt = lines[cur].Mid(4).ToInt();
|
||||
}
|
||||
else if ( lines[cur].Left(6) == "DELAY " )
|
||||
{
|
||||
if ( sdelay > 0 ) ThrowAbortException("dialogue '%s', line %d, duplicate 'DELAY' parameter.",dlg,lnums[cur]);
|
||||
if ( sdelay > 0 ) ThrowAbortException("dialogue '%s', line %d, duplicate 'DELAY' parameter.",dlg,cur+1);
|
||||
sdelay = lines[cur].Mid(6).ToInt();
|
||||
}
|
||||
else if ( lines[cur].Left(11) == "STARTDELAY " )
|
||||
{
|
||||
if ( sstartdelay > 0 ) ThrowAbortException("dialogue '%s', line %d, duplicate 'STARTDELAY' parameter.",dlg,lnums[cur]);
|
||||
if ( sstartdelay > 0 ) ThrowAbortException("dialogue '%s', line %d, duplicate 'STARTDELAY' parameter.",dlg,cur+1);
|
||||
sstartdelay = lines[cur].Mid(11).ToInt();
|
||||
}
|
||||
else if ( lines[cur].Left(9) == "ENDDELAY " )
|
||||
{
|
||||
if ( senddelay > 0 ) ThrowAbortException("dialogue '%s', line %d, duplicate 'ENDDELAY' parameter.",dlg,lnums[cur]);
|
||||
if ( senddelay > 0 ) ThrowAbortException("dialogue '%s', line %d, duplicate 'ENDDELAY' parameter.",dlg,cur+1);
|
||||
senddelay = lines[cur].Mid(9).ToInt();
|
||||
}
|
||||
else if ( lines[cur].Left(10) == "CHARDELAY " )
|
||||
{
|
||||
if ( schardelay > 0 ) ThrowAbortException("dialogue '%s', line %d, duplicate 'CHARDELAY' parameter.",dlg,lnums[cur]);
|
||||
if ( schardelay > 0 ) ThrowAbortException("dialogue '%s', line %d, duplicate 'CHARDELAY' parameter.",dlg,cur+1);
|
||||
schardelay = lines[cur].Mid(10).ToInt();
|
||||
}
|
||||
else if ( lines[cur].Left(11) == "PAUSEDELAY " )
|
||||
{
|
||||
if ( spausedelay > 0 ) ThrowAbortException("dialogue '%s', line %d, duplicate 'PAUSEDELAY' parameter.",dlg,lnums[cur]);
|
||||
if ( spausedelay > 0 ) ThrowAbortException("dialogue '%s', line %d, duplicate 'PAUSEDELAY' parameter.",dlg,cur+1);
|
||||
spausedelay = lines[cur].Mid(11).ToInt();
|
||||
}
|
||||
else if ( lines[cur].Left(8) == "INDIRECT" )
|
||||
{
|
||||
if ( sindirect ) ThrowAbortException("dialogue '%s', line %d, duplicate 'INDIRECT' parameter.",dlg,lnums[cur]);
|
||||
if ( sindirect ) ThrowAbortException("dialogue '%s', line %d, duplicate 'INDIRECT' parameter.",dlg,cur+1);
|
||||
sindirect = true;
|
||||
}
|
||||
else if ( lines[cur].Left(10) == "ZNVSPECIAL" )
|
||||
{
|
||||
if ( sznvspecial ) ThrowAbortException("dialogue '%s', line %d, duplicate 'ZNVSPECIAL' parameter.",dlg,lnums[cur]);
|
||||
if ( sznvspecial ) ThrowAbortException("dialogue '%s', line %d, duplicate 'ZNVSPECIAL' parameter.",dlg,cur+1);
|
||||
sznvspecial = true;
|
||||
}
|
||||
else ThrowAbortException("dialogue '%s', line %d, parameter not recognized",dlg,lnums[cur]);
|
||||
else ThrowAbortException("dialogue '%s', line %d, parameter not recognized",dlg,cur+1);
|
||||
cur++;
|
||||
continue;
|
||||
}
|
||||
|
|
@ -152,7 +150,7 @@ Class SWWMDialogues abstract
|
|||
// begin dialogue
|
||||
inseq = true;
|
||||
schr = lines[cur].Mid(4);
|
||||
if ( schr == "" ) ThrowAbortException("dialogue '%s', line %d, sequence has no character.",dlg,lnums[cur]);
|
||||
if ( schr == "" ) ThrowAbortException("dialogue '%s', line %d, sequence has no character.",dlg,cur+1);
|
||||
lastmsg = msg;
|
||||
msg = new("SWWMDirectMessage").Init(StringTable.Localize("$SWWM_"..schr.."SNAME"),StringTable.Localize("$SWWM_"..schr.."NAME"),schr);
|
||||
// wipe params
|
||||
|
|
@ -168,7 +166,7 @@ Class SWWMDialogues abstract
|
|||
cur++;
|
||||
continue;
|
||||
}
|
||||
ThrowAbortException("dialogue '%s', line %d, expected 'SEQ' directive",dlg,lnums[cur]);
|
||||
ThrowAbortException("dialogue '%s', line %d, expected 'SEQ' directive",dlg,cur+1);
|
||||
return;
|
||||
}
|
||||
ThrowAbortException("dialogue '%s', cursor past end of file.",dlg);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue