diff --git a/utilities/cvtmenus.pas b/utilities/cvtmenus.pas new file mode 100644 index 0000000..534df8b --- /dev/null +++ b/utilities/cvtmenus.pas @@ -0,0 +1,292 @@ +Program CvtMenus; + +{$I M_OPS.PAS} + +Uses + DOS, + m_Strings, + m_FileIO, + Classes; + +{$I RECORDS.PAS} + +Type + OldMenuFlags = Record + Header : String[255]; + Prompt : String[255]; + DispCols : Byte; + Access : String[30]; + Password : String[15]; + DispFile : String[20]; + FallBack : String[20]; + MenuType : Byte; { 0 = standard, 1 = lightbar, 2 = lightbar grid } + InputType : Byte; { 0 = user setting, 1 = longkey, 2 = hotkey } + DoneX : Byte; + DoneY : Byte; + Global : Byte; { 0 = no, 1 = yes } + End; + + OldMenuItem = Record + Text : String[79]; + TextLo : String[79]; + TextHi : String[79]; + HotKey : String[8]; + LongKey : String[8]; + Access : string[30]; + Command : String[2]; + Data : String[79]; + X : Byte; + Y : Byte; + cUp : Byte; + cDown : Byte; + cLeft : Byte; + cRight : Byte; + End; + +Function DeleteFile (FN : String) : Boolean; +Var + F : File; +Begin + Assign (F, FN); +{ SetFAttr (F, Archive);} + {$I-} Erase (F); {$I+} + DeleteFile := (IoResult = 0); +End; + +Function RenameFile (Old, New: String) : Boolean; +Var + OldF : File; +Begin + DeleteFile(New); + + Assign (OldF, Old); + {$I-} ReName (OldF, New); {$I+} + + Result := (IoResult = 0); +End; + +Procedure ConvertMenuDirectory (Path: String); +Var + Dir : SearchRec; + OldF : Text; + NewF : Text; + Menu : OldMenuFlags; + MenuCmd : Array[1..100] of OldMenuItem; + Cmds : LongInt; + FlagStr : String[20]; + NewItem : Array[1..100] of RecMenuItem; + NewItems : LongInt; + NewCmds : LongInt; + DoneList : TStringList; + Count : LongInt; + Loop : LongInt; + + Function FindGridJump (Mode: Byte; Loc: Word) : Word; + Var + TempKey : String; + TempLoop : Word; + Begin + Result := 0; + + Case Mode of + 1 : If MenuCmd[Loc].cUP = 0 Then Exit; + 2 : If MenuCmd[Loc].cDOWN = 0 Then Exit; + 3 : If MenuCmd[Loc].cLEFT = 0 Then Exit; + 4 : If MenuCmd[Loc].cRIGHT = 0 Then Exit; + End; + + // look at hotkey for jump command and then find it in new menu + + Case Mode of + 1 : TempKey := MenuCmd[MenuCmd[Loc].cUP].HotKey; + 2 : TempKey := MenuCmd[MenuCmd[Loc].cDOWN].HotKey; + 3 : TempKey := MenuCmd[MenuCmd[Loc].cLEFT].HotKey; + 4 : TempKey := MenuCmd[MenuCmd[Loc].cRIGHT].HotKey; + End; + + For TempLoop := 1 to NewItems Do + If NewItem[TempLoop].HotKey = TempKey Then Begin + Result := TempLoop; + Exit; + End; + End; + +Begin + Path := DirSlash(Path); + + FindFirst (Path + '*.mnu', AnyFile, Dir); + + While DosError = 0 Do Begin + + WriteLn ('Converting: ' + Dir.Name); + + If Not ReNameFile(Path + Dir.Name, Path + JustFileName(Dir.Name) + '.old') Then Begin + WriteLn('Unable to rename menu file: ' + Dir.Name); + Halt; + End; + + Assign (OldF, Path + JustFileName(Dir.Name) + '.old'); + Reset (OldF); + + Assign (NewF, Path + Dir.Name); + ReWrite (NewF); + + ReadLn (OldF, Menu.Header); + ReadLn (OldF, Menu.Prompt); + ReadLn (OldF, Menu.DispCols); //toggle + ReadLn (OldF, Menu.Access); + ReadLn (OldF, Menu.Password); + ReadLn (OldF, Menu.DispFile); + ReadLn (OldF, Menu.FallBack); + ReadLn (OldF, Menu.MenuType); //toggle + ReadLn (OldF, Menu.InputType); //toggle + ReadLn (OldF, Menu.DoneX); + ReadLn (OldF, Menu.DoneY); + ReadLn (OldF, Menu.Global); //toggle + + Cmds := 0; + + While Not Eof(OldF) Do Begin + Inc (Cmds); + + ReadLn (OldF, MenuCmd[Cmds].Text); + ReadLn (OldF, MenuCmd[Cmds].HotKey); + ReadLn (OldF, MenuCmd[Cmds].LongKey); + ReadLn (OldF, MenuCmd[Cmds].Access); + ReadLn (OldF, MenuCmd[Cmds].Command); + ReadLn (OldF, MenuCmd[Cmds].Data); + ReadLn (OldF, MenuCmd[Cmds].X); + ReadLn (OldF, MenuCmd[Cmds].Y); + ReadLn (OldF, MenuCmd[Cmds].cUP); + ReadLn (OldF, MenuCmd[Cmds].cDOWN); + ReadLn (OldF, MenuCmd[Cmds].cLEFT); + ReadLn (OldF, MenuCmd[Cmds].cRIGHT); + ReadLn (OldF, MenuCmd[Cmds].TextLo); + ReadLn (OldF, MenuCmd[Cmds].TextHi); + + If MenuCmd[Cmds].HotKey = '' Then MenuCmd[Cmds].HotKey := MenuCmd[Cmds].LongKey; + End; + + DoneList := TStringList.Create; + NewItems := 0; + + FillChar (NewItem, SizeOf(NewItem), #0); + + For Count := 1 to Cmds Do Begin + If DoneList.IndexOf(MenuCmd[Count].HotKey) <> -1 Then Continue; + + DoneList.Add(MenuCmd[Count].HotKey); + + Inc (NewItems); + + NewItem[NewItems].Hotkey := MenuCmd[Count].HotKey; + NewItem[NewItems].Access := MenuCmd[Count].Access; + NewItem[NewItems].Text := MenuCmd[Count].Text; + NewItem[NewItems].X := MenuCmd[Count].X; + NewItem[NewItems].Y := MenuCmd[Count].Y; + NewItem[NewItems].TextLo := MenuCmd[Count].TextLo; + NewItem[NewItems].TextHi := MenuCmd[Count].TextHi; + + NewItem[NewItems].Commands := 0; + + For Loop := Count to Cmds Do + If MenuCmd[Count].HotKey = MenuCmd[Loop].HotKey Then Begin + Inc (NewItem[NewItems].Commands); + + NewCmds := NewItem[NewItems].Commands; + + New (NewItem[NewItems].CmdData[NewCmds]); + + NewItem[NewItems].CmdData[NewCmds].MenuCmd := MenuCmd[Loop].Command; + NewItem[NewItems].CmdData[NewCmds].Access := MenuCmd[Loop].Access; + NewItem[NewItems].CmdData[NewCmds].Data := MenuCmd[Loop].Data; + End; + + NewItem[NewItems].JumpUp := FindGridJump(1, Count); + NewItem[NewItems].JumpDown := FindGridJump(2, Count); + NewItem[NewItems].JumpLeft := FindGridJump(3, Count); + NewItem[NewItems].JumpRight := FindGridJump(4, Count); + End; + + DoneList.Free; + + FlagStr := strPadR( + '0' + // char type + strI2S(Menu.MenuType) + + strI2S(Menu.InputType) + + strI2S(Menu.DispCols) + + strI2S(Menu.Global) + , 20, '0'); + + WriteLn (NewF, 'Menu description'); + WriteLn (NewF, Menu.Access); + WriteLn (NewF, Menu.Password); + WriteLn (NewF, FlagStr); + WriteLn (NewF, ''); + WriteLn (NewF, ''); // node status + WriteLn (NewF, Menu.Header); + WriteLn (NewF, Menu.Prompt); + WriteLn (NewF, Menu.DispFile); + WriteLn (NewF, Menu.DoneX); + WriteLn (NewF, Menu.DoneY); + WriteLn (NewF, ''); + WriteLn (NewF, ''); + WriteLn (NewF, ''); + + For Count := 1 to NewItems Do Begin + NewItem[Count].ReDraw := 1; + + WriteLn (NewF, NewItem[Count].Text); + WriteLn (NewF, NewItem[Count].TextLo); + WriteLn (NewF, NewItem[Count].TextHi); + WriteLn (NewF, NewItem[Count].HotKey); + WriteLn (NewF, NewItem[Count].Access); + WriteLn (NewF, NewItem[Count].ReDraw); + WriteLn (NewF, NewItem[Count].ShowType); + WriteLn (NewF, NewItem[Count].Timer); + WriteLn (NewF, NewItem[Count].X); + WriteLn (NewF, NewItem[Count].Y); + WriteLn (NewF, ''); + WriteLn (NewF, ''); + WriteLn (NewF, ''); + WriteLn (NewF, NewItem[Count].JumpUp); + WriteLn (NewF, NewItem[Count].JumpDown); + WriteLn (NewF, NewItem[Count].JumpLeft); + WriteLn (NewF, NewItem[Count].JumpRight); + WriteLn (NewF, NewItem[Count].JumpEscape); + WriteLn (NewF, NewItem[Count].JumpTab); + WriteLn (NewF, NewItem[Count].JumpPgUp); + WriteLn (NewF, NewItem[Count].JumpPgDn); + WriteLn (NewF, NewItem[Count].JumpHome); + WriteLn (NewF, NewItem[Count].JumpEnd); + + WriteLn (NewF, NewItem[Count].Commands); + + For Loop := 1 to NewItem[Count].Commands Do Begin + WriteLn (NewF, NewItem[Count].CmdData[Loop].MenuCmd); + WriteLn (NewF, NewItem[Count].CmdData[Loop].Access); + WriteLn (NewF, NewItem[Count].CmdData[Loop].Data); + WriteLn (NewF, NewItem[Count].CmdData[Loop].JumpID); + WriteLn (NewF, ''); + WriteLn (NewF, ''); + End; + End; + + Close (NewF); + Close (OldF); + + FindNext(Dir); + End; + + FindClose(Dir); +End; + +Begin + WriteLn; + WriteLn ('Mystic BBS Menu File Converter for Mystic BBS v1.10'); + WriteLn; + WriteLn ('THIS SHOULD ONLY BE EXECUTED ONCE IN YOUR MENUS DIRECTORY!'); + WriteLn; + + ConvertMenuDirectory(JustPath(ParamStr(0))); +End.