{$R+}
{$U+}
{**********************************************************}
{**                                                      **}
{**      ESPSCORE                                        **}
{**                                                      **}
{**      A  unit that saves scores:                      **}
{**      in a series of records that represent a total   **}
{**      record of time, date, elapsed time, color of    **}
{**      the screen, type of sound reinforcement, type   **}
{**      of visual reinforcement, the placement of the   **}
{**      target on the select menu, the target and the   **}
{**      current name of the saved file.                 **}
{**                                                      **}
{**      Copyright 1991 Phil Mosier                      **}
{**                                                      **}
{**********************************************************}
Unit ESPSCORE;
{****}
Interface
Uses Graph,Crt;
Procedure SAVESCORE(Var WRITE_OK : Boolean;
                    D_TARGET:Char;
                    D_GUESS:Char;
                    D_HIT_MISS:Char;
                    D_COLOR_OF_CARD:Char;
                    D_SCREEN_DISPLAY1:Char;
                    D_SCREEN_DISPLAY2:Char;
                    D_SCREEN_DISPLAY3:Char;
                    D_SCREEN_DISPLAY4:Char;
                    D_SCREEN_DISPLAY5:Char;
                    D_REINFORCE_SOUND:Char;
                    D_REINFORCE_VISUAL:Char;
                    D_STYLE:Char;
                    D_CUR_YEAR:Word;
                    D_CUR_MONTH:Word;
                    D_CUR_DAY:Word;
                    D_START_HOUR:Word;
                    D_START_MIN:Word;
                    D_START_SEC:Word;
                    D_ELAPESED_SEC:LongInt;
                    D_NAME1: Char;
                    D_NAME2: Char;
                    D_NAME3: Char;
                    D_NAME4: Char;
                    D_NAME5: Char;
                    D_NAME6: Char;
                    D_NAME7: Char;
                    D_NAME8: Char);


Procedure GETSCORE (Var HITS:Word;
                    Var TRIALS :Word;
                    Var FOUND_FLAG : Boolean;
                    D_NAME1: Char;
                    D_NAME2: Char;
                    D_NAME3: Char;
                    D_NAME4: Char;
                    D_NAME5: Char;
                    D_NAME6: Char;
                    D_NAME7: Char;
                    D_NAME8: Char);

Procedure GET_RATIOS(Var HIT_I_1: Word;
                     Var HIT_I_2: Word;
                     Var HIT_I_3: Word;
                     Var HIT_I_4: Word;
                     Var HIT_I_5: Word;
                     Var HIT_P_1: Word;
                     Var HIT_P_2: Word;
                     Var HIT_P_3: Word;
                     Var HIT_P_4: Word;
                     Var HIT_P_5: Word;
                     Var TRIAL_I_1: Word;
                     Var TRIAL_I_2: Word;
                     Var TRIAL_I_3: Word;
                     Var TRIAL_I_4: Word;
                     Var TRIAL_I_5: Word;
                     Var TRIAL_P_1: Word;
                     Var TRIAL_P_2: Word;
                     Var TRIAL_P_3: Word;
                     Var TRIAL_P_4: Word;
                     Var TRIAL_P_5: Word;
                     Var TIME_SHORT_HIT: Word;
                     Var TIME_LONG_HIT: Word;
                     Var TIME_SHORT_TRIAL: Word;
                     Var TIME_LONG_TRIAL: Word;
                     Var FOUND_FLAG : Boolean;
                     D_NAME1: Char;
                     D_NAME2: Char;
                     D_NAME3: Char;
                     D_NAME4: Char;
                     D_NAME5: Char;
                     D_NAME6: Char;
                     D_NAME7: Char;
                     D_NAME8: Char);


Implementation

