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.