home *** CD-ROM | disk | FTP | other *** search
/ PSION CD 2 / PsionCDVol2.iso / Programs / 437 / Maze3D.txt < prev    next >
Encoding:
Text File  |  1998-10-21  |  48.1 KB  |  1,657 lines

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