Procedure SAVESCORE(Var WRITE_OK: Boolean;
                    D_TARGET:Char;
                    D_GUESS:Char;
                    D_HIT_MISS:Char;
                    D_COLOR_OF_CARD:Char;
                    D_SCREEN_DISPLAY1:Char;
                    D_SCREEN_DISPLAY2:Char;
                    D_SCREEN_DISPLAY3:Char;
                    D_SCREEN_DISPLAY4:Char;
                    D_SCREEN_DISPLAY5:Char;
                    D_REINFORCE_SOUND:Char;
                    D_REINFORCE_VISUAL:Char;
                    D_STYLE:Char;
                    D_CUR_YEAR:Word;
                    D_CUR_MONTH:Word;
                    D_CUR_DAY:Word;
                    D_START_HOUR:Word;
                    D_START_MIN:Word;
                    D_START_SEC:Word;
                    D_ELAPESED_SEC:LongInt;
                    D_NAME1: Char;
                    D_NAME2: Char;
                    D_NAME3: Char;
                    D_NAME4: Char;
                    D_NAME5: Char;
                    D_NAME6: Char;
                    D_NAME7: Char;
                    D_NAME8: Char);

{*********************************************************}
{**                                                     **}
{**     SAVE SCORE                                      **}
{**                                                     **}
{*********************************************************}
Var GUESS_FILE  : Text;
    DAT_GUESS_RECORD : Array[1..43] Of Char;
    DATE_TEMP : String[10];
    TIME_TEMP : String[8];
    ELAPESED_SEC_TEMP : String[5];
    INDEX : Byte;
    YEAR_ST4 : String[4];
    MONTH_ST2 : String[2];
    DAY_ST2 : String[2];
    HOUR_ST2 : String[2];
    MIN_ST2 : String[2];
    SEC_ST2 : String[2];
    IOCODE : Word;
    OKAY_FLAG : Boolean;
    GUESS_FILE_NAME : String[12];
    TEMP_FILE_NAME : String[8];
    TEST : STRING[4];
Begin
   DAT_GUESS_RECORD[1] := D_TARGET;
   DAT_GUESS_RECORD[2] := D_GUESS;
   DAT_GUESS_RECORD[3] := D_HIT_MISS;
   DAT_GUESS_RECORD[4] := D_COLOR_OF_CARD;
   DAT_GUESS_RECORD[5] := D_SCREEN_DISPLAY1;
   DAT_GUESS_RECORD[6] := D_SCREEN_DISPLAY2;
   DAT_GUESS_RECORD[7] := D_SCREEN_DISPLAY3;
   DAT_GUESS_RECORD[8] := D_SCREEN_DISPLAY4;
   DAT_GUESS_RECORD[9] := D_SCREEN_DISPLAY5;
   DAT_GUESS_RECORD[10] := D_REINFORCE_SOUND;
   DAT_GUESS_RECORD[11] := D_REINFORCE_VISUAL;
   DAT_GUESS_RECORD[12] := D_STYLE;
   Str(D_CUR_YEAR:4,YEAR_ST4);
   Str(D_CUR_MONTH:2,MONTH_ST2);
   Str(D_CUR_DAY:2,DAY_ST2);
   DATE_TEMP := YEAR_ST4+'-'+MONTH_ST2+'-'+DAY_ST2;
   For INDEX := 1 To 10 Do
      DAT_GUESS_RECORD[12 + INDEX] := DATE_TEMP[INDEX];
   Str(D_START_HOUR:2,HOUR_ST2);
   Str(D_START_MIN:2,MIN_ST2);
   Str(D_START_SEC:2,SEC_ST2);
   TIME_TEMP := HOUR_ST2+':'+MIN_ST2+':'+SEC_ST2;
   For INDEX :=1 To 8 Do
      DAT_GUESS_RECORD[22 + INDEX] := TIME_TEMP[INDEX];
   Str(D_ELAPESED_SEC:5,ELAPESED_SEC_TEMP);
   For INDEX := 1 To 5 Do
      DAT_GUESS_RECORD[30 + INDEX] := ELAPESED_SEC_TEMP[INDEX];
   DAT_GUESS_RECORD[36] := D_NAME1;
   DAT_GUESS_RECORD[37] := D_NAME2;
   DAT_GUESS_RECORD[38] := D_NAME3;
   DAT_GUESS_RECORD[39] := D_NAME4;
   DAT_GUESS_RECORD[40] := D_NAME5;
   DAT_GUESS_RECORD[41] := D_NAME6;
   DAT_GUESS_RECORD[42] := D_NAME7;
   DAT_GUESS_RECORD[43] := D_NAME8;
   For INDEX :=  36 To 43 Do
     Begin
       If DAT_GUESS_RECORD[INDEX] <> ' ' Then
          Begin
             TEMP_FILE_NAME[INDEX - 35] := DAT_GUESS_RECORD[INDEX];
             TEMP_FILE_NAME[0] := Char(INDEX - 35);
          End   { End Of DAT_GUESS_RECORD[INDEX] <> ' ' }
     End; {  End Of For INDEX 36 To 43 }
     GUESS_FILE_NAME  := TEMP_FILE_NAME+'.ESP';
{************************************************}
{**                                            **}
{**   This set of lines could print file       **}
{**   instead of writing them to a file        **}
{**                                            **}
{**  ASSIGN (GUESS_FILE,'PRN');                **}
{**  RESET (GUESS_FILE);                       **}
{**  WRITELN(GUESS_FILE,DAT_GUESS_RECORD);     **}
{************************************************}
  WRITE_OK := True;
  Assign(GUESS_FILE,GUESS_FILE_NAME);
  {$I-}
  RESET(GUESS_FILE);
  IOCODE := IOResult;
  {$I+}
  If IOCODE <> 0 Then
  Begin
     If IOCODE = 2 Then
     Begin
        {$I-}
        ReWrite(GUESS_FILE);
        {$I+}
        IOCODE := IOResult;
        If IOCODE = 0 Then
        Begin
           WriteLn(GUESS_FILE,DAT_GUESS_RECORD);
           Close(GUESS_FILE)
        End
        Else
        Begin
           WRITE_OK := False;
           ClearDevice;
           MoveTo(0,190);
           OutText('  Disk Problems !');
           Sound(440);
           Delay(1000);
           NoSound
        End { If IOCODE <> 0 }
     End   {If IOCODE = 2}
     Else
     Begin
        WRITE_OK := False;
        ClearDevice;
        MoveTo(0,190);
        OutText('  Disk Problems !');
        Sound(440);
        Delay(1000);
        NoSound
     End  { IOCODE <> 2}
  End
  Else
  Begin
     APPEND(GUESS_FILE);
     WriteLn(GUESS_FILE, DAT_GUESS_RECORD);
     Close(GUESS_FILE)
  End   {** If IOCODE = 0 **}
