home *** CD-ROM | disk | FTP | other *** search
/ Gold Fish 3 / goldfish_volume_3.bin / files / gfx / misc / cloudsaga / source / clouds.mod < prev    next >
Encoding:
Text File  |  1995-03-06  |  15.3 KB  |  505 lines

  1. (*---------------------------------------------------------------------------
  2.     :Program.    CloudsAGA.mod
  3.     :Author.     Daniel Amor
  4.     :Address.    Ludwigstr. 124, D-70197 Stuttgart
  5.     :Shortcut.   [da]
  6.     :Version.    2.0
  7.     :Date.       01-Feb-94
  8.     :Copyright.  PD
  9.     :Language.   Oberon-2
  10.     :Translator. Amiga Oberon 3.0
  11.     :Imports.    Clouds [da].
  12.     :Contents.   Erzeugt Fraktal-Wolken.
  13.     :Remark.     Aufruf: Clouds
  14. ---------------------------------------------------------------------------*)
  15.  
  16. MODULE Clouds;
  17.  
  18. (* $OvflChk- $RangeChk- $StackChk- $NilChk- $ReturnChk- $CaseChk- $TypeChk- *)
  19.  
  20. IMPORT  e    : Exec,
  21.         d    : Dos,
  22.         I    : Intuition,
  23.         gt   : GadTools,
  24.         g    : Graphics,
  25.         req  : Requests,
  26.         GUI  : CloudsGUI,
  27.         u    : Utility,
  28.         r    : Random,
  29.         y    : SYSTEM,
  30.         pal  : Palette,
  31.         str  : Strings,
  32.                IFF,ASL;
  33.  
  34. CONST UntereFarbe   = 4;
  35.  
  36. VAR quit,open,gOK                 : BOOLEAN;
  37.     msgptr,msgptr1,msgptr2        : I.IntuiMessagePtr;
  38.     msg,msg1,msg2                 : I.IntuiMessage;
  39.     item1,item2                   : I.MenuItemPtr;
  40.     aktgad1,aktgad2               : I.GadgetPtr;
  41.     vp                            : g.ViewPortPtr;
  42.     nummer,farbe,na,fonty,size,version    : INTEGER;
  43.     win                           : I.WindowPtr;
  44.     depth,resx,resy               : LONGINT;
  45.     key                           : CHAR;
  46.     wx,wy,ObereFarbe,MittlereFarbe: INTEGER;
  47.     VERSION                       : ARRAY 90 OF CHAR;
  48.     Col                           : pal.colourRecord;
  49.  
  50. PROCEDURE FileReq(hail: ARRAY OF CHAR; VAR name: ARRAY OF CHAR; win : I.WindowPtr): BOOLEAN;
  51.  
  52. VAR i,j       : INTEGER;
  53.     Dirname   : ARRAY 256 OF CHAR;
  54.     Filename  : ARRAY 356 OF CHAR;
  55.     flags     : LONGINT;
  56.     res       : BOOLEAN;
  57.     fr        : ASL.FileRequesterPtr;
  58.     pattern   : ARRAY 80 OF CHAR;
  59.  
  60. BEGIN
  61.   j := SHORT(str.Length(name));
  62.   WHILE (j>=0) & (name[j]#":") & (name[j]#"/") DO DEC(j) END;
  63.   i := 0;
  64.   WHILE i<=j DO Dirname[i] := name[i]; INC(i) END; Dirname[i] := 0X;
  65.   j := 0;
  66.   REPEAT Filename[j] := name[i]; INC(j); INC(i) UNTIL name[i-1]=0X;
  67.   fr := ASL.AllocAslRequestTags(ASL.fileRequest, u.done);
  68.   IF fr=NIL THEN HALT(20) END;
  69.   flags := ASH(1,ASL.patGad);
  70.   INC(flags,ASH(1,ASL.save));
  71.   res := ASL.AslRequestTags(fr, ASL.hail,     y.ADR(hail),
  72.                                 ASL.file,     y.ADR(Filename),
  73.                                 ASL.dir,      y.ADR(Dirname),
  74.                                 ASL.window,   win,
  75.                                 ASL.pattern,  y.ADR(pattern),
  76.                                 ASL.funcFlags,flags,
  77.                                 u.done);
  78.   COPY(fr.dir^,Dirname);
  79.   COPY(fr.file^,Filename);
  80.  
  81.   i := SHORT(str.Length(Dirname));
  82.   IF (i>0) & (Dirname[i-1]#"/") & (Dirname[i-1]#":") THEN
  83.     Dirname[i] := "/"; INC(i);
  84.     Dirname[i] := 0X;
  85.   END;
  86.   IF LEN(name)>i+str.Length(Filename) THEN
  87.     COPY(Dirname,name);
  88.     str.Append(name,Filename);
  89.     RETURN TRUE;
  90.   END;
  91.   RETURN FALSE;
  92. END FileReq;
  93.  
  94. PROCEDURE OpenWindow (left,top,width,height: LONGINT; VAR win: I.WindowPtr);
  95.  
  96. VAR quit: BOOLEAN;
  97.  
  98. BEGIN
  99.   IF height<resy-GUI.FontY THEN top:=GUI.FontY+3 END;
  100.   win := I.OpenWindowTagsA ( NIL,
  101.                     I.waLeft,          left,
  102.                     I.waTop,           top,
  103.                     I.waWidth,         width,
  104.                     I.waHeight,        height,
  105.                     I.waIDCMP,         LONGSET {I.closeWindow,I.refreshWindow,I.vanillaKey,I.menuPick},
  106.                     I.waFlags,         LONGSET {I.windowDrag,I.windowDepth,I.windowClose,I.activate,I.newLookMenus},
  107.                     I.waTitle,         y.ADR ("Generating..."),
  108.                     I.waScreenTitle,   y.ADR ("CloudsAGA 2.0 © Danny Amor in 1994"),
  109.                     I.waPubScreen,     GUI.Scr,
  110.                     I.waMinWidth,      67,
  111.                     I.waMinHeight,     21,
  112.                     I.waMaxWidth,      656,
  113.                     I.waMaxHeight,     414, u.done);
  114.  
  115.   gt.RefreshWindow (win, NIL);
  116. END OpenWindow;
  117.  
  118. PROCEDURE CloseWindow (VAR win: I.WindowPtr);
  119.  
  120. BEGIN
  121.   IF win # NIL THEN
  122.     I.CloseWindow (win);
  123.     win := NIL;
  124.   END;
  125. END CloseWindow;
  126.  
  127. PROCEDURE TestF(VAR farbe: INTEGER);
  128.  
  129. BEGIN
  130.   IF farbe>ObereFarbe  THEN farbe:=ObereFarbe;  END;
  131.   IF farbe<UntereFarbe THEN farbe:=UntereFarbe; END;
  132. END TestF;
  133.  
  134. PROCEDURE RandomFarbe(VAR Rp: g.RastPortPtr; Start: INTEGER; VAR mf: REAL; x,y: INTEGER);
  135.  
  136. VAR farbe: INTEGER;
  137.     OK   : BOOLEAN;
  138.  
  139. BEGIN
  140.   farbe:=SHORT(Start+SHORT(mf*(r.RND(1)*LONG(2)-1))+1);
  141.   TestF(farbe);
  142.   g.SetAPen(Rp,farbe);
  143.   OK:=g.WritePixel(Rp,x+4,y+fonty);
  144. END RandomFarbe;
  145.  
  146. PROCEDURE Cloud(numiter: INTEGER; mu: REAL; na: INTEGER);
  147.  
  148. TYPE Coord = ARRAY 11 OF INTEGER;
  149.  
  150. VAR i,j,k,l,x1,y1,x2,y2,x3,y3,smul1,smul2,p  : INTEGER;
  151.     xy                                       : Coord;
  152.     n,n1,farbe,nk,test,test2                 : INTEGER;
  153.     farbe1,farbe2,farbe3,farbe4              : LONGINT;
  154.     mf                                       : REAL;
  155.  
  156.   PROCEDURE BigPic(n,i: INTEGER; VAR n1,l: INTEGER);
  157.  
  158.   BEGIN
  159.    n1:=n DIV 2;
  160.    l:=y.LSH(LONG(1),i);
  161.   END BigPic;
  162.  
  163.   PROCEDURE SetEdge(VAR Rp: g.RastPortPtr; x1,y1,x2,y2,x3,y3: INTEGER; VAR mf: REAL);
  164.  
  165.   BEGIN
  166.     farbe1:=g.ReadPixel(Rp,x1+4,y1+fonty);
  167.     farbe2:=g.ReadPixel(Rp,x2+4,y2+fonty);
  168.     RandomFarbe(Rp,SHORT(farbe1+farbe2) DIV 2,mf,x3,y3);
  169.   END SetEdge;
  170.  
  171.  PROCEDURE SetPoint(VAR Rp: g.RastPortPtr; VAR mf: REAL; VAR xy: Coord);
  172.  
  173.   VAR a: BOOLEAN;
  174.  
  175.   BEGIN
  176.     farbe1:=g.ReadPixel(Rp,xy[1]+4,xy[2]+fonty);
  177.     farbe2:=g.ReadPixel(Rp,xy[3]+4,xy[4]+fonty);
  178.     farbe3:=g.ReadPixel(Rp,xy[5]+4,xy[6]+fonty);
  179.     farbe4:=g.ReadPixel(Rp,xy[7]+4,xy[8]+fonty);
  180.     farbe:=SHORT(((farbe1+farbe2+farbe3+farbe4) DIV 4)+SHORT(r.RND(2)*2*mf-mf));
  181.     TestF(farbe);
  182.     g.SetAPen(Rp,farbe);
  183.     a:=g.WritePixel(Rp,xy[9]+4,xy[10]+fonty);
  184.   END SetPoint;
  185.  
  186. BEGIN
  187.   mf:=(numiter+1)*mu;
  188.   RandomFarbe(win^.rPort,MittlereFarbe,mf,0,  0);
  189.   RandomFarbe(win^.rPort,MittlereFarbe,mf,0, na);
  190.   RandomFarbe(win^.rPort,MittlereFarbe,mf,na, 0);
  191.   RandomFarbe(win^.rPort,MittlereFarbe,mf,na,na);
  192.   n:=na;
  193.   test:=1;
  194.   FOR i:=0 TO numiter DO
  195.     mf:=(numiter-i+1)*mu;
  196.     BigPic(n,i,n1,l);
  197.     FOR j:=1 TO l DO
  198.       smul1:=(j-1)*n;
  199.       smul2:=j*n;
  200.       SetEdge(win^.rPort,smul1,0    ,smul2,0    ,smul2-n1,0       ,mf);
  201.       SetEdge(win^.rPort,smul1,na   ,smul2,na   ,smul2-n1,na      ,mf);
  202.       SetEdge(win^.rPort,0    ,smul1,0    ,smul2,0       ,smul2-n1,mf);
  203.       SetEdge(win^.rPort,na   ,smul1,na   ,smul2,na      ,smul2-n1,mf);
  204.     END;
  205.     n:=n1;
  206.   END;
  207.   n:=na;
  208.   FOR i:=0 TO numiter DO
  209.     mf:=(numiter-i+1)*mu;
  210.     BigPic(n,i,n1,l);
  211.     FOR k:=1 TO l DO
  212.       FOR j:=1 TO l DO
  213.         smul1:=k*n;   smul2:=j*n;
  214.         xy[1]:=smul2-n; xy[2]:=smul1-n; xy[3]:=smul2-n;
  215.         xy[4]:=smul1  ; xy[5]:=smul2  ; xy[6]:=smul1-n;
  216.         xy[7]:=smul2  ; xy[8]:=smul1  ; xy[9]:=smul2-n1;
  217.         xy[10]:=smul1-n1;
  218.         SetPoint(win^.rPort,mf,xy);
  219.       END;
  220.     END;
  221.     nk:=0;
  222.     FOR k:=1 TO test DO
  223.       nk:=1-nk;
  224.       test2:=y.LSH(LONG(1),i)-nk;
  225.       FOR j:=1 TO test2 DO
  226.         smul1:=j*n+nk*n1;   smul2:=k*n1;
  227.         xy[1]:=smul1-n1; xy[2]:=smul2-n1; xy[3]:=smul1;
  228.         xy[4]:=smul2   ; xy[5]:=smul1-n1; xy[6]:=smul2+n1;
  229.         xy[7]:=smul1-n ; xy[8]:=smul2   ; xy[9]:=smul1-n1;
  230.         xy[10]:=smul2;
  231.         SetPoint(win^.rPort,mf,xy);
  232.       END;
  233.     END;
  234.     n:=n1;
  235.     test:=((test+1)*2)-1;
  236.   END;
  237.   I.SetWindowTitles(win,y.ADR("OK!"),y.ADR("CloudsAGA 2.0 © Danny Amor in 1994"));
  238. END Cloud;
  239.  
  240. PROCEDURE SizeOut(VAR na: INTEGER; faktor,size: INTEGER);
  241.  
  242. VAR numiter: INTEGER;
  243.     mu     : REAL;
  244.  
  245. BEGIN
  246.   numiter:=size+5;
  247.   faktor:=size+2;
  248.   na:=y.LSH(LONG(64),size);
  249.   mu:=2.5-faktor/5;
  250.   Cloud(numiter,mu,na);
  251. END SizeOut;
  252.  
  253. PROCEDURE Smooth(VAR na: INTEGER);
  254.  
  255. VAR y1,x,farbe                 : INTEGER;
  256.     a                          : BOOLEAN;
  257.     farbe1,farbe2,farbe3,farbe4: LONGINT;
  258.  
  259. BEGIN
  260.   I.SetWindowTitles(win,y.ADR("Smoothing..."),y.ADR("CloudsAGA 2.0 © Danny Amor in 1994"));
  261.   FOR y1:=0 TO na-1 DO
  262.     FOR x:=0 TO na-1 DO
  263.       farbe1:=g.ReadPixel(win^.rPort,x+4,y1+fonty);
  264.       farbe2:=g.ReadPixel(win^.rPort,x+5,y1+fonty);
  265.       farbe3:=g.ReadPixel(win^.rPort,x+4,y1+1+fonty);
  266.       farbe4:=g.ReadPixel(win^.rPort,x+5,y1+1+fonty);
  267.       farbe :=SHORT(SHORT((farbe1+farbe2+farbe3+farbe4)/4));
  268.       g.SetAPen(win^.rPort,farbe);
  269.       a:=g.WritePixel(win^.rPort,x+4,y1+fonty);
  270.     END;
  271.   END;
  272.   I.SetWindowTitles(win,y.ADR("OK!"),y.ADR("CloudsAGA 2.0 © Danny Amor in 1994"));
  273. END Smooth;
  274.  
  275. PROCEDURE SetColors(VAR vp: g.ViewPortPtr);
  276.  
  277. VAR i: INTEGER;
  278.  
  279. BEGIN
  280.   g.SetRGB4(vp,0,10,10,10);
  281.   g.SetRGB4(vp,1,0,0,0);
  282.   g.SetRGB4(vp,2,15,15,15);
  283.   g.SetRGB4(vp,3,6,8,11);
  284.   IF version<39 THEN
  285.     FOR i:= 4 TO 19 DO g.SetRGB4(vp,i,i-4,i-4,15); END;
  286.     g.SetRGB4(vp,20,11,11,11);
  287.     FOR i:=21 TO 31 DO g.SetRGB4(vp,i,(i DIV 2)-1,(i DIV 2)-1,(i DIV 2)); END;
  288.   END;
  289. END SetColors;
  290.  
  291. PROCEDURE ClickNull(VAR size: INTEGER);
  292.  
  293. BEGIN
  294.   INC(size);
  295.   IF size>5 THEN size:=0; END;
  296.   gt.SetGadgetAttrs(GUI.CloudsGadgets[0]^,GUI.CloudsWnd,NIL,gt.cyActive,size);
  297. END ClickNull;
  298.  
  299. PROCEDURE ClickOne(VAR x,y1: INTEGER);
  300.  
  301. BEGIN
  302.   x:=y.LSH(LONG(64),size);
  303.   y1:=x;
  304.   x:=x+10;
  305.   y1:=y1+fonty+4;
  306.   OpenWindow(0,0,x,y1,win);
  307.   open:=TRUE;
  308.   I.WindowToFront(GUI.CloudsWnd);
  309.   SizeOut(na,4,size);
  310. END ClickOne;
  311.  
  312. PROCEDURE ClickFour(x,y1: INTEGER);
  313.  
  314. VAR Ok   : BOOLEAN;
  315.     Name : ARRAY 80 OF CHAR;
  316.     xm,ym: LONGINT;
  317.  
  318. BEGIN
  319.   Name:="RAM:Clouds_1.IFF";
  320.   Ok:=FileReq("Save Clouds as...",Name,win);
  321.   IF Ok THEN
  322.     I.SetWindowTitles(win,y.ADR("Saving..."),y.ADR("CloudsAGA 2.0 © Danny Amor in 1994"));
  323.     I.WindowToBack(GUI.CloudsWnd);
  324.     xm:=win^.leftEdge DIV 8+(x DIV 8)+1;
  325.     ym:=win^.topEdge+y1;
  326.     IF xm>resx THEN xm:=(x DIV 8)+1-(xm-resx); END;
  327.     IF ym>resy THEN ym:=y1-(ym-resy); END;
  328.     req.Assert(IFF.SaveClip(y.ADR(Name),win^.rPort.bitMap,win^.wScreen^.viewPort.colorMap.colorTable,1,win^.leftEdge DIV 8,win^.topEdge,xm,ym),"Couldn't save picture!");
  329.     I.WindowToFront(GUI.CloudsWnd);
  330.     I.SetWindowTitles(win,y.ADR("OK!"),y.ADR("CloudsAGA 2.0 © Danny Amor in 1994"));
  331.   END;
  332. END ClickFour;
  333.  
  334. PROCEDURE DoColours;
  335.  
  336. BEGIN
  337.   ObereFarbe:=y.LSH(LONG(1),depth)-1;
  338.   MittlereFarbe:=(ObereFarbe DIV 2)+SHORT(depth);
  339. END DoColours;
  340.  
  341. PROCEDURE ClickFive(VAR vp: g.ViewPortPtr);
  342.  
  343. VAR doit: BOOLEAN;
  344.  
  345. BEGIN
  346.   doit:=TRUE;
  347.   IF open THEN doit:=req.Request("Change Screenmode:","Do you want to restart with another\nresolution (this pic will be killed)?","OK","Cancel"); END;
  348.   IF doit THEN
  349.     CloseWindow(win);
  350.     pal.ClosePaletteWindow;
  351.     GUI.CloseCloudsWindow(GUI.CloudsWnd);
  352.     GUI.CloseDownScreen(GUI.Scr);
  353.     req.Assert(GUI.SetupScreen(depth,resx,resy)=0,"Unable to open screen!");
  354.     Col.AGACol[0]:=NIL;
  355.     DoColours;
  356.     vp:=y.ADR(GUI.Scr^.viewPort);
  357.     fonty:=GUI.FontY+3;
  358.     SetColors(vp);
  359.     size:=0;
  360.     req.Assert(GUI.OpenCloudsWindow(GUI.CloudsWnd,GUI.Scr)=0,"Unable to open window!");
  361.     open      := FALSE;
  362.     quit      := FALSE;
  363.   END;
  364. END ClickFive;
  365.  
  366. PROCEDURE WaitUntilClosedInfo;
  367.  
  368. VAR msg: I.IntuiMessagePtr;
  369.  
  370. BEGIN
  371.   e.WaitPort(GUI.InfoReqWnd.userPort);
  372.   msg:=e.GetMsg(GUI.InfoReqWnd.userPort);
  373.   e.ReplyMsg(msg);
  374.   GUI.CloseInfoReqWindow;
  375. END WaitUntilClosedInfo;
  376.  
  377. PROCEDURE CheckKey(code: INTEGER);
  378.  
  379. VAR key: CHAR;
  380.  
  381. BEGIN
  382.   key:=CAP(CHR(code));
  383.   IF  key="Z"                 THEN ClickNull(size);   END;
  384.   IF (key="C") AND (NOT open) THEN ClickOne(wx,wy);   END;
  385.   IF  key="P"                 THEN pal.ShowPalette(GUI.Scr,Col,4); END;
  386.   IF (key="M") AND open       THEN Smooth(na); END;
  387.   IF (key="S") AND open       THEN ClickFour(wx,wy);  END;
  388.   IF  key="R"                 THEN ClickFive(vp);     END;
  389. END CheckKey;
  390.  
  391. PROCEDURE ChangePalette(VAR Scr: I.ScreenPtr; Number: INTEGER);
  392.  
  393. VAR colours: ARRAY 386 OF LONGINT;
  394.     vp     : g.ViewPortPtr;
  395.     i,j    : INTEGER;
  396.  
  397. BEGIN
  398.   vp:=y.ADR(Scr^.viewPort);
  399.   IF Number=0 THEN
  400.     IF depth=5 THEN g.LoadRGB32(vp,GUI.colours32); END;
  401.     IF depth=6 THEN g.LoadRGB32(vp,GUI.colours64); END;
  402.     IF depth=7 THEN g.LoadRGB32(vp,GUI.colours128); END;
  403.   END;
  404.   IF Number=1 THEN
  405.     IF depth=5 THEN j:=31; END;
  406.     IF depth=6 THEN j:=45; END;
  407.     IF depth=7 THEN j:=72; END;
  408.     FOR i:=4 TO j DO
  409.       g.SetRGB32(vp,i,0F0000000H,LONG(255 DIV (j-4))*i*001000000H,0);
  410.     END;
  411.   END;
  412.   IF Number=2 THEN
  413.     IF depth=5 THEN j:=31; END;
  414.     IF depth=6 THEN j:=45; END;
  415.     IF depth=7 THEN j:=72; END;
  416.     FOR i:=4 TO j DO
  417.       g.SetRGB32(vp,i,LONG(255 DIV (j-4))*i*001000000H,LONG(255 DIV (j-4))*i*001000000H,LONG(255 DIV (j-4))*i*001000000H);
  418.     END;
  419.   END;
  420.   IF Number=3 THEN
  421.     IF depth=5 THEN j:=31; END;
  422.     IF depth=6 THEN j:=45; END;
  423.     IF depth=7 THEN j:=72; END;
  424.     FOR i:=4 TO j DO
  425.       g.SetRGB32(vp,i,0,LONG(255 DIV (j-4))*i*001000000H,0);
  426.     END;
  427.   END;
  428. END ChangePalette;
  429.  
  430. BEGIN
  431.   VERSION := "$VER: CloudsAGA 2.0 (02.01.95) by Daniel Amor, Ludwigstr. 124, 70197 Stuttgart, Germany";
  432.   version := g.gfx.libNode.version;
  433.   depth   := 5;
  434.   req.Assert (GUI.SetupScreen(depth,resx,resy) = 0, "Unable to open screen!");
  435.   req.Assert (GUI.OpenCloudsWindow(GUI.CloudsWnd,GUI.Scr) = 0, "Unable to open window!");
  436.   quit    := FALSE;
  437.   open    := FALSE;
  438.   DoColours;
  439.   vp:=y.ADR(GUI.Scr^.viewPort);
  440.   SetColors(vp);
  441.   fonty:=GUI.FontY+3;
  442.   size:=0;
  443.   REPEAT
  444.     IF open THEN
  445.       quit := (d.ctrlC IN e.Wait (LONGSET {GUI.CloudsWnd.userPort.sigBit,
  446.                                            win.userPort.sigBit,
  447.                                            d.ctrlC}))
  448.     ELSE
  449.       quit := (d.ctrlC IN e.Wait (LONGSET {GUI.CloudsWnd.userPort.sigBit,
  450.                                            d.ctrlC}));
  451.     END;
  452.     msgptr1 := gt.GetIMsg (GUI.CloudsWnd.userPort);
  453.     IF msgptr1 # NIL THEN
  454.       msg1 := msgptr1^;
  455.       gt.ReplyIMsg (msgptr1);
  456.  
  457.       IF (I.closeWindow IN msg1.class) THEN
  458.         quit := req.RequestWin("Clouds Requester","Do you really want to quit?","Yes","No",GUI.CloudsWnd);
  459.       END;
  460.       IF (I.gadgetUp IN msg1.class) THEN
  461.         aktgad1:=msg1.iAddress;
  462.         nummer:=aktgad1.gadgetID;
  463.         IF  nummer=GUI.GDSize                   THEN size:=msg1.code; END;
  464.         IF (nummer=GUI.GDCreate) AND (NOT open) THEN ClickOne(wx,wy);  END;
  465.         IF  nummer=GUI.GDAnimate                THEN pal.ShowPalette(GUI.Scr,Col,4); END;
  466.         IF (nummer=GUI.GDSmooth) AND open       THEN Smooth(na); END;
  467.         IF (nummer=GUI.GDSave) AND open         THEN ClickFour(wx,wy); END;
  468.         IF  nummer=GUI.GDScreen                 THEN ClickFive(vp); END;
  469.         IF  nummer=GUI.GDMaterial               THEN ChangePalette(GUI.Scr,msg1.code); END;
  470.       END;
  471.       IF (I.vanillaKey IN msg1.class) THEN CheckKey(msg1.code); END;
  472.       IF (I.menuPick IN msg1.class) THEN
  473.         IF I.MenuNum(msg1.code)=0 THEN
  474.           IF I.ItemNum(msg1.code)=0 THEN
  475.             req.Assert(GUI.OpenInfoReqWindow()=0, "Unable to open Info-Requester!");
  476.             WaitUntilClosedInfo;
  477.           END;
  478.           IF I.ItemNum(msg1.code)=2 THEN
  479.             quit := req.RequestWin("Clouds Requester","Do you really want to quit?","Yes","No",GUI.CloudsWnd);
  480.           END;
  481.         END;
  482.       END;
  483.     ELSE
  484.       IF NOT quit THEN
  485.         msgptr2 := gt.GetIMsg (win.userPort);
  486.         IF msgptr2 # NIL THEN
  487.           msg2 := msgptr2^;
  488.           gt.ReplyIMsg (msgptr2);
  489.  
  490.           IF (I.vanillaKey IN msg2.class) THEN CheckKey(msg2.code); END;
  491.           IF (I.closeWindow IN msg2.class) THEN
  492.             CloseWindow(win);
  493.             open := FALSE;
  494.           END;
  495.         END;
  496.       END;
  497.     END;
  498.   UNTIL quit;
  499. CLOSE
  500.   CloseWindow(win);
  501.   GUI.CloseCloudsWindow(GUI.CloudsWnd);
  502.   pal.ClosePaletteWindow;
  503.   GUI.CloseDownScreen(GUI.Scr);
  504. END Clouds.
  505.