-+-+-+-+-+-+-+-+ START OF PART 3 -+-+-+-+-+-+-+-+
X  card_draw(i,13,dummyd`5Bi`5D);
X  evaluate_dl_hand(i)
Xend;
X`20
X`20
X`20
Xprocedure get_player_card(i : integer);
X`20
Xbegin
X  playerh`5Bi`5D := randint(13)+1;
X    case (playerh`5Bi`5D) of
X      2 :  dummy`5BI`5D := '2';
X      3 :  dummy`5BI`5D := '3';
X      4 :  dummy`5BI`5D := '4';
X      5 :  dummy`5BI`5D := '5';
X      6 :  dummy`5BI`5D := '6';
X      7 :  dummy`5BI`5D := '7';
X      8 :  dummy`5BI`5D := '8';
X      9 :  dummy`5BI`5D := '9';
X     10 :  dummy`5BI`5D := '10';
X     11 :  dummy`5BI`5D := 'J';
X     12 :  dummy`5BI`5D := 'Q';
X     13 :  dummy`5BI`5D := 'K';
X     14 :  dummy`5BI`5D := 'A';
X    end;
X  card_draw(i,6,dummy`5Bi`5D);
X  evaluate_pl_hand;
Xend;
X`20
X`20
X`20
Xprocedure get_dealer_hand;
X`20
Xbegin
X    get_dealer_card(1);
X    get_dealer_card(2);
Xend;
X`20
X`20
Xprocedure get_player_hand;
X`20
Xbegin
X    get_player_card(1);
X    py_index := 2;
X    get_player_card(2);
Xend;
X`20
X`20
Xprocedure get_winning;
X`20
Xvar
X  i     : integer;
X`20
Xbegin
X     if (deal_bust)  then
X       begin
X         gld := gld + 2*bet;
X         case (randint(4)) of
X             1,2,3 : msg_print('The dealer busts, you win.');
X                 4 : msg_print('The dealer busts.');
X         end
X       end
X     else
X        begin
X           if ((vald > valp) and (vald <> valp)) then
X              begin
X                case (randint(5)) of
X               1,2,3 : msg_print('You lose.');
X                   4 : msg_print('Now you know why gambling is illegal.');
X                   5 : msg_print('If you had just taken one more card...');
X                end;
X              end;
X           if vald = valp then begin
X                 msg_print('You push');
X                 gld := gld + bet;
X                 end;
X           if valp > vald then begin
X                 case (randint(4)) of
X                   1,2,3  : msg_print('You win.');
X                       4  : msg_print('You''re not card-counting are you?');
X                 end;
X                 gld := gld + bet*2;
X              end;
X        end;
Xend;
X`20
X`20
Xprocedure play_dealer_hand;
X  var
X    i : integer;
X    stay_flag : boolean;
X`20
Xbegin
Xstay_flag := false;
Xwin_draw := true;
Xcard_draw(1,13,dummyd`5B1`5D);
X   i := 3;
X   if ((vald = 17) and (dl_ace_flag)) or (vald < 17) then
X       begin
X         repeat
X          get_dealer_card(i);
X          i := i + 1;
X          if vald > 16 then stay_flag := true;
X          if (vald = 17) and (dl_ace_flag) then stay_flag := false;
X          if i > 9 then stay_flag := true;
X         until (stay_flag);
X       end;
X  get_winning;
Xend;
X`20
X`20
X`20
Xprocedure double;
X`20
Xbegin
Xbet := bet*2;
Xpy_index := py_index + 1;
Xget_player_card(py_index);
Xdouble_flag := true;
Xend;
X`20
X`20
X`20
Xprocedure split;
X`20
Xbegin
X  playerh`5B6`5D := playerh`5B1`5D;
X  dummy`5B6`5D:= dummy`5B1`5D;
X  card_draw(6,6,dummy`5B6`5D);
X  get_player_card(2);
X  get_player_card(7);
X  split_flag := true;
Xend;
X`20
X`20
X`20
X`20
Xprocedure get_game_command;
X  var
X    command            : char;
X    com_val            : integer;
X    n                  : integer;
X`20
Xbegin
X  if get_com( '', command) then
X     begin
X       com_val   := ord(command);
X       case com_val of
X          104 : begin                                    (* hit *)
X                  py_index := py_index + 1;
X                  get_player_card(py_index);
X                end;
X          115 : pl_stay_flag := true;                      (* stay *)
X           18 : re_draw;
X          118 : begin
X                  display_rules;
X                  re_draw;
X                end;
X          100 : begin                                    (* double *)
X                if (gld >= bet) then begin
X                  if (py_index = 2) or (py_index = 7) then begin
X                        gld := gld - bet;
X                        display_gold;
X                        double;
X                      end;
X                  end;
X                end;
X           47 : begin                                     (* split *)
X                if not(split_flag) and (gld >= bet) and
X                   (py_index = 2) and (playerh`5B1`5D = playerh`5B2`5D) then
V  begin
X                        gld := gld - bet;
X                        display_gold;
X                        split;
X                        msg_print('First play your hand on the left.');
X                     end;
X                 end;
X         otherwise prt('Invalid Command.',1,1)
X       end;
X       end;
Xend;
X`20
X`20
Xprocedure play_hand;
X  var
X    num,i       : integer;
X`20
Xbegin
X    num := 1;
X    if (split_flag) then
X    begin
X      msg_print('As for your second hand...');
X      num := 2;
X    end;
Xfor i := 1 to num do
X  begin
X  if (i = 2) then msg_print ('As for your first hand...');
X  if (i = 2) and (double_flag) then bet := bet div 2;
X  if (i = 2) and (double_flag_save) then bet := bet*2;
X  if not(card5 or bust_flag or blackjack) then play_dealer_hand
X  else  begin
X      if card5 and not(bust_flag) then begin
X         gld := gld + 2*bet;
X         msg_print('Five cards, you win.');
X         end;
X      if bust_flag then begin
X         case (randint(3)) of
X           1,3 :  msg_print('You bust.');
X           2   :  msg_print('You should have stood.');
X         end
X        end;
X      if blackjack then begin
X         msg_print('Blackjack!');
X         win_draw := true;
X         card_draw(1,13,dummyd`5B1`5D);
X         if vald = 21 then begin
X             msg_print('The dealer also has 21 ... You push.');
X             gld := gld + bet;
X             end
X         else gld := gld + 2*bet + bet div 2;
X      end;
X  end;
X  valp := save;
X  bust_flag := bust_save;
X  blackjack := blackjack_save;
X  card5 := card5_save;
X  display_gold;
Xend;
X  clear(21,1);
X  bet := 0;
Xend;
X`20
X`20
Xprocedure play_bj;
X  var
X    exit_flag   : boolean;
X`20
Xbegin
X  exit_flag := false;
X  clear(1,1);
X  display_bj_game;
X  initialize_hand;
X  get_dealer_hand;
X  get_player_hand;
X  repeat
X    if not((valp=21) and ((py_index=2)or(py_index=7))) then get_game_command
V;
X    check_exit(exit_flag);
X  until exit_flag;
X  play_hand;
Xend;
X`20
X`20
X`20
Xprocedure get_bj_bet;
X  var
X    comment      : vtype;
X    num          : integer;
X        exit_flag    : boolean;
X  begin
X      exit_flag := false;
X      comment := 'How much would you like to bet(50 to 1000 gp)? ';
X      repeat
X      if get_response(comment, num) then
X      begin
X        bet := num;
X          if (bet>49) and (bet<1001) then exit_flag := true
X          else prt('Improper value.',1,1)
X      end
X    else
X      begin
X         exit_flag := true;
X         bet := 0
X      end;
X  until (exit_flag);
X    if bet > gld then
X       begin
X         prt('You have not the gold!',1,1);
X         bet := 0;
X       end;
X  gld := gld - bet;
X  display_gold
Xend;
X`20
X`20
X`20
Xprocedure blackjack_commands;
X  var
X    command     : char;
X    exit_flag   : boolean;
X    n           : integer;
X`20
Xbegin
X  bet := 0;
X  win_draw := false;
X  exit_flag   := false;
X  repeat
X  if get_com('', command) then
X     begin
X       case (ord(command))  of
X          112   :   begin
X                      get_bj_bet;
X                      if bet >0 then
X                          begin
X                            play_bj;
X                            display_bj;
X                          end
X                    end;
X           118  :   begin
X                      display_rules;
X                      re_draw;
X                    end;
X            18  :   begin
X                      clear(1,1);
X                      re_draw;
X                    end;
X         otherwise prt('Invalid Command.',1,1);
X       end
X     end
X  else exit_flag  := true;
X  check_casino_kickout;
X  until (exit_flag)
Xend;
X`20
X`20
Xprocedure game_blackjack;
X`20
Xbegin
X      clear(1,1);
X      display_bj;
X      initialize_hand;
X      opening_screen;
X      prt('The dealer awaits your bet.',1,1);
X      blackjack_commands
Xend;
X`20
X`20
X`20
$ CALL UNPACK BJ.INC;1 307279404
$ create 'f'
X
X`5Bpsect(misc2$code)`5D procedure blow;
X      var
X`09`09i1`09`09`09`09: unsigned;
X`09`09i3,i4,chance,i5`09`09`09: integer;
X`09`09i2,item_ptr`09`09`09: treas_ptr;
X`09`09dir`09`09`09`09: char;
X`09`09dur`09`09`09`09: integer;
X`09`09dumy,y_dumy,x_dumy`09`09: integer;
X`09`09out_val`09`09`09`09: vtype;
X`09`09redraw,ident`09`09`09: boolean;
X`09`09tstat`09`09`09`09: stat_set;
X`09`09loss`09`09`09`09: integer;
X      begin
X`09reset_flag := true;
X`09if (inven_ctr > 0) then
X`09  begin
X`09    if (find_range(`5Bmisc_usable,horn,chime,valuable_gems`5D,false,i2,i3
V)) then
X`09      begin
X`09`09redraw := false;
X`09`09if (get_item(item_ptr,'Use which item?',redraw,i3,trash_char,false)) t
Vhen
X`09`09  with item_ptr`5E.data do
X`09`09    begin
X`09`09      if (redraw) then draw_cave;
X`09`09`09reset_flag := false;
X`09`09`09with py.misc do
X`09`09`09  chance := save + lev + bard_adj - level - 5;
X`09`09`09if (((py.flags.confused + py.flags.afraid) > 0) and
X`09`09`09    ((tval = chime) or (tval = horn))) then
X`09`09`09  msg_print('you can not use the instrument...')
X`09`09`09else if (p1 > 0) then
X`09`09`09begin
X`09`09`09if (chance < 0) then chance := 0;
X`09`09`09if (randint(chance) < use_device) and
X`09`09`09   ((tval <> misc_usable) and (subval <> 24)) then
X`09`09`09  msg_print('You failed to use the item properly.')
X`09`09`09else`20
X`09`09`09  begin
X`09`09`09    i1 := flags;
X`09`09`09    ident := false;
X`09`09`09    p1 := p1 - 1;
X`09`09`09    while (i1 > 0) do
X`09`09`09      begin
X`09`09`09`09i5 := bit_pos(i1);
X`09if ((tval = chime) or (tval=horn)) then
X`09begin
X`09`7B Chimes...`09`09`09`09      `7D
X`09case (i5) of
X`7B Chime of Light `7D
X`09  1  :`09ident := light_area(char_row,char_col);
X`7B Chime of Detect Doors/Stairs `7D
X`09  2  :`09ident := detect_sdoor;
X`7B Chime of Detect Traps `7D
X`09  3  :`09ident := detect_trap;
X`7B Chime of Teleportation `7D
X`09  4  :`09begin
X`09`09  teleport(100);
X`09`09  ident := true;
X`09`09end;
X`7B Chime of Thunderblasts `7D
X`09  5  :`09ident := earthquake;
X`7B Chime of Summon Monster `7D
X`09  6  :`09begin
X`09`09  for i3 := 1 to randint(4) do
X`09`09    begin
X`09`09      y := char_row;
X`09`09      x := char_col;
X`09`09      if (cave`5By,x`5D.fval in water_set) then
X`09`09`09summon_water_monster(y,x,false)
X`09`09      else
X`09`09`09summon_land_monster(y,x,false);
X`09`09    end;
X`09`09  ident := true;
X`09`09end;
X`7B Chime of Disarming `7D
X`09   7 :`09begin
X`09`09  ident := true;
X`09`09  for i3 := 1 to 9 do
X`09`09    if (i3 <>5) then
X`09`09      disarm_all(i3,char_row,char_col);
X`09`09end;
X`7B Chime of Aggravation `7D
X`09   8 :`09ident := aggravate_monster(20);
X`7B Chime of Slow Monster `7D
X`09   9 :`09ident := zap_area(0,-1,c_speed);
X`7B Chime of Sooth Monster `7D
X`09  10 :`09ident := zap_area(0,0,c_sleep);
X`7B Chime of Cure Light Wounds `7D
X`09  11 :`09ident := hp_player(randint(8),'a chime.');
X`7B Chime of Changing `7D
X`09  12 :`09ident := mass_poly;
X`7B Chime of Remove Curse `7D
X`09  13 :`09if (remove_curse) then
X`09`09  begin
X`09`09    msg_print('Your equipment glows blue for a moment...');
X`09`09    ident := true;
X`09`09  end;
X`7B Chime of Curing `7D
X`09  14 :`09with py.flags do
X`09`09  ident := cure_me(blind) or cure_me(poisoned)
X`09`09`09or cure_me(confused);
X`7B Chime of Dispell Evil `7D
X`09  15 :`09ident := zap_area(%X'0004',60,c_hp);
X`7B Chime of Darkness `7D
X`09  16 :`09ident := unlight_area(char_row,char_col);
X`7B Horns...`09`09`09`09`09`09`09       `7D
X`7B Horn of Bubbles `7D
X`09  17 :`09begin
X`09`09 msg_print('Bubbles stream forth and surround you!');
X`09`09 py.flags.blind := py.flags.blind + (randint(20) +5);
X`09`09 ident := unlight_area(char_row,char_col);
X`09`09end;
X`7B Horn of Calling `7D
X`09  18 :`09begin
X`09`09  for i3 := 1 to randint(4) do
X`09`09    begin
X`09`09      y := char_row;
X`09`09      x := char_col;
X`09`09      if (cave`5By,x`5D.fval in water_set) then
X`09`09`09summon_water_monster(y,x,false)
X`09`09      else
X`09`09`09summon_land_monster(y,x,false);
X`09`09    end;
X`09`09  ident := true;
X`09`09end;
X`7B Horn of Soft Sounds `7D
X`09  19 :`09ident := sleep_monsters1(char_row,char_col);
X`7B Horn of *Blasting* `7D
X`09  20 :`09ident := destroy_area(char_row,char_col);
X`7B Horn of Cold `7D
X`09  21 :`09begin
X`09`09  msg_print('A wave of cold pours forth...');
X`09`09  ident := zap_area(%X'0010',60,c_hp);
X`09`09end;
X`7B Horn of Heat `7D
X`09  22 :`09begin
X`09`09  msg_print('A blast of warm air pours forth...');
X`09`09  ident := zap_area(%X'0020',60,c_hp);
X`09`09end;
X`7B Horn of Gas `7D
X`09  23 :`09begin
X`09`09  msg_print('Gas streams out ...!');
X`09`09  ident := zap_area(%X'0040',60,c_hp);
X`09`09  py.flags.poisoned := py.flags.poisoned + randint(10)
X`09`09end;
X`7B Horn of Recall `7D
X`09  24 :`09begin
X`09`09  py.flags.word_recall := (randint(20) + 20);
X`09`09  ident:= true;
X`09`09end;
X`7B Horn of *Chaos* `7D
X`09  25 :`09begin
X`09`09  ident := earthquake;
X`09`09  ident := unlight_area(char_row,char_col);
X`09`09  for i3 := 1 to randint(4) do
X`09`09    begin
X`09`09      y := char_row;
X`09`09      x := char_col;
X`09`09      if (cave`5By,x`5D.fval in water_set) then
X`09`09`09summon_water_monster(y,x,false)
X`09`09      else
X`09`09`09summon_land_monster(y,x,false);
X`09`09    end;
X`09`09end;
X`7B Horn of Glue `7D
X`09  26 :`09begin
X`09`09  msg_print('glue pours out of the horn!');
X`09`09  msg_print('all of your equipment is stuck!');
X`09`09  for i3 := Equipment_primary to Equipment_cloak do
X`09`09    with equipment`5Bi3`5D do
X`09`09      flags := uor(flags,%X'80000000');
X`09`09  with equipment`5BEquipment_secondary`5D do
X`09`09    flags := uor(flags,%X'80000000');
X`09`09  ident := true;
X`09`09end;
X`7B Horn of Valhalla `7D
X`09  27 :`09begin
X`09`09  msg_print('The Voice of Odin (oh brother...) smites evil!');
X`09`09  ident := zap_area(%X'0004',70,c_hp);
+-+-+-+-+-+-+-+-  END  OF PART 3 +-+-+-+-+-+-+-+-