End;   { End of SAVESCORE  }

Procedure GETSCORE (Var HITS: Word;
                    Var TRIALS: Word;
                    Var FOUND_FLAG :Boolean;
                    D_NAME1: Char;
                    D_NAME2: Char;
                    D_NAME3: Char;
                    D_NAME4: Char;
                    D_NAME5: Char;
                    D_NAME6: Char;
                    D_NAME7: Char;
                    D_NAME8: Char);
{**************************************}
{**                                  **}
{**************************************}

Var STRING8: String[9];
    FILE_NAME: String[12];
    DAT_GUESS_RECORD: String[43];
    INDEX: Byte;
    GUESS_FILE: Text;
    IOCODE: Word;
    TEMP:String[17];

Begin
    FOUND_FLAG := True;
    HITS := 0;
    TRIALS := 0;
    For INDEX := 1 To 43 Do
       DAT_GUESS_RECORD[INDEX] := ' ';
    STRING8[1] := D_NAME1;
    STRING8[2] := D_NAME2;
    STRING8[3] := D_NAME3;
    STRING8[4] := D_NAME4;
    STRING8[5] := D_NAME5;
    STRING8[6] := D_NAME6;
    STRING8[7] := D_NAME7;
    STRING8[8] := D_NAME8;
    INDEX := 1;
    Repeat
       STRING8[0] := Char(INDEX);
       INDEX := INDEX + 1;
    Until ((STRING8[INDEX] = ' ') Or (INDEX > 8));
    FILE_NAME  := STRING8+'.ESP';
    Assign(GUESS_FILE,FILE_NAME);
    {$I-}
    Reset(GUESS_FILE);
    {$I+}
    IOCODE := IOResult;
    If IOCODE <> 0 Then
       If IOCODE = 2 Then
       Begin
          ClearDevice;
          MoveTo(0,80);
          OutText(FILE_NAME);
          MoveTo(0,120);
          OutText('File not found');
          Delay(4000);
          FOUND_FLAG := False;
       End   { End If iocode = 2 }
    Else
       Begin
          ClearDevice;
          MoveTo(0,190);
          OutText('  Disk Problems !');
          Sound(440);
          Delay(1000);
          NoSound;
          Halt(0);
       End
    Else
       Begin    { If IOCODE = 0 }
       While Not Eof(GUESS_FILE) Do
          Begin
             ReadLn(GUESS_FILE,DAT_GUESS_RECORD);
             If DAT_GUESS_RECORD[3] = 'H' Then
                HITS := HITS + 1;
             TRIALS := TRIALS + 1;
          End;    {  While Not EOF }
       Close(GUESS_FILE);
       End;  { If IOCODE = 0 }
    End; { End of GETSCORE }

