mysticbbs/utilities/cvtmenus.pas

351 lines
10 KiB
ObjectPascal

// ====================================================================
// Mystic BBS Software Copyright 1997-2013 By James Coyle
// ====================================================================
//
// This file is part of Mystic BBS.
//
// Mystic BBS is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Mystic BBS is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Mystic BBS. If not, see <http://www.gnu.org/licenses/>.
//
// ====================================================================
Program CvtMenus;
{$I M_OPS.PAS}
Uses
lineinfo,
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;
Procedure PurgeWildcard (WC: String);
Var
D : SearchRec;
Begin
FindFirst (WC, AnyFile, D);
While DosError = 0 Do Begin
If D.Attr AND Directory <> 0 Then Continue;
FileErase (D.Name);
FindNext(D);
End;
FindClose(D);
End;
Function RenameFile (Old, New: String) : Boolean;
Var
OldF : File;
Begin
FileErase(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) + '.oldmnu') Then Begin
WriteLn('Unable to rename menu file: ' + Dir.Name);
Halt;
End;
Assign (OldF, Path + JustFileName(Dir.Name) + '.oldmnu');
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
If Length(MenuCmd[Loop].Command) < 2 Then Continue;
// if lb menus check x/y/lo/hi values and assign if they were blank
If (Menu.MenuType > 0) And ((NewItem[NewItems].TextLo = '') or (NewItem[NewItems].TextHi = '')) Then Begin
NewItem[NewItems].X := MenuCmd[Loop].X;
NewItem[NewItems].Y := MenuCmd[Loop].Y;
NewItem[NewItems].TextLo := MenuCmd[Loop].TextLo;
NewItem[NewItems].TextHi := MenuCmd[Loop].TextHi;
End;
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;
// New engine will send header/footer for lightbar menus
// old engine did not, so zero these out just in case
If Menu.MenuType > 0 Then Begin
Menu.Header := '';
Menu.Prompt := '';
End;
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.Fallback);
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;
NewItem[Count].TimerType := 0;
NewItem[Count].ShowType := 0;
If (NewItem[Count].Text = '') and (Menu.MenuType = 0) Then
NewItem[Count].ShowType := 2;
FlagStr := strPadR(
strI2S(NewItem[Count].ReDraw) +
strI2S(NewItem[Count].TimerType) +
strI2S(NewItem[Count].ShowType)
, 20, '0');
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, FlagStr);
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);
PurgeWildcard('*.oldmnu');
End;
Begin
WriteLn;
WriteLn ('Mystic BBS Menu File Converter for Mystic BBS v1.10 A15');
WriteLn;
WriteLn ('THIS SHOULD ONLY BE EXECUTED ONCE IN YOUR MENUS DIRECTORY!');
WriteLn;
ConvertMenuDirectory(JustPath(ParamStr(0)));
End.