home *** CD-ROM | disk | FTP | other *** search
/ PSION CD 2 / PsionCDVol2.iso / Programs / 437 / Maze3d.sis / Maze3D.opl (.txt) < prev   
Encoding:
EPOC OPL Source  |  2001-10-27  |  46.8 KB  |  1,662 lines

  1.  
  2.  
  3. APP Maze3D, &03baff1e
  4.   CAPTION "Maze3D", 1
  5.   ICON "Maze3D.mbm"
  6. ENDA
  7.  
  8. DECLARE EXTERNAL
  9.  
  10. INCLUDE "SYSTEM.OXH"
  11.  
  12. REM
  13. REM                                       Maze3D
  14. REM
  15. REM                               Version 5.1 (10/21/98)
  16. REM
  17. REM
  18. REM      Generate and solve mazes on your Psion Series 5.
  19. REM
  20. REM      The mazes are displayed in three dimensions.
  21. REM
  22. REM      You will be prompted for a random number seed, the number of columns,
  23. REM  the tilt, and the number of mazes to be tried before one is selected for
  24. REM  display.
  25. REM
  26. REM      While the maze is being generated, a spinning cursor is displayed.
  27. REM
  28. REM      After the maze is displayed, you may use the arrow keys to solve it.
  29. REM Press "Q" to quit or press "S" to have the computer solve the maze.
  30. REM
  31. REM      After the maze is solved, you must press some key to continue.
  32. REM
  33. REM      Each maze has exactly one solution that does not involve backtracking
  34. REM (passing through a doorway more than once).
  35. REM
  36. REM      This program was written by James L. Dean.
  37. REM
  38. REM
  39.  
  40. EXTERNAL ConditionallyIncrementAdjacency:
  41. EXTERNAL DisplayQuadrilateral:(XMax,XOffset,YMax,X0,Y0,Z0,X1,Y1,Z1,X2,Y2,Z2,X3,Y3,Z3,PixelsPerX,PixelsPerZ,CosTilt,SinTilt,RelDistOfUserFromScreen,Shade%)
  42. EXTERNAL DisplaySolution:(MaxX%,MaxY%,XMax,XOffset,YMax,CosTilt,SinTilt,PixelsPerX,PixelsPerZ,RelDistOfUserFromScreen)
  43. EXTERNAL DrawLine:(X1,Y1,X2,Y2,XMax,XOffset,YMax,CosTilt,SinTilt,PixelsPerX,PixelsPerZ,RelDistOfUserFromScreen)
  44. EXTERNAL DrawQuadrilateral:(ColorNum%)
  45. EXTERNAL GenerateMaze:(MaxX%,MaxY%,NumColumns%,NumRows%)
  46. EXTERNAL GetCorner:(X,Y,Z,PixelsPerX,PixelsPerZ,CosTilt,SinTilt,RelDistOfUserFromScreen,XMax,XOffset,YMax)
  47. EXTERNAL Hash:
  48. EXTERNAL Increment:
  49. EXTERNAL LetUserTryToSolve:(MaxX%,MaxY%,XMax,XOffset,YMax,CosTilt,SinTilt,PixelsPerX,PixelsPerZ,RelDistOfUserFromScreen)
  50. EXTERNAL Maze3D:
  51. EXTERNAL NoPassageIfWall:(X%,Y%,MaxX%)
  52. EXTERNAL OutputFrontTop:(XMax,XOffset,YMax,PixelsPerX,PixelsPerZ,CosTilt,SinTilt,RelDistOfUserFromScreen)
  53. EXTERNAL OutputLeftRight:(XMax,XOffset,YMax,PixelsPerX,PixelsPerZ,CosTilt,SinTilt,RelDistOfUserFromScreen)
  54. EXTERNAL OutputMaze:(MaxX%,MaxY%,XMax,XOffset,YMax,CosTilt,SinTilt,PixelsPerX,PixelsPerZ,RelDistOfUserFromScreen)
  55. EXTERNAL SelectMaze:(Seed&,MaxX%,MaxY%,NumRoomsInMaze%,NumColumns%,NumRows%,NumTrials%)
  56. EXTERNAL SolveMaze:(MaxX%,MaxY%)
  57. EXTERNAL Titillate:
  58.  
  59. CONST True%=-1
  60. CONST False%=0
  61.  
  62. CONST NumColors%=16
  63. CONST TopColor%=226
  64. CONST FrontWallShade%=113
  65. CONST FloorShade%=178
  66. CONST RightWallShade%=81
  67. CONST LeftWallShade%=81
  68. CONST BackoutShade%=146
  69. CONST AdvanceShade%=0
  70. CONST SolutionShade%=255
  71. CONST WidthOfGraphicsInInches=5.6
  72. CONST NumXPixels%=640
  73. CONST WidthOfGraphicsInPixels%=640
  74. CONST HeightOfGraphicsInInches=2.0
  75. CONST NumYPixels%=240
  76. CONST HeightOfGraphicsInPixels%=220
  77. CONST RelativeWidthOfWall=0.2:REM relative to side of square
  78. CONST RelativeHeightOfWall=1.0:REM relative to side of square
  79. CONST MinWallLengthInPixels%=24
  80. CONST MinNumColumns%=2
  81. CONST MaxNumColumns%=26:REM INT(FLT(WidthOfGraphicsInPixels%)/FLT(MinWallLengthInPixels%)-FLT(RelativeWidthOfWall))
  82. CONST MaxNumRows%=9:REM INT(HeightOfGraphicsInInches*FLT(NumColumns%)/WidthOfGraphicsInInches)
  83. CONST MaxNumRooms%=234:REM MaxNumRows%*MaxNumColumns%
  84. CONST MaxMaxX%=52:REM 2*MaxNumColumns%
  85. CONST MaxMaxXPlus1%=53:REM MaxMaxX%+1
  86. CONST MaxMaxY%=18:REM 2*MaxNumRows%
  87. CONST MaxMaxYPlus1%=19:REM MaxMaxY%+1
  88. CONST MaxPageSize%=1007:REM MaxMaxXPlus1%*MaxMaxYPlus1%
  89.  
  90. PROC Maze3D:
  91.   GLOBAL ComputerPage%(MaxPageSize%)
  92.   GLOBAL DeltaX%(96)
  93.   GLOBAL DeltaY%(96)
  94.   GLOBAL StackIndex1%(MaxNumRooms%)
  95.   GLOBAL StackIndex2%(MaxNumRooms%)
  96.   GLOBAL SubstitutionHigh%(100)
  97.   GLOBAL SubstitutionLow%(100)
  98.   GLOBAL Titillator$(4,1)
  99.   GLOBAL TitillatorIndex%
  100.   GLOBAL UserInput$(1)
  101.   GLOBAL UserPage%(MaxPageSize%)
  102.   LOCAL ColorNum%
  103.   LOCAL ColumnCount&
  104.   LOCAL CosTilt
  105.   LOCAL DefaultNumColumns%
  106.   LOCAL DefaultNumTrials%
  107.   LOCAL DefaultSeed&
  108.   LOCAL DefaultTilt
  109.   LOCAL DeltaIndex1a%
  110.   LOCAL DeltaIndex1b%
  111.   LOCAL DeltaIndex1c%
  112.   LOCAL DeltaIndex1d%
  113.   LOCAL DeltaIndex2%
  114.   LOCAL IniFile$(255)
  115.   LOCAL MaxX%
  116.   LOCAL MaxY%
  117.   LOCAL NumColumns%
  118.   LOCAL NumRoomsInMaze%
  119.   LOCAL NumRows%
  120.   LOCAL NumTrials%
  121.   LOCAL PixelsPerX
  122.   LOCAL PixelsPerZ
  123.   LOCAL Plot%
  124.   LOCAL Radians
  125.   LOCAL RadiansPerDegree
  126.   LOCAL RelDistOfUserFromScreen
  127.   LOCAL Response%
  128.   LOCAL Seed&
  129.   LOCAL SinTilt
  130.   LOCAL Tem
  131.   LOCAL Tilt
  132.   LOCAL TrialCount&
  133.   LOCAL XMax
  134.   LOCAL XOffset
  135.   LOCAL YMax
  136.  
  137.   Titillator$(1)="|"
  138.   Titillator$(2)="/"
  139.   Titillator$(3)="-"
  140.   Titillator$(4)="\"
  141.   SubstitutionHigh%(1)=4
  142.   SubstitutionHigh%(2)=1
  143.   SubstitutionHigh%(3)=2
  144.   SubstitutionHigh%(4)=8
  145.   SubstitutionHigh%(5)=8
  146.   SubstitutionHigh%(6)=9
  147.   SubstitutionHigh%(7)=9
  148.   SubstitutionHigh%(8)=6
  149.   SubstitutionHigh%(9)=5
  150.   SubstitutionHigh%(10)=7
  151.   SubstitutionHigh%(11)=2
  152.   SubstitutionHigh%(12)=1
  153.   SubstitutionHigh%(13)=2
  154.   SubstitutionHigh%(14)=9
  155.   SubstitutionHigh%(15)=8
  156.   SubstitutionHigh%(16)=8
  157.   SubstitutionHigh%(17)=6
  158.   SubstitutionHigh%(18)=3
  159.   SubstitutionHigh%(19)=5
  160.   SubstitutionHigh%(20)=1
  161.   SubstitutionHigh%(21)=9
  162.   SubstitutionHigh%(22)=5
  163.   SubstitutionHigh%(23)=4
  164.   SubstitutionHigh%(24)=4
  165.   SubstitutionHigh%(25)=9
  166.   SubstitutionHigh%(26)=8
  167.   SubstitutionHigh%(27)=6
  168.   SubstitutionHigh%(28)=0
  169.   SubstitutionHigh%(29)=8
  170.   SubstitutionHigh%(30)=0
  171.   SubstitutionHigh%(31)=6
  172.   SubstitutionHigh%(32)=0
  173.   SubstitutionHigh%(33)=2
  174.   SubstitutionHigh%(34)=4
  175.   SubstitutionHigh%(35)=1
  176.   SubstitutionHigh%(36)=9
  177.   SubstitutionHigh%(37)=2
  178.   SubstitutionHigh%(38)=0
  179.   SubstitutionHigh%(39)=7
  180.   SubstitutionHigh%(40)=4
  181.   SubstitutionHigh%(41)=7
  182.   SubstitutionHigh%(42)=3
  183.   SubstitutionHigh%(43)=0
  184.   SubstitutionHigh%(44)=0
  185.   SubstitutionHigh%(45)=2
  186.   SubstitutionHigh%(46)=6
  187.   SubstitutionHigh%(47)=8
  188.   SubstitutionHigh%(48)=9
  189.   SubstitutionHigh%(49)=4
  190.   SubstitutionHigh%(50)=0
  191.   SubstitutionHigh%(51)=8
  192.   SubstitutionHigh%(52)=3
  193.   SubstitutionHigh%(53)=2
  194.   SubstitutionHigh%(54)=3
  195.   SubstitutionHigh%(55)=2
  196.   SubstitutionHigh%(56)=5
  197.   SubstitutionHigh%(57)=2
  198.   SubstitutionHigh%(58)=4
  199.   SubstitutionHigh%(59)=6
  200.   SubstitutionHigh%(60)=9
  201.   SubstitutionHigh%(61)=7
  202.   SubstitutionHigh%(62)=9
  203.   SubstitutionHigh%(63)=1
  204.   SubstitutionHigh%(64)=3
  205.   SubstitutionHigh%(65)=5
  206.   SubstitutionHigh%(66)=7
  207.   SubstitutionHigh%(67)=1
  208.   SubstitutionHigh%(68)=1
  209.   SubstitutionHigh%(69)=4
  210.   SubstitutionHigh%(70)=5
  211.   SubstitutionHigh%(71)=8
  212.   SubstitutionHigh%(72)=1
  213.   SubstitutionHigh%(73)=6
  214.   SubstitutionHigh%(74)=0
  215.   SubstitutionHigh%(75)=5
  216.   SubstitutionHigh%(76)=7
  217.   SubstitutionHigh%(77)=8
  218.   SubstitutionHigh%(78)=2
  219.   SubstitutionHigh%(79)=3
  220.   SubstitutionHigh%(80)=3
  221.   SubstitutionHigh%(81)=7
  222.   SubstitutionHigh%(82)=3
  223.   SubstitutionHigh%(83)=5
  224.   SubstitutionHigh%(84)=1
  225.   SubstitutionHigh%(85)=7
  226.   SubstitutionHigh%(86)=5
  227.   SubstitutionHigh%(87)=4
  228.   SubstitutionHigh%(88)=0
  229.   SubstitutionHigh%(89)=3
  230.   SubstitutionHigh%(90)=6
  231.   SubstitutionHigh%(91)=3
  232.   SubstitutionHigh%(92)=7
  233.   SubstitutionHigh%(93)=7
  234.   SubstitutionHigh%(94)=1
  235.   SubstitutionHigh%(95)=9
  236.   SubstitutionHigh%(96)=4
  237.   SubstitutionHigh%(97)=0
  238.   SubstitutionHigh%(98)=5
  239.   SubstitutionHigh%(99)=6
  240.   SubstitutionHigh%(100)=6
  241.   SubstitutionLow%(1)=1
  242.   SubstitutionLow%(2)=2
  243.   SubstitutionLow%(3)=2
  244.   SubstitutionLow%(4)=1
  245.   SubstitutionLow%(5)=5
  246.   SubstitutionLow%(6)=5
  247.   SubstitutionLow%(7)=4
  248.   SubstitutionLow%(8)=6
  249.   SubstitutionLow%(9)=4
  250.   SubstitutionLow%(10)=6
  251.   SubstitutionLow%(11)=4
  252.   SubstitutionLow%(12)=4
  253.   SubstitutionLow%(13)=5
  254.   SubstitutionLow%(14)=6
  255.   SubstitutionLow%(15)=6
  256.   SubstitutionLow%(16)=3
  257.   SubstitutionLow%(17)=0
  258.   SubstitutionLow%(18)=9
  259.   SubstitutionLow%(19)=6
  260.   SubstitutionLow%(20)=5
  261.   SubstitutionLow%(21)=7
  262.   SubstitutionLow%(22)=2
  263.   SubstitutionLow%(23)=0
  264.   SubstitutionLow%(24)=9
  265.   SubstitutionLow%(25)=3
  266.   SubstitutionLow%(26)=4
  267.   SubstitutionLow%(27)=2
  268.   SubstitutionLow%(28)=3
  269.   SubstitutionLow%(29)=9
  270.   SubstitutionLow%(30)=1
  271.   SubstitutionLow%(31)=9
  272.   SubstitutionLow%(32)=9
  273.   SubstitutionLow%(33)=9
  274.   SubstitutionLow%(34)=3
  275.   SubstitutionLow%(35)=8
  276.   SubstitutionLow%(36)=9
  277.   SubstitutionLow%(37)=3
  278.   SubstitutionLow%(38)=4
  279.   SubstitutionLow%(39)=1
  280.   SubstitutionLow%(40)=5
  281.   SubstitutionLow%(41)=0
  282.   SubstitutionLow%(42)=5
  283.   SubstitutionLow%(43)=2
  284.   SubstitutionLow%(44)=7
  285.   SubstitutionLow%(45)=0
  286.   SubstitutionLow%(46)=8
  287.   SubstitutionLow%(47)=8
  288.   SubstitutionLow%(48)=0
  289.   SubstitutionLow%(49)=4
  290.   SubstitutionLow%(50)=5
  291.   SubstitutionLow%(51)=0
  292.   SubstitutionLow%(52)=3
  293.   SubstitutionLow%(53)=6
  294.   SubstitutionLow%(54)=8
  295.   SubstitutionLow%(55)=1
  296.   SubstitutionLow%(56)=7
  297.   SubstitutionLow%(57)=8
  298.   SubstitutionLow%(58)=8
  299.   SubstitutionLow%(59)=7
  300.   SubstitutionLow%(60)=1
  301.   SubstitutionLow%(61)=3
  302.   SubstitutionLow%(62)=2
  303.   SubstitutionLow%(63)=7
  304.   SubstitutionLow%(64)=7
  305.   SubstitutionLow%(65)=1
  306.   SubstitutionLow%(66)=8
  307.   SubstitutionLow%(67)=0
  308.   SubstitutionLow%(68)=3
  309.   SubstitutionLow%(69)=7
  310.   SubstitutionLow%(70)=5
  311.   SubstitutionLow%(71)=2
  312.   SubstitutionLow%(72)=6
  313.   SubstitutionLow%(73)=4
  314.   SubstitutionLow%(74)=0
  315.   SubstitutionLow%(75)=9
  316.   SubstitutionLow%(76)=9
  317.   SubstitutionLow%(77)=7
  318.   SubstitutionLow%(78)=7
  319.   SubstitutionLow%(79)=4
  320.   SubstitutionLow%(80)=6
  321.   SubstitutionLow%(81)=2
  322.   SubstitutionLow%(82)=0
  323.   SubstitutionLow%(83)=0
  324.   SubstitutionLow%(84)=1
  325.   SubstitutionLow%(85)=7
  326.   SubstitutionLow%(86)=3
  327.   SubstitutionLow%(87)=6
  328.   SubstitutionLow%(88)=6
  329.   SubstitutionLow%(89)=1
  330.   SubstitutionLow%(90)=1
  331.   SubstitutionLow%(91)=2
  332.   SubstitutionLow%(92)=4
  333.   SubstitutionLow%(93)=5
  334.   SubstitutionLow%(94)=9
  335.   SubstitutionLow%(95)=8
  336.   SubstitutionLow%(96)=2
  337.   SubstitutionLow%(97)=8
  338.   SubstitutionLow%(98)=8
  339.   SubstitutionLow%(99)=3
  340.   SubstitutionLow%(100)=5
  341.   DeltaX%(1)=-1
  342.   DeltaY%(1)=0
  343.   DeltaX%(25)=0
  344.   DeltaY%(25)=1
  345.   DeltaX%(49)=1
  346.   DeltaY%(49)=0
  347.   DeltaX%(73)=0
  348.   DeltaY%(73)=-1
  349.   DeltaIndex2%=0
  350.   DeltaIndex1a%=0
  351.   WHILE DeltaIndex1a% <= 3
  352.     DeltaIndex1b%=0
  353.     WHILE DeltaIndex1b% <= 3
  354.       IF DeltaIndex1a% <> DeltaIndex1b%
  355.         DeltaIndex1c%=0
  356.         WHILE DeltaIndex1c% <= 3
  357.           IF (DeltaIndex1a% <> DeltaIndex1c%) AND (DeltaIndex1b% <> DeltaIndex1c%)
  358.             DeltaIndex1d%=0
  359.             WHILE DeltaIndex1d% <= 3
  360.               IF (DeltaIndex1a% <> DeltaIndex1d%) AND (DeltaIndex1b% <> DeltaIndex1d%) AND (DeltaIndex1c% <> DeltaIndex1d%)
  361.                 DeltaIndex2%=DeltaIndex2%+1
  362.                 DeltaX%(24*DeltaIndex1a%+DeltaIndex2%)=DeltaX%(1)
  363.                 DeltaY%(24*DeltaIndex1a%+DeltaIndex2%)=DeltaY%(1)
  364.                 DeltaX%(24*DeltaIndex1b%+DeltaIndex2%)=DeltaX%(25)
  365.                 DeltaY%(24*DeltaIndex1b%+DeltaIndex2%)=DeltaY%(25)
  366.                 DeltaX%(24*DeltaIndex1c%+DeltaIndex2%)=DeltaX%(49)
  367.                 DeltaY%(24*DeltaIndex1c%+DeltaIndex2%)=DeltaY%(49)
  368.                 DeltaX%(24*DeltaIndex1d%+DeltaIndex2%)=DeltaX%(73)
  369.                 DeltaY%(24*DeltaIndex1d%+DeltaIndex2%)=DeltaY%(73)
  370.               ENDIF
  371.               DeltaIndex1d%=DeltaIndex1d%+1
  372.             ENDWH
  373.           ENDIF
  374.           DeltaIndex1c%=DeltaIndex1c%+1
  375.         ENDWH
  376.       ENDIF
  377.       DeltaIndex1b%=DeltaIndex1b%+1
  378.     ENDWH
  379.     DeltaIndex1a%=DeltaIndex1a%+1
  380.   ENDWH
  381.   IniFile$=CMD$(1)
  382.   IniFile$=LEFT$(IniFile$,LEN(IniFile$)-3)+"ini"
  383.   IF EXIST(IniFile$)
  384.     OPEN IniFile$,A,DefaultNumColumns%,DefaultTilt,DefaultSeed&,DefaultNumTrials%
  385.     DefaultNumColumns%=A.DefaultNumColumns%
  386.     DefaultTilt=A.DefaultTilt
  387.     DefaultSeed&=A.DefaultSeed&
  388.     DefaultNumTrials%=A.DefaultNumTrials%
  389.     CLOSE
  390.   ELSE
  391.     DefaultNumColumns%=26
  392.     DefaultTilt=60.0
  393.     DefaultSeed&=1
  394.     DefaultNumTrials%=5
  395.   ENDIF
  396.   DO
  397.     ColumnCount&=DefaultNumColumns%
  398.     Tilt=DefaultTilt
  399.     TrialCount&=DefaultNumTrials%
  400.     Seed&=DefaultSeed&
  401.       DINIT "3D Mazes", 16
  402.     DLONG Seed&, "Random number seed:", 1, 99999999
  403.       DLONG ColumnCount&, "Number of columns:", MinNumColumns%, MaxNumColumns%
  404.       DFLOAT Tilt, "Tilt (degrees):", 30.0, 60.0
  405.     DLONG TrialCount&, "Display most difficult maze of:", 1, 50
  406.       DBUTTONS "Okay", %o, "Quit", %q
  407.       Response%=DIALOG
  408.     IF Response% = %o
  409.       NumColumns%=ColumnCount&
  410.       NumTrials%=TrialCount&
  411.       Tem=NumColumns%
  412.       NumRows%=INT(HeightOfGraphicsInInches*Tem/WidthOfGraphicsInInches)
  413.       IF NumRows% < 2
  414.         NumRows%=2
  415.       ENDIF
  416.       DefaultSeed&=Seed&
  417.       DefaultNumColumns%=NumColumns%
  418.       DefaultNumTrials%=NumTrials%
  419.       DefaultTilt=Tilt
  420.       MaxX%=2*NumColumns%
  421.       MaxY%=2*NumRows%
  422.       NumRoomsInMaze%=NumRows%*NumColumns%
  423.       Plot%=GCREATE(0,0,640,240,1,2)
  424.       GSETPENWIDTH 1
  425.       TitillatorIndex%=1
  426.       SelectMaze:(Seed&,MaxX%,MaxY%,NumRoomsInMaze%,NumColumns%,NumRows%,NumTrials%)
  427.       GCOLOR 255,255,255
  428.       GAT 320,120
  429.       GPRINT Titillator$(TitillatorIndex%)
  430.       RadiansPerDegree=ATAN(1.0)/45.0
  431.       Radians=Tilt*RadiansPerDegree
  432.       SinTilt=SIN(Radians)
  433.       CosTilt=COS(Radians)
  434.       Tem=NumColumns%
  435.       XMax=Tem+RelativeWidthOfWall
  436.       Tem=WidthOfGraphicsInPixels%
  437.       PixelsPerX=(Tem-1.0)/(XMax*(XMax/(XMax-RelativeHeightOfWall)))
  438.       XOffset=(XMax/2.0)*(RelativeHeightOfWall/(XMax-RelativeHeightOfWall))
  439.       Tem=NumRows%
  440.       YMax=Tem+RelativeWidthOfWall
  441.       Tem=HeightOfGraphicsInPixels%
  442.       PixelsPerZ=(Tem-1.0)/SQR(YMax*YMax+RelativeHeightOfWall*RelativeHeightOfWall)
  443.       IF YMax > XMax
  444.         RelDistOfUserFromScreen=YMax
  445.       ELSE
  446.         RelDistOfUserFromScreen=XMax
  447.       ENDIF
  448.       OutputMaze:(MaxX%,MaxY%,XMax,XOffset,YMax,CosTilt,SinTilt,PixelsPerX,PixelsPerZ,RelDistOfUserFromScreen)
  449.       GCOLOR 0,0,0
  450.       GAT 320-GTWIDTH("Arrows - Move    S - Solve    D - Dialog")/2,234
  451.       GPRINT "Arrows - Move    S - Solve    D - Dialog"
  452.       ComputerPage%((MaxX%+1)*MaxY%+MaxX%)=1
  453.       LetUserTryToSolve:(MaxX%,MaxY%,XMax,XOffset,YMax,CosTilt,SinTilt,PixelsPerX,PixelsPerZ,RelDistOfUserFromScreen)
  454.       IF (UserInput$ = "s") OR (UserInput$ = "S")
  455.         DisplaySolution:(MaxX%,MaxY%,XMax,XOffset,YMax,CosTilt,SinTilt,PixelsPerX,PixelsPerZ,RelDistOfUserFromScreen)
  456.         GCOLOR 0,0,0
  457.         GAT 320-GTWIDTH("Press a key to continue.")/2,234
  458.         GPRINT "Press a key to continue."
  459.         GET$
  460.       ENDIF
  461.       GCLOSE Plot%
  462.     ENDIF
  463.   UNTIL Response% <> %o
  464.   IF EXIST(IniFile$)
  465.     DELETE IniFile$
  466.   ENDIF
  467.   CREATE IniFile$,A,DefaultNumColumns%,DefaultTilt,DefaultSeed&,DefaultNumTrials%
  468.   A.DefaultNumColumns%=DefaultNumColumns%
  469.   A.DefaultTilt=DefaultTilt
  470.   A.DefaultSeed&=DefaultSeed&
  471.   A.DefaultNumTrials%=DefaultNumTrials%
  472.   APPEND
  473.   CLOSE
  474. ENDP
  475.  
  476. PROC DrawQuadrilateral:(ColorNum%)
  477.   EXTERNAL BoxX%()
  478.   EXTERNAL BoxY%()
  479.   GLOBAL BoxX1%
  480.   GLOBAL BoxX2%
  481.   GLOBAL BoxY1%
  482.   LOCAL BoxDeltaX
  483.   LOCAL BoxDeltaY
  484.   LOCAL BoxNum1%
  485.   LOCAL BoxNum2%
  486.   LOCAL BoxXIntercept
  487.   LOCAL BoxYMax%
  488.   LOCAL BoxYMin%
  489.   LOCAL BoxYOffset
  490.   LOCAL InterceptCountMod2%
  491.  
  492.   BoxYMin%=BoxY%(1)
  493.   BoxYMax%=BoxYMin%
  494.   BoxNum1%=2
  495.   WHILE BoxNum1% <= 4
  496.     IF BoxY%(BoxNum1%) < BoxYMin%
  497.       BoxYMin%=BoxY%(BoxNum1%)
  498.     ENDIF
  499.     IF BoxY%(BoxNum1%) > BoxYMax%
  500.       BoxYMax%=BoxY%(BoxNum1%)
  501.     ENDIF
  502.     BoxNum1%=BoxNum1%+1
  503.   ENDWH
  504.   GCOLOR ColorNum%,ColorNum%,ColorNum%
  505.   BoxY1%=BoxYMin%
  506.   WHILE BoxY1% <= BoxYMax%
  507.     InterceptCountMod2%=0
  508.     BoxNum2%=2
  509.     BoxNum1%=1
  510.     WHILE BoxNum1% <= 4
  511.       IF BoxY%(BoxNum1%) >= BoxY1%
  512.         IF BoxY1% > BoxY%(BoxNum2%)
  513.           BoxDeltaY=BoxY%(BoxNum2%)-BoxY%(BoxNum1%)
  514.           BoxDeltaX=BoxX%(BoxNum2%)-BoxX%(BoxNum1%)
  515.           BoxYOffset=BoxY1%-BoxY%(BoxNum1%)
  516.           BoxXIntercept=BoxX%(BoxNum1%)
  517.           BoxX1%=INT((BoxDeltaX*BoxYOffset)/BoxDeltaY+BoxXIntercept)
  518.           IF InterceptCountMod2% = 0
  519.             BoxX2%=BoxX1%
  520.           ELSE
  521.             GAT BoxX1%,BoxY1%
  522.             GLINETO BoxX2%,BoxY1%
  523.             GLINEBY 0,0
  524.           ENDIF
  525.           InterceptCountMod2%=1-InterceptCountMod2%
  526.         ENDIF
  527.       ELSE
  528.         IF BoxY1% <= BoxY%(BoxNum2%)
  529.           BoxDeltaY=BoxY%(BoxNum2%)-BoxY%(BoxNum1%)
  530.           BoxDeltaX=BoxX%(BoxNum2%)-BoxX%(BoxNum1%)
  531.           BoxYOffset=BoxY1%-BoxY%(BoxNum1%)
  532.           BoxXIntercept=BoxX%(BoxNum1%)
  533.           BoxX1%=INT((BoxDeltaX*BoxYOffset)/BoxDeltaY+BoxXIntercept)
  534.           IF InterceptCountMod2% = 0
  535.             BoxX2%=BoxX1%
  536.           ELSE
  537.             GAT BoxX1%,BoxY1%
  538.             GLINETO BoxX2%,BoxY1%
  539.             GLINEBY 0,0
  540.           ENDIF
  541.           InterceptCountMod2%=1-InterceptCountMod2%
  542.         ENDIF
  543.       ENDIF
  544.       BoxNum2%=BoxNum2%+1
  545.       IF BoxNum2% > 4
  546.         BoxNum2%=1
  547.       ENDIF
  548.       BoxNum1%=BoxNum1%+1
  549.     ENDWH
  550.     BoxY1%=BoxY1%+1
  551.   ENDWH
  552. ENDP
  553.  
  554. PROC GetCorner:(X,Y,Z,PixelsPerX,PixelsPerZ,CosTilt,SinTilt,RelDistOfUserFromScreen,XMax,XOffset,YMax)
  555.   EXTERNAL CornerX%
  556.   EXTERNAL CornerY%
  557.   LOCAL XAdjusted
  558.   LOCAL YPrime
  559.   LOCAL ZAdjusted
  560.   LOCAL ZPrime
  561.  
  562.   YPrime=(YMax-Y)*CosTilt-Z*SinTilt
  563.   ZPrime=(YMax-Y)*SinTilt+Z*CosTilt
  564.   ZAdjusted=(YMax/2.0)+RelDistOfUserFromScreen*(ZPrime-(YMax/2.0))/(YPrime+RelDistOfUserFromScreen)
  565.   XAdjusted=(XMax/2.0)+RelDistOfUserFromScreen*(X-(XMax/2.0))/(YPrime+RelDistOfUserFromScreen)
  566.   XAdjusted=XAdjusted+XOffset
  567.   CornerX%=INT(PixelsPerX*XAdjusted)
  568.   CornerY%=(HeightOfGraphicsInPixels%-1)-INT(PixelsPerZ*ZAdjusted)
  569. ENDP
  570.  
  571. PROC DisplayQuadrilateral:(XMax,XOffset,YMax,X0,Y0,Z0,X1,Y1,Z1,X2,Y2,Z2,X3,Y3,Z3,PixelsPerX,PixelsPerZ,CosTilt,SinTilt,RelDistOfUserFromScreen,Shade%)
  572.   GLOBAL BoxX%(4)
  573.   GLOBAL BoxY%(4)
  574.   GLOBAL CornerX%
  575.   GLOBAL CornerY%
  576.   GetCorner:(X0,Y0,Z0,PixelsPerX,PixelsPerZ,CosTilt,SinTilt,RelDistOfUserFromScreen,XMax,XOffset,YMax)
  577.   BoxX%(1)=CornerX%
  578.   BoxY%(1)=CornerY%
  579.   GetCorner:(X1,Y1,Z1,PixelsPerX,PixelsPerZ,CosTilt,SinTilt,RelDistOfUserFromScreen,XMax,XOffset,YMax)
  580.   BoxX%(2)=CornerX%
  581.   BoxY%(2)=CornerY%
  582.   GetCorner:(X2,Y2,Z2,PixelsPerX,PixelsPerZ,CosTilt,SinTilt,RelDistOfUserFromScreen,XMax,XOffset,YMax)
  583.   BoxX%(3)=CornerX%
  584.   BoxY%(3)=CornerY%
  585.   GetCorner:(X3,Y3,Z3,PixelsPerX,PixelsPerZ,CosTilt,SinTilt,RelDistOfUserFromScreen,XMax,XOffset,YMax)
  586.   BoxX%(4)=CornerX%
  587.   BoxY%(4)=CornerY%
  588.   DrawQuadrilateral:(Shade%)
  589. ENDP
  590.  
  591. PROC OutputFrontTop:(XMax,XOffset,YMax,PixelsPerX,PixelsPerZ,CosTilt,SinTilt,RelDistOfUserFromScreen)
  592.   EXTERNAL SingleRectangleX()
  593.   EXTERNAL SingleRectangleY()
  594.   LOCAL X0
  595.   LOCAL X1
  596.   LOCAL X2
  597.   LOCAL X3
  598.   LOCAL Y0
  599.   LOCAL Y1
  600.   LOCAL Y2
  601.   LOCAL Y3
  602.   X0=SingleRectangleX(4)
  603.   Y0=SingleRectangleY(4)
  604.   X1=SingleRectangleX(3)
  605.   Y1=SingleRectangleY(3)
  606.   X2=SingleRectangleX(3)
  607.   Y2=SingleRectangleY(3)
  608.   X3=SingleRectangleX(4)
  609.   Y3=SingleRectangleY(4)
  610.   DisplayQuadrilateral:(XMax,XOffset,YMax,X0,Y0,RelativeHeightOfWall,X1,Y1,RelativeHeightOfWall,X2,Y2,0.0,X3,Y3,0.0,PixelsPerX,PixelsPerZ,CosTilt,SinTilt,RelDistOfUserFromScreen,FrontWallShade%)
  611.   X0=SingleRectangleX(1)
  612.   Y0=SingleRectangleY(1)
  613.   X1=SingleRectangleX(2)
  614.   Y1=SingleRectangleY(2)
  615.   X2=SingleRectangleX(3)
  616.   Y2=SingleRectangleY(3)
  617.   X3=SingleRectangleX(4)
  618.   Y3=SingleRectangleY(4)
  619.   DisplayQuadrilateral:(XMax,XOffset,YMax,X0,Y0,RelativeHeightOfWall,X1,Y1,RelativeHeightOfWall,X2,Y2,RelativeHeightOfWall,X3,Y3,RelativeHeightOfWall,PixelsPerX,PixelsPerZ,CosTilt,SinTilt,RelDistOfUserFromScreen,TopColor%)
  620. ENDP
  621.  
  622. PROC OutputLeftRight:(XMax,XOffset,YMax,PixelsPerX,PixelsPerZ,CosTilt,SinTilt,RelDistOfUserFromScreen)
  623.   EXTERNAL SingleRectangleX()
  624.   EXTERNAL SingleRectangleY()
  625.   LOCAL X0
  626.   LOCAL X1
  627.   LOCAL X2
  628.   LOCAL X3
  629.   LOCAL Y0
  630.   LOCAL Y1
  631.   LOCAL Y2
  632.   LOCAL Y3
  633.   IF 2.0*SingleRectangleX(1) > XMax
  634.     X0=SingleRectangleX(1)
  635.     Y0=SingleRectangleY(1)
  636.     X1=SingleRectangleX(4)
  637.     Y1=SingleRectangleY(4)
  638.     X2=SingleRectangleX(4)
  639.     Y2=SingleRectangleY(4)
  640.     X3=SingleRectangleX(1)
  641.     Y3=SingleRectangleY(1)
  642.     DisplayQuadrilateral:(XMax,XOffset,YMax,X0,Y0,RelativeHeightOfWall,X1,Y1,RelativeHeightOfWall,X2,Y2,0.0,X3,Y3,0.0,PixelsPerX,PixelsPerZ,CosTilt,SinTilt,RelDistOfUserFromScreen,RightWallShade%)
  643.   ENDIF
  644.   IF 2.0*SingleRectangleX(2) < XMax
  645.     X0=SingleRectangleX(3)
  646.     Y0=SingleRectangleY(3)
  647.     X1=SingleRectangleX(2)
  648.     Y1=SingleRectangleY(2)
  649.     X2=SingleRectangleX(2)
  650.     Y2=SingleRectangleY(2)
  651.     X3=SingleRectangleX(3)
  652.     Y3=SingleRectangleY(3)
  653.     DisplayQuadrilateral:(XMax,XOffset,YMax,X0,Y0,RelativeHeightOfWall,X1,Y1,RelativeHeightOfWall,X2,Y2,0.0,X3,Y3,0.0,PixelsPerX,PixelsPerZ,CosTilt,SinTilt,RelDistOfUserFromScreen,LeftWallShade%)
  654.   ENDIF
  655. ENDP
  656.  
  657. PROC OutputMaze:(MaxX%,MaxY%,XMax,XOffset,YMax,CosTilt,SinTilt,PixelsPerX,PixelsPerZ,RelDistOfUserFromScreen)
  658.   EXTERNAL ComputerPage%()
  659.   GLOBAL SingleRectangleX(4)
  660.   GLOBAL SingleRectangleY(4)
  661.   LOCAL BaseRectangleX(16)
  662.   LOCAL BaseRectangleY(16)
  663.   LOCAL RectangleX(16)
  664.   LOCAL RectangleY(16)
  665.   LOCAL VertexIndex%
  666.   LOCAL VertexNum%
  667.   LOCAL X%
  668.   LOCAL X0
  669.   LOCAL X1
  670.   LOCAL X2
  671.   LOCAL X3
  672.   LOCAL Y%
  673.   LOCAL Y0
  674.   LOCAL Y1
  675.   LOCAL Y2
  676.   LOCAL Y3
  677.   LOCAL YOffset
  678.   BaseRectangleX(1)=0.0
  679.   BaseRectangleY(1)=0.0
  680.   BaseRectangleX(2)=RelativeWidthOfWall
  681.   BaseRectangleY(2)=0.0
  682.   BaseRectangleX(3)=RelativeWidthOfWall
  683.   BaseRectangleY(3)=RelativeWidthOfWall
  684.   BaseRectangleX(4)=0.0
  685.   BaseRectangleY(4)=RelativeWidthOfWall
  686.   BaseRectangleX(5)=RelativeWidthOfWall
  687.   BaseRectangleY(5)=0.0
  688.   BaseRectangleX(6)=1.0
  689.   BaseRectangleY(6)=0.0
  690.   BaseRectangleX(7)=1.0
  691.   BaseRectangleY(7)=RelativeWidthOfWall
  692.   BaseRectangleX(8)=RelativeWidthOfWall
  693.   BaseRectangleY(8)=RelativeWidthOfWall
  694.   BaseRectangleX(9)=RelativeWidthOfWall
  695.   BaseRectangleY(9)=RelativeWidthOfWall
  696.   BaseRectangleX(10)=1.0
  697.   BaseRectangleY(10)=RelativeWidthOfWall
  698.   BaseRectangleX(11)=1.0
  699.   BaseRectangleY(11)=1.0
  700.   BaseRectangleX(12)=RelativeWidthOfWall
  701.   BaseRectangleY(12)=1.0
  702.   BaseRectangleX(13)=0.0
  703.   BaseRectangleY(13)=RelativeWidthOfWall
  704.   BaseRectangleX(14)=RelativeWidthOfWall
  705.   BaseRectangleY(14)=RelativeWidthOfWall
  706.   BaseRectangleX(15)=RelativeWidthOfWall
  707.   BaseRectangleY(15)=1.0
  708.   BaseRectangleX(16)=0.0
  709.   BaseRectangleY(16)=1.0
  710.   RectangleX(1)=0.0
  711.   RectangleY(1)=0.0
  712.   RectangleX(2)=XMax
  713.   RectangleY(2)=0.0
  714.   RectangleX(3)=XMax
  715.   RectangleY(3)=YMax
  716.   RectangleX(4)=0.0
  717.   RectangleY(4)=YMax
  718.   X0=RectangleX(1)
  719.   Y0=RectangleY(1)
  720.   X1=RectangleX(2)
  721.   Y1=RectangleY(2)
  722.   X2=RectangleX(3)
  723.   Y2=RectangleY(3)
  724.   X3=RectangleX(4)
  725.   Y3=RectangleY(4)
  726.   DisplayQuadrilateral:(XMax,XOffset,YMax,X0,Y0,0.0,X1,Y1,0.0,X2,Y2,0.0,X3,Y3,0.0,PixelsPerX,PixelsPerZ,CosTilt,SinTilt,RelDistOfUserFromScreen,FloorShade%)
  727.   YOffset=0.0
  728.   Y%=0
  729.   WHILE Y% <= MaxY%
  730.     VertexIndex%=1
  731.     WHILE VertexIndex% <= 4
  732.       RectangleX(VertexIndex%)=BaseRectangleX(VertexIndex%)
  733.       RectangleY(VertexIndex%)=BaseRectangleY(VertexIndex%)+YOffset
  734.       VertexIndex%=VertexIndex%+1
  735.     ENDWH
  736.     X%=0
  737.     WHILE X% <= MaxX%
  738.       IF ComputerPage%((MaxX%+1)*Y%+X%+1) = 0
  739.         VertexIndex%=1
  740.         WHILE VertexIndex% <= 4
  741.           SingleRectangleX(VertexIndex%)=RectangleX(VertexIndex%)
  742.           SingleRectangleY(VertexIndex%)=RectangleY(VertexIndex%)
  743.           VertexIndex%=VertexIndex%+1
  744.         ENDWH
  745.         OutputLeftRight:(XMax,XOffset,YMax,PixelsPerX,PixelsPerZ,CosTilt,SinTilt,RelDistOfUserFromScreen)
  746.       ENDIF
  747.       VertexIndex%=1
  748.       WHILE VertexIndex% <= 4
  749.         RectangleX(VertexIndex%)=RectangleX(VertexIndex%)+1
  750.         VertexIndex%=VertexIndex%+1
  751.       ENDWH
  752.       X%=X%+2
  753.     ENDWH
  754.     VertexIndex%=1
  755.     WHILE VertexIndex% <= 4
  756.       RectangleX(VertexIndex%)=BaseRectangleX(VertexIndex%)
  757.       RectangleY(VertexIndex%)=BaseRectangleY(VertexIndex%)+YOffset
  758.       VertexIndex%=VertexIndex%+1
  759.     ENDWH
  760.     VertexIndex%=5
  761.     WHILE VertexIndex% <= 9
  762.       RectangleX(VertexIndex%)=BaseRectangleX(VertexIndex%)
  763.       RectangleY(VertexIndex%)=BaseRectangleY(VertexIndex%)+YOffset
  764.       VertexIndex%=VertexIndex%+1
  765.     ENDWH
  766.     X%=0
  767.     WHILE X% <= MaxX%
  768.       IF ComputerPage%((MaxX%+1)*Y%+X%+1) = 0
  769.         VertexIndex%=1
  770.         WHILE VertexIndex% <= 4
  771.           SingleRectangleX(VertexIndex%)=RectangleX(VertexIndex%)
  772.           SingleRectangleY(VertexIndex%)=RectangleY(VertexIndex%)
  773.           VertexIndex%=VertexIndex%+1
  774.         ENDWH
  775.         OutputFrontTop:(XMax,XOffset,YMax,PixelsPerX,PixelsPerZ,CosTilt,SinTilt,RelDistOfUserFromScreen)
  776.       ENDIF
  777.       VertexIndex%=1
  778.       WHILE VertexIndex% <= 4
  779.         RectangleX(VertexIndex%)=RectangleX(VertexIndex%)+1
  780.         VertexIndex%=VertexIndex%+1
  781.       ENDWH
  782.       X%=X%+1
  783.       IF X% <= MaxX%
  784.         IF ComputerPage%((MaxX%+1)*Y%+X%+1) = 0
  785.           VertexIndex%=4
  786.           VertexNum%=1
  787.           WHILE VertexNum% <= 4
  788.             VertexIndex%=VertexIndex%+1
  789.             SingleRectangleX(VertexNum%)=RectangleX(VertexIndex%)
  790.             SingleRectangleY(VertexNum%)=RectangleY(VertexIndex%)
  791.             VertexNum%=VertexNum%+1
  792.           ENDWH
  793.           OutputFrontTop:(XMax,XOffset,YMax,PixelsPerX,PixelsPerZ,CosTilt,SinTilt,RelDistOfUserFromScreen)
  794.         ENDIF
  795.         VertexIndex%=5
  796.         WHILE VertexIndex% <= 9
  797.           RectangleX(VertexIndex%)=RectangleX(VertexIndex%)+1
  798.           VertexIndex%=VertexIndex%+1
  799.         ENDWH
  800.         X%=X%+1
  801.       ENDIF
  802.     ENDWH
  803.     Y%=Y%+1
  804.     IF Y% <= MaxY%
  805.       VertexIndex%=13
  806.       WHILE VertexIndex% <= 16
  807.         RectangleX(VertexIndex%)=BaseRectangleX(VertexIndex%)
  808.         RectangleY(VertexIndex%)=BaseRectangleY(VertexIndex%)+YOffset
  809.         VertexIndex%=VertexIndex%+1
  810.       ENDWH
  811.       X%=0
  812.       WHILE X% <= MaxX%
  813.         IF ComputerPage%((MaxX%+1)*Y%+X%+1) = 0
  814.           VertexIndex%=12
  815.           VertexNum%=1
  816.           WHILE VertexNum% <= 4
  817.             VertexIndex%=VertexIndex%+1
  818.             SingleRectangleX(VertexNum%)=RectangleX(VertexIndex%)
  819.             SingleRectangleY(VertexNum%)=RectangleY(VertexIndex%)
  820.             VertexNum%=VertexNum%+1
  821.           ENDWH
  822.           OutputLeftRight:(XMax,XOffset,YMax,PixelsPerX,PixelsPerZ,CosTilt,SinTilt,RelDistOfUserFromScreen)
  823.         ENDIF
  824.         VertexIndex%=13
  825.         WHILE VertexIndex% <= 16
  826.           RectangleX(VertexIndex%)=RectangleX(VertexIndex%)+1
  827.           VertexIndex%=VertexIndex%+1
  828.         ENDWH
  829.         X%=X%+2
  830.       ENDWH
  831.       VertexIndex%=13
  832.       WHILE VertexIndex% <= 16
  833.         RectangleX(VertexIndex%)=BaseRectangleX(VertexIndex%)
  834.         RectangleY(VertexIndex%)=BaseRectangleY(VertexIndex%)+YOffset
  835.         VertexIndex%=VertexIndex%+1
  836.       ENDWH
  837.       X%=0
  838.       WHILE X% <= MaxX%
  839.         IF ComputerPage%((MaxX%+1)*Y%+X%+1) = 0
  840.           VertexIndex%=12
  841.           VertexNum%=1
  842.           WHILE VertexNum% <= 4
  843.             VertexIndex%=VertexIndex%+1
  844.             SingleRectangleX(VertexNum%)=RectangleX(VertexIndex%)
  845.             SingleRectangleY(VertexNum%)=RectangleY(VertexIndex%)
  846.             VertexNum%=VertexNum%+1
  847.           ENDWH
  848.           OutputFrontTop:(XMax,XOffset,YMax,PixelsPerX,PixelsPerZ,CosTilt,SinTilt,RelDistOfUserFromScreen)
  849.         ENDIF
  850.         VertexIndex%=13
  851.         WHILE VertexIndex% <= 16
  852.           RectangleX(VertexIndex%)=RectangleX(VertexIndex%)+1
  853.           VertexIndex%=VertexIndex%+1
  854.         ENDWH
  855.         X%=X%+2
  856.       ENDWH
  857.       Y%=Y%+1
  858.     ENDIF
  859.     YOffset=YOffset+1
  860.   ENDWH
  861. ENDP
  862.  
  863. PROC Titillate:
  864.   EXTERNAL Titillator$()
  865.   EXTERNAL TitillatorIndex%
  866.   GCOLOR 255,255,255
  867.   GAT 320,120
  868.   GPRINT Titillator$(TitillatorIndex%)
  869.   TitillatorIndex%=TitillatorIndex%+1
  870.   IF TitillatorIndex% > 4
  871.     TitillatorIndex%=1
  872.   ENDIF
  873.   GCOLOR 0,0,0
  874.   GAT 320,120
  875.   GPRINT Titillator$(TitillatorIndex%)
  876. ENDP
  877.  
  878. PROC ConditionallyIncrementAdjacency:
  879.   EXTERNAL Adjacency%
  880.   EXTERNAL ComputerPage%()
  881.   EXTERNAL PageOffset%
  882.   IF ComputerPage%(PageOffset%) = 1
  883.     Adjacency%=Adjacency%+1
  884.   ENDIF
  885. ENDP
  886.  
  887. PROC SolveMaze:(MaxX%,MaxY%)
  888.   EXTERNAL Adjacency%
  889.   EXTERNAL ComputerPage%()
  890.   EXTERNAL DeltaX%()
  891.   EXTERNAL DeltaY%()
  892.   EXTERNAL NumRoomsInSolution%
  893.   EXTERNAL StackIndex1%()
  894.   GLOBAL PageOffset%
  895.   LOCAL DeltaIndex%
  896.   LOCAL DeltaOffset%
  897.   LOCAL PassageFound%
  898.   LOCAL StackHead%
  899.   LOCAL X%
  900.   LOCAL XNext%
  901.   LOCAL Y%
  902.   LOCAL YNext%
  903.  
  904.   NumRoomsInSolution%=1
  905.   Adjacency%=0
  906.   X%=1
  907.   Y%=1
  908.   StackHead%=0
  909.   ComputerPage%(MaxX%+3)=1
  910.   DO
  911.     DeltaIndex%=0
  912.     PassageFound%=False%
  913.     DO
  914.       WHILE (DeltaIndex% < 4) AND (NOT PassageFound%)
  915.         DeltaOffset%=24*DeltaIndex%+1
  916.         XNext%=X%+DeltaX%(DeltaOffset%)
  917.         YNext%=Y%+DeltaY%(DeltaOffset%)
  918.         IF ComputerPage%((MaxX%+1)*YNext%+XNext%+1) = 2
  919.           PassageFound%=True%
  920.         ELSE
  921.           DeltaIndex%=DeltaIndex%+1
  922.         ENDIF
  923.       ENDWH
  924.       IF NOT PassageFound%
  925.         DeltaIndex%=StackIndex1%(StackHead%)
  926.         ComputerPage%((MaxX%+1)*Y%+X%+1)=2
  927.         DeltaOffset%=24*DeltaIndex%+1
  928.         X%=X%-DeltaX%(DeltaOffset%)
  929.         Y%=Y%-DeltaY%(DeltaOffset%)
  930.         ComputerPage%((MaxX%+1)*Y%+X%+1)=2
  931.         X%=X%-DeltaX%(DeltaOffset%)
  932.         Y%=Y%-DeltaY%(DeltaOffset%)
  933.         StackHead%=StackHead%-1
  934.         DeltaIndex%=DeltaIndex%+1
  935.       ENDIF
  936.     UNTIL PassageFound%
  937.     ComputerPage%((MaxX%+1)*YNext%+XNext%+1)=1
  938.     DeltaOffset%=24*DeltaIndex%+1
  939.     XNext%=XNext%+DeltaX%(DeltaOffset%)
  940.     YNext%=YNext%+DeltaY%(DeltaOffset%)
  941.     IF YNext% <= MaxY%
  942.       StackHead%=StackHead%+1
  943.       StackIndex1%(StackHead%)=DeltaIndex%
  944.       ComputerPage%((MaxX%+1)*YNext%+XNext%+1)=1
  945.       X%=XNext%
  946.       Y%=YNext%
  947.     ENDIF
  948.   UNTIL YNext% >= MaxY%
  949.   X%=MaxX%-1
  950.   Y%=MaxY%-1
  951.   Adjacency%=0
  952.   WHILE (StackHead% > 0)
  953.     DeltaOffset%=1
  954.     DeltaIndex%=0
  955.     WHILE DeltaIndex% <= 3
  956.       XNext%=X%+DeltaX%(DeltaOffset%)
  957.       YNext%=Y%+DeltaY%(DeltaOffset%)
  958.       PageOffset%=(MaxX%+1)*YNext%+XNext%+1
  959.       IF ComputerPage%(PageOffset%) <> 1
  960.         IF ComputerPage%(PageOffset%) = 0
  961.           XNext%=XNext%+DeltaX%(DeltaOffset%)
  962.           YNext%=YNext%+DeltaY%(DeltaOffset%)
  963.           IF XNext% < 0
  964.             Adjacency%=Adjacency%+1
  965.           ELSE
  966.             IF XNext% > MaxX%
  967.               Adjacency%=Adjacency%+1
  968.             ELSE
  969.               IF YNext% < 0
  970.                 Adjacency%=Adjacency%+1
  971.               ELSE
  972.                 IF YNext% > MaxY%
  973.                   Adjacency%=Adjacency%+1
  974.                 ELSE
  975.                   PageOffset%=(MaxX%+1)*YNext%+XNext%+1
  976.                   ConditionallyIncrementAdjacency:
  977.                 ENDIF
  978.               ENDIF
  979.             ENDIF
  980.           ENDIF
  981.         ENDIF
  982.       ENDIF
  983.       DeltaOffset%=DeltaOffset%+24
  984.       DeltaIndex%=DeltaIndex%+1
  985.     ENDWH
  986.     DeltaOffset%=24*StackIndex1%(StackHead%)+1
  987.     X%=X%-2*DeltaX%(DeltaOffset%)
  988.     Y%=Y%-2*DeltaY%(DeltaOffset%)
  989.     StackHead%=StackHead%-1
  990.     NumRoomsInSolution%=NumRoomsInSolution%+1
  991.   ENDWH
  992.   DeltaOffset%=1
  993.   DeltaIndex%=0
  994.   WHILE DeltaIndex% <= 3
  995.     XNext%=X%+DeltaX%(DeltaOffset%)
  996.     YNext%=X%+DeltaY%(DeltaOffset%)
  997.     PageOffset%=(MaxX%+1)*YNext%+XNext%+1
  998.     IF ComputerPage%(PageOffset%) <> 2
  999.       IF ComputerPage%(PageOffset%) = 0
  1000.         XNext%=XNext%+DeltaX%(DeltaOffset%)
  1001.         YNext%=YNext%+DeltaY%(DeltaOffset%)
  1002.         IF XNext% < 0
  1003.           Adjacency%=Adjacency%+1
  1004.         ELSE
  1005.           IF XNext% > MaxX%
  1006.             Adjacency%=Adjacency%+1
  1007.           ELSE
  1008.             IF YNext% < 0
  1009.               Adjacency%=Adjacency%+1
  1010.             ELSE
  1011.               IF YNext% > MaxY%
  1012.                 Adjacency%=Adjacency%+1
  1013.               ELSE
  1014.                 PageOffset%=(MaxX%+1)*YNext%+XNext%+1
  1015.                 ConditionallyIncrementAdjacency:
  1016.               ENDIF
  1017.             ENDIF
  1018.           ENDIF
  1019.         ENDIF
  1020.       ENDIF
  1021.     ENDIF
  1022.     DeltaOffset%=DeltaOffset%+24
  1023.     DeltaIndex%=DeltaIndex%+1
  1024.   ENDWH
  1025. ENDP
  1026.  
  1027. PROC GenerateMaze:(MaxX%,MaxY%,NumColumns%,NumRows%)
  1028.   EXTERNAL ComputerPage%()
  1029.   EXTERNAL DeltaX%()
  1030.   EXTERNAL DeltaY%()
  1031.   EXTERNAL SeedByte%()
  1032.   EXTERNAL StackIndex1%()
  1033.   EXTERNAL StackIndex2%()
  1034.   EXTERNAL Titillator$()
  1035.   EXTERNAL TitillatorIndex%
  1036.   LOCAL DeltaIndex1%
  1037.   LOCAL DeltaIndex2%
  1038.   LOCAL DeltaOffset%
  1039.   LOCAL Digit%
  1040.   LOCAL DigitNum%
  1041.   LOCAL PageOffset%
  1042.   LOCAL PassageFound%
  1043.   LOCAL RN%(8)
  1044.   LOCAL RNIndex1%
  1045.   LOCAL RNIndex2%
  1046.   LOCAL SearchComplete%
  1047.   LOCAL StackHead%
  1048.   LOCAL Sum%
  1049.   LOCAL TemInt%
  1050.   LOCAL X%
  1051.   LOCAL XNext%
  1052.   LOCAL Y%
  1053.   LOCAL YNext%
  1054.  
  1055.   Titillate:
  1056.   RN%(1)=SeedByte%(1)+1
  1057.   RN%(2)=SeedByte%(2)+1
  1058.   RN%(3)=SeedByte%(3)+1
  1059.   RN%(4)=SeedByte%(4)+1
  1060.   RN%(5)=SeedByte%(5)+1
  1061.   RN%(6)=SeedByte%(6)+1
  1062.   RN%(7)=SeedByte%(7)+1
  1063.   RN%(8)=SeedByte%(8)+1
  1064.   PageOffset%=0
  1065.   Y%=0
  1066.   WHILE Y% <= MaxY%
  1067.     X%=0
  1068.     WHILE X% <= MaxX%
  1069.       PageOffset%=PageOffset%+1
  1070.        ComputerPage%(PageOffset%)=0
  1071.       X%=X%+1
  1072.     ENDWH
  1073.     Y%=Y%+1
  1074.   ENDWH
  1075.   Sum%=0
  1076.   DigitNum%=1
  1077.   WHILE DigitNum% <= 3
  1078.     Digit%=RN%(1)
  1079.     RNIndex1%=1
  1080.     RNIndex2%=2
  1081.     WHILE (RNIndex2% <= 8)
  1082.       TemInt%=RN%(RNIndex2%)
  1083.       RN%(RNIndex1%)=TemInt%
  1084.       Digit%=Digit%+TemInt%
  1085.       IF Digit% >= 29
  1086.         Digit%=Digit%-29
  1087.       ENDIF
  1088.       RNIndex1%=RNIndex2%
  1089.       RNIndex2%=RNIndex2%+1
  1090.     ENDWH
  1091.     RN%(8)=Digit%
  1092.     Sum%=29*Sum%+Digit%
  1093.     DigitNum%=DigitNum%+1
  1094.   ENDWH
  1095.   X%=2*MOD&:(Sum%,NumColumns%)+1
  1096.   Sum%=0
  1097.   DigitNum%=1
  1098.   WHILE DigitNum% <= 3
  1099.     Digit%=RN%(1)
  1100.     RNIndex1%=1
  1101.     RNIndex2%=2
  1102.     WHILE (RNIndex2% <= 8)
  1103.       TemInt%=RN%(RNIndex2%)
  1104.       RN%(RNIndex1%)=TemInt%
  1105.       Digit%=Digit%+TemInt%
  1106.       IF Digit% >= 29
  1107.         Digit%=Digit%-29
  1108.       ENDIF
  1109.       RNIndex1%=RNIndex2%
  1110.       RNIndex2%=RNIndex2%+1
  1111.     ENDWH
  1112.     RN%(8)=Digit%
  1113.     Sum%=29*Sum%+Digit%
  1114.     DigitNum%=DigitNum%+1
  1115.   ENDWH
  1116.   Y%=2*MOD&:(Sum%,NumRows%)+1
  1117.   ComputerPage%((MaxX%+1)*Y%+X%+1)=2
  1118.   StackHead%=0
  1119.   DO
  1120.     DeltaIndex1%=0
  1121.     DO
  1122.       DeltaIndex2%=RN%(1)
  1123.       RNIndex1%=1
  1124.       RNIndex2%=2
  1125.       WHILE (RNIndex2% <= 8)
  1126.         TemInt%=RN%(RNIndex2%)
  1127.         RN%(RNIndex1%)=TemInt%
  1128.         DeltaIndex2%=DeltaIndex2%+TemInt%
  1129.         IF DeltaIndex2% >= 29
  1130.           DeltaIndex2%=DeltaIndex2%-29
  1131.         ENDIF
  1132.         RNIndex1%=RNIndex2%
  1133.         RNIndex2%=RNIndex2%+1
  1134.       ENDWH
  1135.       RN%(8)=DeltaIndex2%
  1136.     UNTIL DeltaIndex2% < 24
  1137.     PassageFound%=False%
  1138.     SearchComplete%=False%
  1139.     WHILE (NOT SearchComplete%)
  1140.       WHILE ((DeltaIndex1% < 4) AND (NOT PassageFound%))
  1141.         DeltaOffset%=24*DeltaIndex1%+DeltaIndex2%+1
  1142.         XNext%=X%+2*DeltaX%(DeltaOffset%)
  1143.         IF XNext% <= 0
  1144.           DeltaIndex1%=DeltaIndex1%+1
  1145.         ELSE
  1146.           IF XNext% > MaxX%
  1147.             DeltaIndex1%=DeltaIndex1%+1
  1148.           ELSE
  1149.             YNext%=Y%+2*DeltaY%(DeltaOffset%)
  1150.             IF YNext% <= 0
  1151.               DeltaIndex1%=DeltaIndex1%+1
  1152.             ELSE
  1153.               IF YNext% > MaxY%
  1154.                 DeltaIndex1%=DeltaIndex1%+1
  1155.               ELSE
  1156.                 IF ComputerPage%((MaxX%+1)*YNext%+XNext%+1) = 0
  1157.                   PassageFound%=True%
  1158.                 ELSE
  1159.                   DeltaIndex1%=DeltaIndex1%+1
  1160.                 ENDIF
  1161.               ENDIF
  1162.             ENDIF
  1163.           ENDIF
  1164.         ENDIF
  1165.       ENDWH
  1166.       IF NOT PassageFound%
  1167.         IF StackHead% > 0
  1168.           DeltaIndex1%=StackIndex1%(StackHead%)
  1169.           DeltaIndex2%=StackIndex2%(StackHead%)
  1170.           DeltaOffset%=24*DeltaIndex1%+DeltaIndex2%+1
  1171.           X%=X%-2*DeltaX%(DeltaOffset%)
  1172.           Y%=Y%-2*DeltaY%(DeltaOffset%)
  1173.           StackHead%=StackHead%-1
  1174.           DeltaIndex1%=DeltaIndex1%+1
  1175.         ENDIF
  1176.       ENDIF
  1177.       IF ((PassageFound%) OR ((StackHead% = 0) AND (DeltaIndex1% >= 4)))
  1178.         SearchComplete%=True%
  1179.       ELSE
  1180.         SearchComplete%=False%
  1181.       ENDIF
  1182.     ENDWH
  1183.     IF PassageFound%
  1184.       StackHead%=StackHead%+1
  1185.       StackIndex1%(StackHead%)=DeltaIndex1%
  1186.       StackIndex2%(StackHead%)=DeltaIndex2%
  1187.       ComputerPage%((MaxX%+1)*YNext%+XNext%+1)=2
  1188.       ComputerPage%((MaxX%+1)*((Y%+YNext%)/2)+(X%+XNext%)/2+1)=2
  1189.       X%=XNext%
  1190.       Y%=YNext%
  1191.     ENDIF
  1192.   UNTIL StackHead% = 0
  1193.   ComputerPage%(2)=1
  1194.   ComputerPage%((MaxX%+1)*MaxY%+MaxX%)=2
  1195. ENDP
  1196.  
  1197. PROC SelectMaze:(Seed&,MaxX%,MaxY%,NumRoomsInMaze%,NumColumns%,NumRows%,NumTrials%)
  1198.   EXTERNAL ComputerPage%()
  1199.   EXTERNAL StackIndex1%()
  1200.   EXTERNAL StackIndex2%()
  1201.   EXTERNAL Titillator$()
  1202.   EXTERNAL TitillatorIndex%
  1203.   GLOBAL Adjacency%
  1204.   GLOBAL NumRoomsInSolution%
  1205.   GLOBAL SeedByte%(8)
  1206.   GLOBAL Counter0%
  1207.   GLOBAL Counter1%
  1208.   GLOBAL Counter2%
  1209.   GLOBAL Counter3%
  1210.   GLOBAL Counter4%
  1211.   GLOBAL Counter5%
  1212.   GLOBAL Counter6%
  1213.   GLOBAL Counter7%
  1214.   LOCAL DigitNum%
  1215.   LOCAL Dividend&
  1216.   LOCAL MinAdjacency%
  1217.   LOCAL NumRoomsInSolutionAtMin%
  1218.   LOCAL Quotient&
  1219.   LOCAL RN%(8)
  1220.   LOCAL SeedByteAtMin%(8)
  1221.   LOCAL TrialNum%
  1222.  
  1223.   Dividend&=Seed&
  1224.   DigitNum%=1
  1225.   WHILE DigitNum% <= 8
  1226.     Quotient&=Dividend&/10
  1227.     RN%(DigitNum%)=Dividend&-10*Quotient&
  1228.     Dividend&=Quotient&
  1229.     DigitNum%=DigitNum%+1
  1230.   ENDWH
  1231.   Counter0%=RN%(1)
  1232.   Counter1%=RN%(2)
  1233.   Counter2%=RN%(3)
  1234.   Counter3%=RN%(4)
  1235.   Counter4%=RN%(5)
  1236.   Counter5%=RN%(6)
  1237.   Counter6%=RN%(7)
  1238.   Counter7%=RN%(8)
  1239.   Hash:
  1240.   MinAdjacency%=2*NumRoomsInMaze%+1
  1241.   NumRoomsInSolutionAtMin%=0
  1242.   SeedByteAtMin%(1)=Counter0%
  1243.   SeedByteAtMin%(2)=Counter1%
  1244.   SeedByteAtMin%(3)=Counter2%
  1245.   SeedByteAtMin%(4)=Counter3%
  1246.   SeedByteAtMin%(5)=Counter4%
  1247.   SeedByteAtMin%(6)=Counter5%
  1248.   SeedByteAtMin%(7)=Counter6%
  1249.   SeedByteAtMin%(8)=Counter7%
  1250.   TrialNum%=NumTrials%
  1251.   WHILE TrialNum% >= 1
  1252.     Titillate:
  1253.     SeedByte%(1)=Counter0%
  1254.     SeedByte%(2)=Counter1%
  1255.     SeedByte%(3)=Counter2%
  1256.     SeedByte%(4)=Counter3%
  1257.     SeedByte%(5)=Counter4%
  1258.     SeedByte%(6)=Counter5%
  1259.     SeedByte%(7)=Counter6%
  1260.     SeedByte%(8)=Counter7%
  1261.     GenerateMaze:(MaxX%,MaxY%,NumColumns%,NumRows%)
  1262.     SolveMaze:(MaxX%,MaxY%)
  1263.     IF 3*NumRoomsInSolution% >= NumRoomsInMaze%
  1264.       IF Adjacency% < MinAdjacency%
  1265.         MinAdjacency%=Adjacency%
  1266.         NumRoomsInSolutionAtMin%=NumRoomsInSolution%
  1267.         SeedByteAtMin%(1)=SeedByte%(1)
  1268.         SeedByteAtMin%(2)=SeedByte%(2)
  1269.         SeedByteAtMin%(3)=SeedByte%(3)
  1270.         SeedByteAtMin%(4)=SeedByte%(4)
  1271.         SeedByteAtMin%(5)=SeedByte%(5)
  1272.         SeedByteAtMin%(6)=SeedByte%(6)
  1273.         SeedByteAtMin%(7)=SeedByte%(7)
  1274.         SeedByteAtMin%(8)=SeedByte%(8)
  1275.       ELSE
  1276.         IF Adjacency% = MinAdjacency%
  1277.           IF NumRoomsInSolution% > NumRoomsInSolutionAtMin%
  1278.             NumRoomsInSolutionAtMin%=NumRoomsInSolution%
  1279.             SeedByteAtMin%(1)=SeedByte%(1)
  1280.             SeedByteAtMin%(2)=SeedByte%(2)
  1281.             SeedByteAtMin%(3)=SeedByte%(3)
  1282.             SeedByteAtMin%(4)=SeedByte%(4)
  1283.             SeedByteAtMin%(5)=SeedByte%(5)
  1284.             SeedByteAtMin%(6)=SeedByte%(6)
  1285.             SeedByteAtMin%(7)=SeedByte%(7)
  1286.             SeedByteAtMin%(8)=SeedByte%(8)
  1287.           ENDIF
  1288.         ENDIF
  1289.       ENDIF
  1290.     ENDIF
  1291.     Increment:
  1292.     TrialNum%=TrialNum%-1
  1293.   ENDWH
  1294.   SeedByte%(1)=SeedByteAtMin%(1)
  1295.   SeedByte%(2)=SeedByteAtMin%(2)
  1296.   SeedByte%(3)=SeedByteAtMin%(3)
  1297.   SeedByte%(4)=SeedByteAtMin%(4)
  1298.   SeedByte%(5)=SeedByteAtMin%(5)
  1299.   SeedByte%(6)=SeedByteAtMin%(6)
  1300.   SeedByte%(7)=SeedByteAtMin%(7)
  1301.   SeedByte%(8)=SeedByteAtMin%(8)
  1302.   GenerateMaze:(MaxX%,MaxY%,NumColumns%,NumRows%)
  1303.   SolveMaze:(MaxX%,MaxY%)
  1304. ENDP
  1305.  
  1306. PROC Hash:
  1307.   EXTERNAL Counter0%
  1308.   EXTERNAL Counter1%
  1309.   EXTERNAL Counter2%
  1310.   EXTERNAL Counter3%
  1311.   EXTERNAL Counter4%
  1312.   EXTERNAL Counter5%
  1313.   EXTERNAL Counter6%
  1314.   EXTERNAL Counter7%
  1315.   EXTERNAL SubstitutionHigh%()
  1316.   EXTERNAL SubstitutionLow%()
  1317.   LOCAL Iteration%
  1318.   LOCAL Seed0%
  1319.   LOCAL Seed1%
  1320.   LOCAL Seed2%
  1321.   LOCAL Seed3%
  1322.   LOCAL Seed4%
  1323.   LOCAL Seed5%
  1324.   LOCAL Seed6%
  1325.   LOCAL Seed7%
  1326.   LOCAL SubstitutionIndex%
  1327.   LOCAL Tem0%
  1328.   LOCAL Tem1%
  1329.   LOCAL Tem2%
  1330.   Seed0%=Counter0%
  1331.   Seed1%=Counter1%
  1332.   Seed2%=Counter2%
  1333.   Seed3%=Counter3%
  1334.   Seed4%=Counter4%
  1335.   Seed5%=Counter5%
  1336.   Seed6%=Counter6%
  1337.   Seed7%=Counter7%
  1338.   Iteration%=1
  1339.   WHILE Iteration% <= 8
  1340.     SubstitutionIndex%=10*Seed1%+Seed0%+1
  1341.     Tem0%=SubstitutionLow%(SubstitutionIndex%)
  1342.     Tem1%=SubstitutionHigh%(SubstitutionIndex%)
  1343.     SubstitutionIndex%=10*Seed3%+Seed2%+1
  1344.     Seed0%=SubstitutionLow%(SubstitutionIndex%)
  1345.     Tem2%=SubstitutionHigh%(SubstitutionIndex%)
  1346.     SubstitutionIndex%=10*Seed5%+Seed4%+1
  1347.     Seed2%=SubstitutionLow%(SubstitutionIndex%)
  1348.     Seed1%=SubstitutionHigh%(SubstitutionIndex%)
  1349.     SubstitutionIndex%=10*Seed7%+Seed6%+1
  1350.     Seed5%=SubstitutionLow%(SubstitutionIndex%)
  1351.     Seed7%=SubstitutionHigh%(SubstitutionIndex%)
  1352.     Seed3%=Tem0%
  1353.     Seed6%=Tem1%
  1354.     Seed4%=Tem2%
  1355.     Iteration%=Iteration%+1
  1356.   ENDWH
  1357.   Counter0%=Seed0%
  1358.   Counter1%=Seed1%
  1359.   Counter2%=Seed2%
  1360.   Counter3%=Seed3%
  1361.   Counter4%=Seed4%
  1362.   Counter5%=Seed5%
  1363.   Counter6%=Seed6%
  1364.   Counter7%=Seed7%
  1365. ENDP
  1366.  
  1367. PROC Increment:
  1368.   EXTERNAL Counter0%
  1369.   EXTERNAL Counter1%
  1370.   EXTERNAL Counter2%
  1371.   EXTERNAL Counter3%
  1372.   EXTERNAL Counter4%
  1373.   EXTERNAL Counter5%
  1374.   EXTERNAL Counter6%
  1375.   EXTERNAL Counter7%
  1376.   LOCAL Tem%
  1377.   Tem%=Counter0%+1
  1378.   IF Tem% <= 9
  1379.     Counter0%=Tem%
  1380.   ELSE
  1381.     Counter0%=0
  1382.     Tem%=Counter1%+1
  1383.     IF Tem% <= 9
  1384.       Counter1%=Tem%
  1385.     ELSE
  1386.       Counter1%=0
  1387.       Tem%=Counter2%+1
  1388.       IF Tem% <= 9
  1389.         Counter2%=Tem%
  1390.       ELSE
  1391.         Counter2%=0
  1392.         Tem%=Counter3%+1
  1393.         IF Tem% <= 9
  1394.           Counter3%=Tem%
  1395.         ELSE
  1396.           Counter3%=0
  1397.           Tem%=Counter4%+1
  1398.           IF Tem% <= 9
  1399.             Counter4%=Tem%
  1400.           ELSE
  1401.             Counter4%=0
  1402.             Tem%=Counter5%+1
  1403.             IF Tem% <= 9
  1404.               Counter5%=Tem%
  1405.             ELSE
  1406.               Counter5%=0
  1407.               Tem%=Counter6%+1
  1408.               IF Tem% <= 9
  1409.                 Counter6%=Tem%
  1410.               ELSE
  1411.                 Counter6%=0
  1412.                 Tem%=Counter7%+1
  1413.                 IF Tem% <= 9
  1414.                   Counter7%=Tem%
  1415.                 ELSE
  1416.                   Counter7%=0
  1417.                 ENDIF
  1418.               ENDIF
  1419.             ENDIF
  1420.           ENDIF
  1421.         ENDIF
  1422.       ENDIF
  1423.     ENDIF
  1424.   ENDIF
  1425. ENDP
  1426.  
  1427. PROC DrawLine:(X1,Y1,X2,Y2,XMax,XOffset,YMax,CosTilt,SinTilt,PixelsPerX,PixelsPerZ,RelDistOfUserFromScreen)
  1428.   GLOBAL CornerX%
  1429.   GLOBAL CornerY%
  1430.   LOCAL LineX1%
  1431.   LOCAL LineX2%
  1432.   LOCAL LineY1%
  1433.   LOCAL LineY2%
  1434.   GetCorner:(X1,Y1,RelativeHeightOfWall,PixelsPerX,PixelsPerZ,CosTilt,SinTilt,RelDistOfUserFromScreen,XMax,XOffset,YMax)
  1435.   LineX1%=CornerX%
  1436.   LineY1%=CornerY%
  1437.   GetCorner:(X2,Y2,RelativeHeightOfWall,PixelsPerX,PixelsPerZ,CosTilt,SinTilt,RelDistOfUserFromScreen,XMax,XOffset,YMax)
  1438.   LineX2%=CornerX%
  1439.   LineY2%=CornerY%
  1440.   GAT LineX1%,LineY1%
  1441.   GLINETO LineX2%,LineY2%
  1442.   GLINEBY 0,0
  1443. ENDP
  1444.  
  1445. PROC DisplaySolution:(MaxX%,MaxY%,XMax,XOffset,YMax,CosTilt,SinTilt,PixelsPerX,PixelsPerZ,RelDistOfUserFromScreen)
  1446.   EXTERNAL ComputerPage%()
  1447.   EXTERNAL DeltaX%()
  1448.   EXTERNAL DeltaY%()
  1449.   LOCAL DeltaIndex%
  1450.   LOCAL DeltaOffset%
  1451.   LOCAL PathFound%
  1452.   LOCAL Tem
  1453.   LOCAL X%
  1454.   LOCAL XNext%
  1455.   LOCAL XPrevious%
  1456.   LOCAL XRelative
  1457.   LOCAL XRelativeNext
  1458.   LOCAL Y%
  1459.   LOCAL YNext%
  1460.   LOCAL YPrevious%
  1461.   LOCAL YRelative
  1462.   LOCAL YRelativeNext
  1463.   GSETPENWIDTH 3
  1464.   XPrevious%=1
  1465.   YPrevious%=-1
  1466.   X%=1
  1467.   XRelative=(RelativeWidthOfWall+1.0)/2.0
  1468.   Y%=0
  1469.   YRelative=RelativeWidthOfWall/2.0
  1470.   DO
  1471.     PathFound%=False%
  1472.     DeltaIndex%=0
  1473.     WHILE NOT PathFound%
  1474.       DeltaOffset%=24*DeltaIndex%+1
  1475.       XNext%=X%+DeltaX%(DeltaOffset%)
  1476.       YNext%=Y%+DeltaY%(DeltaOffset%)
  1477.       IF (XNext% <> XPrevious%) OR (YNext% <> YPrevious%)
  1478.         IF ComputerPage%((MaxX%+1)*YNext%+XNext%+1) = 1
  1479.           PathFound%=True%
  1480.           Tem=DeltaX%(DeltaOffset%)
  1481.           XRelativeNext=XRelative+Tem/2.0
  1482.           Tem=DeltaY%(DeltaOffset%)
  1483.           YRelativeNext=YRelative+Tem/2.0
  1484.         ENDIF
  1485.       ENDIF
  1486.       DeltaIndex%=DeltaIndex%+1
  1487.     ENDWH
  1488.     DrawLine:(XRelative,YRelative,XRelativeNext,YRelativeNext,XMax,XOffset,YMax,CosTilt,SinTilt,PixelsPerX,PixelsPerZ, RelDistOfUserFromScreen)
  1489.     XRelative=XRelativeNext
  1490.     YRelative=YRelativeNext
  1491.     XPrevious%=X%
  1492.     YPrevious%=Y%
  1493.     X%=XNext%
  1494.     Y%=YNext%
  1495.   UNTIL (X% = MaxX%-1) AND (Y% = MaxY%)
  1496.   GSETPENWIDTH 1
  1497. ENDP
  1498.  
  1499. PROC NoPassageIfWall:(X%,Y%,MaxX%)
  1500.   EXTERNAL PassageFound%
  1501.   EXTERNAL UserPage%()
  1502.   IF UserPage%((MaxX%+1)*Y%+X%+1) = 0
  1503.     PassageFound%=False%
  1504.   ENDIF
  1505. ENDP
  1506.  
  1507. PROC LetUserTryToSolve:(MaxX%,MaxY%,XMax,XOffset,YMax,CosTilt,SinTilt,PixelsPerX,PixelsPerZ,RelDistOfUserFromScreen)
  1508.   EXTERNAL ComputerPage%()
  1509.   EXTERNAL DeltaX%()
  1510.   EXTERNAL DeltaY%()
  1511.   EXTERNAL UserInput$
  1512.   EXTERNAL UserPage%()
  1513.   GLOBAL PassageFound%
  1514.   LOCAL DeltaIndex1%
  1515.   LOCAL DeltaOffset%
  1516.   LOCAL PageOffset%
  1517.   LOCAL Pitch%
  1518.   LOCAL Response%
  1519.   LOCAL Tem
  1520.   LOCAL X%
  1521.   LOCAL XNext%
  1522.   LOCAL XRelative
  1523.   LOCAL XRelativeNext
  1524.   LOCAL Y%
  1525.   LOCAL YNext%
  1526.   LOCAL YRelative
  1527.   LOCAL YRelativeNext
  1528.  
  1529.   PageOffset%=0
  1530.   Y%=0
  1531.   WHILE Y% <= MaxY%
  1532.     X%=0
  1533.     WHILE X% <= MaxX%
  1534.       PageOffset%=PageOffset%+1
  1535.       IF ComputerPage%(PageOffset%) = 0
  1536.         UserPage%(PageOffset%)=0
  1537.       ELSE
  1538.         UserPage%(PageOffset%)=2
  1539.       ENDIF
  1540.       X%=X%+1
  1541.     ENDWH
  1542.     Y%=Y%+1
  1543.   ENDWH
  1544.   X%=1
  1545.   XRelative=(RelativeWidthOfWall+1.0)/2.0
  1546.   Y%=1
  1547.   YRelative=(RelativeWidthOfWall+1.0)/2.0
  1548.   UserPage%((MaxX%+1)*Y%+X%+1)=1
  1549.   GSETPENWIDTH 3
  1550.   GCOLOR AdvanceShade%,AdvanceShade%,AdvanceShade%
  1551.   DrawLine:(XRelative,RelativeWidthOfWall/2.0,XRelative,YRelative,XMax,XOffset,YMax,CosTilt,SinTilt,PixelsPerX,PixelsPerZ,RelDistOfUserFromScreen)
  1552.   DO
  1553.     DO
  1554.       PassageFound%=True%
  1555.       UserInput$=GET$
  1556.       IF ((UserInput$ <> "D") AND (UserInput$ <> "d") AND (UserInput$ <> "S") AND (UserInput$ <> "s"))
  1557.         Response%=ASC(UserInput$)
  1558.         IF Response% = 8
  1559.           DeltaIndex1%=0
  1560.         ELSE
  1561.           IF Response% = 3
  1562.             DeltaIndex1%=0
  1563.           ELSE
  1564.             IF Response% = 0
  1565.               DeltaIndex1%=3
  1566.             ELSE
  1567.               IF Response% = 2
  1568.                 DeltaIndex1%=2
  1569.               ELSE
  1570.                 IF Response% = 1
  1571.                   DeltaIndex1%=1
  1572.                 ELSE
  1573.                   PassageFound%=False%
  1574.                 ENDIF
  1575.               ENDIF
  1576.             ENDIF
  1577.           ENDIF
  1578.         ENDIF
  1579.         UserInput$=" "
  1580.         IF PassageFound%
  1581.           DeltaOffset%=24*DeltaIndex1%+1
  1582.           XNext%=X%+DeltaX%(DeltaOffset%)
  1583.           IF XNext% <= 0
  1584.             PassageFound%=False%
  1585.           ELSE
  1586.             IF XNext% >= MaxX%
  1587.               PassageFound%=False%
  1588.             ELSE
  1589.               YNext%=Y%+DeltaY%(DeltaOffset%)
  1590.               IF YNext% <= 0
  1591.                 PassageFound%=False%
  1592.               ELSE
  1593.                 IF YNext% > MaxY%
  1594.                   PassageFound%=False%
  1595.                 ELSE
  1596.                   NoPassageIfWall:(XNext%,YNext%,MaxX%)
  1597.                 ENDIF
  1598.               ENDIF
  1599.             ENDIF
  1600.           ENDIF
  1601.         ENDIF
  1602.         IF NOT PassageFound%
  1603.           BEEP 4,300
  1604.         ENDIF
  1605.       ENDIF
  1606.     UNTIL (PassageFound%) OR (UserInput$ = "D") OR (UserInput$ = "d") OR (UserInput$ = "S") OR (UserInput$ = "s")
  1607.     IF ((UserInput$ <> "D") AND (UserInput$ <> "d") AND (UserInput$ <> "S") AND (UserInput$ <> "s"))
  1608.       DeltaOffset%=24*DeltaIndex1%+1
  1609.       XNext%=XNext%+DeltaX%(DeltaOffset%)
  1610.       YNext%=YNext%+DeltaY%(DeltaOffset%)
  1611.       IF YNext% < MaxY%
  1612.         IF UserPage%((MaxX%+1)*YNext%+XNext%+1) = 1
  1613.           GCOLOR BackoutShade%,BackoutShade%,BackoutShade%
  1614.           UserPage%((MaxX%+1)*Y%+X%+1)=2
  1615.         ELSE
  1616.           GCOLOR AdvanceShade%,AdvanceShade%,AdvanceShade%
  1617.           UserPage%((MaxX%+1)*YNext%+XNext%+1)=1
  1618.         ENDIF
  1619.         Tem=XNext%-X%
  1620.         XRelativeNext=XRelative+Tem/2.0
  1621.         Tem=YNext%-Y%
  1622.         YRelativeNext=YRelative+Tem/2.0
  1623.         DrawLine:(XRelative,YRelative,XRelativeNext,YRelativeNext,XMax,XOffset,YMax,CosTilt,SinTilt,PixelsPerX,PixelsPerZ,RelDistOfUserFromScreen)
  1624.       ELSE
  1625.         GCOLOR AdvanceShade%,AdvanceShade%,AdvanceShade%
  1626.         DrawLine:(XRelative,YRelative,XRelative,YRelative+0.5,XMax,XOffset,YMax,CosTilt,SinTilt,PixelsPerX,PixelsPerZ,RelDistOfUserFromScreen)
  1627.       ENDIF
  1628.       X%=XNext%
  1629.       Y%=YNext%
  1630.       XRelative=XRelativeNext
  1631.       YRelative=YRelativeNext
  1632.     ENDIF
  1633.   UNTIL (YNext% >= MaxY%) OR (UserInput$ = "D") OR (UserInput$ = "d") OR (UserInput$ = "S") OR (UserInput$ = "s")
  1634.   GSETPENWIDTH 1
  1635.   GCOLOR 255,255,255
  1636.   GAT 320-GTWIDTH("Arrows - Move    S - Solve    D - Dialog")/2,234
  1637.   GPRINT "Arrows - Move    S - Solve    D - Dialog"
  1638.   IF ((UserInput$ <> "D") AND (UserInput$ <> "d") AND (UserInput$ <> "S") AND (UserInput$ <> "s"))
  1639.     GCOLOR 0,0,0
  1640.     GAT 320-GTWIDTH("Congratulations!")/2,234
  1641.     GPRINT "Congratulations!"
  1642.     Pitch%=1000
  1643.     WHILE Pitch% > 169
  1644.       BEEP 1,Pitch%
  1645.       Pitch%=Pitch%-33
  1646.     ENDWH
  1647.     GCOLOR 255,255,255
  1648.     GAT 320-GTWIDTH("Congratulations!")/2,234
  1649.     GPRINT "Congratulations!"
  1650.     GCOLOR 0,0,0
  1651.     GAT 320-GTWIDTH("S - Solve    Other - Dialog")/2,234
  1652.     GPRINT "S - Solve    Other - Dialog"
  1653.     UserInput$=GET$
  1654.     GCOLOR 255,255,255
  1655.     GAT 320-GTWIDTH("S - Solve    Other - Dialog")/2,234
  1656.     GPRINT "S - Solve    Other - Dialog"
  1657.   ENDIF
  1658. ENDP
  1659.  
  1660.  
  1661.  
  1662.