Procedure GET_RATIOS(Var HIT_I_1: Word;
                     Var HIT_I_2: Word;
                     Var HIT_I_3: Word;
                     Var HIT_I_4: Word;
                     Var HIT_I_5: Word;
                     Var HIT_P_1: Word;
                     Var HIT_P_2: Word;
                     Var HIT_P_3: Word;
                     Var HIT_P_4: Word;
                     Var HIT_P_5: Word;
                     Var TRIAL_I_1: Word;
                     Var TRIAL_I_2: Word;
                     Var TRIAL_I_3: Word;
                     Var TRIAL_I_4: Word;
                     Var TRIAL_I_5: Word;
                     Var TRIAL_P_1: Word;
                     Var TRIAL_P_2: Word;
                     Var TRIAL_P_3: Word;
                     Var TRIAL_P_4: Word;
                     Var TRIAL_P_5: Word;
                     Var TIME_SHORT_HIT: Word;
                     Var TIME_LONG_HIT: Word;
                     Var TIME_SHORT_TRIAL: Word;
                     Var TIME_LONG_TRIAL: Word;
                     Var FOUND_FLAG : Boolean;
                     D_NAME1: Char;
                     D_NAME2: Char;
                     D_NAME3: Char;
                     D_NAME4: Char;
                     D_NAME5: Char;
                     D_NAME6: Char;
                     D_NAME7: Char;
                     D_NAME8: Char);

{**************************************}
{**                                  **}
{**************************************}

Var STRING5: String[5];
    STRING8: String[9];
    FILE_NAME: String[12];
    DAT_GUESS_RECORD: String[43];
    INDEX: Byte;
    STRING_INDEX: Word;
    GUESS_FILE: Text;
    IOCode: Word;
    THIS_ELAPSED_SEC : Real;
    TOTAL_SEC : Real;
    CODE : Integer;
    REC_COUNT : Word;
    AVER_SEC : Real;
