home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deathday Collection
/
dday.bin
/
edit
/
dfe
/
dfe.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1994-05-26
|
30KB
|
1,026 lines
{****************************************************************************
* The DOOM Hacker's Tool Kit *
*****************************************************************************
* Program: DFE v1.31 *
* Purpose: DOOM 1.2 Front End *
* Date: 4/28/94 *
* Author: Joshua Jackson Internet: joshjackson@delphi.com *
****************************************************************************}
{As of this point in time, I have not found a way to allow execution of
the Watcom DOS extender while running under DPMI... however I am looking
into a way to switch the system back to real mode before launching DOOM}
{$IFNDEF DPMI}
uses app,objects,menus,drivers,views,memory,dialogs,strings,windos,Dos,crt,
WadDecl,Wad,mapread,StdDlg,Swap,MsgBox;
{$ELSE} {You CAN NOT use the SWAP unit under DPMI!!!}
uses app,objects,menus,drivers,views,memory,dialogs,strings,windos,Dos,crt,
WadDecl,Wad,mapread,StdDlg,MsgBox;
{$ENDIF}
const cmOnePlayerMenu = 100;
cmSerialMenu = 101;
cmIPXMenu = 102;
cmModemMenu = 103;
cmViewMaps = 105;
cmNull = 255;
gtNormal = 00;
gtIPXNet = 01;
gtModem = 02;
gtDirLinkModem = 03;
gtSerial = 04;
gtSetMode = 05;
gtViewSprites = 06;
gtViewMaps = 07;
type PMyApp=^TMyApp;
TMyApp=Object(Tapplication)
Constructor Init;
Procedure InitMenuBar; virtual;
Procedure Idle; virtual;
Procedure HandleEvent(Var Event:TEvent); virtual;
Function GetPalette:PPalette; virtual;
Procedure RunDoom(GameType:integer;Params:string);
Procedure OnePlayerMenu;
Procedure SerialMenu;
Procedure IPXMenu;
Procedure ModemMenu;
Procedure ViewMaps;
end;
SelLevelArray=array[1..4] of PCluster;
LevelNameArray=array[1..9] of String;
var MyApp:TMyApp;
Debug:boolean;
Procedure SetLevelData(R:TRect;var SelLevel:PRadioButtons;Level:word);
begin
case Level of
1:SelLevel:=New(PRadioButtons, Init(R,
NewSItem('~1~ Hanger',
NewSItem('~2~ Nuclear Plant',
NewSItem('~3~ Toxin Refinery',
NewSItem('~4~ Command Control',
NewSItem('~5~ Phobos Lab',
NewSItem('~6~ Central Processing',
NewSItem('~7~ Computer Station',
NewSItem('~8~ Phobos Anomaly',
NewSItem('~9~ Military Base',
nil)))))))))));
2:SelLevel:=New(PRadioButtons, Init(R,
NewSItem('~1~ Deimos Anomaly',
NewSItem('~2~ Containment Area',
NewSItem('~3~ Refinery',
NewSItem('~4~ Deimos Lab',
NewSItem('~5~ Command Center',
NewSItem('~6~ Halls of the Damned',
NewSItem('~7~ Spawning Vats',
NewSItem('~8~ Towel of Babel',
NewSItem('~9~ Fortress of Mystery',
nil)))))))))));
3:SelLevel:=New(PRadioButtons, Init(R,
NewSItem('~1~ Hell Keep',
NewSItem('~2~ Slough of Despair',
NewSItem('~3~ Pandemonium',
NewSItem('~4~ House of Pain',
NewSItem('~5~ Unholy Cathedrial',
NewSItem('~6~ Mount Erebus',
NewSItem('~7~ Limbo',
NewSItem('~8~ DIS',
NewSItem('~9~ Warrens',
nil)))))))))));
end;
end;
Procedure FindLevelNames(FileSpec:PathStr;var Levels:LevelNameArray;R:TRect; var SelLevel:PRadioButtons);
var PDir:PWadDirectory;
t,i1,i2,CurLevel:integer;
tmpstr:string;
Code:integer;
TmpArray:PSItem;
CurItem,ItemList:PSitem;
begin
TmpStr:=FileSpec;
PDir:=new(PWadDirectory, Init(FileSpec));
if WadResult<>wrOk then begin
MessageBox(WadResultMsg(WadResult),Nil,mfError+ mfOkButton);
exit;
end;
CurLevel:=1;
CurItem:=Nil;
ItemList:=Nil;
Levels[1]:='';
for t:=1 to PDir^.DirEntries do begin
if (PDir^.DirEntry^[t].ObjName[1]='E') and (PDir^.DirEntry^[t].ObjName[3]='M') then begin
tmpstr:=PDir^.DirEntry^[t].ObjName[2];
val(TmpStr,i1,Code);
if Code<>0 then
continue;
tmpstr:=PDir^.DirEntry^[t].ObjName[4];
val(TmpStr,i2,Code);
if Code<>0 then
continue;
Levels[CurLevel]:=PDir^.DirEntry^[t].ObjName;
if ItemList=Nil then begin
ItemList:=New(PSItem);
ItemList^.Value:=NewStr(Levels[CurLevel]);
ItemList^.Next:=Nil;
CurItem:=ItemList;
end
else begin
CurItem^.Next:=New(PSItem);
CurItem:=CurItem^.Next;
CurItem^.Value:=NewStr(Levels[CurLevel]);
CurItem^.Next:=Nil;
end;
inc(CurLevel);
if CurLevel=10 then begin
PDir^.Done;
Dispose(PDir);
SelLevel:=New(PRadioButtons, Init(R,ItemList));
exit;
end;
end;
end;
PDir^.Done;
Dispose(PDir);
SelLevel:=New(PRadioButtons, Init(R,ItemList));
end;
Procedure SetMenuData(MenuNum:byte;var Param1,Param2:string);
var R:Trect;
SelModem,SelGame,Monsters,SelSkill,Players:PCluster;
DialNum:PInputLine;
SelLevel:PRadioButtons;
Dialog1,Dialog2:PDialog;
Dialog3:PFileDialog;
ComPort:PCluster;
Control,Episode:word;
TmpStr,DmParam,ModeParam:string;
ExtFile:PathStr;
ExtLevelPos:byte;
jb:byte;
FileName: FNameStr;
LevelNames:LevelNameArray;
begin
Case MenuNum of
1:begin
R.Assign(2,1,30,5);
SelGame:=New(PRadioButtons, Init(R,
NewSItem('~K~nee-Deep In The Dead',
NewSItem('~S~hores Of Hell',
NewSItem('~I~nferno!',
NewSItem('~L~oad External Wad File',
nil))))));
R.Assign(20,6,60,15);
Dialog1:=New(PDialog,Init(r,'Episodes'));
with Dialog1^ do begin
R.Assign(5,6,15,8);
Insert(New(PButton,Init(R,'~O~k',cmOk,bfDefault)));
R.Assign(25,6,35,8);
Insert(New(PButton,Init(R,'~C~ancel',cmCancel,bfNormal)));
Insert(SelGame);
end;
Control:=Desktop^.ExecView(Dialog1);
Episode:=SelGame^.Value + 1;
Param1:='';
DmParam:='';
if Episode=4 then begin
FileName := '*.WAD';
Dialog3:=New(PFileDialog, Init('*.WAD', 'Select Wad File','~N~ame',fdOkButton,100));
Dialog3^.SetData(FileName);
Control:=Desktop^.ExecView(Dialog3);
if Control=cmFileOpen then
Control:=cmOk;
if Control=cmOK then begin
ExtFile:=Dialog3^.Directory^+(Dialog3^.FileName^.Data^);
R.Assign(2, 1, 28, 10);
FindLevelNames(ExtFile,LevelNames,R,SelLevel);
if WadResult<>wrOk then
exit;
if LevelNames[1]='' then begin
Param1:='';
MessageBox('No valid level entries found.',Nil,mfError+mfOkButton);
control:=cmCancel;
end
else begin
Episode:=4;
Param1:='-file '+ExtFile+' ';
end;
end;
Dialog3^.Done;
Dispose(Dialog3);
end;
if Control=cmOK then begin
R.Assign(30, 3, 55, 8);
SelSkill:=New(PRadioButtons, Init(R,
NewSItem('~I~''m too young to die',
NewSItem('~H~ey Not too Rough',
NewSItem('H~u~rt Me Plenty',
NewSItem('U~l~tra Violence',
NewSItem('~N~ightmare!',
nil)))))));
R.Assign(30, 1, 50, 2);
Monsters:=New(PCheckBoxes, Init(R,
NewSItem('No ~M~onsters',
nil)));
R.Assign(2, 1, 28, 10);
if Episode < 4 then
SetLevelData(R,SelLevel,1);
R.Assign(11,4,69,18);
Dialog2:=New(PDialog,Init(r,'Game Options'));
with Dialog2^ do begin
Insert(Monsters);
Insert(SelSkill);
R.Assign(15,11,25,13);
Insert(New(PButton,Init(R,'~C~ancel',cmCancel,bfNormal)));
R.Assign(2,11,12,13);
Insert(New(PButton,Init(R,'~O~k',cmOk,bfDefault)));
Insert(SelLevel);
end;
Control:=Desktop^.ExecView(Dialog2);
if Control=cmOk then begin
if Episode < 4 then begin
Str(Episode,TmpStr);
DmParam:='-devparm -warp '+TmpStr+' ';
Str(SelLevel^.Value + 1,TmpStr);
DmParam:=DmParam+TmpStr
end
else begin
DmParam:='-devparm -warp ';
DmParam:=DmParam+LevelNames[SelLevel^.Value+1][2]+' ';
DmParam:=DmParam+LevelNames[SelLevel^.Value+1][4];
end;
Str(SelSkill^.Value + 1,TmpStr);
DmParam:=DmParam+' -skill '+TmpStr+' ';
if (Monsters^.Value and 1) = 1 then
DmParam:=DmParam+'-nomonsters';
end
else
Param1:='';
Dialog2^.Done;
Dispose(Dialog2);
Param1:=Param1+DmParam;
end;
Dialog1^.Done;
Dispose(Dialog1);
end;
2:begin
R.Assign(2,1,30,5);
SelGame:=New(PRadioButtons, Init(R,
NewSItem('~K~nee-Deep In The Dead',
NewSItem('~S~hores Of Hell',
NewSItem('~I~nferno!',
NewSItem('~L~oad External Wad File',
nil))))));
R.Assign(20,7,60,16);
Dialog1:=New(PDialog,Init(r,'Episodes'));
with Dialog1^ do begin
R.Assign(5,6,15,8);
Insert(New(PButton,Init(R,'~O~k',cmOk,bfDefault)));
R.Assign(25,6,35,8);
Insert(New(PButton,Init(R,'~C~ancel',cmCancel,bfNormal)));
Insert(SelGame);
end;
Control:=Desktop^.ExecView(Dialog1);
Episode:=SelGame^.Value + 1;
DmParam:='';
Param1:='';
if Episode=4 then begin
Dialog3:=New(PFileDialog,Init('*.WAD','Load External WAD','WAD Files',fdOkButton,jb));
Control:=Desktop^.ExecView(Dialog3);
if Control=cmFileOpen then
Control:=cmOk;
if Control=cmOK then begin
ExtFile:=Dialog3^.Directory^+(Dialog3^.FileName^.Data^);
R.Assign(2, 1, 28, 10);
FindLevelNames(ExtFile,LevelNames,R,SelLevel);
if WadResult<>wrOk then
exit;
if LevelNames[1]='' then begin
Param1:='';
MessageBox('No valid level entries found.',Nil,mfError+mfOkButton);
control:=cmCancel;
end
else begin
Episode:=4;
Param1:='-file '+ExtFile+' ';
end;
end;
Dialog3^.Done;
Dispose(Dialog3);
end;
if Control=cmOK then begin
R.Assign(30,10,55,14);
ComPort:=New(PRadioButtons, Init(R,
NewSItem('COM1',
NewSItem('COM2',
NewSItem('COM3',
NewSItem('COM4',
nil))))));
R.Assign(30, 4, 55, 9);
SelSkill:=New(PRadioButtons, Init(R,
NewSItem('~I~''m too young to die',
NewSItem('~H~ey Not too Rough',
NewSItem('H~u~rt Me Plenty',
NewSItem('U~l~tra Violence',
NewSItem('~N~ightmare!',
nil)))))));
R.Assign(30, 1, 50, 3);
Monsters:=New(PCheckBoxes, Init(R,
NewSItem('No ~M~onsters',
NewSItem('~D~eath Match',
nil))));
R.Assign(2, 1, 28, 10);
if Episode < 4 then
SetLevelData(R,SelLevel,Episode);
R.Assign(11,3,69,18);
Dialog2:=New(PDialog,Init(r,'Game Options'));
with Dialog2^ do begin
Insert(Monsters);
Insert(SelSkill);
Insert(ComPort);
R.Assign(15,12,25,14);
Insert(New(PButton,Init(R,'~C~ancel',cmCancel,bfNormal)));
R.Assign(2,12,12,14);
Insert(New(PButton,Init(R,'~O~k',cmOk,bfDefault)));
Insert(SelLevel);
end;
Control:=Desktop^.ExecView(Dialog2);
if Control=cmOk then begin
if Episode < 4 then begin
Str(Episode,TmpStr);
DmParam:='-devparm -warp '+TmpStr+' ';
Str(SelLevel^.Value + 1,TmpStr);
DmParam:=DmParam+TmpStr
end
else begin
DmParam:='-devparm -warp ';
DmParam:=DmParam+LevelNames[SelLevel^.Value+1][2]+' ';
DmParam:=DmParam+LevelNames[SelLevel^.Value+1][4];
end;
Str(SelSkill^.Value + 1,TmpStr);
DmParam:=DmParam+' -skill '+TmpStr+' ';
DmParam:=DmParam+' -COM';
Str(ComPort^.Value + 1,TmpStr);
ModeParam:='COM'+TmpStr+':9600,N,8,1';
DmParam:=DmParam+TmpStr+' ';
if (Monsters^.Value and 1) = 1 then
DmParam:=DmParam+'-nomonsters ';
if (Monsters^.Value and 2) = 2 then
DmParam:=DmParam+'-deathmatch';
end
else
Param1:='';
Dialog2^.Done;
Dispose(Dialog2);
Param1:=Param1+DmParam;
end;
Param2:=ModeParam;
Param1:=Param1+dmParam;
Dialog1^.Done;
Dispose(Dialog1);
end;
3:begin
R.Assign(2,1,30,5);
SelGame:=New(PRadioButtons, Init(R,
NewSItem('~K~nee-Deep In The Dead',
NewSItem('~S~hores Of Hell',
NewSItem('~I~nferno!',
NewSItem('~L~oad External Wad File',
nil))))));
R.Assign(20,7,60,16);
Dialog1:=New(PDialog,Init(r,'Episodes'));
with Dialog1^ do begin
R.Assign(5,6,15,8);
Insert(New(PButton,Init(R,'~O~k',cmOk,bfDefault)));
R.Assign(25,6,35,8);
Insert(New(PButton,Init(R,'~C~ancel',cmCancel,bfNormal)));
Insert(SelGame);
end;
Control:=Desktop^.ExecView(Dialog1);
Episode:=SelGame^.Value + 1;
DmParam:='';
Param1:='';
if Episode=4 then begin
Dialog3:=New(PFileDialog,Init('*.WAD','Load External WAD','WAD Files',fdOkButton,jb));
Control:=Desktop^.ExecView(Dialog3);
if Control=cmFileOpen then
Control:=cmOk;
if Control=cmOK then begin
ExtFile:=Dialog3^.Directory^+(Dialog3^.FileName^.Data^);
R.Assign(2, 1, 28, 10);
FindLevelNames(ExtFile,LevelNames,R,SelLevel);
if WadResult<>wrOk then
exit;
if LevelNames[1]='' then begin
Param1:='';
MessageBox('No valid level entries found.',Nil,mfError+mfOkButton);
control:=cmCancel;
end
else begin
Episode:=4;
Param1:='-file '+ExtFile+' ';
end;
end;
Dialog3^.Done;
Dispose(Dialog3);
end;
if Control=cmOK then begin
R.Assign(30,10,55,13);
Players:=New(PRadioButtons, Init(R,
NewSItem('Two Players',
NewSItem('Three Players',
NewSItem('Four Players',
nil)))));
R.Assign(30, 4, 55, 9);
SelSkill:=New(PRadioButtons, Init(R,
NewSItem('~I~''m too young to die',
NewSItem('~H~ey Not too Rough',
NewSItem('H~u~rt Me Plenty',
NewSItem('U~l~tra Violence',
NewSItem('~N~ightmare!',
nil)))))));
R.Assign(30, 1, 50, 3);
Monsters:=New(PCheckBoxes, Init(R,
NewSItem('No ~M~onsters',
NewSItem('~D~eath Match',
nil))));
R.Assign(2, 1, 28, 10);
if Episode < 4 then
SetLevelData(R,SelLevel,Episode);
R.Assign(11,3,69,17);
Dialog2:=New(PDialog,Init(r,'Game Options'));
with Dialog2^ do begin
Insert(Monsters);
Insert(SelSkill);
Insert(Players);
R.Assign(15,11,25,13);
Insert(New(PButton,Init(R,'~C~ancel',cmCancel,bfNormal)));
R.Assign(2,11,12,13);
Insert(New(PButton,Init(R,'~O~k',cmOk,bfDefault)));
Insert(SelLevel);
end;
Control:=Desktop^.ExecView(Dialog2);
if Control=cmOk then begin
if Episode < 4 then begin
Str(Episode,TmpStr);
DmParam:='-devparm -warp '+TmpStr+' ';
Str(SelLevel^.Value + 1,TmpStr);
DmParam:=DmParam+TmpStr
end
else begin
DmParam:='-devparm -warp ';
DmParam:=DmParam+LevelNames[SelLevel^.Value+1][2]+' ';
DmParam:=DmParam+LevelNames[SelLevel^.Value+1][4];
end;
Str(SelSkill^.Value + 1,TmpStr);
DmParam:=DmParam+' -skill '+TmpStr+' ';
DmParam:=DmParam+' -nodes ';
Str(Players^.Value + 2,TmpStr);
DmParam:=DmParam+TmpStr+' ';
if (Monsters^.Value and 1) = 1 then
DmParam:=DmParam+'-nomonsters ';
if (Monsters^.Value and 2) = 2 then
DmParam:=DmParam+'-deathmatch';
end
else
Param1:='';
Dialog2^.Done;
Dispose(Dialog2);
Param1:=Param1+DmParam;
end;
Param1:=Param1+DmParam;
Dialog1^.Done;
Dispose(Dialog1);
end;
4:begin
R.Assign(2,1,30,5);
SelGame:=New(PRadioButtons, Init(R,
NewSItem('~K~nee-Deep In The Dead',
NewSItem('~S~hores Of Hell',
NewSItem('~I~nferno!',
NewSItem('~L~oad External Wad File',
nil))))));
R.Assign(20,7,60,16);
Dialog1:=New(PDialog,Init(r,'Episodes'));
with Dialog1^ do begin
R.Assign(5,6,15,8);
Insert(New(PButton,Init(R,'~O~k',cmOk,bfDefault)));
R.Assign(25,6,35,8);
Insert(New(PButton,Init(R,'~C~ancel',cmCancel,bfNormal)));
Insert(SelGame);
end;
Control:=Desktop^.ExecView(Dialog1);
Episode:=SelGame^.Value + 1;
DmParam:='';
Param1:='';
if Episode=4 then begin
Dialog3:=New(PFileDialog,Init('*.WAD','Load External WAD','WAD Files',fdOkButton,jb));
Control:=Desktop^.ExecView(Dialog3);
if Control=cmFileOpen then
Control:=cmOk;
if Control=cmOK then begin
ExtFile:=Dialog3^.Directory^+(Dialog3^.FileName^.Data^);
R.Assign(2, 1, 28, 10);
FindLevelNames(ExtFile,LevelNames,R,SelLevel);
if WadResult<>wrOk then
exit;
if LevelNames[1]='' then begin
Param1:='';
MessageBox('No valid level entries found.',Nil,mfError+mfOkButton);
control:=cmCancel;
end
else begin
Episode:=4;
Param1:='-file '+ExtFile+' ';
end;
end;
Dialog3^.Done;
Dispose(Dialog3);
end;
if Control=cmOK then begin
R.Assign(30,10,55,14);
ComPort:=New(PRadioButtons, Init(R,
NewSItem('COM1',
NewSItem('COM2',
NewSItem('COM3',
NewSItem('COM4',
nil))))));
R.Assign(2,11,28,14);
SelModem:=New(PRadioButtons, Init(R,
NewSItem('~A~lready Connected',
NewSItem('~W~ait For Call',
NewSItem('~D~ial:',
nil)))));
R.Assign(12,13,25,14);
DialNum:=New(PInputLine, Init(R,11));
R.Assign(30, 4, 55, 9);
SelSkill:=New(PRadioButtons, Init(R,
NewSItem('~I~''m too young to die',
NewSItem('~H~ey Not too Rough',
NewSItem('H~u~rt Me Plenty',
NewSItem('U~l~tra Violence',
NewSItem('~N~ightmare!',
nil)))))));
R.Assign(30, 1, 50, 3);
Monsters:=New(PCheckBoxes, Init(R,
NewSItem('No ~M~onsters',
NewSItem('~D~eath Match',
nil))));
R.Assign(2, 1, 28, 10);
if Episode < 4 then
SetLevelData(R,SelLevel,Episode);
R.Assign(11,2,69,20);
Dialog2:=New(PDialog,Init(r,'Game Options'));
with Dialog2^ do begin
Insert(SelModem);
Insert(DialNum);
Insert(Monsters);
Insert(SelSkill);
Insert(ComPort);
R.Assign(15,15,25,17);
Insert(New(PButton,Init(R,'~C~ancel',cmCancel,bfNormal)));
R.Assign(2,15,12,17);
Insert(New(PButton,Init(R,'~O~k',cmOk,bfDefault)));
Insert(SelLevel);
end;
Control:=Desktop^.ExecView(Dialog2);
if Control=cmOk then begin
DmParam:='';
if SelModem^.Value = 2 then
DmParam:=DmParam+'-dial '+DialNum^.Data^;
if SelModem^.Value = 1 then
DmParam:=DmParam+'-answer ';
if Episode < 4 then begin
Str(Episode,TmpStr);
DmParam:=DmParam+'-devparm -warp '+TmpStr+' ';
Str(SelLevel^.Value + 1,TmpStr);
DmParam:=DmParam+TmpStr
end
else begin
DmParam:=DmParam+'-devparm -warp ';
DmParam:=DmParam+LevelNames[SelLevel^.Value+1][2]+' ';
DmParam:=DmParam+LevelNames[SelLevel^.Value+1][4];
end;
Str(SelSkill^.Value + 1,TmpStr);
DmParam:=DmParam+' -skill '+TmpStr+' ';
DmParam:=DmParam+' -COM';
Str(ComPort^.Value + 1,TmpStr);
ModeParam:='COM'+TmpStr+':9600,N,8,1';
DmParam:=DmParam+TmpStr+' ';
if (Monsters^.Value and 1) = 1 then
DmParam:=DmParam+'-nomonsters ';
if (Monsters^.Value and 2) = 2 then
DmParam:=DmParam+'-deathmatch ';
end
else
Param1:='';
Dialog2^.Done;
Dispose(Dialog2);
Param1:=Param1+DmParam;
end;
Param1:=Param1+DmParam;
Param2:=ModeParam;
Dialog1^.Done;
Dispose(Dialog1);
end;
end;
end;
Constructor TMyApp.Init;
var Regs:Registers;
E:TEvent;
AboutBox:PWindow;
R:TRect;
ch:char;
begin
TApplication.Init;
if not Debug then begin
R.Assign(28,6,52,15);
AboutBox:=New(PWindow,Init(R,'',0));
With AboutBox^ do begin
Flags:=0;
R.Assign(4,2,21,3);
Insert(New(PStaticText,Init(R,'DOOM! Front End')));
R.Assign(11,4,13,5);
Insert(New(PStaticText,Init(R,'by')));
R.Assign(4,6,21,7);
Insert(New(PStaticText,Init(R,'Jackson Software')));
end;
Desktop^.Insert(AboutBox);
delay(1000);
Desktop^.Delete(AboutBox);
AboutBox^.Done;
end;
Regs.ax:=$7A00;
Intr($2F,Regs);
if Regs.al <> $FF then
DisableCommands([cmIPXMenu]);
while keypressed do
ch:=ReadKey;
E.What:=evKeyDown;
E.Command:=evKeyDown;
E.KeyCode:=kbAltG;
PutEvent(E);
end;
Procedure TMyApp.Idle;
begin
Inherited Idle;
{ Gotoxy(65,1);
writeln(MemAvail);}
end;
Procedure TMyApp.HandleEvent(Var Event:TEvent);
begin
TApplication.HandleEvent(Event);
if Event.What=evCommand then begin
Case Event.Command of
cmOnePlayerMenu:OnePlayerMenu;
cmSerialMenu:SerialMenu;
cmIPXMenu:IPXMenu;
cmModemMenu:ModemMenu;
cmViewMaps:ViewMaps;
else
exit;
end;
ClearEvent(Event);
end;
end;
procedure TMyApp.InitMenuBar;
var r:TRect;
begin
GetExtent(r);
R.B.Y:=1;
MenuBar:=New(PMenuBar,Init(r,NewMenu(
NewSubMenu('~G~ames',hcNoContext,NewMenu(
NewItem('~O~ne Player','',0,cmOnePlayerMenu,hcNoContext,
NewItem('~S~erial Link','',0,cmSerialMenu,hcNoContext,
NewItem('~I~PX Network','',0,cmIPXMenu,hcNoContext,
NewItem('~M~odem Link','',0,cmModemMenu,hcNoContext,
Nil))))),
NewSubMenu('~V~iewers',hcNoContext,NewMenu(
NewItem('~M~aps','',0,cmViewMaps,hcNoContext,
Nil)),
Nil)))));
end;
Function TMyApp.GetPalette:PPalette;
const MyBackColor:TPalette=CColor;
var t:integer;
begin
for t:=8 to 15 do
MyBackColor[t+24]:=MyBackColor[t];
MyBackColor[46]:=#16;
MyBackColor[50]:=#15;
MyBackColor[42]:=#$2F;
MyBackColor[47]:=#23;
MyBackColor[48]:=#31;
MyBackColor[49]:=#30;
GetPalette:=@MyBackColor;
end;
Procedure TMyApp.RunDoom(GameType:integer;Params:string);
var RunName:String;
R:TRect;
e:TEvent;
S,Rn:array[0..79] of char;
InfoBox:PWindow;
SwapErr:word;
begin
case GameType of
gtNormal:RunName:='DOOM.EXE';
gtModem,gtSerial,gtDirLinkModem:RunName:='SERSETUP.EXE';
gtIPXNet:RunName:='IPXSETUP.EXE';
gtSetMode:RunName:='MODE.COM';
end;
if GameType=gtSetMode then begin
StrPCopy(Rn,RunName);
FileSearch(S,Rn,GetEnvVar('Path'));
RunName:=strpas(s);
R.Assign(20,8,60,11);
InfoBox:=New(PWindow, Init(R,'',0));
R.Assign(5,1,35,2);
InfoBox^.Insert(New(PStaticText, Init(R,'Initializing: '+Params)));
InfoBox^.Flags:=0;
DeskTop^.Insert(InfoBox);
if RunName<>'' then begin
DoneDosMem;
SwapVectors;
Exec(RunName,Params+' >NUL');
SwapVectors;
InitDosMem;
DeskTop^.Delete(InfoBox);
InfoBox^.Done;
end
else begin
DeskTop^.Delete(InfoBox);
InfoBox^.Done;
R.Assign(20,8,60,11);
InfoBox:=New(PWindow, Init(R,'**Error**',0));
R.Assign(5,1,35,2);
InfoBox^.Insert(New(PStaticText, Init(R,'Could Not Locate MODE.COM')));
InfoBox^.Flags:=0;
DeskTop^.Insert(InfoBox);
delay(2000);
DeskTop^.Delete(InfoBox);
InfoBox^.Done;
end
end {If GameType}
else begin
DoneSysError;
DoneEvents;
DoneVideo;
DoneDosMem;
if Debug then
writeln(RunName,' ',Params);
{$IFNDEF DPMI}
SwapErr:=ExecPrg(RunName+' '+Params);
{$ELSE}
Exec(RunName,Params);
{$ENDIF}
delay(500);
InitDosMem;
InitVideo;
InitEvents;
InitSysError;
Redraw;
E.What:=evKeyDown;
E.Command:=evKeyDown;
E.KeyCode:=kbAltG;
PutEvent(E);
end;
end;
Procedure TMyApp.OnePlayerMenu;
var DmParam,TmpStr:String;
begin
SetMenuData(1,DmParam,TmpStr);
if DmParam<>'' then
RunDoom(gtNormal,DmParam);
end;
Procedure TMyApp.SerialMenu;
var ModeParam,DmParam:String;
begin
SetMenuData(2,DmParam,ModeParam);
if DmParam<>'' then begin
RunDoom(gtSetMode,ModeParam);
RunDoom(gtSerial,DmParam);
end;
end;
Procedure TMyApp.IPXMenu;
var DmParam,TmpStr:String;
begin
SetMenuData(3,DmParam,TmpStr);
if DmParam<>'' then
RunDoom(gtIPXNet,DmParam);
end;
Procedure TMyApp.ModemMenu;
var ModeParam,DmParam:String;
begin
SetMenuData(4,DmParam,ModeParam);
if DmParam<>'' then begin
RunDoom(gtSetMode,ModeParam);
RunDoom(gtModem,DmParam);
end;
end;
Procedure TMyApp.ViewMaps;
var r:TRect;
Episode,Control:integer;
SelGame,Monsters,SelSkill:PCluster;
SelLevel:PRadioButtons;
Dialog1,Dialog2:PDialog;
Dialog3:PFileDialog;
TmpStr:String;
ExtFile,WadName:PathStr;
DmParam:ObjNameStr;
ViewerMask,ThingMask:word;
LevelNames:LevelNameArray;
begin
R.Assign(2,1,30,5);
SelGame:=New(PRadioButtons, Init(R,
NewSItem('~K~nee-Deep In The Dead',
NewSItem('~S~hores Of Hell',
NewSItem('~I~nferno!',
NewSItem('~E~xternal Map',
nil))))));
R.Assign(20,7,60,16);
Dialog1:=New(PDialog,Init(r,'Episodes'));
with Dialog1^ do begin
R.Assign(5,6,15,8);
Insert(New(PButton,Init(R,'~O~k',cmOk,bfDefault)));
R.Assign(25,6,35,8);
Insert(New(PButton,Init(R,'~C~ancel',cmCancel,bfNormal)));
Insert(SelGame);
end;
Control:=Desktop^.ExecView(Dialog1);
Episode:=SelGame^.Value + 1;
ExtFile:='DOOM.WAD';
if Episode=4 then begin
Dialog3:=New(PFileDialog,Init('*.WAD','Load External WAD','WAD Files',fdOpenButton,100));
Control:=ExecView(Dialog3);
if Control=cmFileOpen then
Control:=cmOk;
if Control=cmOK then begin
ExtFile:=Dialog3^.Directory^+(Dialog3^.FileName^.Data^);
R.Assign(2, 1, 28, 10);
FindLevelNames(ExtFile,LevelNames,R,SelLevel);
if WadResult<>wrOk then
exit;
if LevelNames[1]='' then begin
MessageBox('No valid level entries found.',Nil,mfError+mfOkButton);
Control:=cmCancel;
end;
Episode:=4;
end;
Dialog3^.Done;
Dispose(Dialog3);
end;
if Control=cmOK then begin
R.Assign(30, 6, 55, 11);
SelSkill:=New(PRadioButtons, Init(R,
NewSItem('~I~''m too young to die',
NewSItem('~H~ey Not too Rough',
NewSItem('H~u~rt Me Plenty',
NewSItem('U~l~tra Violence',
NewSItem('~N~ightmare!',
nil)))))));
R.Assign(30, 1, 50, 5);
Monsters:=New(PCheckBoxes, Init(R,
NewSItem('Show ~M~onsters',
NewSItem('Show ~W~eapons',
NewSItem('Show ~G~oodies',
NewSItem('Muti~P~layer',
nil))))));
R.Assign(2, 1, 28, 10);
SetLevelData(R,SelLevel,Episode);
R.Assign(11,2,69,16);
Dialog2:=New(PDialog,Init(r,'Map Viewer Options'));
with Dialog2^ do begin
Insert(Monsters);
Insert(SelSkill);
R.Assign(15,11,25,13);
Insert(New(PButton,Init(R,'~C~ancel',cmCancel,bfNormal)));
R.Assign(2,11,12,13);
Insert(New(PButton,Init(R,'~O~k',cmOk,bfDefault)));
Insert(SelLevel);
end;
Control:=Desktop^.ExecView(Dialog2);
ViewerMask:=0;
ThingMask:=0;
if Control=cmOk then begin
if Episode < 4 then begin
DmParam:='E M ';
Str(Episode,TmpStr);
DmParam[2]:=TmpStr[1];
Str(SelLevel^.Value + 1,TmpStr);
DmParam[4]:=TmpStr[1];
end
else begin
TmpStr:=LevelNames[SelLevel^.Value + 1]+' ';
move(TmpStr[1],DmParam[1],8);
end;
if (Monsters^.Value and 1) = 1 then
ViewerMask:=ViewerMask or 1;
if (Monsters^.Value and 2) = 2 then
ViewerMask:=ViewerMask or 4;
if (Monsters^.Value and 4) = 4 then
ViewerMask:=ViewerMask or 2;
if (Monsters^.Value and 8) = 8 then
ViewerMask:=ViewerMask or 64;
if (SelSkill^.Value=3) or (SelSkill^.Value=4) then
ViewerMask:=ViewerMask or 32;
if SelSkill^.Value=2 then
ViewerMask:=ViewerMask or 16;
if (SelSkill^.Value=0) or (SelSkill^.Value=1) then
ViewerMask:=ViewerMask or 8;
DoneSysError;
DoneEvents;
DoneVideo;
TerminateOnWadError:=True;
WadName:=ExtFile;
ViewMap(WadName,DmParam,ViewerMask,0);
TerminateOnWadError:=False;
InitVideo;
InitEvents;
InitSysError;
Redraw;
end;
Dialog2^.Done;
Dispose(Dialog2);
end;
Dialog1^.Done;
Dispose(Dialog1);
end;
begin
{$IFNDEF DFE}
writeln('Please include the conditional symbol DFE in you compiler options');
writeln('and recompile DFE!');
halt;
{$ENDIF}
{$IFNDEF DPMI}
if (ParamStr(1)='/NOEMS') or (ParamStr(1)='/noems') then
AllowEMSswap:=False;
if (ParamStr(1)='-NOEMS') or (ParamStr(1)='-noems') then
AllowEMSswap:=False;
if not AllowEMSswap then
writeln('EMS_Swap: disabled');
delay(1000);
{$ENDIF}
TerminateOnWadError:=False;
{$IFDEF DPMI}
writeln;
write('================================>>WARNING<<=====================================');
writeln('SysDPMI_Init:');
writeln;
writeln('DFE is not designed to be compiled under DPMI! You will not be able to');
writeln('successfully launch DOOM with the current system configuration. Please');
writeln('recompile for real mode before attempting to execute DOOM.');
writeln;
writeln(' Press ENTER to continue.');
write('================================================================================');
readln;
{$ENDIF}
writeln('SysApplication_Init');
delay(500);
MyApp.Init;
MyApp.Run;
MyApp.Done;
end.