(*********************************************************************
 *
 *  :Program.	HilfsModul für SCHIFFCHENVERSENKEN
 *  :Author.	Hans Schafft
 *  :Address.	Landfriedstraße 1A - Hinterhaus
 *  :Address.	6900 Heidelberg
 *  :Phone.	06221 - 22416
 *  :Version.	1.0
 *  :Date.	1990
 *  :Copyright.	PD
 *  :Language.	Modula-II
 *  :Translator.M2Amiga
 *  :Contents.
 *
 *********************************************************************)
IMPLEMENTATION MODULE BESTENLISTE;

FROM BenutzerEingabe	IMPORT	Eingabe;
FROM Arts		IMPORT	TermProcedure,Assert;
FROM SYSTEM		IMPORT	ADDRESS, LONGSET, ADR;
FROM FileSystem 	IMPORT	Lookup,Close,Response,File,SetPos,
				ReadByteBlock, WriteByteBlock,Delete;
FROM Graphics		IMPORT	jam2, jam1,Move,Text,SetAPen,SetRast,
				SetBPen,RastPortPtr,ScrollRaster, RectFill;
FROM FileMessage	IMPORT	ResponseText,StrPtr;
FROM Conversions	IMPORT	ValToStr;
FROM Str 		IMPORT	Copy,Length,Compare;
FROM Intuition		IMPORT	WindowPtr;

TYPE  Eintrag = RECORD
	restBoote : INTEGER;
	restWasser : INTEGER;
	Punkte : INTEGER;
	name : ARRAY [1..26] OF CHAR;
      END;

VAR bl		: File;
    eintrag	: ARRAY [0..19] OF Eintrag;
    bewerber	: Eintrag;
    dummy	: Eintrag;
    err		: BOOLEAN;
    rpPtr	: RastPortPtr;

(***************************************************************)
PROCEDURE TextAusgabe(text : ARRAY OF CHAR; farbe,x,y : INTEGER);
BEGIN
  SetAPen(rpPtr,farbe);
  SetBPen(rpPtr,0);
  Move(rpPtr,x,y);
  Text(rpPtr,ADR(text),Length(text));
END TextAusgabe;

(***************************************************************)
PROCEDURE RichteBestenListeEin;
VAR x : CARDINAL;
   strPtr : StrPtr;
BEGIN
  Lookup(bl,"SVBestenListe",18*SIZE(Eintrag),TRUE);
  ResponseText(bl.res,strPtr);
  Assert(bl.res = done,strPtr);
  FOR x := 1 TO 18 DO
    WriteByteBlock(bl,eintrag[0]);
  END;
  Close(bl);
END RichteBestenListeEin;

(***************************************************************)
PROCEDURE BestenListeSuchen;
VAR strPtr : StrPtr;
    mm : CARDINAL;
BEGIN
  Lookup(bl,"SVBestenListe",18*SIZE(Eintrag),FALSE);
  IF bl.res = notFound THEN
    Close(bl);
    RichteBestenListeEin;
    Lookup(bl,"SVBestenListe",18*SIZE(Eintrag),FALSE);
    ResponseText(bl.res,strPtr);
    Assert(bl.res = done,strPtr);
  END;
  FOR mm := 1 TO 18 DO
    ReadByteBlock(bl,eintrag[mm]);
  END;
  Close(bl);
END BestenListeSuchen;

(***************************************************************)
PROCEDURE Einordnen;
VAR x,k : CARDINAL;
BEGIN
 eintrag[19] := bewerber;
 k := 18;
 WHILE (k > 0) AND (eintrag[k+1].Punkte > eintrag[k].Punkte) DO
   dummy := eintrag[k];
   eintrag[k] := eintrag[k+1];
   eintrag[k+1] := dummy;
   DEC(k);
 END;
END Einordnen;

(***************************************************************)
PROCEDURE NeueListeSpeichern;
VAR strPtr : StrPtr;
    x : CARDINAL;
BEGIN
  Lookup(bl,"SVBestenListe",18*SIZE(Eintrag),TRUE);
  ResponseText(bl.res,strPtr);
  Assert(bl.res = done,strPtr);
  FOR x := 1 TO 18 DO
    WriteByteBlock(bl,eintrag[x]);
  END;
  Close(bl);
END NeueListeSpeichern;

(***************************************************************)
PROCEDURE AufDemBildschirmDarstellen;
VAR x,s,f,v,h : INTEGER;
    ar : ARRAY [0..7] OF CHAR;
BEGIN
  SetRast(rpPtr,0);
  TextAusgabe("DER AKTUELLE STAND DER BESTENLISTE",6,85,19);

  TextAusgabe("NAME",13,40,45);
  TextAusgabe("Boote",13,280,45);
  TextAusgabe("Wasser",13,370,45);
  TextAusgabe("PUNKTE",13,500,45);

  FOR x := 1 TO 18 DO
    TextAusgabe(eintrag[x].name,(x+3) DIV 2,0,22 * x + 55);
  END;

    SetAPen(rpPtr,0);		(* zu lange Namen beschneiden *)
    RectFill(rpPtr,280,50,640,512);

  FOR x := 1 TO 18 DO
    ValToStr(eintrag[x].restWasser,FALSE,ar,10,4," ",err);
    TextAusgabe(ar,(x+3) DIV 2, 290,22 * x + 55);

    ValToStr(eintrag[x].restBoote,FALSE,ar,10,4," ",err);
    TextAusgabe(ar,(x+3) DIV 2, 390,22 * x + 55);

    ValToStr(eintrag[x].Punkte,TRUE,ar,10,8," ",err);
    TextAusgabe(ar,(x+3) DIV 2, 470,22 * x + 55);
  END;
END AufDemBildschirmDarstellen;


(****************************************************************)
(* Wird restBoote=0 übergeben, wird lediglich eine vorhandene	*)
(* BestenListe dargestellt					*)
(****************************************************************)
PROCEDURE BestenListe(wiPtr : WindowPtr;restBoote,restWasser : INTEGER;
			MenschSieg : BOOLEAN);
VAR len : INTEGER;
BEGIN
  bewerber.restWasser := restWasser;
  bewerber.restBoote := restBoote;
  (**********************************************)
  (* Die Punkte werden wie folgt vergeben :     *)
  (**********************************************)
  bewerber.Punkte := bewerber.restWasser * bewerber.restBoote;

  rpPtr := wiPtr^.rPort;

  BestenListeSuchen;
  AufDemBildschirmDarstellen;

  IF restBoote > 0 THEN
    IF MenschSieg THEN
      Eingabe(wiPtr,bewerber.name);
    ELSE
      Copy(bewerber.name,"AMIGA");
    END;
    Einordnen;
    AufDemBildschirmDarstellen;
    NeueListeSpeichern;
  END;

END BestenListe;

(***************************************************************)
(***************************************************************)
BEGIN
  eintrag[0].restWasser := 0;
  eintrag[0].restBoote := 0;
  eintrag[0].Punkte := 0;
  Copy(eintrag[0].name,"----");
END BESTENLISTE.