Begin
    FOUND_FLAG := True;
    HIT_I_1:= 0;
    HIT_I_2:= 0;
    HIT_I_3:= 0;
    HIT_I_4:= 0;
    HIT_I_5:= 0;
    HIT_P_1:= 0;
    HIT_P_2:= 0;
    HIT_P_3:= 0;
    HIT_P_4:= 0;
    HIT_P_5:= 0;
    TRIAL_I_1:= 0;
    TRIAL_I_2:= 0;
    TRIAL_I_3:= 0;
    TRIAL_I_4:= 0;
    TRIAL_I_5:= 0;
    TRIAL_P_1:= 0;
    TRIAL_P_2:= 0;
    TRIAL_P_3:= 0;
    TRIAL_P_4:= 0;
    TRIAL_P_5:= 0;
    TOTAL_SEC := 0;
    TIME_SHORT_HIT:= 0;
    TIME_LONG_HIT:= 0;
    TIME_SHORT_TRIAL:= 0;
    TIME_LONG_TRIAL:= 0;
    REC_COUNT := 0;
    For INDEX := 1 To 43 Do
       DAT_GUESS_RECORD[INDEX] := ' ';
    STRING8[1] := D_NAME1;
    STRING8[2] := D_NAME2;
    STRING8[3] := D_NAME3;
    STRING8[4] := D_NAME4;
    STRING8[5] := D_NAME5;
    STRING8[6] := D_NAME6;
    STRING8[7] := D_NAME7;
    STRING8[8] := D_NAME8;
    INDEX := 1;
    Repeat
       STRING8[0] := Char(INDEX);
       INDEX := INDEX + 1;
    Until ((STRING8[INDEX] = ' ') Or (INDEX > 8));
    FILE_NAME  := STRING8+'.ESP';
    Assign(GUESS_FILE,FILE_NAME);
    {$I-}
    Reset(GUESS_FILE);
    {$I+}
    IOCODE := IOResult;
    If IOCODE <> 0 Then
       If IOCODE = 2 Then
       Begin
          ClearDevice;
          MoveTo(0,80);
          OutText(FILE_NAME);
          MoveTo(0,90);
          OutText('File not found');
          Delay(4000);
          FOUND_FLAG := False;
       End   { End If IOCode = 2 }
       Else
       Begin
          ClearDevice;
          MoveTo(0,80);
          OutText('Disk problems!');
          MoveTo(0,100);
          OutText(STRING5);
          Delay(4000);
          FOUND_FLAG := False;
          Halt(0);
    End
    Else
    Begin
       While Not Eof(GUESS_FILE) Do
       Begin
          ReadLn(GUESS_FILE,DAT_GUESS_RECORD);
{*********************************************************}
{**        DAT_GUESS_RECORD[1]  -- Target               **}
{**        DAT_GUESS_RECORD[3]  -- Hit/Miss             **}
{*********************************************************}

          If ((DAT_GUESS_RECORD[Ord(DAT_GUESS_RECORD[1]) - 44] = '1') And
              (DAT_GUESS_RECORD[3] = 'H')) Then
              HIT_I_1 := HIT_I_1 + 1;
          If ((DAT_GUESS_RECORD[Ord(DAT_GUESS_RECORD[1]) - 44] = '2') And
              (DAT_GUESS_RECORD[3] = 'H')) Then
              HIT_I_2 := HIT_I_2 + 1;
          If ((DAT_GUESS_RECORD[Ord(DAT_GUESS_RECORD[1]) - 44] = '3') And
              (DAT_GUESS_RECORD[3] = 'H')) Then
              HIT_I_3 := HIT_I_3 + 1;
          If ((DAT_GUESS_RECORD[Ord(DAT_GUESS_RECORD[1]) - 44] = '4') And
              (DAT_GUESS_RECORD[3] = 'H')) Then
              HIT_I_4 := HIT_I_4 + 1;
          If ((DAT_GUESS_RECORD[Ord(DAT_GUESS_RECORD[1]) - 44] = '5') And
              (DAT_GUESS_RECORD[3] = 'H')) Then
              HIT_I_5 := HIT_I_5 + 1;
{*********************************************************}
{**        DAT_GUESS_RECORD[2]  -- Place you choose     **}
{**        DAT_GUESS_RECORD[3]  -- Hit/Miss             **}
{*********************************************************}

          If ((DAT_GUESS_RECORD[2] = '1') And
              (DAT_GUESS_RECORD[3] = 'H')) Then
              HIT_P_1 := HIT_P_1 + 1;
          If ((DAT_GUESS_RECORD[2] = '2') And
              (DAT_GUESS_RECORD[3] = 'H')) Then
              HIT_P_2 := HIT_P_2 + 1;
          If ((DAT_GUESS_RECORD[2] = '3') And
              (DAT_GUESS_RECORD[3] = 'H')) Then
              HIT_P_3 := HIT_P_3 + 1;
          If ((DAT_GUESS_RECORD[2] = '4') And
              (DAT_GUESS_RECORD[3] = 'H')) Then
              HIT_P_4 := HIT_P_4 + 1;
          If ((DAT_GUESS_RECORD[2] = '5') And
              (DAT_GUESS_RECORD[3] = 'H')) Then
              HIT_P_5 := HIT_P_5 + 1;

