(*********************************************************************
 *
 *  :Program.		HilfsModul für Mastermind
 *  :Author.		Hans Schafft
 *  :Address.		Landfriedstraße 1A - Hinterhaus
 *  :Address.		6900 Heidelberg
 *  :Phone.		06221 - 22416
 *  :Version.		1.3
 *  :Date.		6/1990
 *  :Copyright.		PD
 *  :Language.		Modula-II
 *  :Translator.	M2Amiga
 *
 *********************************************************************)

IMPLEMENTATION MODULE Gadget;

FROM Abbruch	IMPORT	ZeigeAbbruch;
FROM VonWem	IMPORT	ShowReq;
FROM Hilfen	IMPORT	ZeigeHilfen;

FROM Arts	IMPORT	Terminate;
FROM SYSTEM	IMPORT	INLINE, ADDRESS, ADR, LONGSET;
FROM Graphics   IMPORT  ScrollRaster, SetAPen, RectFill,
			Flood, Draw, Move, jam2, jam1;
FROM Exec       IMPORT  MemReqs, MemReqSet,AvailMem,WaitPort, ReplyMsg,
			CopyMem, AllocMem, FreeMem, GetMsg;
FROM Intuition	IMPORT	GadgetPtr, ScreenPtr, keyCodeQ, selectDown,
			IDCMPFlags, IDCMPFlagSet, PrintIText,
			boolGadget, ActivationFlags,ActivationFlagSet,
		        Border, Gadget, GadgetFlagSet, IntuiText,
                        GadgetFlags, IntuiTextLength, gadgHighbits,
                        RefreshGadgets, AddGadget, DrawBorder, gadgHNone,
                        RemoveGadget,IntuiMessagePtr, WindowPtr;

VAR     BoolGad  : ARRAY [1..50] OF Gadget;
	ZahlText : ARRAY [1..2] OF IntuiText;
	text	 : ARRAY [0..16],[1..3] OF CHAR;
	wiPtr	 : WindowPtr;
	x,YPos	 : INTEGER;
	sta	 : INTEGER;
	rahmenWeite : INTEGER;
        gadDim : ARRAY [1..30],[1..4] OF INTEGER;

(***************************************************************)
PROCEDURE GadgetsLoeschen;
VAR x,y : CARDINAL;
BEGIN
  FOR x := 1 TO 30+sta DO
    y := RemoveGadget(wiPtr,ADR(BoolGad[x]));
  END;
END GadgetsLoeschen;

(***************************************************************)
PROCEDURE MaleBlock(y : INTEGER);
VAR x : INTEGER;
BEGIN
  FOR x := 1 TO y DO
    SetAPen(wiPtr^.rPort,x);
    RectFill(wiPtr^.rPort,460,(x-1)*34 + 15,510,(x-1)*34 + 44);
  END;
  IF y < 14 THEN
    FOR x := y+1 TO 14 DO
      SetAPen(wiPtr^.rPort,0);
      RectFill(wiPtr^.rPort,460,(x-1)*34 + 15,510,(x-1)*34 + 44);
    END;
  END;
END MaleBlock;

(***************************************************************)
PROCEDURE TextEinrichten(id,len : INTEGER);
VAR leer : IntuiText;
BEGIN
  SetAPen(wiPtr^.rPort,5);
  RectFill(wiPtr^.rPort,566,66+((id-1)*100),596,88+((id-1)*100));
  WITH ZahlText[id] DO
    leftEdge  := gadDim[id,1]; 	topEdge := gadDim[id,2];
    frontPen  := 0; 	backPen := 5;
    drawMode  := jam2;
    iText     := ADR(text[len]);
    iTextFont := NIL;
    nextText  := NIL;
  END;
  PrintIText(wiPtr^.rPort,ADR(ZahlText[id]),0,0);
END TextEinrichten;

(***************************************************************)
PROCEDURE InitGadget(le,te,wi,he,id : INTEGER);
VAR	stelle : INTEGER;
BEGIN
  WITH BoolGad[id] DO
    leftEdge  	 :=  le;
    topEdge  	 :=  te;
    width  	 :=  wi;
    height 	 :=  he;
    flags  	 :=  GadgetFlagSet{};
    activation 	 :=  ActivationFlagSet{gadgImmediate,relVerify};
    gadgetType 	 :=  boolGadget;
    gadgetRender :=  NIL;
    gadgetText 	 :=  NIL;
    mutualExclude:=  LONGSET{};
    nextGadget 	 :=  NIL;
    selectRender :=  NIL;
    specialInfo  :=  NIL;
    userData     :=  NIL;
    gadgetID 	 :=  id;
  END;
  IF ((id > 0) AND (id < 9)) OR (id > 16) THEN
    BoolGad[id].flags := gadgHNone;
  END;
  stelle := AddGadget(wiPtr,ADR(BoolGad[id]),-1);
  RefreshGadgets(ADR(BoolGad[id]),wiPtr,NIL);
