home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / top2src.zip / BJ4TOP.ZIP / BJBAK.PAS < prev    next >
Pascal/Delphi Source File  |  1996-05-08  |  60KB  |  1,725 lines

  1. {$M 16384,0,0}
  2. {$V-}
  3. Program Blackjack4TOP;
  4. Uses DOS, Crt, BJSupp;
  5.  
  6. Type
  7.   IDXRec = Record
  8.              RecLen : Word;
  9.              Alias : String[30];
  10.              RealName : String[40];
  11.              Baud : Word;
  12.              Location : String[30];
  13.              Gender : Word;
  14.              Quiet : Byte;
  15.              Task : Word;
  16.              LastTime : LongInt;
  17.              Channel : LongInt;
  18.              Listed : Byte;
  19.              Security : Word;
  20.              Actions : Byte;
  21. {             Buf : Array [1..346] of byte;}
  22.            end;
  23.  
  24.   Str30 = String[30];
  25.   Str255 = String[255];
  26.  
  27.   NodeRec = Record
  28.              RecLen : Word;
  29.              Kind : Integer;
  30.              From : Integer;
  31.              DoneTo : Integer;
  32.              Gender : Integer;
  33.              Alias : Str30;
  34.              Data : Str255;
  35.              Channel : LongInt;
  36.              MinSec : Word;
  37.              MaxSec : Word;
  38.              Data1 : LongInt;
  39.            end;
  40.  
  41.   ConfigRec = Record
  42.                 StartCD : Word;
  43.                 BetCD : Byte;
  44.                 MaxBet : Byte;
  45.                 MinBet : Byte;
  46.                 TimeBetweenGames : Byte;
  47.                 FirstWarn : Byte;
  48.                 SecondWarn : Byte;
  49.                 BootFromBJ : Byte;
  50.               end;
  51.  
  52. Type
  53.   RegisterRec = record
  54.                   TheReg : string;
  55.                   TheName : string;
  56.                 end;
  57. Const
  58.   RegisterData : RegisterRec
  59.                = ( TheReg : '00000000000';
  60.                    TheName : '[UNREGISTERED]');
  61.  
  62.   ProgVerStr = ' v0.91';
  63.  
  64.   fmReadOnly  = $00;
  65.   fmWriteOnly = $01;
  66.   fmReadWrite = $02;
  67.  
  68.   fmDenyAll   = $10;
  69.   fmDenyWrite = $20;
  70.   fmDenyRead  = $30;
  71.   fmDenyNone  = $40;
  72.  
  73.   ConfigData : ConfigRec
  74.                = ( StartCD : 1000;
  75.                    BetCD : 10;
  76.                    MaxBet : 100;
  77.                    MinBet : 10;
  78.                    TimeBetweenGames : 19;
  79.                    FirstWarn : 60;
  80.                    SecondWarn : 90;
  81.                    BootFromBJ : 125
  82.                   );
  83.  
  84.   HelpData : Array[1..15] of String = (
  85.   #13#10'^A^oEnter ^A^n/BJ BET ^A^m<amount> ^A^oto change your bet (cannot be done during a game).',
  86.   '^A^oEnter ^A^n/BJ CD ^A^oor ^A^n/BJ $ ^A^ofor your current number of Cyberdollars.',
  87.   '^A^oEnter ^A^n/BJ DOUBLE ^A^oto double down.',
  88.   '^A^oEnter ^A^n/BJ DOUBLE 2 ^A^oto double down on your second hand.',
  89.   '^A^oEnter ^A^n/BJ HAND ^A^oto view the dealer''s and your own cards.',
  90.   '^A^oEnter ^A^n/BJ HELP ^A^ofor this commands list.',
  91.   '^A^oEnter ^A^n/BJ HIT ^A^oto be dealt a card.',
  92.   '^A^oEnter ^A^n/BJ HIT 2 ^A^oto be dealt a card to your second hand.',
  93.   '^A^oEnter ^A^n/BJ INSURE ^A^oto make an insurance bet against a blackjack.',
  94.   '^A^oEnter ^A^n/BJ OFF ^A^oto be dealt out of blackjack.',
  95.   '^A^oEnter ^A^n/BJ ON ^A^oto join in the next game of blackjack.',
  96.   '^A^oEnter ^A^n/BJ SCAN ^A^oto see who''s playing blackjack.',
  97.   '^A^oEnter ^A^n/BJ SPLIT ^A^oto split your hand.',
  98.   '^A^oEnter ^A^n/BJ STAY ^A^oto end your turn.',
  99.   '^A^oEnter ^A^n/BJ TURN ^A^oto see who''s turn it is.'#13#10);
  100.  
  101.   ComList : Array[1..16] of String = ('BJ BET', 'BJ $',
  102.   'BJ CD', 'BJ DOUBLE', 'BJ DOUBLE2', 'BJ HAND', 'BJ HELP', 'BJ HIT',
  103.   'BJ HIT 2', 'BJ INSURE', 'BJ OFF', 'BJ ON', 'BJ SCAN', 'BJ SPLIT',
  104.   'BJ STAY', 'BJ TURN');
  105.  
  106.  
  107. Var
  108.   IPCDir : String;
  109.   Node : Byte;
  110.   NodeStr : String;
  111.   NodeData : NodeRec;
  112.   NodeData2 : NodeRec;
  113.   GamePlaying : Boolean;
  114.   L : Word;
  115.   Sec : Word;
  116.   OldSec : Word;
  117.   SecPassed : Word;
  118.   NodeTurn : Integer;
  119.   NodeStat : Array [1..255] of Byte; { 0 = Not in game }
  120.                                      { 1 = Waiting }
  121.                                      { 2 = In game }
  122.   NodeCD : Array [1..255] of LongInt;
  123.   NodeInsure : Array [1..255] of Boolean;
  124.   NodeHand : Array [1..255] of String[24];
  125.   NodeHand2 : Array [1..255] of String[24];
  126.   NodeDoneH1 : Array [1..255] of Boolean;
  127.   NodeDoneH2 : Array [1..255] of Boolean;
  128.   NodeBet : Array [1..255] of byte;
  129.   NodeDD : Array [1..255] of byte;
  130.   NodeDD2 : Array [1..255] of byte;
  131.   UsedCards : String;
  132.   DealerHand : String[40];
  133.  
  134. Procedure InitScr;
  135. Var
  136.   Loop : Word;
  137. begin
  138.   TextAttr := $71;
  139.   ClrScr;
  140.   GotoXY (1,2);
  141.   For loop := 1 to 1920 do Write ('░');
  142.   Textbackground (blue);
  143.   GotoXY (1,1);
  144.   Textbackground (7);
  145.   Textcolor (red);
  146.   Write (' Blackjack for TOP'+ProgVerStr);
  147.   Textcolor (0);
  148.   Write (' Configuration (c) 1994 by David Ong, OmniWare(tm)');
  149.   ClrEol;
  150.   GotoXY (1,25);
  151.   Textcolor (Red);
  152.   Write (' Help: ');
  153.   Textcolor (0);
  154.   Write ('Use cursor keys to select a choice.');
  155.   ClrEol;
  156.   WindowBorder (4,3,60,13,White,7);
  157.   TextAttr := $7F;
  158.   GotoXY (27,3);
  159.   Write ('┤ Config ├');
  160.   GotoXY (6,4);
  161.   Textcolor (0);
  162.   Writeln ('Starting Cyberdollars:');
  163.   GotoXY (6,5);
  164.   Writeln ('Minimum bet:');
  165.   GotoXY (6,6);
  166.   Writeln ('Maximum bet: ');
  167.   GotoXY (6,7);
  168.   Writeln ('Time between games:');
  169.   GotoXY (6,8);
  170. {  For Loop := 1 to 9 do WriteField (Loop);}
  171. end;
  172.  
  173. Procedure ConfigureBJ;
  174. begin
  175.   InitScr;
  176.   Halt;
  177. end;
  178.  
  179. Procedure SaveReg;
  180. Var
  181.   ExeFile    : file;
  182.   HeaderSize : word;
  183.   FileName : String;
  184.  
  185. begin
  186.   FileName := ParamStr (0);
  187.   Writeln ('Writing registration codes to ', FileName);
  188.   Assign (ExeFile, FileName);
  189.   Reset (ExeFile, 1);
  190.   Seek      (ExeFile, 8);
  191.   Blockread (ExeFile, HeaderSize, Sizeof (HeaderSize));
  192.   Seek      (ExeFile, Longint(16) * (seg(RegisterData)
  193.             - PrefixSeg + HeaderSize) + ofs (RegisterData) - 256);
  194.   Blockwrite (ExeFile, RegisterData, sizeof (RegisterData));
  195.   Close      (ExeFile);
  196. end;
  197.  
  198. Procedure Enter_Reg;
  199. begin
  200.   Writeln;
  201.   Writeln ('BJ4TOP Registration--Your registration code and named will be saved to');
  202.   Writeln ('  the ', ParamStr(0), ' file.');
  203.   Writeln;
  204.   Write ('Your Name (Please note it is case sensitive): ');
  205.   Readln (RegisterData.TheName);
  206.   Write ('Registration Number:');
  207.   Readln (RegisterData.TheReg);
  208.   Writeln;
  209. {  UserName := RegisterData.TheName;}
  210. {  RegisterNum := RegisterData.TheReg;}
  211. {  Check_Register;}
  212. {  If Registered then Writeln ('The registration number checks out, thank you
  213. for registering')}
  214. {  else}
  215.   begin
  216.     Writeln ('The registration number doesn''t check out, make sure you''ve entered');
  217.     Writeln ('everything correctly!'+#7);
  218.     Writeln;
  219.     Writeln ('Name and registration number not saved.');
  220.     Halt (1);
  221.   end;
  222.   Writeln;
  223.   If Not FExists (ParamStr (0)) then Writeln ('Error: The file '+ParamStr(0)+' could not be written to.'+#7)
  224.   else SaveReg;
  225. end;
  226.  
  227. Procedure InitProgram;
  228. begin
  229.   Randomize;
  230.   Writeln;
  231.   Writeln ('Blackjack for TOP'+ProgVerStr);
  232.   Writeln ('Original BJ4RAP program Copyright 1995 David Ong, OmniWare(tm)');
  233.   Writeln ('TOP modifications Copyright 1996 Paul Sidorsky, ISMWare, All Rights Reserved.');
  234.   Writeln;
  235.   If ParamCount < 1 then
  236.   begin
  237.     Writeln ('Command line parameter(s) missing!');
  238.     Writeln;
  239.     Writeln ('Usage: BJ4TOP <work path> [<node>]');
  240.     Writeln;
  241.     Writeln ('<work path>  Is the path to TOP''s work directory.');
  242.     Writeln ('<node>       Is optional and if given will force BJ4TOP to use the node even');
  243.     Writeln ('             if it is already taken.');
  244.     Writeln;
  245.     Writeln ('Eg: BJ4TOP d:\top\workdir');
  246.     Writeln ('For further help refer to BJ4TOP.DOC');
  247.     Halt;
  248.   end;
  249. {  RegisterKey := '#####';}
  250. {  UserName := RegisterData.TheName;}
  251. {  RegisterNum := RegisterData.TheReg;}
  252. {  Check_Register;}
  253.   If UpStr(ParamStr (1)) = '/REGISTER' then
  254.   begin
  255.     Enter_Reg;
  256.     Halt;
  257.   end;
  258. { If UpStr(ParamStr(1)) = '/CONFIG' then ConfigureBJ;}
  259.   IPCDir := ParamStr(1);
  260.   If IPCDir[Length(IPCDir)] <> '\' then IPCDir := IPCDir + '\';
  261.   FileMode:=fmReadWrite+FmDenyNone;
  262.   If not FExists (IPCDir + 'NODEIDX.TCH') then
  263.   begin
  264.     Writeln ('Error: The NODEIDX.TCH file was not found in the ', UpStr(IPCDir), ' directory!');
  265.     Writeln ('Make sure TOP uses the same work path and has been previously run or is'#13#10'currently running.');
  266.     Halt;
  267.   end;
  268.   If not FExists (IPCDir + 'NODEIDX2.TCH') then
  269.   begin
  270.     Writeln ('Error: The NODEIDX2.TCH file was not found in the ', UpStr(IPCDir), ' directory!');
  271.     Writeln ('Make sure TOP uses the same work path and has been previously run or is'#13#10'currently running.');
  272.     Halt;
  273.   end;
  274. end;
  275.  
  276. Function UnUsedNode : byte;
  277. Var
  278.   f : file of byte;
  279.   L : byte;
  280.   B : byte;
  281.   Error : Integer;
  282. begin
  283.   If Paramcount < 2 then
  284.   begin
  285.     L := 0;
  286.     Assign (F, IPCDir + 'NODEIDX2.TCH');
  287.     Reset (f);
  288.     Repeat
  289.       Inc (l);
  290.       {$I-}
  291.       Repeat
  292.         Read (f,b);
  293.       Until IOResult = 0;
  294.       {$I+}
  295.     Until b = 0;
  296.     Close (f);
  297.   end
  298.   else
  299.   begin
  300.     Val (ParamStr(2), L, Error);
  301.     If (Error <> 0) or (L = 0) then
  302.     begin
  303.       Writeln ('Invalid forced node passed!');
  304.       Writeln ('Node must be from 1 to 255');
  305.       Halt;
  306.     end;
  307.   end;
  308.   UnUsedNode := L;
  309. end;
  310.  
  311. Procedure TakeNode;
  312. Var
  313.   L : byte;
  314.   B : byte;
  315.   f : File of byte;
  316.   IDXFile : File of IDXRec;
  317.   IDXData : IDXRec;
  318. begin
  319.   L := 0;
  320.   Assign (f, IPCDir + 'MSG'+NodeStr+'.TCH');
  321.   Rewrite (f);
  322.   Close (f);
  323.   Assign (f, IPCDir + 'MIX'+NodeStr+'.TCH');
  324.   Rewrite (f);
  325.   Close (f);
  326.   Assign (F, IPCDir + 'NODEIDX2.TCH');
  327.   Reset (f);
  328.   Seek (f, Node);
  329.   b := 1;
  330.   {$I-}
  331.   Repeat
  332.     Write (f,b);
  333.   Until IOResult = 0;
  334.   {$I+}
  335.   Close (f);
  336.   Assign (IDXFile, IPCDir + 'NODEIDX.TCH');
  337.   Reset (IDXFile);
  338.   Seek (IDXFile, Node);
  339.   FillChar (IDXData, SizeOf(IDXData), #0);
  340.   IDXData.Alias := 'A^pBJ'#8'lackjack Dealer'#0;
  341.   IDXData.Alias[0] := '^';
  342.   IDXData.RealName := 'J'#0;
  343.   IDXData.RealName[0] := 'B';
  344.   IDXData.Baud := 0;
  345. {  If registered then}
  346. {  begin
  347.     IDXData.Location := 'egistered'+#0;
  348.     IDXData.Location[0] := 'R';
  349.   end}
  350.   {else}
  351.   begin
  352.     IDXData.Location := 'NREGISTERED'+#0;
  353.     IDXData.Location[0] := 'U';
  354.   end;
  355.   IDXData.Gender := 0;
  356.   IDXData.LastTime := 0;
  357.   IDXData.Channel := 1;
  358.   IDXData.Listed := 1;
  359.   IDXData.Security := 65535;
  360.   {$I-}
  361.   Repeat
  362.     Write (IDXFile, IDXData);
  363.   Until IOResult = 0;
  364.   {$I+}
  365.   Close (IDXFile);
  366. end;
  367.  
  368. Procedure SendMSG (N : byte; NodeData : NodeRec);
  369. Var
  370.   b : byte;
  371.   f : File of byte;
  372.   NodeFile : File of NodeRec;
  373. begin
  374.   Assign (f, IPCDir + 'MIX' + PaddedNum(N)+'.TCH');
  375.   Reset (f);
  376.   b := 0;
  377.   If not Eof (f) then
  378.   Repeat
  379.     {$I-}
  380.     Repeat
  381.       Read (f,b);
  382.     Until IOResult = 0;
  383.     {$I+}
  384.     If Eof (f) then
  385.     begin
  386.       b := 0;
  387.       Write (f,b);
  388.     end;
  389.   Until B = 0
  390.   else Write (f,b);
  391.   b := 1;
  392.   Seek (f, FilePos(f) - 1);
  393.   {$I-}
  394.   Repeat
  395.     Write (f,b);
  396.   Until IOResult = 0;
  397.   {$I+}
  398.   Assign (NodeFile, IPCDir + 'MSG' + PaddedNum(N)+'.TCH');
  399.   Reset (NodeFile);
  400.   Seek (NodeFile, FilePos(f) - 1);
  401.   {$I-}
  402.   Repeat
  403.     Write (NodeFile, NodeData);
  404.   Until IOResult = 0;
  405.   {$I+}
  406.   Close (NodeFile);
  407.   Close (f);
  408.   Assign (F, IPCDir + 'CHGIDX.TCH');
  409.   Reset (f);
  410.   Seek (f, N);
  411.   b := 1;
  412.   {$I-}
  413.   Repeat
  414.     Write (f,b);
  415.   Until IOResult = 0;
  416.   {$I+}
  417.   Close (f);
  418. end;
  419.  
  420. Procedure BroadCast (T : Byte; Alias : Str30; Data : Str255);
  421. Var
  422.   IDX2 : File of byte;
  423.   b : byte;
  424.   L : Word;
  425.   NodeData : NodeRec;
  426. begin
  427.   FillChar (NodeData, SizeOf(NodeData), #0);
  428.   NodeData.Doneto := -1;
  429.   Alias := Alias + #0;
  430.   Data := Data + #0;
  431.   NodeData.Kind := T;
  432.   NodeData.From := Node;
  433.   NodeData.Alias := Minus1 (Alias);
  434.   NodeData.Alias[0] := Alias[1];
  435.   NodeData.Data := Minus1 (Data);
  436.   NodeData.Data[0] := Data[1];
  437.   NodeData.Channel := 1;
  438.   NodeData.MinSec := 0;
  439.   NodeData.Data1 := 0;
  440.   Assign (IDX2, IPCDir + 'NODEIDX2.TCH');
  441.   {$I-}
  442.   Repeat
  443.     Reset (IDX2);
  444.   Until IOResult = 0;
  445.   {$I+}
  446.   For L := 0 to (FileSize(IDX2) - 1) do
  447.   begin
  448.     {$I-}
  449.     Repeat
  450.       Read (IDX2, b);
  451.     Until IOResult = 0;
  452.     {$I+}
  453.     If (L <> Node) and (b=1) and (NodeStat[L] <> 0) then SendMSG (L, NodeData);
  454.   end;
  455.   Close (IDX2);
  456. end;
  457.  
  458. Procedure BroadCastAll (T : Byte; Alias : Str30; Data : Str255);
  459. Var
  460.   IDX2 : File of byte;
  461.   b : byte;
  462.   L : Word;
  463.   NodeData : NodeRec;
  464. begin
  465.   FillChar (NodeData, SizeOf(NodeData), #0);
  466.   NodeData.Doneto := -1;
  467.   Alias := Alias + #0;
  468.   Data := Data + #0;
  469.   NodeData.Kind := T;
  470.   NodeData.From := Node;
  471.   NodeData.Alias := Minus1 (Alias);
  472.   NodeData.Alias[0] := Alias[1];
  473.   NodeData.Data := Minus1 (Data);
  474.   NodeData.Data[0] := Data[1];
  475.   NodeData.Channel := 1;
  476.   NodeData.MinSec := 0;
  477.   NodeData.Data1 := 0;
  478.   Assign (IDX2, IPCDir + 'NODEIDX2.TCH');
  479.   {$I-}
  480.   Repeat
  481.     Reset (IDX2);
  482.   Until IOResult = 0;
  483.   {$I+}
  484.   For L := 0 to (FileSize(IDX2) - 1) do
  485.   begin
  486.     {$I-}
  487.     Repeat
  488.       Read (IDX2, b);
  489.     Until IOResult = 0;
  490.     {$I+}
  491.     If (L <> Node) and (b=1) then SendMSG (L, NodeData);
  492.   end;
  493.   Close (IDX2);
  494. end;
  495.  
  496. Procedure BroadCastAllBut (T : Byte; Alias : Str30; Data : Str255; NoSend : Byte);
  497. Var
  498.   IDX2 : File of byte;
  499.   b : byte;
  500.   L : Word;
  501.   NodeData : NodeRec;
  502. begin
  503.   FillChar (NodeData, SizeOf(NodeData), #0);
  504.   NodeData.Doneto := -1;
  505.   Alias := Alias + #0;
  506.   Data := Data + #0;
  507.   NodeData.Kind := T;
  508.   NodeData.From := node;
  509.   NodeData.Alias := Minus1 (Alias);
  510.   NodeData.Alias[0] := Alias[1];
  511.   NodeData.Data := Minus1 (Data);
  512.   NodeData.Data[0] := Data[1];
  513.   NodeData.Channel := 1;
  514.   NodeData.MinSec := 0;
  515.   NodeData.Data1 := 0;
  516.   Assign (IDX2, IPCDir + 'NODEIDX2.TCH');
  517.   {$I-}
  518.   Repeat
  519.     Reset (IDX2);
  520.   Until IOResult = 0;
  521.   {$I+}
  522.   For L := 0 to (FileSize(IDX2) - 1) do
  523.   begin
  524.     {$I-}
  525.     Repeat
  526.       Read (IDX2, b);
  527.     Until IOResult = 0;
  528.     {$I+}
  529.     If (L <> Node) and (b=1) and (NoSend <> L) then SendMSG (L, NodeData);
  530.   end;
  531.   Close (IDX2);
  532. end;
  533.  
  534. Procedure GiveMSG (T : Byte; Alias : Str30; Data : Str255; Node : Byte);
  535. Var
  536.   IDX2 : File of byte;
  537.   b : byte;
  538.   L : Word;
  539.   NodeData : NodeRec;
  540. begin
  541.   FillChar (NodeData, SizeOf(NodeData), #0);
  542.   NodeData.Doneto := -1;
  543.   Alias := Alias + #0;
  544.   Data := Data + #0;
  545.   NodeData.Kind := T;
  546.   NodeData.From := node;
  547.   NodeData.Alias := Minus1 (Alias);
  548.   NodeData.Alias[0] := Alias[1];
  549.   NodeData.Data := Minus1 (Data);
  550.   NodeData.Data[0] := Data[1];
  551.   NodeData.Channel := 1;
  552.   NodeData.MinSec := 0;
  553.   NodeData.Data1 := 0;
  554.   SendMSG (Node, NodeData);
  555. end;
  556.  
  557. Procedure BroadCastBut (T : Byte; Alias : Str30; Data : Str255; NoSend : Byte);
  558. Var
  559.   IDX2 : File of byte;
  560.   b : byte;
  561.   L : Word;
  562.   NodeData : NodeRec;
  563. begin
  564.   FillChar (NodeData, SizeOf(NodeData), #0);
  565.   NodeData.Doneto := -1;
  566.   Alias := Alias + #0;
  567.   Data := Data + #0;
  568.   NodeData.Kind := T;
  569.   NodeData.From := node;
  570.   NodeData.Alias := Minus1 (Alias);
  571.   NodeData.Alias[0] := Alias[1];
  572.   NodeData.Data := Minus1 (Data);
  573.   NodeData.Data[0] := Data[1];
  574.   NodeData.Channel := 1;
  575.   NodeData.MinSec := 0;
  576.   NodeData.Data1 := 0;
  577.   Assign (IDX2, IPCDir + 'NODEIDX2.TCH');
  578.   {$I-}
  579.   Repeat
  580.     Reset (IDX2);
  581.   Until IOResult = 0;
  582.   {$I+}
  583.   For L := 0 to (FileSize(IDX2) - 1) do
  584.   begin
  585.     {$I-}
  586.     Repeat
  587.       Read (IDX2, b);
  588.     Until IOResult = 0;
  589.     {$I+}
  590.     If (L <> Node) and (b=1) and (L <> NoSend) and (NodeStat[L] <> 0) then SendMSG (L, NodeData);
  591.   end;
  592.   Close (IDX2);
  593. end;
  594.  
  595. Function NodeUser (I : Integer) : String;
  596. Var
  597.   IDXFile : File of IDXRec;
  598.   IDXData : IDXRec;
  599. begin
  600.   If I > 0 then
  601.   begin
  602.     Assign (IDXFile, IPCDir + 'NODEIDX.TCH');
  603.     Reset (IDXFile);
  604.     Seek (IDXFile, I);
  605.     {$I-}
  606.     Repeat
  607.       Read (IDXFile, IDXData);
  608.     Until IOResult = 0;
  609.     {$I+}
  610.     NodeUser := CStr (IDXData.Alias);
  611.     Close (IDXFile);
  612.   end
  613.   else NodeUser := 'everyone';
  614. end;
  615.  
  616. Function NodeGender (I : Word) : Boolean;
  617. Var
  618.   IDXFile : File of IDXRec;
  619.   IDXData : IDXRec;
  620. begin
  621.   If I > 0 then
  622.   begin
  623.     Assign (IDXFile, IPCDir + 'NODEIDX.TCH');
  624.     Reset (IDXFile);
  625.     Seek (IDXFile, I);
  626.     {$I-}
  627.     Repeat
  628.       Read (IDXFile, IDXData);
  629.     Until IOResult = 0;
  630.     {$I+}
  631.     Close (IDXFile);
  632.     NodeGender := IDXData.Gender = 1;
  633.   end
  634.   else NodeGender := False;
  635. end;
  636.  
  637. Procedure InitTOP;
  638. begin
  639.   Node := UnusedNode;
  640.   Writeln ('Logging onto TOP as node ', Node);
  641.   Str (Node, NodeStr);
  642.   NodeStr := PaddedNum (Node);
  643.   TakeNode;
  644.   BroadCastAll (2, '^A^pBJ'#8'lackjack Dealer', '');
  645.   BroadCastAll (9, '', '^I^i*** Blackjack'+ProgVerStr+' Game Module Active ***');
  646.   BroadCastAll (9, '', '^A^nThis program is registered to: ^A^p'+Registerdata.TheName);
  647. {  If not Registered then}
  648.     BroadCastAll (9, '', '^I^oBe sure to register soon!');
  649.   BroadCastAll (9, '', '^A^nType ^A^p/BJ HELP ^A^nfor the commands.');
  650. end;
  651.  
  652. Procedure DeInit;
  653. Var
  654.   B : byte;
  655.   f : File of byte;
  656. begin
  657.   BroadCastAll (3, '^A^mThe ^A^pBlackjack Dealer','');
  658.   BroadCastAll (9, '', '^I^i*** Blackjack'+ProgVerStr+' Game Module Deactivated ***');
  659.   Assign (F, IPCDir + 'NODEIDX2.TCH');
  660.   Reset (f);
  661.   Seek (f, node);
  662.   b := 0;
  663.   {$I-}
  664.   Repeat
  665.     Write (f,b);
  666.   Until IOResult = 0;
  667.   {$I+}
  668.   Close (f);
  669.   TextAttr := $07;
  670.   Window (1,1,80,25);
  671.   ClrScr;
  672. end;
  673.  
  674. Procedure InitScreen;
  675. begin
  676.   Delay (1000);
  677.   ClrScr;
  678.   TextAttr := $71;  { Grey on blue }
  679.   { Put background in, skipping the bottom line to create a status bar }
  680.   For L := 1 to 1920 do Write ('░');
  681.   TextAttr := $74;
  682.   GotoXY (1,1);   ClrEol;
  683.   GotoXY (8,1);  Writeln ('Blackjack for TOP'+ProgVerStr+' Copyright 1996 Paul Sidorsky All Rights Reserved.');
  684.   WindowBorder (5,3,74,21, White, Blue);
  685.   GotoXY (1,25);
  686.   TextAttr := $70;
  687.   Write (' Press <ESC> to deactivate blackjack');
  688.   ClrEol;
  689. {  If not registered then}
  690.   begin
  691.     GotoXY (67,25);
  692.     Textcolor (Red+Blink);
  693.     Textbackground (LightGray);
  694.     Write ('Unregistered');
  695.   end;
  696. {  else
  697.   begin
  698.     GotoXY (67,25);
  699.     Textcolor (Red);
  700.     Textbackground (LightGray);
  701.     Write ('Registered');
  702.   end;}
  703.   Window (6,4,73,20);
  704.   Textbackground (Blue);
  705.   Textcolor (Yellow);
  706.   Writeln ('Waiting for people to join blackjack.');
  707. end;
  708.  
  709. Procedure InitVars;
  710. begin
  711.   For L := 1 to 255 do
  712.   begin
  713.     NodeStat[L] := 0;
  714.     NodeCD[L] := ConfigData.StartCD;
  715.     NodeHand[L] := '';
  716.     NodeHand2[L] := '';
  717.     NodeBet[L] := ConfigData.BetCD;
  718.     NodeDD[L] := 1;
  719.     NodeDD2[L] := 1;
  720.     NodeDoneH1[L] := False;
  721.     NodeDoneH2[L] := False;
  722.     NodeInsure[L] := False;
  723.   end;
  724.   UsedCards := '';
  725. end;
  726.  
  727. Function MSGWait : boolean;
  728. Var
  729.   b : byte;
  730.   f : File of byte;
  731. begin
  732.   Assign (f, IPCDir + 'CHGIDX.TCH');
  733.   Reset (f);
  734.   Seek (f, node);
  735.   {$I-}
  736.   Repeat
  737.     Read (f,b);
  738.   Until IOResult = 0;
  739.   {$I+}
  740.   MSGWait := b = 1;
  741.   Close (f);
  742. end;
  743.  
  744. Function GetCard : String;
  745. Const
  746.   Cards : Array [1..13] of Char = 'A23456789TJQK';
  747.   Kinds : Array [1..4] of Char = 'HDSC';
  748. Var
  749.   Value, Kind : Byte;
  750.   Card : String[6];
  751. begin
  752.   Repeat
  753.     Value := Random (13)+1;
  754.     Kind := Random (4)+1;
  755.     Card := Cards[Value] + Kinds [Kind];
  756.   Until Pos (Card, UsedCards) = 0;
  757.   UsedCards := UsedCards + Card;
  758.   If Length (UsedCards) = 104 then UsedCards := '';
  759.   GetCard := Card;
  760. end;
  761.  
  762. Function HandValue (Hand : String) : Byte;
  763. Var
  764.   Value : Byte;
  765.   Aces : Byte;
  766. begin
  767.   Value := 0;
  768.   { Count aces }
  769.   Aces := 0;
  770.   For L := 1 to Length (Hand) do if Hand[L] = 'A' then Inc (Aces);
  771.   While Hand[0] > #1 do
  772.   begin
  773.     If Hand[1] = 'A' then Value := Value + 11;
  774.     If Hand[1] in ['T','J','Q','K'] then Value := Value + 10;
  775.     If Hand[1] in ['2'..'9'] then Value := Value + Ord(Hand[1])-48;
  776.     Delete (Hand, 1, 2);
  777.   end;
  778.   While (Value > 21) and (Aces <> 0) do
  779.   begin
  780.     Dec (Value,10);
  781.     Dec (Aces);
  782.   end;
  783.   HandValue := Value;
  784. end;
  785.  
  786. Function ColorHand (Hand : String) : String;
  787. Var
  788.   New : String;
  789. begin
  790.   New := '';
  791.   While Hand[0] > #1 do
  792.   begin
  793.     If Hand[2] in ['D','H'] then New := New + '^H^e'+Hand[1]+Hand[2]+'^A^k '
  794.     else
  795.     If Hand[2] in ['C','S'] then New := New + '^H^a'+Hand[1]+Hand[2]+'^A^k '
  796.     else New := New + '^H^a  ^A^k';
  797.     Delete (Hand, 1, 2);
  798.   end;
  799.   ColorHand := New;
  800. end;
  801.  
  802. Procedure NextPlayer;
  803. Var
  804.   I : Word;
  805. begin
  806.   If NodeStat[NodeTurn] <> 0 then
  807.     If NodeHand2[NodeTurn] <> '' then
  808.     begin
  809.       If (HandValue (NodeHand[NodeTurn]) > 21) and
  810.       (HandValue (NodeHand2[NodeTurn]) > 21) then NodeStat[NodeTurn] := 1;
  811.     end
  812.     else If HandValue (NodeHand[NodeTurn]) > 21 then NodeStat[NodeTurn] := 1;
  813.   If NodeStat[NodeTurn] = 1 then
  814.   begin
  815.     If NodeInsure[NodeTurn] then
  816.     begin
  817.       Dec (NodeCD[NodeTurn], Round (NodeBet[NodeTurn]/2));
  818.       GiveMSG (9, '', '^A^pYou^I^n lose ^A^nyour insurance bet of ^A^p'+ToStr(Round(NodeBet[NodeTurn]/2))
  819.                +' ^A^nCyberdollars!', NodeTurn);
  820.       If NodeGender (NodeTurn) then
  821.         BroadCastBut (9, '', '^A^p'+NodeUser(NodeTurn)+'^I^n loses ^A^nher insurance bet of ^A^p'
  822.                       +ToStr(Round(NodeBet[NodeTurn]/2))+' ^A^nCyberdollars!', NodeTurn)
  823.       else
  824.         BroadCastBut (9, '', '^A^p'+NodeUser(NodeTurn)+'^I^n loses ^A^nhis insurance bet of ^A^p'
  825.                       +ToStr(Round(NodeBet[NodeTurn]/2))+' ^A^nCyberdollars!', NodeTurn)
  826.     end;
  827.   end;
  828.   I := NodeTurn;
  829.   Repeat
  830.     Inc (I);
  831.   Until (I = 256) or (NodeStat[I] = 2);
  832.   If I = 256 then NodeTurn := -1       { Dealer's turn }
  833.     else NodeTurn := I;
  834.   If NodeTurn > 1 then
  835.   begin
  836.     NodeData2.DoneTo := -1;
  837.     NodeData2.From := node;
  838.     NodeData2.Gender := 0;
  839.     NodeData2.Alias := '';
  840.     NodeData2.Kind := 9;
  841.     NodeData2.Data := 'A^mIt is your turn in ^A^pblackjack^A^m!'#0;
  842.     NodeData2.Data[0] := '^';
  843.     NodeData2.Channel := 1;
  844.     NodeData2.MinSec := 0;
  845.     NodeData2.Data1 := 0;
  846.     SendMSG (NodeTurn, NodeData2);
  847.   end;
  848.   SecPassed := 0;
  849.   If NodeTurn > 1 then Writeln ('It is ', NodeUser(NodeTurn), '''s turn in blackjack.')
  850.   else Writeln ('It is the Dealer''s turn in blackjack.');
  851. end;
  852.  
  853. Procedure DisplayHand (Node : Word);
  854. begin
  855.   GiveMSG (9, '', '^A^nDealer''s cards: '+ColorHand(DealerHand[1]+DealerHand[2])+'^H^a  ^A^n  (^A^p'
  856.            +ToStr(HandValue(DealerHand[1]+DealerHand[2]))+'^A^n)', Node);
  857.   If NodeHand2[Node] <> '' then
  858.   begin
  859.     If not NodeDoneH1[Node] then
  860.     GiveMSG (9, '', '^A^nFirst hand :    '+ColorHand(NodeHand[Node])+' ^A^n(^A^p'
  861.              +ToStr(HandValue(NodeHand[Node]))+'^A^n)', Node);
  862.     If not NodeDoneH2[Node] then
  863.     GiveMSG (9, '', '^A^nSecond hand:    '+ColorHand(NodeHand2[Node])+' ^A^n(^A^p'
  864.              +ToStr(HandValue(NodeHand2[Node]))+'^A^n)', Node);
  865.   end
  866.   else
  867.     GiveMSG (9, '', '^A^nYour cards:     '+ColorHand(NodeHand[Node])+' ^A^n(^A^p'
  868.              +ToStr(HandValue(NodeHand[Node]))+'^A^n)', Node);
  869. end;
  870.  
  871. Procedure RegRemind;
  872. Var
  873.   N : Byte;
  874. begin
  875.   N := Random (4);
  876.   Case N of
  877.     0 : Broadcast (9,'','From ^A^lBlackjack Dealer^A^o, holding up a big placard: ^A^kRemember to register Blackjack!');
  878.     1 : BroadCast (9,'','^I^pThis version of Blackjack for TOP is UNREGISTERED!^A^o');
  879.     2 : BroadCast (9,'','From ^A^lBlackjack Dealer^A^o, in a hypnotic tone: ^A^kRegister blackjack, Register blackjack...');
  880.     3 : BroadCast (9,'','From ^A^lBlackjack Dealer^A^o, over the bar''s PA system: ^A^kBlackjack is UNREGISTERED!');
  881.   end;
  882. end;
  883.  
  884. Procedure Retal (Node : Word);
  885. Var
  886.   N : Byte;
  887.   J : Byte;
  888.   T : LongInt;
  889. begin
  890.   N := Random (30);
  891.   If N > 9 then
  892.   begin
  893.     J := Random (9);
  894.     Case J of
  895.     0 : begin
  896.           GiveMSG (9, '', '^oThe ^A^lBlackjack Dealer ^A^ois booting ^A^lyou ^A^oto the head!',
  897.                       Node);
  898.           BroadCastAllBut (9, '', '^oThe ^A^lBlackjack Dealer ^A^ois booting ^A^l'+NodeUser(Node)+' ^A^oto the head!', Node);
  899.         end;
  900.     1 : begin
  901.           GiveMSG (9, '', '^oThe ^A^lBlackjack Dealer ^A^ois frowning darkly at ^A^lyou^A^o!',
  902.                       Node);
  903.           BroadCastAllBut (9, '', '^oThe ^A^lBlackjack Dealer ^A^ois frowning darkly at ^A^l'+NodeUser(Node)+'^A^o!', Node);
  904.         end;
  905.     2 : begin
  906.           GiveMSG (9, '', '^oThe ^A^lBlackjack Dealer ^A^ojust smacked ^A^lyou ^A^oacross the back of the head!',
  907.                       Node);
  908.           BroadCastAllBut (9, '', '^oThe ^A^lBlackjack Dealer ^A^ojust smacked ^A^l'+NodeUser(Node)
  909.                         +' ^A^oacross the back of the head!', Node);
  910.         end;
  911.     3 : If NodeStat[Node] > 0 then
  912.           BroadCastAll (9, '^oThe Blackjack Dealer',
  913.               '^oFrom ^A^lThe Blackjack Dealer^A^o, grumbling unhappily: ^A^kStop that, '
  914.                         +NodeUser(Node)+', or I''ll kick you out of the game!');
  915.     4 : If NodeStat[Node] > 0 then
  916.           BroadCastAll (9, '^oThe Blackjack Dealer',
  917.               '^oFrom ^A^lThe Blackjack Dealer^A^o, grumbling unhappily: ^A^kStop that, '
  918.                         +NodeUser(Node)+', or I''ll have to fine you!');
  919.     5 : begin
  920.           GiveMSG (9, '', '^oThe ^A^lBlackjack Dealer ^A^ojust elbowed ^A^lyou ^A^oin the face!',
  921.                       Node);
  922.           BroadCastAllBut (9, '', '^oThe ^A^lBlackjack Dealer ^A^ojust elbowed ^A^l'+NodeUser(Node)+' ^A^oin the face!', Node);
  923.         end;
  924.     6 : BroadCastAll (9, '', '^oThe ^A^lBlackjack Dealer ^A^ojust put up ^A^lhis^A^o deflector shields!');
  925.     7 : begin
  926.           GiveMSG (9, '', '^oThe ^A^lBlackjack Dealer ^A^ojust poked ^A^lyou ^A^oin the ribs!',
  927.                       Node);
  928.           BroadCastAllBut (9, '', '^oThe ^A^lBlackjack Dealer ^A^ojust poked ^A^l'+NodeUser(Node)+' ^A^oin the ribs!', Node);
  929.         end;
  930.     8 : begin
  931.           GiveMSG (9, '', '^oThe ^A^lBlackjack Dealer ^A^ojust gave ^A^lyou ^A^oa good, swift, kick in the butt!',
  932.                       Node);
  933.           BroadCastAllBut (9, '', '^oThe ^A^lBlackjack Dealer ^A^ojust gave ^A^l'+NodeUser(Node)
  934.                            +' ^A^oa good, swift, kick in the butt!', Node);
  935.         end;
  936.     end;
  937.   end
  938.   else
  939.   If ((N = 9) or (N = 8) or (N = 15)) and (NodeStat[NodeData.From] > 0) then
  940.   begin
  941.     If NodeStat[nodedata.from] = 2 then
  942.     begin
  943.       Dec (NodeCD[Node], NodeBet[Node]*NodeDD[Node]);
  944.       If (NodeHand2[Node] <> '') and (HandValue (NodeHand2[Node]) < 22) then
  945.         Dec (NodeCD[Node], NodeBet[Node]*NodeDD2[Node]);
  946.       If NodeInsure[Node] then Dec (NodeCD[Node], Round(NodeBet[Node]/2));
  947.     end;
  948.     NodeStat[Node] := 0;
  949.     BroadCastBut (9,'','^A^nThe ^A^pblackjack dealer ^A^njust tossed ^A^p'+(NodeUser(Node))
  950.                   +' ^A^nout of the ^A^pblackjack^A^n game!', Node);
  951.     GiveMSG (9,'','^A^nThe angry ^A^pblackjack dealer ^A^njust tossed ^A^pyou ^A^nout of the ^A^pblackjack^A^n game!',
  952.                   Node);
  953.     Writeln (NodeUser(Node), ' is dealt out of the blackjack game.');
  954.     If (nodedata.from) = NodeTurn then NextPlayer;
  955.   end;
  956.   If (N = 25) and (NodeStat[NodeData.From] > 0) then
  957.   begin
  958.     T := (((random(5) + 4) MOD 3) + 1) * 100;
  959.     Dec(NodeCD[NodeData.From], T);
  960.     BroadCastBut (9,'','^A^nThe ^pblackjack dealer ^njust ^I^pfined^A '+(NodeUser(Node))
  961.                   +' ^l'+ ToStr(T) +'^n CyberDollars!', Node);
  962.     GiveMSG (9,'','^A^nThe ^pblackjack dealer ^njust ^I^pfined^A you'
  963.              +' ^l'+ ToStr(T) +'^n CyberDollars!', Node);
  964.     Writeln(NodeUser(Node), ' has been fined ', T, 'CDs.');
  965.   end;
  966. end;
  967.  
  968. Procedure Process (NodeData : NodeRec);
  969. Var
  970.   s : String;
  971.   I : Word;
  972.   L : LongInt;
  973.   Error : Integer;
  974.   J : Word;
  975. begin
  976.   NodeData2.DoneTo := -1;
  977.   NodeData2.From := node;
  978.   NodeData2.Gender := 0;
  979.   NodeData2.Alias := '';
  980.   NodeData2.Kind := 9;
  981.   NodeData2.Channel := 1;
  982.   NodeData2.MinSec := 0;
  983.   NodeData2.Data1 := 0;
  984.   If NodeData.Kind = 6 then
  985.   begin
  986.     s := KillSpaces(UpStr(CStr(NodeData.Data)));
  987.     If s = 'ON' then
  988.     begin
  989.       If NodeStat[NodeData.From+1] = 0 then
  990.       begin
  991.         GiveMSG (9, '', '^A^nOk, you will now be playing in the next ^A^pblackjack ^A^ngame!',
  992.                  NodeData.from);
  993.         NodeStat[NodeData.from] := 1;
  994.         BroadCastBut (9,'','^A^p'+CStr(NodeData.Alias)+' ^A^nwill be playing in the next ^A^pblackjack^A^n game!',
  995.                       NodeData.from);
  996.         Writeln (CStr(NodeData.Alias), ' joins the blackjack game.');
  997.       end
  998.       else
  999.         GiveMSG (9, '', '^A^nYou are already playing ^A^pblackjack^A^n!', NodeData.from);
  1000.     end;
  1001.     If s = 'OFF' then
  1002.     begin
  1003.       If NodeStat[NodeData.from] = 0 then
  1004.         GiveMSG (9, '', '^A^nYou aren''t playing in ^A^pblackjack^A^n!', NodeData.from)
  1005.       else
  1006.       begin
  1007.         GiveMSG (9, '', '^A^nOk, you are no longer playing ^A^pblackjack^A^n.', NodeData.from);
  1008.         If NodeStat[NodeData.from] = 2 then
  1009.         begin
  1010.           Dec (NodeCD[NodeData.from], NodeBet[NodeData.from]*NodeDD[NodeData.from]);
  1011.           NextPlayer;
  1012.         end;
  1013.         BroadCastBut (9,'','^A^p'+CStr(NodeData.Alias)+' ^A^nask to be dealt out of the ^A^pblackjack^A^n game!',
  1014.                       NodeData.from);
  1015.         Writeln (CStr(NodeData.Alias), ' is dealt out of the blackjack game.');
  1016.         NodeStat[NodeData.from] := 0;
  1017.       end;
  1018.     end;
  1019.     If (s='INSURE')or(s='INSURANCE')or(s='INSUR')or(s='INS')or(s='INSUER') then
  1020.     begin
  1021.       If (NodeStat[NodeData.from] = 2) then
  1022.       begin
  1023.         If NodeData.from = NodeTurn then
  1024.         begin
  1025.           If NodeInsure[NodeData.from] then
  1026.             GiveMSG (9, '', '^A^nYou''ve already made an insurance bet!', NodeData.from)
  1027.           else
  1028.           begin
  1029.             If (Length (NodeHand[NodeData.from]) = 4) and (NodeHand2[NodeData.from]='') then
  1030.             begin
  1031.               GiveMSG (9, '', '^A^nOk, you make an insurance bet.', NodeData.from);
  1032.               BroadcastBut (9, '', '^A^p'+NodeUser(NodeTurn)+' ^A^nmakes an insurance bet.', NodeData.from);
  1033.               NodeInsure[NodeData.from] := True;
  1034.             end
  1035.             else GiveMSG (9, '', '^A^nYou can''t buy insurance now!', NodeData.from);
  1036.           end;
  1037.         end
  1038.         else
  1039.           GiveMSG (9, '', '^A^nIt isn''t your turn!', NodeData.from);
  1040.       end
  1041.       else
  1042.         GiveMSG (9, '', '^A^nYou aren''t playing in the ^A^pblackjack^A^n game.', NodeData.from);
  1043.     end;
  1044.     If (s='STAY')or(s='STA')or(s='STY')or(s='SAY')or(s='TAY')or(s='STYA')or(s='STAYU')or
  1045.        (s='STAND') then
  1046.     begin
  1047.       If (NodeStat[NodeData.from] = 2) then
  1048.       begin
  1049.         If NodeData.from = NodeTurn then
  1050.         begin
  1051.           GiveMSG (9, '', '^A^nOk, you stay.', NodeData.from);
  1052.           BroadcastBut (9, '', '^A^p'+NodeUser(NodeTurn)+' ^A^nstays.', NodeData.from);
  1053.           NextPlayer;
  1054.         end
  1055.         else
  1056.           GiveMSG (9, '', '^A^nIt isn''t your turn!', NodeData.from);
  1057.       end
  1058.       else
  1059.         GiveMSG (9, '', '^A^nYou aren''t playing in the ^A^pblackjack^A^n game.', NodeData.from);
  1060.     end;
  1061.     If (s='HAND')or(s='HAN')or(s='HADN')or(s='AHND') then
  1062.     begin
  1063.       If NodeStat[NodeData.from] = 2 then DisplayHand (NodeData.from)
  1064.       else
  1065.         GiveMSG (9, '', '^A^nYou aren''t playing in the ^A^pblackjack^A^n game.', NodeData.from);
  1066.     end;
  1067.     If (s = 'CD') or (s = '$') then
  1068.       GiveMSG (9, '', '^A^nYou have ^A^p'+ ToStr(NodeCD[NodeData.from])+'^A^n Cyberdollars.', NodeData.from);
  1069.     If (s='HIT')or(s='HIT1')or(s='HTI')or(s='IHT') then
  1070.     begin
  1071.       If NodeStat[NodeData.from] = 2 then
  1072.       begin
  1073.         If NodeData.from = NodeTurn then
  1074.         begin
  1075.           If NodeDoneH1[NodeData.from] then GiveMSG (9, '', '^A^nYou can''t play that hand!', NodeData.from)
  1076.           else
  1077.           begin
  1078.             BroadcastBut (9, '', '^A^p'+NodeUser(NodeTurn)+' ^A^nhits.', NodeData.from);
  1079.             NodeHand[NodeData.from] := NodeHand[NodeData.from] + GetCard;
  1080.             DisplayHand (NodeData.from);
  1081.             SecPassed := 0;
  1082.             Writeln (NodeUser(NodeTurn), ' hits.');
  1083.             If HandValue(NodeHand[NodeData.from]) > 21 then
  1084.             begin
  1085.               GiveMSG (9, '', '^I^nYou busted!', NodeData.from);
  1086.               BroadCastBut (9, '', '^A^p'+NodeUser(NodeTurn)+' ^A^nbusts!', NodeData.from);
  1087.               BroadCastBut (9, '', '^A^p'+NodeUser(NodeTurn)+'^I^n loses ^A^p'+ToStr(NodeBet[NodeTurn])+' ^A^nCyberdollars!'
  1088.                             , NodeData.from);
  1089.               GiveMSG (9, '', '^A^pYou^I^n lose ^A^p'+ToStr(NodeBet[NodeTurn])+' ^A^nCyberdollars!', NodeData.from);
  1090.               Dec (NodeCD[NodeData.from], NodeBet[NodeData.from]);
  1091.               Writeln (NodeUser(NodeTurn), ' busts.');
  1092.               NodeDoneH1[NodeData.from] := True;
  1093.               If NodeHand2[NodeData.from] = '' then NextPlayer
  1094.               else If NodeDoneH1[NodeData.from] and NodeDoneH2[NodeData.from] then NextPlayer;
  1095.             end;
  1096.           end;
  1097.         end
  1098.         else
  1099.           GiveMSG (9, '', '^A^nIt is not your turn!', NodeData.from);
  1100.       end
  1101.       else
  1102.         GiveMSG (9, '',  '^A^nYou aren''t playing in the ^A^pblackjack^A^n game.', NodeData.from);
  1103.     end;
  1104.     If (s='HIT2')or(s='HTI2')or(s='HI2T')or(s='IHT2') then
  1105.     begin
  1106.       If NodeStat[NodeData.from] = 2 then
  1107.       begin
  1108.         If NodeData.from = NodeTurn then
  1109.         begin
  1110.           If NodeHand2[NodeData.from] = '' then
  1111.             GiveMSG (9, '', '^A^nYou don''t have a second hand!', NodeData.from)
  1112.           else
  1113.           begin
  1114.             If NodeDoneH2[NodeData.from] then GiveMSG (9, '', '^A^nYou can''t play that hand!', NodeData.from)
  1115.             else
  1116.             begin
  1117.               BroadcastBut (9, '', '^A^p'+NodeUser(NodeTurn)+' ^A^nhits second hand.', NodeData.from);
  1118.               NodeHand2[NodeData.from] := NodeHand2[NodeData.from] + GetCard;
  1119.               DisplayHand (NodeData.from);
  1120.               SecPassed := 0;
  1121.               Writeln (NodeUser(NodeTurn), ' hits second hand.');
  1122.               If HandValue(NodeHand2[NodeData.from]) > 21 then
  1123.               begin
  1124.                 GiveMSG (9, '', '^I^nYou busted!', NodeData.from);
  1125.                 BroadCastBut (9, '', '^A^p'+NodeUser(NodeTurn)+' ^A^nbusts!', NodeData.from);
  1126.                 BroadCastBut (9, '', '^A^p'+NodeUser(NodeTurn)+'^I^n loses ^A^p'+ToStr(NodeBet[NodeTurn])+' ^A^nCyberdollars!'
  1127.                               , NodeData.from);
  1128.                 GiveMSG (9, '', '^A^pYou^I^n lose ^A^p'+ToStr(NodeBet[NodeTurn])+' ^A^nCyberdollars!', NodeData.from);
  1129.                 Dec (NodeCD[NodeData.from], NodeBet[NodeData.from]);
  1130.                 Writeln (NodeUser(NodeTurn), ' busts.');
  1131.                 NodeDoneH2[NodeData.from] := True;
  1132.                 If NodeDoneH1[NodeData.from] and NodeDoneH2[NodeData.from] then NextPlayer;
  1133.               end;
  1134.             end;
  1135.           end;
  1136.         end
  1137.         else
  1138.           GiveMSG (9, '', '^A^nIt is not your turn!', NodeData.from);
  1139.       end
  1140.       else
  1141.         GiveMSG (9, '',  '^A^nYou aren''t playing in the ^A^pblackjack^A^n game.', NodeData.from);
  1142.     end;
  1143.     If (s = 'HELP') or (s = '!') or (s = '?') or (s = 'COMMANDS') then
  1144.     begin
  1145.       For I := 1 to 15 do
  1146.         GiveMSG (9, '', HelpData[I], NodeData.from);
  1147.     end;
  1148.     If (s='SPLIT')or(s='SPLI')or(s='SPL')or(s='SPLITT')or(s='SPLTI') then
  1149.     begin
  1150.       If NodeStat[NodeData.from] = 2 then
  1151.         If NodeData.from = NodeTurn then
  1152.         begin
  1153.           If (Length (NodeHand[NodeData.from]) = 4) and (NodeHand2[NodeData.from] = '') then
  1154.           begin
  1155.             If HandValue (NodeHand[NodeData.from][1]+NodeHand[NodeData.from][2])
  1156.                = HandValue (NodeHand[NodeData.from][3]+NodeHand[NodeData.from][4]) then
  1157.             begin
  1158.               GiveMSG (9, '', '^A^nOk, you split.', NodeData.from);
  1159.               SecPassed := 0;
  1160.               BroadcastBut (9, '', '^A^p'+NodeUser(NodeTurn)+' ^A^nsplits.', NodeData.from);
  1161.               NodeHand2[NodeData.from] := NodeHand[NodeData.from][3]+NodeHand[NodeData.from][4];
  1162.               Dec (NodeHand[NodeData.from][0], 2);
  1163.               NodeHand[NodeData.from] := NodeHand[NodeData.from] + GetCard;
  1164.               NodeHand2[NodeData.from] := NodeHand2[NodeData.from] + GetCard;
  1165.               DisplayHand (NodeData.from);
  1166.             end
  1167.             else GiveMSG (9, '', '^A^nYou can''t split when card values are different!', NodeData.from)
  1168.           end
  1169.           else GiveMSG (9, '', '^A^nYou can''t split now!', NodeData.from)
  1170.         end
  1171.         else
  1172.           GiveMSG (9, '', '^A^nIt is not your turn!', NodeData.from)
  1173.       else
  1174.         GiveMSG (9, '',  '^A^nYou aren''t playing in the ^A^pblackjack^A^n game.', NodeData.from);
  1175.     end;
  1176.     If (s='DOUBLE')or(s='DOUBLEDOWN')or(s = 'DD')or(s='DOUBLE1')or(s='DOUBLEDOWN1')or(s='DD1')or
  1177.        (s='DOUBL')or(s='DOUBLEE')or(s='DOUB')or(s='DOUBEL')or(s='DUOBLE')or(s='DOUBKLE') then
  1178.     begin
  1179.       If NodeStat[NodeData.from] = 2 then
  1180.       begin
  1181.         If NodeData.from = NodeTurn then
  1182.         begin
  1183.           if Length(NodeHand[NodeData.from]) <= 4 then
  1184.           begin
  1185.             BroadcastBut (9, '', '^A^p'+NodeUser(NodeTurn)+' ^A^ndoubles down.', NodeData.from);
  1186.             NodeHand[NodeData.from] := NodeHand[NodeData.from] + GetCard;
  1187.             NodeDD[NodeData.from] := 2;
  1188.             GiveMSG (9, '', '^A^nOk, you ^A^pdouble down^A^n!', NodeData.from);
  1189.             DisplayHand (NodeData.from);
  1190.             SecPassed := 0;
  1191.             Writeln (NodeUser(NodeTurn), ' doubles down.');
  1192.             If HandValue(NodeHand[NodeData.from]) > 21 then
  1193.             begin
  1194.               GiveMSG (9, '', '^I^nYou busted!', NodeData.from);
  1195.               BroadCastBut (9, '', '^A^p'+NodeUser(NodeTurn)+' ^A^nbusts!', NodeData.from);
  1196.               BroadCastBut (9, '', '^A^p'+NodeUser(NodeTurn)+'^I^n loses ^A^p'+ToStr(NodeBet[NodeTurn]*NodeDD[NodeTurn])
  1197.                             +' ^A^nCyberdollars!', NodeData.from);
  1198.               GiveMSG (9, '', '^A^pYou^I^n lose ^A^p'+ToStr(NodeBet[NodeTurn]*NodeDD[NodeTurn])+' ^A^nCyberdollars!',
  1199.                        NodeData.from);
  1200.               Dec (NodeCD[NodeData.from], NodeBet[NodeData.from]*NodeDD[NodeData.from]);
  1201.               Writeln (NodeUser(NodeTurn), ' busts.');
  1202.             end;
  1203.             NodeDoneH1[NodeData.from] := True;
  1204.             If NodeHand2[NodeData.from] = '' then NextPlayer
  1205.             else If NodeDoneH1[NodeData.from] and NodeDoneH2[NodeData.from]
  1206.               then NextPlayer;
  1207.           end
  1208.           else
  1209.             GiveMSG (9, '', '^A^nYou can''t double down after hitting!', NodeData.from);
  1210.         end
  1211.         else
  1212.           GiveMSG (9, '', '^A^nIt is not your turn!', NodeData.from);
  1213.       end
  1214.       else
  1215.         GiveMSG (9, '',  '^A^nYou aren''t playing in the ^A^pblackjack^A^n game.', NodeData.from);
  1216.     end;
  1217.     If (s = 'DOUBLE2') or (s = 'DOUBLEDOWN2') or (s = 'DD2') then
  1218.     begin
  1219.       If NodeStat[NodeData.from] = 2 then
  1220.       begin
  1221.         If NodeData.from = NodeTurn then
  1222.         begin
  1223.           If NodeHand2[NodeData.from] = '' then
  1224.             GiveMSG (9, '', '^A^nYou don''t have a second hand!', NodeData.from)
  1225.           else
  1226.           begin
  1227.             if Length(NodeHand2[NodeData.from]) <= 4 then
  1228.             begin
  1229.               BroadcastBut (9, '', '^A^p'+NodeUser(NodeTurn)+' ^A^ndoubles down on second hand.', NodeData.from);
  1230.               NodeHand2[NodeData.from] := NodeHand2[NodeData.from] + GetCard;
  1231.               NodeDD2[NodeData.from] := 2;
  1232.               GiveMSG (9, '', '^A^nOk, you ^A^pdouble down^A^n!', NodeData.from);
  1233.               DisplayHand (NodeData.from);
  1234.               SecPassed := 0;
  1235.               Writeln (NodeUser(NodeTurn), ' doubles down on second hand.');
  1236.               If HandValue(NodeHand2[NodeData.from]) > 21 then
  1237.               begin
  1238.                 GiveMSG (9, '', '^I^nYou busted!', NodeData.from);
  1239.                 BroadCastBut (9, '', '^A^p'+NodeUser(NodeTurn)+' ^A^nbusts!', NodeData.from);
  1240.                 BroadCastBut (9, '', '^A^p'+NodeUser(NodeTurn)+'^I^n loses ^A^p'+ToStr(NodeBet[NodeTurn]*NodeDD2[NodeTurn])
  1241.                               +' ^A^nCyberdollars!', NodeData.from);
  1242.                 GiveMSG (9, '', '^A^pYou^I^n lose ^A^p'+ToStr(NodeBet[NodeTurn]*NodeDD2[NodeTurn])+' ^A^nCyberdollars!',
  1243.                          NodeData.from);
  1244.                 Dec (NodeCD[NodeData.from], NodeBet[NodeData.from]*NodeDD2[NodeData.from]);
  1245.                 Writeln (NodeUser(NodeTurn), ' busts.');
  1246.               end;
  1247.               NodeDoneH2[NodeData.from] := True;
  1248.               If NodeDoneH1[NodeData.from] and NodeDoneH2[NodeData.from] then NextPlayer;
  1249.             end
  1250.             else
  1251.             GiveMSG (9, '', '^a^nYou can''t double down after hitting!', NodeData.from);
  1252.           end
  1253.         end
  1254.         else
  1255.           GiveMSG (9, '', '^A^nIt is not your turn!', NodeData.from);
  1256.       end
  1257.       else
  1258.         GiveMSG (9, '',  '^A^nYou aren''t playing in the ^A^pblackjack^A^n game.', NodeData.from);
  1259.     end;
  1260.     If (s='TURN')or(s='TUR')or(s='TUNR') then
  1261.     begin
  1262.       If GamePlaying then
  1263.       begin
  1264.         If NodeTurn = NodeData.from then
  1265.           GiveMSG (9, '', '^A^nIt is ^A^pyour ^A^nturn in blackjack.',
  1266.                    NodeData.from)
  1267.         else
  1268.           GiveMSG (9, '', '^A^nIt is ^A^p'+NodeUser(NodeTurn)+'^A^n''s turn in blackjack.',
  1269.                    NodeData.from);
  1270.       end
  1271.       else
  1272.         GiveMSG (9, '', '^A^nThere is no blackjack game being played at the moment.', NodeData.from);
  1273.     end;
  1274.     If (s='SCAN')or(s='SCA')or(s='SCNA') then
  1275.     begin
  1276.       GiveMSG (9, '', #13#10'^A^oPlayer                          Playing    Cyberdollars', NodeData.from);
  1277.       GiveMSG (9, '', '^A^o-------------------------------------------------------', NodeData.from);
  1278.       For I := 1 to 255 do
  1279.       begin
  1280.         If NodeStat[I] = 1 then
  1281.           GiveMSG (9, '', '^A^o'+NodeUser(I)+Spaces(34-Length(KillTOPCodes(NodeUser(I)))) +' No         '+ToStr(NodeCD[I]),
  1282.                    NodeData.from);
  1283.         If NodeStat[I] = 2 then
  1284.           GiveMSG (9, '', '^A^o'+NodeUser(I)+Spaces(34-Length(KillTOPCodes(NodeUser(I)))) +'Yes         '+ToStr(NodeCD[I]),
  1285.                    NodeData.from);
  1286.       end;
  1287.       GiveMSG (9, '', #0, NodeData.from);
  1288.     end;
  1289.     If (s='BET')or(s='BTE') then
  1290.       GiveMSG (9, '', '^A^nYour current bet is ^A^p'+ToStr(NodeBet[NodeData.from])+' ^A^nCyberdollars.', NodeData.from)
  1291.     else
  1292.     If (s[1] = 'B') and (s[2] = 'E') and (s[3] = 'T') and (s[0] > #3) then
  1293.     begin
  1294.       If NodeStat[NodeData.from] < 2 then
  1295.       begin
  1296.         Delete (s, 1, 3);
  1297.         Val (s, L, Error);
  1298.         If (Error <> 0) or (L > ConfigData.MaxBet) or (L < ConfigData.MinBet) then
  1299.         begin
  1300.           GiveMSG (9, '', '^A^nBets must be between ^A^p'+ToStr(ConfigData.MinBet)+' ^A^nand ^A^p'+ToStr(ConfigData.MaxBet)+
  1301.                    ' ^A^nCyberdollars.', NodeData.from);
  1302.         end
  1303.         else
  1304.         begin
  1305.           NodeBet[NodeData.from] := L;
  1306.           GiveMSG (9, '', '^A^nOk, your bet will now be ^A^p'+ToStr(L)+' ^A^nCyberdollars.', NodeData.from);
  1307.         end;
  1308.       end
  1309.       else
  1310.         GiveMSG (9, '', '^A^nSorry, you cannot change your bet during a game.', NodeData.from);
  1311.     end;
  1312.   end;
  1313.   If (NodeData.Kind = 3) or (NodeData.Kind = 19) then
  1314.   begin
  1315.     If NodeStat[NodeData.from] = 2 then
  1316.     begin
  1317.       Dec (NodeCD[NodeData.from], NodeBet[NodeData.from]*NodeDD[NodeData.from]);
  1318.       If (NodeHand2[Node] <> '') and (HandValue (NodeHand2[Node]) < 22) then
  1319.         Dec (NodeCD[Node], NodeBet[Node]*NodeDD2[Node]);
  1320.       If NodeInsure[Node] then Dec (NodeCD[Node], Round(NodeBet[Node]/2));
  1321.       NodeStat[NodeData.from] := 0;
  1322.       BroadCastBut (9,'','^A^p'+CStr(NodeData.Alias)+' ^A^nis dealt out of the ^A^pblackjack^A^n game!',
  1323.                     NodeData.from);
  1324.       Writeln (CStr(NodeData.Alias), ' is dealt out of the blackjack game.');
  1325.       If (NodeData.from) = NodeTurn then NextPlayer;
  1326.     end;
  1327.     NodeCD[NodeData.from] := ConfigData.StartCD;
  1328.     NodeBet[NodeData.from] := ConfigData.BetCD;
  1329.   end;
  1330.   If (NodeData.Kind = 1) then
  1331.   begin
  1332.     s := UpStr(CStr(NodeData.Data));
  1333.     For J := 1 to 16 do
  1334.       If s = ComList[J] then GiveMSG (6, '^A^pThe blackjack dealer', 'You missed a "^A^k/^A^o" in your blackjack command.'
  1335.                                       , NodeData.from);
  1336.   end;
  1337.   If (NodeData.Kind = 10) and (NodeData.DoneTo = Node) then
  1338.   begin
  1339.     s := CStr(NodeData.Data);
  1340.     If Pos ('just barfed ALL OVER', s) <> 0 then Retal (NodeData.from);
  1341.     If Pos ('just bonked',s) <> 0 then Retal (NodeData.from);
  1342.     If Pos ('is booting',s) <> 0 then Retal (NodeData.from);
  1343.     If Pos ('with a disruptor!',s) <> 0 then Retal (NodeData.from);
  1344.     If Pos ('just tossed a grenade!',s) <> 0 then Retal (NodeData.from);
  1345.     If Pos ('is hitting',s) <> 0 then Retal (NodeData.from);
  1346.     If Pos ('is kicking the life out of',s) <> 0 then Retal (NodeData.from);
  1347.     If Pos ('with a mushroom cloud!',s) <> 0 then Retal (NodeData.from);
  1348.     If Pos ('a phaser and blasted',s) <> 0 then Retal (NodeData.from);
  1349.     If Pos ('is punching',s) <> 0 then Retal (NodeData.from);
  1350.     If Pos ('just shot',s) <> 0 then Retal (NodeData.from);
  1351.     If Pos ('just slapped',s) <> 0 then Retal (NodeData.from);
  1352.     If Pos ('across the back of the head!',s) <> 0 then Retal (NodeData.from);
  1353.     If Pos ('just spit on',s) <> 0 then Retal (NodeData.from);
  1354.     If Pos ('is stripping',s) <> 0 then Retal (NodeData.from);
  1355.     If Pos ('just zapped',s) <> 0 then Retal (NodeData.from);
  1356.     If Pos ('just bashed',s) <> 0 then Retal (NodeData.from);
  1357.     If Pos ('just stapled',s) <> 0 then Retal (NodeData.from);
  1358.     If Pos ('just killed',s) <> 0 then Retal (NodeData.from);
  1359.     If Pos ('just elbowed',s) <> 0 then Retal (NodeData.from);
  1360.     If Pos ('just poked',s) <> 0 then Retal (NodeData.from);
  1361.   end;
  1362. end;
  1363.  
  1364. Procedure GetMSGs;
  1365. Var
  1366.   b : byte;
  1367.   z : byte;
  1368.   f : file of byte;
  1369.   NodeFile : File of NodeRec;
  1370. begin
  1371.   z := 0;
  1372.   Assign (f, IPCDir + 'MIX'+NodeStr+'.TCH');
  1373.   Assign (NodeFile, IPCDir + 'MSG'+NodeStr+'.TCH');
  1374.   Reset (f);
  1375.   Reset (NodeFile);
  1376.   Repeat
  1377.     {$I-}
  1378.     Repeat
  1379.       Read (f,b);
  1380.     Until IOResult = 0;
  1381.     Seek (f, FilePos (f) - 1);
  1382.     Repeat
  1383.       Write (f,z);
  1384.     Until IOResult = 0;
  1385.     Repeat
  1386.       Read (NodeFile, NodeData);
  1387.     Until IOResult = 0;
  1388.     {$I+}
  1389.     If b = 1 then Process (NodeData);
  1390.   Until Eof (f);
  1391.   Close (f);
  1392.   Close (NodeFile);
  1393.   b := 0;
  1394.   Assign (f, IPCDir + 'CHGIDX.TCH');
  1395.   Reset (f);
  1396.   Seek (f, node);
  1397.   {$I-}
  1398.   Repeat
  1399.     Write (f,b);
  1400.   Until IOResult = 0;
  1401.   {$I+}
  1402.   Close (f);
  1403. end;
  1404.  
  1405. Procedure WaitSec;
  1406. begin
  1407.   GetTime (L, L, OldSec, L);
  1408.   Repeat
  1409.     GetTime (L, L, Sec, L);
  1410.   Until Sec <> OldSec;
  1411.   OldSec := Sec;
  1412.   Inc (SecPassed);
  1413. end;
  1414.  
  1415. Procedure StartGame;
  1416. Var
  1417.   SomeoneIn : Boolean;
  1418.   I : Word;
  1419. begin
  1420.   Writeln ('Starting a new blackjack game');
  1421.  { UsedCards := ''; }
  1422.   NodeData2.DoneTo := -1;
  1423.   NodeData2.From := node;
  1424.   NodeData2.Gender := 0;
  1425.   NodeData2.Alias := '';
  1426.   NodeData2.Kind := 9;
  1427.   NodeData2.Channel := 1;
  1428.   NodeData2.MinSec := 0;
  1429.   NodeData2.Data1 := 0;
  1430.   SomeoneIn := False;
  1431.   { Get dealer's hand }
  1432.   DealerHand := GetCard + GetCard;
  1433.   If (Random(5) = 0) {and (not registered)} then RegRemind;
  1434.   For I := 1 to 255 do
  1435.     If NodeStat[I] > 0 then
  1436.     begin
  1437.       SomeoneIn := True;
  1438.       GiveMSG (9, '', #0, I);
  1439.       GiveMSG (9, '', '^A^nA new ^A^pblackjack ^A^ngame has begun!', I);
  1440.       NodeStat[I] := 2;
  1441.     end;
  1442.   { Deal first cards }
  1443.   For I := 1 to 255 do
  1444.     If NodeStat[I] = 2 then
  1445.     begin
  1446.       NodeHand[I] := GetCard + GetCard;
  1447.       GiveMSG (9, '', '^A^nDealer''s cards: '+ColorHand(DealerHand[1]+DealerHand[2])+'^H^a  ^A^n  (^A^p'
  1448.                +ToStr(HandValue(DealerHand[1]+DealerHand[2]))+'^A^n)', I);
  1449.       GiveMSG (9, '', '^A^nYour cards:     '+ColorHand(NodeHand[I])+' ^A^n(^A^p'+ToStr(HandValue(NodeHand[I]))+'^A^n)', I);
  1450.       If DealerHand[1] = 'A' then GiveMSG (9, '',
  1451.         '^A^nDealer has possible blackjack, you may want to make an insurance bet.', I);
  1452.     end;
  1453.   If SomeoneIn then
  1454.   begin
  1455.     For I := 255 downto 1 do If NodeStat[I] = 2 then NodeTurn := I;
  1456.     GamePlaying := True;
  1457.     GiveMSG (9, '', '^A^nIt is your turn in ^A^pblackjack^A^n!', NodeTurn);
  1458.     Writeln ('It is ', NodeUser(NodeTurn), '''s turn in blackjack.');
  1459.   end
  1460.   else Writeln ('No players.');
  1461.   SecPassed := 0;
  1462. end;
  1463.  
  1464. Procedure WarnUser;
  1465. begin
  1466.   GiveMSG (9, '', #7'^I^nIt is still your turn in ^I^pblackjack^A^n!', NodeTurn);
  1467.   WaitSec;
  1468. end;
  1469.  
  1470. Procedure DealerPlay;
  1471. Var
  1472.   I : Word;
  1473.   DealerValue : Word;
  1474. begin
  1475.   BroadCast (9, '', '');
  1476.   BroadCast (9, '', '^A^nThe ^A^pBlackjack dealer ^A^nnow plays.');
  1477.   WaitSec;
  1478.   BroadCast (9, '', '^A^nDealer''s cards: '+ColorHand(DealerHand)+' ^A^n(^A^p'+ToStr(HandValue(DealerHand))+'^A^n)');
  1479.   WaitSec;
  1480.   While HandValue (DealerHand) < 17 do
  1481.   begin
  1482.     Writeln ('Dealer hits.');
  1483.     BroadCast (9, '', '^A^pDealer ^A^nhits.');
  1484.     DealerHand := DealerHand + GetCard;
  1485.     WaitSec;
  1486.     BroadCast (9, '', '^A^nDealer''s cards: '+ColorHand(DealerHand)+' ^A^n(^A^p'+ToStr(HandValue(DealerHand))+'^A^n)');
  1487.     WaitSec;
  1488.   end;
  1489.   WaitSec;
  1490.   If HandValue (DealerHand) < 22 then BroadCast (9, '', '^A^pDealer ^A^nstays.'#13#10)
  1491.   else BroadCast (9, '', '^A^pDealer ^A^nbusts!'#13#10);
  1492.   BroadCast (9, '', '^A^nThe ^A^pblackjack ^A^ngame is over!');
  1493.  
  1494.   { Pay the winners }
  1495.   DealerValue := HandValue (DealerHand);
  1496.   If DealerValue > 21 then DealerValue := 0;
  1497.   If (DealerValue = 21) and (Length (DealerHand) = 4) then
  1498.   begin
  1499.     { Blackjack for dealer }
  1500.     BroadCast (9, '', '^A^nThe ^A^pdealer ^A^nhas a ^I^pblackjack^A^n!');
  1501.     For I := 1 to 255 do if NodeStat[I] = 2 then
  1502.     begin
  1503.       If NodeInsure[I] then
  1504.       begin
  1505.         Inc (NodeCD[I], Round (NodeBet[I]));
  1506.         GiveMSG (9, '', '^A^pYou^I^n win ^A^nyour insurance bet and get ^A^p'+ToStr(Round(NodeBet[I]))
  1507.                  +' ^A^nCyberdollars!', I);
  1508.         If NodeGender (I) then
  1509.           BroadCastBut (9, '', '^A^p'+NodeUser(I)+'^I^n wins ^A^nher insurance bet and gets ^A^p'
  1510.                         +ToStr(Round(NodeBet[I]))+' ^A^nCyberdollars!', I)
  1511.         else
  1512.           BroadCastBut (9, '', '^A^p'+NodeUser(I)+'^I^n wins ^A^nhis insurance bet and gets ^A^p'
  1513.                         +ToStr(Round(NodeBet[I]))+' ^A^nCyberdollars!', I)
  1514.       end;
  1515.       If (HandValue (NodeHand[I]) = 21) and (Length(NodeHand[I]) = 4) then
  1516.       begin
  1517.         BroadCastBut (9, '', '^A^p'+NodeUser(I)+'^A^n''s cards: '+ColorHand(NodeHand[I])+
  1518.                    ' ^A^n(^A^p'+ToStr(HandValue(NodeHand[I]))+'^A^n)', I);
  1519.         GiveMSG (9, '', '^A^pYour^A^n cards: '+ColorHand(NodeHand[I])+
  1520.                    ' ^A^n(^A^p'+ToStr(HandValue(NodeHand[I]))+'^A^n)', I);
  1521.         BroadCastBut (9, '', '^A^p'+NodeUser(I)+'^A^n loses nothing.',I);
  1522.         GiveMSG (9, '', '^A^pYou^A^n lose nothing.',I);
  1523.       end
  1524.       else
  1525.       begin
  1526.         If HandValue (NodeHand[I]) < 22 then
  1527.         begin
  1528.           BroadCastBut (9, '', '^A^p'+NodeUser(I)+'^A^n''s cards: '+ColorHand(NodeHand[I])+
  1529.                         ' ^A^n(^A^p'+ToStr(HandValue(NodeHand[I]))+'^A^n)', I);
  1530.           GiveMSG (9, '', '^A^pYour^A^n cards: '+ColorHand(NodeHand[I])+
  1531.                   ' ^A^n(^A^p'+ToStr(HandValue(NodeHand[I]))+'^A^n)', I);
  1532.           BroadCastBut (9, '', '^A^p'+NodeUser(I)+'^I^n loses ^A^p'+ToStr(NodeBet[I]*NodeDD[I])+' ^A^nCyberdollars!',I);
  1533.           GiveMSG (9, '', '^A^pYou^I^n lose ^A^p'+ToStr(NodeBet[I]*NodeDD[I])+' ^A^nCyberdollars!',I);
  1534.           Dec (NodeCD[I], NodeBet[I]*NodeDD[I]);
  1535.         end;
  1536.       end;
  1537.       If (HandValue (NodeHand2[I]) = 21) and (Length(NodeHand2[I]) = 4) and
  1538.          (NodeHand2[I] <> '') then
  1539.       begin
  1540.         BroadCastBut (9, '', '^A^p'+NodeUser(I)+'^A^n''s second hand: '+ColorHand(NodeHand2[I])+
  1541.                    ' ^A^n(^A^p'+ToStr(HandValue(NodeHand2[I]))+'^A^n)', I);
  1542.         GiveMSG (9, '', '^A^pYour^A^n second hand: '+ColorHand(NodeHand2[I])+
  1543.                    ' ^A^n(^A^p'+ToStr(HandValue(NodeHand2[I]))+'^A^n)', I);
  1544.         BroadCastBut (9, '', '^A^p'+NodeUser(I)+'^A^n loses nothing.',I);
  1545.         GiveMSG (9, '', '^A^pYou^A^n lose nothing.',I);
  1546.       end
  1547.       else
  1548.       begin
  1549.         If (NodeHand2[I] <> '') and (HandValue (NodeHand2[I]) < 22) then
  1550.         begin
  1551.           BroadCastBut (9, '', '^A^p'+NodeUser(I)+'^A^n''s second hand: '+ColorHand(NodeHand2[I])+
  1552.                      ' ^A^n(^A^p'+ToStr(HandValue(NodeHand2[I]))+'^A^n)', I);
  1553.           GiveMSG (9, '', '^A^pYour^A^n second hand: '+ColorHand(NodeHand2[I])+
  1554.                      ' ^A^n(^A^p'+ToStr(HandValue(NodeHand2[I]))+'^A^n)', I);
  1555.           BroadCastBut (9, '', '^A^p'+NodeUser(I)+'^I^n loses ^A^p'+ToStr(NodeBet[I]*NodeDD2[I])+' ^A^nCyberdollars!',I);
  1556.           GiveMSG (9, '', '^A^pYou^I^n lose ^A^p'+ToStr(NodeBet[I]*NodeDD2[I])+' ^A^nCyberdollars!',I);
  1557.           Dec (NodeCD[I], NodeBet[I]*NodeDD2[I]);
  1558.         end;
  1559.       end;
  1560.     end;
  1561.   end
  1562.   else
  1563.   For I := 1 to 255 do if NodeStat[I] = 2 then
  1564.   begin
  1565.     If HandValue (NodeHand[I]) < 22 then
  1566.     begin
  1567.       BroadCastBut (9, '', '^A^p'+NodeUser(I)+'^A^n''s cards: '+ColorHand(NodeHand[I])+
  1568.                  ' ^A^n(^A^p'+ToStr(HandValue(NodeHand[I]))+'^A^n)', I);
  1569.       GiveMSG (9, '', '^A^pYour^A^n cards: '+ColorHand(NodeHand[I])+
  1570.                  ' ^A^n(^A^p'+ToStr(HandValue(NodeHand[I]))+'^A^n)', I);
  1571.       If (HandValue (NodeHand[I]) = 21) and (Length (NodeHand[I]) = 4) then
  1572.       begin
  1573.         { Blackjack }
  1574.         GiveMSG (9, '', '^I^nYou got a ^I^pblackjack^I^n!', I);
  1575.         BroadCastBut (9, '', '^A^p'+NodeUser(I)+' ^A^nhas a ^A^pblackjack^A^n!', I);
  1576.         BroadCastBut (9, '', '^A^p'+NodeUser(I)+'^I^n wins ^A^p'+ToStr(Round(NodeBet[I]*(3/2)))
  1577.                           +' ^A^nCyberdollars!', I);
  1578.         GiveMSG (9, '', '^A^pYou^I^n win ^A^p'+ToStr(Round(NodeBet[I]*(3/2)))+' ^A^nCyberdollars!', I);
  1579.         Inc (NodeCD[I], Round(NodeBet[I]*(3/2)));
  1580.         Writeln (NodeUser(I), ' gets a blackjack.');
  1581.       end
  1582.       else
  1583.       If HandValue (NodeHand[I]) > DealerValue then
  1584.       begin
  1585.         BroadCastBut (9, '', '^A^p'+NodeUser(I)+'^I^n wins ^A^p'+ToStr(NodeBet[I]*NodeDD[I])+' ^A^nCyberdollars!',I);
  1586.         GiveMSG (9, '', '^A^pYou^I^n win ^A^p'+ToStr(NodeBet[I]*NodeDD[I])+' ^A^nCyberdollars!',I);
  1587.         Inc (NodeCD[I], NodeBet[I]*NodeDD[I]);
  1588.       end
  1589.       else
  1590.       If HandValue (NodeHand[I]) < DealerValue then
  1591.       begin
  1592.         BroadCastBut (9, '', '^A^p'+NodeUser(I)+'^I^n loses ^A^p'+ToStr(NodeBet[I]*NodeDD[I])+' ^A^nCyberdollars!',I);
  1593.         GiveMSG (9, '', '^A^pYou^I^n lose ^A^p'+ToStr(NodeBet[I]*NodeDD[I])+' ^A^nCyberdollars!',I);
  1594.         Dec (NodeCD[I], NodeBet[I]*NodeDD[I]);
  1595.       end
  1596.       else
  1597.       If HandValue (NodeHand[I]) = DealerValue then
  1598.       begin
  1599.         BroadCastBut (9, '', '^A^p'+NodeUser(I)+'^A^n loses nothing.',I);
  1600.         GiveMSG (9, '', '^A^pYou^A^n lose nothing.',I);
  1601.       end;
  1602.       If NodeInsure[I] then
  1603.       begin
  1604.         Dec (NodeCD[I], Round (NodeBet[I]/2));
  1605.         GiveMSG (9, '', '^A^pYou^I^n lose ^A^nyour insurance bet of ^A^p'+ToStr(Round(NodeBet[I]/2))
  1606.                  +' ^A^nCyberdollars!', I);
  1607.         If NodeGender (I) then
  1608.           BroadCastBut (9, '', '^A^p'+NodeUser(I)+'^I^n loses ^A^nher insurance bet of ^A^p'
  1609.                         +ToStr(Round(NodeBet[I]/2))+' ^A^nCyberdollars!', I)
  1610.         else
  1611.           BroadCastBut (9, '', '^A^p'+NodeUser(I)+'^I^n loses ^A^nhis insurance bet of ^A^p'
  1612.                         +ToStr(Round(NodeBet[I]/2))+' ^A^nCyberdollars!', I)
  1613.       end;
  1614.     end;
  1615.     If (NodeHand2[I] <> '') and (HandValue (NodeHand2[I]) < 22) then
  1616.     begin
  1617.       BroadCastBut (9, '', '^A^p'+NodeUser(I)+'^A^n''s second hand: '+ColorHand(NodeHand2[I])+
  1618.                  ' ^A^n(^A^p'+ToStr(HandValue(NodeHand2[I]))+'^A^n)', I);
  1619.       GiveMSG (9, '', '^A^pYour^A^n second hand: '+ColorHand(NodeHand2[I])+
  1620.                  ' ^A^n(^A^p'+ToStr(HandValue(NodeHand2[I]))+'^A^n)', I);
  1621.       If (HandValue (NodeHand2[I]) = 21) and (Length (NodeHand2[I]) = 4) then
  1622.       begin
  1623.         { Blackjack }
  1624.         GiveMSG (9, '', '^I^nYou got a ^I^pblackjack^I^n!', I);
  1625.         BroadCastBut (9, '', '^A^p'+NodeUser(I)+' ^A^nhas a ^A^pblackjack^A^n!', I);
  1626.         BroadCastBut (9, '', '^A^p'+NodeUser(I)+'^I^n wins ^A^p'+ToStr(Round(NodeBet[I]*(3/2)))
  1627.                           +' ^A^nCyberdollars!', I);
  1628.         GiveMSG (9, '', '^A^pYou^I^n win ^A^p'+ToStr(Round(NodeBet[I]*(3/2)))+' ^A^nCyberdollars!', I);
  1629.         Inc (NodeCD[I], Round(NodeBet[I]*(3/2)));
  1630.         Writeln (NodeUser(I), ' gets a blackjack.');
  1631.       end
  1632.       else
  1633.       If HandValue (NodeHand2[I]) > DealerValue then
  1634.       begin
  1635.         BroadCastBut (9, '', '^A^p'+NodeUser(I)+'^I^n wins ^A^p'+ToStr(NodeBet[I]*NodeDD2[I])+' ^A^nCyberdollars!',I);
  1636.         GiveMSG (9, '', '^A^pYou^I^n win ^A^p'+ToStr(NodeBet[I]*NodeDD2[I])+' ^A^nCyberdollars!',I);
  1637.         Inc (NodeCD[I], NodeBet[I]*NodeDD2[I]);
  1638.       end
  1639.       else
  1640.       If HandValue (NodeHand2[I]) < DealerValue then
  1641.       begin
  1642.         BroadCastBut (9, '', '^A^p'+NodeUser(I)+'^I^n loses ^A^p'+ToStr(NodeBet[I]*NodeDD2[I])+' ^A^nCyberdollars!',I);
  1643.         GiveMSG (9, '', '^A^pYou^I^n lose ^A^p'+ToStr(NodeBet[I]*NodeDD2[I])+' ^A^nCyberdollars!',I);
  1644.         Dec (NodeCD[I], NodeBet[I]*NodeDD2[I]);
  1645.       end
  1646.       else
  1647.       If HandValue (NodeHand2[I]) = DealerValue then
  1648.       begin
  1649.         BroadCastBut (9, '', '^A^p'+NodeUser(I)+'^A^n loses nothing.',I);
  1650.         GiveMSG (9, '', '^A^pYou^A^n lose nothing.',I);
  1651.       end;
  1652.       If NodeInsure[I] then
  1653.       begin
  1654.         Dec (NodeCD[I], Round (NodeBet[I]/2));
  1655.         GiveMSG (9, '', '^A^pYou^I^n lose ^A^nyour insurance bet of ^A^p'+ToStr(Round(NodeBet[I]/2))
  1656.                  +' ^A^nCyberdollars!', I);
  1657.         If NodeGender (I) then
  1658.           BroadCastBut (9, '', '^A^p'+NodeUser(I)+'^I^n loses ^A^nher insurance bet of ^A^p'
  1659.                         +ToStr(Round(NodeBet[I]/2))+' ^A^nCyberdollars!', I)
  1660.         else
  1661.           BroadCastBut (9, '', '^A^p'+NodeUser(I)+'^I^n loses ^A^nhis insurance bet of ^A^p'
  1662.                         +ToStr(Round(NodeBet[I]/2))+' ^A^nCyberdollars!', I)
  1663.       end;
  1664.     end;
  1665.   end;
  1666.   GamePlaying := False;
  1667.   SecPassed := 0;
  1668.   For I := 1 to 255 do
  1669.   begin
  1670.     If NodeStat[I] = 2 then NodeStat[I] := 1;
  1671.     NodeDD[I] := 1;
  1672.     NodeDD2[I] := 1;
  1673.     NodeDoneH1[I] := False;
  1674.     NodeDoneH2[I] := False;
  1675.     NodeHand2[I] := '';
  1676.     NodeInsure[I] := False;
  1677.   end;
  1678. end;
  1679.  
  1680. Procedure BootUser;
  1681. begin
  1682.   GiveMSG (9, '', #7'^I^nYou have been thrown out of the ^I^pblackjack^I^n game for taking too long!', NodeTurn);
  1683.   BroadCastBut (9, '', '^A^nThe ^A^pBlackjack dealer^A^n has thrown ^A^p'+NodeUser(NodeTurn)
  1684.                 +'^A^n out of the game for taking too long!', NodeTurn);
  1685.   NodeStat[NodeTurn] := 0;
  1686.   Dec (NodeCD[NodeTurn], NodeBet[NodeTurn]);
  1687.   WaitSec;
  1688.   NextPlayer;
  1689. end;
  1690.  
  1691. Procedure RunBJ;
  1692. Var
  1693.   ch : Char;
  1694. begin
  1695.   ch := #0;
  1696.   OldSec := 0;
  1697.   SecPassed := 0;
  1698.   GamePlaying := False;
  1699.   Repeat
  1700.     GetTime (L, L, Sec, L);
  1701.     If Sec <> OldSec then
  1702.     begin
  1703.       OldSec := Sec;
  1704.       Inc (SecPassed);
  1705.     end;
  1706.     If not GamePlaying and (SecPassed > ConfigData.TimeBetweenGames) then StartGame;
  1707.     If GamePlaying and (SecPassed = ConfigData.FirstWarn) then WarnUser;
  1708.     If GamePlaying and (SecPassed = ConfigData.SecondWarn) then WarnUser;
  1709.     If GamePlaying and (SecPassed = ConfigData.BootFromBJ) then BootUser;
  1710.     If MSGWait then GetMSGs;
  1711.     TimeSlice (2);
  1712.     If (NodeTurn = -1) and (GamePlaying) then DealerPlay;
  1713.     If Keypressed then ch := Readkey;
  1714.   Until ch = #27;
  1715. end;
  1716.  
  1717. begin
  1718.   InitProgram;
  1719.   InitTOP;
  1720.   InitScreen;
  1721.   InitVars;
  1722.   RunBJ;
  1723.   DeInit;
  1724. end.
  1725.