{*********************************************************}
{**        DAT_GUESS_RECORD[2]  -- Place you choose     **}
{**        DAT_GUESS_RECORD[Ord( "       ) - 44]        **}
{**                             -- Image you choose     **}
{*********************************************************}
          If DAT_GUESS_RECORD[Ord(DAT_GUESS_RECORD[2]) - 44]
                = '1' Then TRIAL_I_1 := TRIAL_I_1 + 1;
          If DAT_GUESS_RECORD[Ord(DAT_GUESS_RECORD[2]) - 44]
                = '2' Then TRIAL_I_2 := TRIAL_I_2 + 1;
          If DAT_GUESS_RECORD[Ord(DAT_GUESS_RECORD[2]) - 44]
                = '3' Then TRIAL_I_3 := TRIAL_I_3 + 1;
          If DAT_GUESS_RECORD[Ord(DAT_GUESS_RECORD[2]) - 44]
                = '4' Then TRIAL_I_4 := TRIAL_I_4 + 1;
          If DAT_GUESS_RECORD[Ord(DAT_GUESS_RECORD[2]) - 44]
                = '5' Then TRIAL_I_5 := TRIAL_I_5 + 1;
{*********************************************************}
{**        DAT_GUESS_RECORD[2]  -- Place you choose     **}
{*********************************************************}
          If DAT_GUESS_RECORD[2] = '1' Then
              TRIAL_P_1 := TRIAL_P_1 + 1;

          If DAT_GUESS_RECORD[2] = '2' Then
              TRIAL_P_2 := TRIAL_P_2 + 1;

          If DAT_GUESS_RECORD[2] = '3' Then
              TRIAL_P_3 := TRIAL_P_3 + 1;

          If DAT_GUESS_RECORD[2] = '4' Then
              TRIAL_P_4 := TRIAL_P_4 + 1;

          If DAT_GUESS_RECORD[2] = '5' Then
              TRIAL_P_5 := TRIAL_P_5 + 1;
          STRING_INDEX :=0;
          For INDEX := 1 To 5 Do
          Begin
             If DAT_GUESS_RECORD[30 + INDEX] <> ' ' Then
             Begin
                STRING_INDEX := STRING_INDEX + 1;
                STRING5[STRING_INDEX] := DAT_GUESS_RECORD[30 + INDEX];
             End
          End;
          STRING5[0] := Char(STRING_INDEX);
          Val(STRING5,THIS_ELAPSED_SEC,CODE);
          TOTAL_SEC := TOTAL_SEC + THIS_ELAPSED_SEC;
          REC_COUNT := REC_COUNT + 1;
          AVER_SEC := TOTAL_SEC / REC_COUNT;
          AVER_SEC := AVER_SEC / 2;
      End;  { while not eof }
      Assign(GUESS_FILE,FILE_NAME);
      Reset(GUESS_FILE);
      While Not Eof(GUESS_FILE) Do
      Begin
          ReadLn(GUESS_FILE,DAT_GUESS_RECORD);
          STRING_INDEX :=0;
          For INDEX := 1 To 5 Do
             Begin
                If DAT_GUESS_RECORD[30 + INDEX] <> ' ' Then
                   Begin
                     STRING_INDEX := STRING_INDEX + 1;
                     STRING5[STRING_INDEX] := DAT_GUESS_RECORD[30 + INDEX];
                   End
             End;
          STRING5[0] := Char(STRING_INDEX);
          Val(STRING5,THIS_ELAPSED_SEC,CODE);
          If ((DAT_GUESS_RECORD[3] = 'H') And
             (AVER_SEC >= THIS_ELAPSED_SEC)) Then
                TIME_SHORT_HIT := TIME_SHORT_HIT + 1;
          If (AVER_SEC >= THIS_ELAPSED_SEC) Then
             TIME_SHORT_TRIAL := TIME_SHORT_TRIAL + 1;
          If ((DAT_GUESS_RECORD[3] = 'H') And
             (AVER_SEC < THIS_ELAPSED_SEC)) Then
                TIME_LONG_HIT := TIME_LONG_HIT + 1;
          If (AVER_SEC < THIS_ELAPSED_SEC) Then
             TIME_LONG_TRIAL := TIME_LONG_TRIAL + 1;
       End;     {  while not EOF }
    End; { IOCODE = 0 }
    Close(GUESS_FILE);


End; { End of GET_RATIOS }

End.  { End of ESPSCORE  }