END InitGadget;

(***************************************************************)
PROCEDURE FestGadgetAufbau(wPtr : WindowPtr);
VAR x : INTEGER;
BEGIN
  wiPtr := wPtr;
  gadDim[1,1]:=568;gadDim[1,2]:=72;gadDim[1,3]:=30;gadDim[1,4]:=25;
  gadDim[2,1]:=568;gadDim[2,2]:=172;gadDim[2,3]:=30;gadDim[2,4]:=25;
  gadDim[3,1]:=525;gadDim[3,2]:=55;gadDim[3,3]:=27;gadDim[3,4]:=34;
  gadDim[4,1]:=610;gadDim[4,2]:=55;gadDim[4,3]:=27;gadDim[4,4]:=34;
  gadDim[5,1]:=525;gadDim[5,2]:=152;gadDim[5,3]:=27;gadDim[5,4]:=34;
  gadDim[6,1]:=610;gadDim[6,2]:=152;gadDim[6,3]:=27;gadDim[6,4]:=34;
  gadDim[7,1]:=532;gadDim[7,2]:=16;gadDim[7,3]:=95;gadDim[7,4]:=25;
  gadDim[8,1]:=532;gadDim[8,2]:=116;gadDim[8,3]:=95;gadDim[8,4]:=25;
  gadDim[9,1]:=532;gadDim[9,2]:=226;gadDim[9,3]:=95;gadDim[9,4]:=25;
  gadDim[10,1]:=532;gadDim[10,2]:=266;gadDim[10,3]:=95;gadDim[10,4]:=25;
  gadDim[11,1]:=532;gadDim[11,2]:=306;gadDim[11,3]:=95;gadDim[11,4]:=25;
  gadDim[12,1]:=532;gadDim[12,2]:=346;gadDim[12,3]:=95;gadDim[12,4]:=25;
  gadDim[13,1]:=532;gadDim[13,2]:=386;gadDim[13,3]:=95;gadDim[13,4]:=25;
  gadDim[14,1]:=532;gadDim[14,2]:=426;gadDim[14,3]:=95;gadDim[14,4]:=25;
  gadDim[15,1]:=532;gadDim[15,2]:=471;gadDim[15,3]:=95;gadDim[15,4]:=25;
  gadDim[16,1]:=412;gadDim[16,2]:=18;gadDim[16,3]:=26;gadDim[16,4]:=477;
  (* Farbtafeln *)

  FOR x := 17 TO 30 DO (* 14 mögliche Farben *)
    gadDim[x,1] := 460; gadDim[x,2] := (x-17)*34 + 15;
    gadDim[x,3] := 50; gadDim[x,4] := 33;
  END;
  FOR x := 1 TO 30 DO
    InitGadget(gadDim[x,1],gadDim[x,2],gadDim[x,3],gadDim[x,4],x);
  END;
  TextEinrichten(1,8);
  TextEinrichten(2,8);
END FestGadgetAufbau;


(***************************************************************)
PROCEDURE FlexGadgetAufbau(stellenAnzahl : INTEGER);
VAR gadNum : INTEGER;
    rahmenXPos : ARRAY [31..45] OF INTEGER;
    eckDaten : ARRAY [1..10] OF INTEGER;
    rahmen : Border;
BEGIN
  sta := stellenAnzahl;
  rahmenWeite := 320 DIV stellenAnzahl;
  YPos := rahmenWeite  DIV 2;
  FOR gadNum := 31 TO 30 + stellenAnzahl DO
    rahmenXPos[gadNum] := (gadNum - 31) * rahmenWeite;
    eckDaten[1] := rahmenXPos[gadNum] + 3;
    eckDaten[2] := 3;
    eckDaten[3] := rahmenXPos[gadNum] + rahmenWeite - 6;
    eckDaten[4] := 3;
    eckDaten[5] := rahmenXPos[gadNum] + rahmenWeite - 6;
    eckDaten[6] := rahmenWeite - 6;
    eckDaten[7] := rahmenXPos[gadNum] + 3;
    eckDaten[8] := rahmenWeite - 6;
    eckDaten[9] := rahmenXPos[gadNum] + 3;
    eckDaten[10] := 3;
    WITH rahmen DO
      leftEdge := 0;
      topEdge  := 0;
      frontPen := 14;
      backPen  := 4;
      drawMode := jam1;
      count    := 5;
      xy       := ADR(eckDaten);
      nextBorder := NIL;
    END;
    DrawBorder(wiPtr^.rPort,ADR(rahmen),0,0);
    InitGadget(rahmenXPos[gadNum]+3,3,rahmenWeite-6,rahmenWeite-6,gadNum);
  END;
END FlexGadgetAufbau;

