home *** CD-ROM | disk | FTP | other *** search
/ Ultra Mac Games 1 & 2 / UltraMacGames2.iso / Puzzles / Maze / MazeGenAll.p < prev   
Text File  |  1987-08-29  |  5KB  |  171 lines

  1. (*
  2.     MazeGenAll.p -- a HyperCard external command to draw a random maze!
  3.     by Chris Knepper, August 1987
  4.     CompuServe: 76347,1757
  5.     
  6.     Call this from HyperCard as follows:
  7.     
  8.         MazeGenAll(x,y,lineDir)
  9.         
  10.     x,y are the starting point of the line.  We determine a "random" direction, either right or down
  11.     by looking at lineDir: true -> go right, false -> go left.
  12.  
  13.     It returns error in returnValue.
  14.     
  15.     To compile and link this file using Macintosh Programmer's Workshop:
  16.  
  17.     pascal -w "{MPW}"HCard.xcmd:MazeGenAll.p
  18.     link -m ENTRYPOINT                             # set the main entry point spec'd in the obj files    ∂
  19.         -o "{MPW}"HCard.xcmd:MazeGenAll.xfcn      # place the Linker output here                        ∂
  20.         -rt XFCN=0                                 # sets the resource: type to XCMD; id to 0            ∂
  21.         -sn Main=MazeGenAll                        # combines the segment Main into MazeGenAll            ∂
  22.         "{MPW}"HCard.xcmd:MazeGenAll.p.o        ∂
  23.         "{Libraries}"Interface.o                ∂
  24.         "{Plibraries}"PasLib.o 
  25. *)
  26.  
  27. {$R-}
  28.  
  29. {$S MazeGenAll }     { Segment name must be the same as the command name. }
  30.  
  31. UNIT DummyUnit;
  32.  
  33. INTERFACE
  34.  
  35. USES MemTypes, QuickDraw, OSIntf, ToolIntf, PackIntf, HyperXCmd;
  36.  
  37. { Note: HyperXCmd.p is available from APDA -- put it in the folder :MPW:PInterfaces: }
  38.  
  39. PROCEDURE EntryPoint(paramPtr: XCmdPtr);
  40.  
  41. IMPLEMENTATION
  42.  
  43. TYPE Str19 = String[19];
  44.      Str31 = String[31];
  45.  
  46. PROCEDURE MazeGenAll(paramPtr: XCmdPtr); FORWARD;
  47.  
  48.   PROCEDURE EntryPoint(paramPtr: XCmdPtr);
  49.   BEGIN
  50.     MazeGenAll(paramPtr);
  51.   END;
  52.  
  53.   PROCEDURE MazeGenAll(paramPtr: XCmdPtr);
  54.   VAR     str,retStr,myStr: Str255;
  55.         x,y,
  56.         fromXErase,fromYErase,toXErase,toYErase,
  57.         fromXDrag,fromYDrag,toXDrag,toYDrag: INTEGER;
  58.   
  59.   {$I XCmdGlue.inc }
  60.   
  61.   { Note: XCmdGlue.inc is available from APDA -- put it in the folder :MPW:HCard.xcmd: }
  62.   
  63.   FUNCTION toStr(a: LONGINT): Str255;
  64.   { toStr converts an integer value to its string -- it makes the code readable }
  65.   VAR    s: Str255;
  66.   BEGIN
  67.     NumToString(a,s);
  68.     toStr := s;
  69.   END;
  70.  
  71.   FUNCTION OKDir(x1,y1,x2,y2: INTEGER): BOOLEAN;
  72.   { OKDir returns true if the line has not yet been place or has not yet failed }
  73.   VAR        tempStr:Str255;
  74.               theHandle: Handle;
  75.   BEGIN
  76.       OKDir:=false;
  77.       IF ((x1=0) AND (x2=0)) THEN exit(OKDir);
  78.     IF ((y1=0) AND (y2=0)) THEN exit(OKDir);
  79.     IF ((x1=15) AND (x2=15)) THEN exit(OKDir);
  80.     IF ((y1=9) AND (y2=9)) THEN exit(OKDir);
  81.     IF (x2>15) THEN exit(OKDir);
  82.     IF (y2>9) THEN exit(OKDir);
  83.  
  84.     { if str is not in allLines then continue }
  85.     theHandle := GetGlobal('allLines');    { GetGlobal is in XCmdGlue.inc }
  86.     tempStr := Concat(toStr(x1),toStr(y1),toStr(x2),toStr(y2),' ');
  87.     IF StringMatch(tempStr,theHandle^)<>NIL THEN exit(OKDir);    { StringMatch is in XCmdGlue.inc }
  88.     
  89.     SetGlobal('lastLine',PasToZero(tempStr));    { SetGlobal is in XCmdGlue.inc }
  90.     OKDir:=true;
  91.   END;
  92.  
  93.   BEGIN
  94.     WITH paramPtr^ DO BEGIN
  95.         IF paramCount <> 3 THEN
  96.             retStr := 'error'
  97.         ELSE BEGIN
  98.             retStr := 'false';
  99.             
  100.             { first param is x coordinate }
  101.             ZeroToPas(params[1]^,str);    { ZeroToPas is in XCmdGlue.inc }
  102.             x := StrToNum(str);
  103.         
  104.             { second param is y coordinate }
  105.             ZeroToPas(params[2]^,str);
  106.             y := StrToNum(str);
  107.             
  108.             { third param is lineDir }
  109.             ZeroToPas(params[3]^,str);
  110.                     
  111.             IF Odd(StrToNum(str)) THEN BEGIN {go down -- StrToNum is in XCmdGlue.inc }
  112.                 IF OKDir(x,y,x,y+1) THEN BEGIN
  113.                     
  114.                         retStr := 'true';
  115.                         fromXDrag := x*24+65;
  116.                         fromYDrag := y*24+60;
  117.                         toXDrag := fromXDrag;
  118.                         toYDrag := (y+1)*24+60;
  119.                         fromXErase := fromXDrag;
  120.                         fromYErase := fromYDrag+3;
  121.                         toXErase := fromXDrag;
  122.                         toYErase := toYDrag-3;
  123.                                             
  124.                 END { IF OKDir }
  125.             END ELSE IF OKDir(x,y,x+1,y) THEN BEGIN {go right}
  126.                     
  127.                         retStr := 'true';
  128.                         fromXDrag := x*24+65;
  129.                         fromYDrag := y*24+60;
  130.                         toXDrag := (x+1)*24+65;
  131.                         toYDrag := fromYDrag;
  132.                         fromXErase := fromXDrag+3;
  133.                         fromYErase := fromYDrag;
  134.                         toXErase := toXDrag-3;
  135.                         toYErase := fromYDrag;
  136.                     
  137.                    END; {IF OKDir}
  138.             
  139.             IF retStr = 'true' THEN BEGIN { ie. line is OK as per OKDir }
  140.             
  141.                 str := Concat('drag from ',toStr(fromXDrag),',',toStr(fromYDrag),' to ');
  142.                 str := Concat(str,toStr(toXDrag),',',toStr(toYDrag));
  143.                 SendHCMessage(str);    { SendHCMessage is in XCmdGlue.inc }
  144.                 
  145.                 str := Concat('drag from ',toStr(fromXErase),',',toStr(fromYErase),' to ');
  146.                 str := Concat(str,toStr(toXErase),',',toStr(toYErase));
  147.                 SetGlobal('eraseLine',PasToZero(str));
  148.                 
  149.                 str := 'doClick';
  150.                 SendCardMessage(str);    { SendCardMessage is in XCmdGlue.inc }
  151.                 
  152.                 { look at pixels in the current grafport and set a HyperCard global variable }
  153.                                 
  154.                 IF (fromXDrag = toXDrag) THEN { line is up/down }
  155.                     SetGlobal('GetPixelRes',
  156.                         PasToZero(BoolToStr(GetPixel(fromXDrag+5,fromYDrag+5) AND GetPixel(fromXDrag-5,fromYDrag+5))))
  157.                 ELSE { line is across }
  158.                     SetGlobal('GetPixelRes',
  159.                         PasToZero(BoolToStr(GetPixel(fromXDrag+5,fromYDrag-5) AND GetPixel(fromXDrag+5,fromYDrag+5))));
  160.                 
  161.             END; {IF}
  162.           END; {IF}
  163.     
  164.         returnValue := PasToZero(retStr);
  165.         passFlag := false;
  166.         
  167.     END; {WITH}
  168.     
  169.   END; {PROCEDURE}
  170.   
  171. END. {UNIT}