Category : A Collection of Games for DOS and Windows
Archive   : EMPIREU.ZIP
Filename : AFSTATS.PAS

 
Output of file : AFSTATS.PAS contained in archive : EMPIREU.ZIP
PROGRAM AFSTATS(INPUT,OUTPUT,LOGFILE);

{ Reads .LOG file produced by MONITOR to produce Army-Fighter combat }
{ statistics }

VAR LOGFILE: TEXT;

CONST
LINE_LIMIT=80;
MAX_IMPORTANT_LINES=32;

TYPE
COMBATANT_TYPE=(ATTACKER,DEFENDER);
RESULT_TYPE=(WON,LOST);
SOURCE_LINE=LSTRING(LINE_LIMIT);
IMPORTANT_LINE_MEANING=(MEANS_NOTHING,
MEANS_ATTACKER,MEANS_DEFENDER,
MEANS_WON,MEANS_LOST);
IMPORTANT_LINE_DESCRIPTOR=
RECORD
LINE_TEXT: SOURCE_LINE;
MEANING: IMPORTANT_LINE_MEANING;
END;

VAR

RESULTS: ARRAY [COMBATANT_TYPE] OF ARRAY [RESULT_TYPE] OF INTEGER;
IMPORTANT_LINES: ARRAY [1..MAX_IMPORTANT_LINES] OF
IMPORTANT_LINE_DESCRIPTOR;
N_IMPORTANT_LINES: INTEGER;

PROCEDURE SET_SOURCE_LINE(CONST CONTENTS: LSTRING; VAR LINE: SOURCE_LINE);
VAR I: INTEGER;
BEGIN
LINE.LEN:=CONTENTS.LEN;
FOR I:=1 TO ORD(CONTENTS.LEN) DO LINE[I]:=CONTENTS[I];
END;

PROCEDURE SET_IMPORTANT_LINE(CONST CONTENTS: LSTRING;
MEANING: IMPORTANT_LINE_MEANING);
BEGIN
N_IMPORTANT_LINES:=N_IMPORTANT_LINES+1;
SET_SOURCE_LINE(CONTENTS,IMPORTANT_LINES[N_IMPORTANT_LINES].LINE_TEXT);
IMPORTANT_LINES[N_IMPORTANT_LINES].MEANING:=MEANING
END;

PROCEDURE SORT_IMPORTANT_LINES;
VAR I: INTEGER;
SCRATCH: IMPORTANT_LINE_DESCRIPTOR;
BEGIN
I:=1;
WHILE I BEGIN
I:=I+1;
IF IMPORTANT_LINES[I-1].LINE_TEXT.LEN
BEGIN
SCRATCH:=IMPORTANT_LINES[I-1];
IMPORTANT_LINES[I-1]:=IMPORTANT_LINES[I];
IMPORTANT_LINES[I]:=SCRATCH;
I:=1
END;
END;
END;

PROCEDURE INITIALIZE_IMPORTANT_LINES;
BEGIN
{ lines are interpreted from our point of view }
N_IMPORTANT_LINES:=0;
SET_IMPORTANT_LINE('Your Army is under attack at ',MEANS_DEFENDER);
SET_IMPORTANT_LINE('Your Army ',MEANS_ATTACKER);
SET_IMPORTANT_LINE('Your Fighter is under attack at ',MEANS_DEFENDER);
SET_IMPORTANT_LINE('Your Fighter ',MEANS_ATTACKER);
SET_IMPORTANT_LINE('Your Army destroyed, Enemy Army has 1 hits left.',
MEANS_LOST);
SET_IMPORTANT_LINE('Enemy Army destroyed, Your Army has 1 hits left.',
MEANS_WON);
SET_IMPORTANT_LINE('Your Army destroyed, Enemy Fighter has 1 hits left.',
MEANS_LOST);
SET_IMPORTANT_LINE('Enemy Fighter destroyed, Your Army has 1 hits left.',
MEANS_WON);
SET_IMPORTANT_LINE('Your Fighter destroyed, Enemy Fighter has 1 hits left.',
MEANS_LOST);
SET_IMPORTANT_LINE('Enemy Fighter destroyed, Your Fighter has 1 hits left.',
MEANS_WON);
SET_IMPORTANT_LINE('Your Fighter destroyed, Enemy Army has 1 hits left.',
MEANS_LOST);
SET_IMPORTANT_LINE('Enemy Army destroyed, Your Fighter has 1 hits left.',
MEANS_WON);
{ lines are arranged with longest first to give longest preference }
{ in matching }
SORT_IMPORTANT_LINES;
END;

