From 00ed82b868e55adf00796c0f529e017eef48f801 Mon Sep 17 00:00:00 2001 From: mysticbbs Date: Mon, 6 Aug 2012 01:53:11 -0400 Subject: [PATCH] Initial import --- mystic/bbs_menudata.pas | 354 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 354 insertions(+) create mode 100644 mystic/bbs_menudata.pas diff --git a/mystic/bbs_menudata.pas b/mystic/bbs_menudata.pas new file mode 100644 index 0000000..7e910ea --- /dev/null +++ b/mystic/bbs_menudata.pas @@ -0,0 +1,354 @@ +Unit BBS_MenuData; + +{$I M_OPS.PAS} + +Interface + +Uses + m_Strings; + +{$I RECORDS.PAS} + +Type + TMenuData = Class + Menu : Text; + Info : RecMenuInfo; + Item : Array[1..mysMaxMenuItems] of PtrMenuItem; + NumItems : Byte; + + Constructor Create; + Destructor Destroy; Override; + Function CreateNewMenu (FN: String) : Boolean; + Function Load (Append: Boolean; FN: String) : Boolean; + Function Save (FN: String) : Boolean; + Procedure Unload; + Procedure InsertItem (Num: Word); + Procedure DeleteItem (Num: Word); + Procedure CopyItem (Source, Dest: Word); + Procedure InsertCommand (Num, CmdNum: Word); + Procedure DeleteCommand (Num, CmdNum: Word); + End; + +Implementation + +Constructor TMenuData.Create; +Begin + Inherited Create; + + FillChar (Info, SizeOf(Info), 0); + + NumItems := 0; +End; + +Destructor TMenuData.Destroy; +Begin + Unload; + + Inherited Destroy; +End; + +Procedure TMenuData.Unload; +Var + Count1 : LongInt; + Count2 : LongInt; +Begin + For Count1 := NumItems DownTo 1 Do Begin + For Count2 := Item[Count1]^.Commands DownTo 1 Do + Dispose (Item[Count1]^.CmdData[Count2]); + + Dispose (Item[Count1]); + End; + + NumItems := 0; +End; + +Function TMenuData.Load (Append: Boolean; FN: String) : Boolean; +Var + Count : LongInt; + Junk : RecMenuInfo; + Buf : Array[1..4096] of Byte; + Str : String; + Flags : String; +Begin + If Not Append Then Unload; + + Result := False; + + If FN = '' Then Exit; + + Assign (Menu, FN); + SetTextBuf (Menu, Buf); + + {$I-} Reset (Menu); {$I+} + + If IoResult <> 0 Then Exit; + + ReadLn (Menu, Junk.Description); + ReadLn (Menu, Junk.Access); + ReadLn (Menu, Junk.Password); + ReadLn (Menu, Flags); + ReadLn (Menu, Str); // resv + ReadLn (Menu, Junk.NodeStatus); + ReadLn (Menu, Junk.Header); + ReadLn (Menu, Junk.Footer); + ReadLn (Menu, Junk.DispFile); + ReadLn (Menu, Junk.DoneX); + ReadLn (Menu, Junk.DoneY); + ReadLn (Menu, Str); // resv + ReadLn (Menu, Str); // resv + ReadLn (Menu, Str); // resv + + Junk.CharType := strS2I(Flags[1]); + Junk.MenuType := strS2I(Flags[2]); + Junk.InputType := strS2I(Flags[3]); + Junk.DispCols := strS2I(Flags[4]); + Junk.Global := Boolean(strS2I(Flags[5])); + + If Not Append Then Info := Junk; + + While Not Eof(Menu) And (NumItems <= mysMaxMenuItems) Do Begin + Inc (NumItems); + + New (Item[NumItems]); + + ReadLn (Menu, Item[NumItems]^.Text); + ReadLn (Menu, Item[NumItems]^.TextLo); + ReadLn (Menu, Item[NumItems]^.TextHi); + ReadLn (Menu, Item[NumItems]^.HotKey); + ReadLn (Menu, Item[NumItems]^.Access); + ReadLn (Menu, Flags); + ReadLn (Menu, Item[NumItems]^.Timer); + ReadLn (Menu, Item[NumItems]^.X); + ReadLn (Menu, Item[NumItems]^.Y); + ReadLn (Menu, Str); + ReadLn (Menu, Str); + ReadLn (Menu, Str); + ReadLn (Menu, Item[NumItems]^.JumpUp); + ReadLn (Menu, Item[NumItems]^.JumpDown); + ReadLn (Menu, Item[NumItems]^.JumpLeft); + ReadLn (Menu, Item[NumItems]^.JumpRight); + ReadLn (Menu, Item[NumItems]^.JumpEscape); + ReadLn (Menu, Item[NumItems]^.JumpTab); + ReadLn (Menu, Item[NumItems]^.JumpPgUp); + ReadLn (Menu, Item[NumItems]^.JumpPgDn); + ReadLn (Menu, Item[NumItems]^.JumpHome); + ReadLn (Menu, Item[NumItems]^.JumpEnd); + ReadLn (Menu, Item[NumItems]^.Commands); + + Item[NumItems]^.TimerShow := True; + Item[NumItems]^.ReDraw := strS2I(Flags[1]); + Item[NumItems]^.TimerType := strS2I(Flags[2]); + Item[NumItems]^.ShowType := strS2I(Flags[3]); + + For Count := 1 to Item[NumItems]^.Commands Do Begin + New (Item[NumItems]^.CmdData[Count]); + + ReadLn (Menu, Item[NumItems]^.CmdData[Count]^.MenuCmd); + ReadLn (Menu, Item[NumItems]^.CmdData[Count]^.Access); + ReadLn (Menu, Item[NumItems]^.CmdData[Count]^.Data); + ReadLn (Menu, Item[NumItems]^.CmdData[Count]^.JumpID); + ReadLn (Menu, Str); + ReadLn (Menu, Str); + End; + End; + + Close (Menu); + + Result := True; +End; + +Function TMenuData.Save (FN: String) : Boolean; +Var + Count : LongInt; + Count2 : LongInt; + Flags : String; + Buf : Array[1..4096] of Byte; +Begin + Result := False; + + Assign (Menu, FN); + SetTextBuf (Menu, Buf); + ReWrite (Menu); + + Flags := strPadR( + strI2S(Info.CharType) + + strI2S(Info.MenuType) + + strI2S(Info.InputType) + + strI2S(Info.DispCols) + + strI2S(Ord(Info.Global)) + , 20, '0'); + + WriteLn (Menu, Info.Description); + WriteLn (Menu, Info.Access); + WriteLn (Menu, Info.Password); + WriteLn (Menu, Flags); + WriteLn (Menu, ''); // resv + WriteLn (Menu, Info.NodeStatus); + WriteLn (Menu, Info.Header); + WriteLn (Menu, Info.Footer); + WriteLn (Menu, Info.DispFile); + WriteLn (Menu, Info.DoneX); + WriteLn (Menu, Info.DoneY); + WriteLn (Menu, ''); // resv + WriteLn (Menu, ''); // resv + WriteLn (Menu, ''); // resv + + For Count := 1 to NumItems Do Begin + Flags := strPadR( + strI2S(Item[Count]^.ReDraw) + + strI2S(Item[Count]^.TimerType) + + strI2S(Item[Count]^.ShowType) + , 20, '0'); + + WriteLn (Menu, Item[Count]^.Text); + WriteLn (Menu, Item[Count]^.TextLo); + WriteLn (Menu, Item[Count]^.TextHi); + WriteLn (Menu, Item[Count]^.HotKey); + WriteLn (Menu, Item[Count]^.Access); + WriteLn (Menu, Flags); + WriteLn (Menu, Item[Count]^.Timer); + WriteLn (Menu, Item[Count]^.X); + WriteLn (Menu, Item[Count]^.Y); + WriteLn (Menu, ''); + WriteLn (Menu, ''); + WriteLn (Menu, ''); + WriteLn (Menu, Item[Count]^.JumpUp); + WriteLn (Menu, Item[Count]^.JumpDown); + WriteLn (Menu, Item[Count]^.JumpLeft); + WriteLn (Menu, Item[Count]^.JumpRight); + WriteLn (Menu, Item[Count]^.JumpEscape); + WriteLn (Menu, Item[Count]^.JumpTab); + WriteLn (Menu, Item[Count]^.JumpPgUp); + WriteLn (Menu, Item[Count]^.JumpPgDn); + WriteLn (Menu, Item[Count]^.JumpHome); + WriteLn (Menu, Item[Count]^.JumpEnd); + WriteLn (Menu, Item[Count]^.Commands); + + For Count2 := 1 to Item[Count]^.Commands Do Begin + WriteLn (Menu, Item[Count]^.CmdData[Count2]^.MenuCmd); + WriteLn (Menu, Item[Count]^.CmdData[Count2]^.Access); + WriteLn (Menu, Item[Count]^.CmdData[Count2]^.Data); + WriteLn (Menu, Item[Count]^.CmdData[Count2]^.JumpID); + WriteLn (Menu, ''); + WriteLn (Menu, ''); + End; + End; + + Close (Menu); + + Result := True; +End; + +Procedure TMenuData.DeleteItem (Num: Word); +Var + Count : Word; +Begin + If NumItems = 0 Then Exit; + + For Count := 1 to Item[Num]^.Commands Do + Dispose (Item[Num]^.CmdData[Count]); + + Dispose (Item[Num]); + + For Count := Num To NumItems - 1 Do + Item[Count] := Item[Count + 1]; + + Dec(NumItems); +End; + +Procedure TMenuData.DeleteCommand (Num, CmdNum: Word); +Var + Count : Word; +Begin + If Item[Num]^.Commands = 0 Then Exit; + + Dispose (Item[Num]^.CmdData[CmdNum]); + + For Count := CmdNum To Item[Num]^.Commands - 1 Do + Item[Num]^.CmdData[Count] := Item[Num]^.CmdData[Count + 1]; + + Dec (Item[Num]^.Commands); +End; + +Procedure TMenuData.InsertCommand (Num, CmdNum: Word); +Var + Count : Word; +Begin + If Item[Num]^.Commands = mysMaxMenuCmds Then Exit; + + Inc (Item[Num]^.Commands); + + For Count := Item[Num]^.Commands DownTo CmdNum + 1 Do + Item[Num]^.CmdData[Count] := Item[Num]^.CmdData[Count - 1]; + + New (Item[Num]^.CmdData[CmdNum]); + + With Item[Num]^.CmdData[CmdNum]^ Do Begin + MenuCmd := 'GO'; + Access := ''; + Data := 'main'; + JumpID := 0; + End; +End; + +Procedure TMenuData.InsertItem (Num: Word); +Var + Count : Word; +Begin + If NumItems = mysMaxMenuItems Then Exit; + + Inc (NumItems); + + For Count := NumItems DownTo Num + 1 Do + Item[Count] := Item[Count - 1]; + + New (Item[Num]); + + FillChar (Item[Num]^, SizeOf(Item[Num]^), #0); + + With Item[Num]^ Do Begin + Text := '|09(|10Q|09) |03Quit to Main Menu'; + TextLo := '|07Quit to Main Menu'; + TextHi := '|15Quit to Main Menu'; + HotKey := 'Q'; + Redraw := 1; + End; + + InsertCommand(Num, 1); +End; + +Function TMenuData.CreateNewMenu (FN: String) : Boolean; +Begin + Info.Description := 'New Mystic BBS menu'; + Info.Header := '|CR|14New Menu Header|CR'; + Info.Footer := '|CR|09Selection|03: |11'; + Info.DispCols := 3; + + InsertItem(1); + + Result := Save(FN); +End; + +Procedure TMenuData.CopyItem (Source, Dest: Word); +Var + Count : Word; +Begin + If NumItems = mysMaxMenuItems Then Exit; + + Inc (NumItems); + + For Count := NumItems DownTo Dest + 1 Do + Item[Count] := Item[Count - 1]; + + New (Item[Dest]); + + Item[Dest]^ := Item[Source]^; + + For Count := 1 to Item[Source]^.Commands Do Begin + New (Item[Dest]^.CmdData[Count]); + + Item[Dest]^.CmdData[Count]^ := Item[Source]^.CmdData[Count]^; + End; +End; + +End.