home *** CD-ROM | disk | FTP | other *** search
/ PSION CD 2 / PsionCDVol2.iso / Programs / 437 / Maze3d.sis (.txt) next >
EPOC Installation Package  |  2001-10-27  |  68KB  |  1,829 lines

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