(*******************************************************)
(* Ist ns = 15 wurde OK übergeben - alles war gelöst.  *)
(* Ist fus = 16 wurde die Hilfe beansprucht *)
(*******************************************************)
PROCEDURE Auswerten(fus,ns : INTEGER);
VAR nsText,fusText : IntuiText;
    i,x : INTEGER;
BEGIN
  WITH fusText DO
    leftEdge  := 335; 	topEdge := YPos;
    frontPen  := 5; 	backPen := 0;
    drawMode  := jam2;
    iText     := ADR(text[fus]);
    iTextFont := NIL;
    nextText  := NIL;
  END;
  IF fus = 16 THEN
    fusText.iText := ADR("DAS WAR MIT HILFE !");
    fusText.leftEdge := 20;
  ELSIF fus = sta THEN
    fusText.iText := ADR("ALLES RICHTIG");
    fusText.leftEdge := 70;
  END;
  PrintIText(wiPtr^.rPort,ADR(fusText),0,0);

  IF fus < 15 THEN
    WITH nsText DO
      leftEdge  := 360; 	topEdge := YPos;
      frontPen  := 5; 	backPen := 0;
      drawMode  := jam2;
      iText     := ADR(text[ns]);
      iTextFont := NIL;
      nextText  := NIL;
    END;
    PrintIText(wiPtr^.rPort,ADR(nsText),0,0);
  END;

  IF ns # 15 THEN
    ScrollRaster(wiPtr^.rPort,0,-rahmenWeite,0,0,390,512);
    FOR x := 31 TO 31+sta DO
      i := RemoveGadget(wiPtr,ADR(BoolGad[x]));
    END;
    FlexGadgetAufbau(sta);
  END;
END Auswerten;

(************************************************************************)
PROCEDURE StellenUndFarben(VAR stellenAnzahl,farbAnzahl : INTEGER);
VAR
  gadPtr	: GadgetPtr;
  gadNr		: INTEGER;
  msgPtr	: IntuiMessagePtr;
  class 	: IDCMPFlagSet;
  x, y		: INTEGER;
  code		: CARDINAL;
  fertig	: BOOLEAN;
BEGIN
  MaleBlock(8);
  fertig := FALSE;
  REPEAT
    WaitPort(wiPtr^.userPort);
    LOOP
      msgPtr := GetMsg(wiPtr^.userPort);
      IF msgPtr=NIL THEN EXIT END;

      x     := msgPtr^.mouseX;
      y     := msgPtr^.mouseY;
      class := msgPtr^.class;
      code  := msgPtr^.code;
      gadPtr := msgPtr^.iAddress;
      gadNr := gadPtr^.gadgetID;

      ReplyMsg(msgPtr);

      IF (class = IDCMPFlagSet{gadgetUp}) THEN
        CASE gadNr OF
        | INTEGER(minusSt): IF stellenAnzahl > 4 THEN
        		      DEC(stellenAnzahl);
        		      TextEinrichten(1,stellenAnzahl);
        		    END;
        | INTEGER(plusSt):  IF stellenAnzahl < 12 THEN
        		      INC(stellenAnzahl);
        		      TextEinrichten(1,stellenAnzahl);
        		    END;
        | INTEGER(minusFb): IF farbAnzahl > 2 THEN
        		      DEC(farbAnzahl);
        		      MaleBlock(farbAnzahl);
        		      TextEinrichten(2,farbAnzahl);
        		    END;
        | INTEGER(plusFb):  IF farbAnzahl < 14 THEN
        		      INC(farbAnzahl);
        		      TextEinrichten(2,farbAnzahl);
        		      MaleBlock(farbAnzahl);
        		    END;
        | INTEGER(hilfe)  : IF ZeigeHilfen(wiPtr) THEN END;
        | INTEGER(spielen): fertig := TRUE;
        | INTEGER(info)   : ShowReq(wiPtr);
        | INTEGER(ende)   : IF ZeigeAbbruch(wiPtr) THEN
        			Terminate(0);
        	 	    END;
        ELSE
        END;
      END;
      IF fertig THEN EXIT END;
    END; (* LOOP *)
  UNTIL fertig;
END StellenUndFarben;

(************************************************************************)
PROCEDURE TipFuellen(gadNum : INTEGER;farbReg : CARDINAL);
BEGIN
  SetAPen(wiPtr^.rPort,farbReg);
  RectFill(wiPtr^.rPort,BoolGad[gadNum].leftEdge+3,BoolGad[gadNum].topEdge+3,
  BoolGad[gadNum].leftEdge+rahmenWeite-6,BoolGad[gadNum].topEdge+rahmenWeite-6);
END TipFuellen;


(************************************************************************)
(************************************************************************)
BEGIN
  FOR x := 0 TO 15 DO
    text[x,3] := 0C;
    IF x < 10 THEN
      text[x,1] := " ";
      text[x,2] := CHAR(x+48);
    ELSIF x < 15 THEN
      text[x,1] := "1";
      text[x,2] := CHAR(x+38);
    END;
  END;
END Gadget.