PROCEDURE INITIALIZE;
VAR COMBATANT: COMBATANT_TYPE;
RESULT: RESULT_TYPE;

BEGIN
RESET(LOGFILE);
FOR COMBATANT:=ATTACKER TO DEFENDER DO
FOR RESULT:=WON TO LOST DO
RESULTS[COMBATANT,RESULT]:=0;
INITIALIZE_IMPORTANT_LINES;
END;

PROCEDURE GET_LINE(VAR LINE: SOURCE_LINE);
VAR C: CHAR;
BEGIN
LINE.LEN:=0;
WHILE NOT EOLN(LOGFILE) DO
BEGIN
READ(LOGFILE,C);
IF LINE.LEN BEGIN
LINE.LEN:=LINE.LEN+1;
LINE[LINE.LEN]:=C
END
END;
READLN(LOGFILE);
END;

FUNCTION LINES_MATCH(CONST LINE1, LINE2: SOURCE_LINE): BOOLEAN;
VAR COMMON_LENGTH, I: INTEGER;
BEGIN
{ two lines match if the shorter exactly matches the beginning of }
{ the other }
IF LINE1.LEN ELSE COMMON_LENGTH:=ORD(LINE2.LEN);
I:=0;
WHILE I BEGIN
I:=I+1;
IF LINE1[I]<>LINE2[I] THEN I:=COMMON_LENGTH+1;
END;
LINES_MATCH:=I=COMMON_LENGTH
END;

FUNCTION LINE_MEANS(CONST LINE: SOURCE_LINE): IMPORTANT_LINE_MEANING;
VAR CLASSIFIED: BOOLEAN;
I: INTEGER;
BEGIN
I:=0;
LINE_MEANS:=MEANS_NOTHING;
CLASSIFIED:=FALSE;
REPEAT
I:=I+1;
WITH IMPORTANT_LINES[I] DO
IF LINES_MATCH(LINE,LINE_TEXT) THEN
BEGIN
LINE_MEANS:=MEANING;
CLASSIFIED:=TRUE
END;
UNTIL CLASSIFIED OR (I=N_IMPORTANT_LINES);
END;

PROCEDURE COMPUTE;
VAR OUR_ROLE: COMBATANT_TYPE;
LINE: SOURCE_LINE;
BEGIN
WHILE NOT EOF(LOGFILE) DO
BEGIN
GET_LINE(LINE);
CASE LINE_MEANS(LINE) OF
MEANS_NOTHING: ;
MEANS_ATTACKER: OUR_ROLE:=ATTACKER;
MEANS_DEFENDER: OUR_ROLE:=DEFENDER;
MEANS_WON: RESULTS[OUR_ROLE,WON]:=RESULTS[OUR_ROLE,WON]+1;
MEANS_LOST: RESULTS[OUR_ROLE,LOST]:=RESULTS[OUR_ROLE,LOST]+1;
END;
END;
END;

PROCEDURE REPORT;
VAR COMBATANT: COMBATANT_TYPE;
RESULT: RESULT_TYPE;
PERCENT: INTEGER;
RSLT, TOTAL: REAL;
BEGIN

WRITELN;
WRITELN(' We Attacked We Defended');
WRITELN(' We Won We Lost We Won We Lost');

FOR COMBATANT:=ATTACKER TO DEFENDER DO
BEGIN
FOR RESULT:=WON TO LOST DO
WRITE(RESULTS[COMBATANT,RESULT]:10);
IF COMBATANT=ATTACKER THEN WRITE(' ':10);
END;
WRITELN;

FOR COMBATANT:=ATTACKER TO DEFENDER DO
BEGIN
TOTAL:=RESULTS[COMBATANT,WON]+RESULTS[COMBATANT,LOST];
FOR RESULT:=WON TO LOST DO
BEGIN
RSLT:=RESULTS[COMBATANT,RESULT];
PERCENT:=TRUNC( RSLT/TOTAL*100 );
WRITE(PERCENT:9,'%')
END;
IF COMBATANT=ATTACKER THEN WRITE(' ':10);
END;
WRITELN;

END;

BEGIN
INITIALIZE;
COMPUTE;
REPORT;
END.


  3 Responses to “Category : A Collection of Games for DOS and Windows
Archive   : EMPIREU.ZIP
Filename : AFSTATS.PAS

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/