{ Included File: SCORE.INC }

function score(hand: handtype):integer;
const jack = 11;
var
 index: 1..5;
 return: integer;
 cardmax: 4..5;

 function fifteen(hand: handtype):integer;
 var
   ways: integer;
   i,j,k: 1..dealsize;
   sum: integer;
 begin
   sum:=0;
   for i:=1 to cardmax do
     begin
       if hand[i].rank>10 then hand[i].rank:=10;
       sum:=sum+hand[i].rank
     end;
   ways:=0;
   if sum=15 then ways:=1;
   for i:=1 to cardmax do
     begin
       with hand[i] do
         begin
           if (sum-rank) <= 15 then
             begin
               if (sum-rank) = 15 then ways:=ways+1
             end
           else
             for j:=i+1 to cardmax do   { ????????????? }
               begin
                 if (sum-rank-hand[j].rank)<=15 then
                   begin
                     if (sum-rank-hand[j].rank)=15 then
                       ways:=ways+1
                   end
                 else
                   for k:=j+1 to cardmax do
                     if (sum-rank-hand[j].rank-hand[k].rank)=15 then
                       ways:=ways+1
               end
         end {with}
     end;
   fifteen:=ways*2
 end;  {fifteen}

 function run(hand: handtype):integer;
 var
   mult: integer;
   matched: 0..5;
   i: 1..dealsize;
   return: integer;
   seen: boolean;
 begin
   mult:=1;
   matched:=0;
   return:=0;
   seen:=false;
   for i:=1 to (cardmax-1) do
     begin
       if hand[i].rank=hand[i+1].rank then
         begin
           if seen then mult:=mult+1
           else mult:=mult+2;
           seen:=true;
           if i=(cardmax-1) then
             begin
               if mult>=2 then mult:=mult-1;
               if matched>=2 then
                 return:=return+((matched+1)*mult);
               matched:=0
             end
         end
       else
         begin
           seen:=false;
           if hand[i].rank=(hand[i+1].rank-1) then
             matched:=matched+1
           else
             begin
               if mult>=2 then mult:=mult-1;
               if matched>=2 then
                 return:=return+((matched+1)*mult);
               mult:=1;
               matched:=0
             end
         end
     end;
   if mult>=2 then mult:=mult-1;
   if matched>=2 then
     return:=return+((matched+1)*mult);
   run:=return
 end;  {run}

 function pair(hand: handtype):integer;
 var
   return: integer;
   matched: 0..4;
   index: 1..dealsize;
 begin
   return:=0;
   matched:=0;
   for index:=1 to (cardmax-1) do
     begin
       if hand[index].rank=hand[index+1].rank then
         matched:=matched+1;
       if (hand[index].rank<>hand[index+1].rank) or
          (index=cardmax-1) then
          begin
            case matched of
              0: ;
              1: return:=return+2;
              2: return:=return+6;
              3: return:=return+12
              end; {case}
            matched:=0     { ??? }
          end
     end;
   pair:=return
 end;  {pair}

 function flush(hand: handtype):integer;
 var
   return: integer;
   index: 1..dealsize;
 begin
   return:=1;
   for index:=1 to 3 do
     if hand[index].suit=hand[index+1].suit then
       return:=return+1;
   if return=4 then
     begin
       if common.rank<>0 then
         if common.suit=hand[4].suit then return:=5;
       flush:=return
     end
   else flush:=0
 end;  {flush}

BEGIN  {score}
 return:=0;
 cardmax:=4;
 return:=return + flush(hand);
 if common.rank<>0 then
   begin
     cardmax:=5;
     for index := 1 to playsize do
       if hand[index].rank = jack then
          if hand[index].suit = common.suit then
             return:=return+1;  {GLITCH IN THE BOOK???}
     hand[5]:=common;
     sort(5,hand)
   end
 else
   begin
     hand[5].rank:=0
   end;
 return:= fifteen(hand)+return;
 return:= pair(hand)+return;
 return:= run(hand)+return;
 score:=return
END;   {score}