diff --git a/language.version b/language.version index 786748a32..28a92de2e 100644 --- a/language.version +++ b/language.version @@ -1,3 +1,3 @@ [default] -SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r948 \cu(Sat 2 Sep 10:01:26 CEST 2023)\c-"; -SWWM_SHORTVER="\cw1.3pre r948 \cu(2023-09-02 10:01:26)\c-"; +SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r949 \cu(Mon 4 Sep 14:08:18 CEST 2023)\c-"; +SWWM_SHORTVER="\cw1.3pre r949 \cu(2023-09-04 14:08:18)\c-"; diff --git a/zscript/handler/swwm_statichandler.zsc b/zscript/handler/swwm_statichandler.zsc index 665fe2032..e9f79437a 100644 --- a/zscript/handler/swwm_statichandler.zsc +++ b/zscript/handler/swwm_statichandler.zsc @@ -440,6 +440,172 @@ Class SWWMStaticHandler : StaticEventHandler } if ( !fail ) Console.Printf("ALL OK"); } + else if ( e.Name ~== "swwmvalidatedlgfiles" ) + { + for ( int lmp = Wads.FindLumpFullName("swwmdialogue",0,true); lmp != -1; lmp = Wads.FindLumpFullName("swwmdialogue",lmp+1,true) ) + { + Console.Printf("\ce-- PARSING FILE \cf'%s'\ce...\c-",Wads.GetLumpFullName(lmp)); + Console.Printf(""); + String dat = Wads.ReadLump(lmp); + dat.Replace("\r",""); // just in case + Array lines; + lines.Clear(); + dat.Split(lines,"\n",0); + // strip comments and trim whitespace + for ( int i=0; i 0 ) Console.Printf(" \cqdelay: \cd%d\c-",sdelay); + if ( sstartdelay > 0 ) Console.Printf(" \cqstartdelay: \cd%d\c-",sstartdelay); + if ( senddelay > 0 ) Console.Printf(" \cqenddelay: \cd%d\c-",senddelay); + if ( schardelay > 0 ) Console.Printf(" \cqchardelay: \cd%d\c-",schardelay); + if ( spausedelay > 0 ) Console.Printf(" \cqpausedelay: \cd%d\c-",spausedelay); + if ( sznvspecial ) Console.Printf(" \cq+\cdznvspecial\c-"); + if ( sindirect ) Console.Printf(" \cq+\cdindirect\c-"); + Console.Printf(" \cqcount: \cd%d\c-\n\cd---\c-",scnt); + for ( int i=0; i 0 ) ThrowAbortException("dialogue '%s', line %d, sequence %d, duplicate 'CNT' parameter.",sdlg,cur+1,nseq); + scnt = lines[cur].Mid(4).ToInt(); + } + else if ( lines[cur].Left(6) == "DELAY " ) + { + if ( sdelay > 0 ) ThrowAbortException("dialogue '%s', line %d, sequence %d, duplicate 'DELAY' parameter.",sdlg,cur+1,nseq); + sdelay = lines[cur].Mid(6).ToInt(); + } + else if ( lines[cur].Left(11) == "STARTDELAY " ) + { + if ( sstartdelay > 0 ) ThrowAbortException("dialogue '%s', line %d, sequence %d, duplicate 'STARTDELAY' parameter.",sdlg,cur+1,nseq); + sstartdelay = lines[cur].Mid(11).ToInt(); + } + else if ( lines[cur].Left(9) == "ENDDELAY " ) + { + if ( senddelay > 0 ) ThrowAbortException("dialogue '%s', line %d, sequence %d, duplicate 'ENDDELAY' parameter.",sdlg,cur+1,nseq); + senddelay = lines[cur].Mid(9).ToInt(); + } + else if ( lines[cur].Left(10) == "CHARDELAY " ) + { + if ( schardelay > 0 ) ThrowAbortException("dialogue '%s', line %d, sequence %d, duplicate 'CHARDELAY' parameter.",sdlg,cur+1,nseq); + schardelay = lines[cur].Mid(10).ToInt(); + } + else if ( lines[cur].Left(11) == "PAUSEDELAY " ) + { + if ( spausedelay > 0 ) ThrowAbortException("dialogue '%s', line %d, sequence %d, duplicate 'PAUSEDELAY' parameter.",sdlg,cur+1,nseq); + spausedelay = lines[cur].Mid(11).ToInt(); + } + else if ( lines[cur].Left(8) == "INDIRECT" ) + { + if ( sindirect ) ThrowAbortException("dialogue '%s', line %d, sequence %d, duplicate 'INDIRECT' parameter.",sdlg,cur+1,nseq); + sindirect = true; + } + else if ( lines[cur].Left(10) == "ZNVSPECIAL" ) + { + if ( sznvspecial ) ThrowAbortException("dialogue '%s', line %d, sequence %d, duplicate 'ZNVSPECIAL' parameter.",sdlg,cur+1,nseq); + sznvspecial = true; + } + else ThrowAbortException("dialogue '%s', line %d, sequence %d, parameter not recognized",sdlg,cur+1,nseq); + cur++; + continue; + } + if ( lines[cur].Left(4) == "SEQ " ) + { + // begin dialogue + inseq = true; + schr = lines[cur].Mid(4); + // wipe params + sname = ""; + scnt = 0; + sdelay = 0; + sstartdelay = 0; + senddelay = 0; + schardelay = 0; + spausedelay = 0; + sindirect = false; + sznvspecial = false; + cur++; + continue; + } + ThrowAbortException("dialogue '%s', line %d, expected 'SEQ' directive",sdlg,cur+1); + return; + } + if ( indlg ) ThrowAbortException("line %d, premature end of file reached for dialogue '%s'",cur+1,sdlg); + if ( inseq ) ThrowAbortException("dialogue '%s', line %d, premature end of file reached for sequence %d",sdlg,cur+1,nseq); + Console.Printf("\ce-- END OF FILE \cf'%s'\ce...\c-",Wads.GetLumpFullName(lmp)); + Console.Printf(""); + } + } else if ( e.Name ~== "swwmdumpmonsters" ) { int i = 0;