home *** CD-ROM | disk | FTP | other *** search
/ Planet Source Code Jumbo …e CD Visual Basic 1 to 7 / 6_2008-2009.ISO / data / zips / a_3d_maze_212595962008.psc / 3dmaze.frm
Text File  |  2008-09-06  |  106KB  |  2,800 lines

  1. VERSION 5.00
  2. Begin VB.Form frm3DMaze 
  3.    BackColor       =   &H00FFFFFF&
  4.    Caption         =   "Ultimate Maze"
  5.    ClientHeight    =   4560
  6.    ClientLeft      =   1560
  7.    ClientTop       =   1980
  8.    ClientWidth     =   6000
  9.    BeginProperty Font 
  10.       Name            =   "Arial"
  11.       Size            =   8.25
  12.       Charset         =   178
  13.       Weight          =   400
  14.       Underline       =   0   'False
  15.       Italic          =   0   'False
  16.       Strikethrough   =   0   'False
  17.    EndProperty
  18.    Icon            =   "3dmaze.frx":0000
  19.    KeyPreview      =   -1  'True
  20.    LinkTopic       =   "Form1"
  21.    PaletteMode     =   1  'UseZOrder
  22.    ScaleHeight     =   4560
  23.    ScaleWidth      =   6000
  24.    Begin VB.TextBox Text2 
  25.       Appearance      =   0  'Flat
  26.       BorderStyle     =   0  'None
  27.       BeginProperty Font 
  28.          Name            =   "Arial"
  29.          Size            =   8.25
  30.          Charset         =   178
  31.          Weight          =   700
  32.          Underline       =   0   'False
  33.          Italic          =   0   'False
  34.          Strikethrough   =   0   'False
  35.       EndProperty
  36.       Height          =   288
  37.       Left            =   4440
  38.       TabIndex        =   2
  39.       Top             =   4200
  40.       Width           =   1335
  41.    End
  42.    Begin VB.Timer Timer2 
  43.       Interval        =   1000
  44.       Left            =   960
  45.       Top             =   120
  46.    End
  47.    Begin VB.TextBox Text1 
  48.       BackColor       =   &H00FFFFFF&
  49.       BorderStyle     =   0  'None
  50.       BeginProperty Font 
  51.          Name            =   "Arial"
  52.          Size            =   8.25
  53.          Charset         =   178
  54.          Weight          =   700
  55.          Underline       =   0   'False
  56.          Italic          =   0   'False
  57.          Strikethrough   =   0   'False
  58.       EndProperty
  59.       Height          =   288
  60.       Left            =   0
  61.       Locked          =   -1  'True
  62.       TabIndex        =   1
  63.       Top             =   3720
  64.       Width           =   3360
  65.    End
  66.    Begin VB.VScrollBar VScroll1 
  67.       Height          =   4212
  68.       LargeChange     =   5
  69.       Left            =   5760
  70.       Max             =   60
  71.       Min             =   30
  72.       TabIndex        =   0
  73.       Top             =   0
  74.       Value           =   45
  75.       Width           =   252
  76.    End
  77.    Begin VB.Timer Timer1 
  78.       Enabled         =   0   'False
  79.       Interval        =   55
  80.       Left            =   0
  81.       Top             =   0
  82.    End
  83.    Begin VB.Menu mnuAction 
  84.       Caption         =   "&Action"
  85.       Begin VB.Menu mnuActionItem 
  86.          Caption         =   "&New"
  87.          Index           =   0
  88.       End
  89.       Begin VB.Menu mnuActionItem 
  90.          Caption         =   "&Solve"
  91.          Enabled         =   0   'False
  92.          Index           =   1
  93.       End
  94.       Begin VB.Menu mnuActionItem 
  95.          Caption         =   "&Clear"
  96.          Enabled         =   0   'False
  97.          Index           =   2
  98.       End
  99.       Begin VB.Menu mnuActionItem 
  100.          Caption         =   "-"
  101.          Index           =   3
  102.       End
  103.       Begin VB.Menu mnuActionItem 
  104.          Caption         =   "E&xit"
  105.          Index           =   4
  106.       End
  107.    End
  108.    Begin VB.Menu mnuStyle 
  109.       Caption         =   "&Style"
  110.       Begin VB.Menu mnuStyleItem 
  111.          Caption         =   "&Hexagonal rooms"
  112.          Index           =   0
  113.       End
  114.       Begin VB.Menu mnuStyleItem 
  115.          Caption         =   "&Square rooms"
  116.          Index           =   1
  117.       End
  118.    End
  119.    Begin VB.Menu mnuHelp 
  120.       Caption         =   "&Help"
  121.       Begin VB.Menu mnuHelpItem 
  122.          Caption         =   "&About..."
  123.          Index           =   0
  124.       End
  125.    End
  126. End
  127. Attribute VB_Name = "frm3DMaze"
  128. Attribute VB_GlobalNameSpace = False
  129. Attribute VB_Creatable = False
  130. Attribute VB_PredeclaredId = True
  131. Attribute VB_Exposed = False
  132.  
  133. Option Explicit
  134.  
  135. Private Type CornerRec
  136.   X As Long
  137.   Y As Long
  138. End Type
  139.  
  140. Private Type VertexRec
  141.   X As Double
  142.   Y As Double
  143. End Type
  144.  
  145. Private Type StackRec
  146.   Index1 As Byte
  147.   Index2 As Integer
  148. End Type
  149.  
  150. Private Type PALETTEENTRY
  151.   peRed As Byte
  152.   peGreen As Byte
  153.   peBlue As Byte
  154.   peFlags As Byte
  155. End Type
  156.  
  157. Private Type LOGPALETTE
  158.   palVersion As Integer
  159.   palNumEntries As Integer
  160.   palPalEntry(16) As PALETTEENTRY
  161. End Type
  162.  
  163. Private Declare Function CreatePalette Lib "GDI32" (LogicalPalette As LOGPALETTE) As Long
  164. Private Declare Function CreatePen Lib "GDI32" (ByVal PenStyle As Long, ByVal Width As Long, ByVal Color As Long) As Long
  165. Private Declare Function CreatePolygonRgn Lib "GDI32" (lpPoints As Any, ByVal nCount As Long, ByVal nPolyFillMode As Long) As Long
  166. Private Declare Function CreateSolidBrush Lib "GDI32" (ByVal rgbColor As Long) As Long
  167. Private Declare Function DeleteObject Lib "GDI32" (ByVal hndobj As Long) As Long
  168. Private Declare Function FillRgn Lib "GDI32" (ByVal hDC As Long, ByVal hRegion As Long, ByVal hBrush As Long) As Long
  169. Private Declare Function GetDeviceCaps Lib "GDI32" (ByVal hDC As Long, ByVal Index As Long) As Long
  170. Private Declare Function LineTo Lib "GDI32" (ByVal hDC As Long, ByVal X As Long, ByVal Y As Long) As Long
  171. Private Declare Function MoveToEx Lib "GDI32" (ByVal hDC As Long, ByVal X As Long, ByVal Y As Long, ByVal NullPtr As Long) As Long
  172. Private Declare Function RealizePalette Lib "GDI32" (ByVal hDC As Long) As Long
  173. Private Declare Function SelectPalette Lib "GDI32" (ByVal hDC As Long, ByVal PaletteHandle As Long, ByVal Background As Long) As Long
  174. Private Declare Function SelectObject Lib "GDI32" (ByVal hDC As Long, ByVal ObjectHandle As Long) As Long
  175.  
  176. Const PLANES = 14
  177. Const BITSPIXEL = 12
  178. Const PC_NOCOLLAPSE = 4
  179. Const COLORS = 24
  180. Const PS_SOLID = 0
  181.  
  182. Const NumColors = 16
  183. Const TopColor = 12: ' all but last 3 colors are gray
  184. Const RectangleSENWColor = 10
  185. Const TriangleSSENNWColor = 9
  186. Const TriangleSENWColor = 8
  187. Const RectangleWEColor = 7
  188. Const FloorColor = 6
  189. Const TriangleSWNEColor = 5
  190. Const RectangleSWNEColor = 4
  191. Const TriangleSSWNNEColor = 3
  192. Const BackoutColor = 13
  193. Const AdvanceColor = 14
  194. Const SolutionColor = 15
  195.  
  196. Const RelativeWidthOfWall = 0.25: ' relative to side of hexagon or square
  197. Const RelativeHeightOfWall = 2#: ' relative to side of hexagon or square
  198. Const MinWallLengthInInches = 0.25
  199.  
  200. Const SecondsForMazeSelection = 0.25
  201. Dim timetaken
  202. Dim AlreadyPainting As Boolean
  203. Dim BaseRectangle(5, 3) As VertexRec
  204. Dim BaseTriangle(3, 2) As VertexRec
  205. Dim ComputerPage() As Byte
  206. Dim CosTilt As Double
  207. Dim CurrentColor As Integer
  208. Dim HexDeltaX(5, 719) As Integer
  209. Dim HexDeltaY(5, 719) As Integer
  210. Dim MaxX As Integer
  211. Dim MaxY As Integer
  212. Dim Minimized As Boolean
  213. Dim NumColumns As Integer
  214. Dim NumRealized As Long
  215. Dim NumRoomsInMaze As Integer
  216. Dim NumRows As Integer
  217. Dim OldPaletteHandle As Long
  218. Dim Paint As Boolean
  219. Dim PaletteHandle As Long
  220. Dim PixelsPerX As Double
  221. Dim PixelsPerZ As Double
  222. Dim Rectangle(5, 3) As VertexRec
  223. Dim RedGreenBlue(16) As Long
  224. Dim RelDistOfUserFromScreen As Double
  225. Dim Resize As Boolean
  226. Dim Seed As String
  227. Dim SinTilt As Double
  228. Dim SolutionDisplayed As Boolean
  229. Dim SqrDeltaX(3, 23) As Integer
  230. Dim SqrDeltaY(3, 23) As Integer
  231. Dim Sqrt3 As Double
  232. Dim Stack() As StackRec
  233. Dim State As Byte
  234. Dim SubstitutionHigh(99) As Byte
  235. Dim SubstitutionLow(99) As Byte
  236. Dim Tilt As Double
  237. Dim UsePalette As Boolean
  238. Dim UserHasSolved As Boolean
  239. Dim UserPage() As Byte
  240. Dim UserX As Integer
  241. Dim UserXRelative As Double
  242. Dim UserY As Integer
  243. Dim UserYRelative As Double
  244. Dim X As Integer
  245. Dim XMax As Double
  246. Dim XOffset As Double
  247. Dim Y As Integer
  248. Dim YMax As Double
  249. Dim YMod4 As Byte
  250. Dim YOffset As Double
  251.  
  252. Private Sub DrawQuadrilateral(Box() As CornerRec, ColorNum As Integer)
  253.   Dim Brush As Long
  254.   Dim rc As Long
  255.   Dim Region As Long
  256.   If UsePalette Then
  257.     Brush = CreateSolidBrush(16777216 + ColorNum)
  258.     If Brush Then
  259.       Region = CreatePolygonRgn(Box(0), 4, 1)
  260.       If Region Then
  261.         rc = FillRgn(frm3DMaze.hDC, Region, Brush)
  262.         rc = DeleteObject(Region)
  263.       End If
  264.       rc = DeleteObject(Brush)
  265.     End If
  266.   Else
  267.     Brush = CreateSolidBrush(RedGreenBlue(ColorNum))
  268.     If Brush Then
  269.       Region = CreatePolygonRgn(Box(0), 4, 1)
  270.       If Region Then
  271.         rc = FillRgn(frm3DMaze.hDC, Region, Brush)
  272.         rc = DeleteObject(Region)
  273.       End If
  274.       rc = DeleteObject(Brush)
  275.     End If
  276.   End If
  277. End Sub
  278.  
  279. Private Sub GetCorner(X#, Y#, Z#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, XMax#, XOffset#, YMax#, Corner As CornerRec)
  280.   Dim XAdjusted As Double
  281.   Dim YPrime As Double
  282.   Dim ZAdjusted As Double
  283.   Dim ZPrime As Double
  284.  
  285.   YPrime = (YMax# - Y#) * CosTilt# - Z# * SinTilt#
  286.   ZPrime = (YMax# - Y#) * SinTilt# + Z# * CosTilt#
  287.   ZAdjusted = (YMax# / 2#) + RelDistOfUserFromScreen# * (ZPrime - (YMax# / 2#)) / (YPrime + RelDistOfUserFromScreen#)
  288.   XAdjusted = (XMax# / 2#) + RelDistOfUserFromScreen# * (X# - (XMax# / 2#)) / (YPrime + RelDistOfUserFromScreen#)
  289.   XAdjusted = XAdjusted + XOffset#
  290.   Corner.X = Int(PixelsPerX# * XAdjusted)
  291.   Corner.Y = (ScaleHeight - Text1.Height) - Int(PixelsPerZ# * ZAdjusted)
  292. End Sub
  293.  
  294. Private Sub DisplayQuadrilateral(XMax#, XOffset#, YMax#, X0#, Y0#, Z0#, X1#, Y1#, Z1#, X2#, Y2#, Z2#, X3#, Y3#, Z3#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, Shade%)
  295.   Dim Quadrilateral(3) As CornerRec
  296.   Dim TemQuad As CornerRec
  297.   Call GetCorner(X0#, Y0#, Z0#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, XMax#, XOffset#, YMax#, TemQuad)
  298.   Quadrilateral(0).X = TemQuad.X
  299.   Quadrilateral(0).Y = TemQuad.Y
  300.   Call GetCorner(X1#, Y1#, Z1#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, XMax#, XOffset#, YMax#, TemQuad)
  301.   Quadrilateral(1).X = TemQuad.X
  302.   Quadrilateral(1).Y = TemQuad.Y
  303.   Call GetCorner(X2#, Y2#, Z2#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, XMax#, XOffset#, YMax#, TemQuad)
  304.   Quadrilateral(2).X = TemQuad.X
  305.   Quadrilateral(2).Y = TemQuad.Y
  306.   Call GetCorner(X3#, Y3#, Z3#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, XMax#, XOffset#, YMax#, TemQuad)
  307.   Quadrilateral(3).X = TemQuad.X
  308.   Quadrilateral(3).Y = TemQuad.Y
  309.   Call DrawQuadrilateral(Quadrilateral(), Shade%)
  310. End Sub
  311.  
  312. Private Sub DrawTriangle(Box() As CornerRec, ColorNum As Integer)
  313.   Dim Brush As Long
  314.   Dim rc As Long
  315.   Dim Region As Long
  316.   If UsePalette Then
  317.     Brush = CreateSolidBrush(16777216 + ColorNum)
  318.     If Brush Then
  319.       Region = CreatePolygonRgn(Box(0), 3, 1)
  320.       If Region Then
  321.         rc = FillRgn(frm3DMaze.hDC, Region, Brush)
  322.         rc = DeleteObject(Region)
  323.       End If
  324.       rc = DeleteObject(Brush)
  325.     End If
  326.   Else
  327.     Brush = CreateSolidBrush(RedGreenBlue(ColorNum))
  328.     If Brush Then
  329.       Region = CreatePolygonRgn(Box(0), 3, 1)
  330.       If Region Then
  331.         rc = FillRgn(frm3DMaze.hDC, Region, Brush)
  332.         rc = DeleteObject(Region)
  333.       End If
  334.       rc = DeleteObject(Brush)
  335.     End If
  336.   End If
  337. End Sub
  338.  
  339. Private Sub DisplayTriangle(XMax#, XOffset#, YMax#, X0#, Y0#, Z0#, X1#, Y1#, Z1#, X2#, Y2#, Z2#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, Shade%)
  340.   Dim Triangle(2) As CornerRec
  341.   Dim TemTriangle As CornerRec
  342.   Call GetCorner(X0#, Y0#, Z0#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, XMax#, XOffset#, YMax#, TemTriangle)
  343.   Triangle(0).X = TemTriangle.X
  344.   Triangle(0).Y = TemTriangle.Y
  345.   Call GetCorner(X1#, Y1#, Z1#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, XMax#, XOffset#, YMax#, TemTriangle)
  346.   Triangle(1).X = TemTriangle.X
  347.   Triangle(1).Y = TemTriangle.Y
  348.   Call GetCorner(X2#, Y2#, Z2#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, XMax#, XOffset#, YMax#, TemTriangle)
  349.   Triangle(2).X = TemTriangle.X
  350.   Triangle(2).Y = TemTriangle.Y
  351.   Call DrawTriangle(Triangle(), Shade%)
  352. End Sub
  353.  
  354. Private Sub OutputTriangle(XMax#, XOffset#, YMax#, Triangle() As VertexRec, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, FirstPass%, FaceColor%)
  355.   Dim X0 As Double
  356.   Dim X1 As Double
  357.   Dim X2 As Double
  358.   Dim X3 As Double
  359.   Dim Y0 As Double
  360.   Dim Y1 As Double
  361.   Dim Y2 As Double
  362.   Dim Y3 As Double
  363.   If FirstPass% Then
  364.     If ((Triangle(1).X < XMax# / 2#) And (Triangle(1).X > Triangle(0).X)) Then
  365.       X0 = Triangle(2).X
  366.       Y0 = Triangle(2).Y
  367.       X1 = Triangle(1).X
  368.       Y1 = Triangle(1).Y
  369.       X2 = Triangle(1).X
  370.       Y2 = Triangle(1).Y
  371.       X3 = Triangle(2).X
  372.       Y3 = Triangle(2).Y
  373.       Call DisplayQuadrilateral(XMax#, XOffset#, YMax#, X0, Y0, RelativeHeightOfWall, X1, Y1, RelativeHeightOfWall, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, TriangleSSWNNEColor)
  374.     End If
  375.     If ((Triangle(1).X > XMax# / 2#) And (Triangle(1).X < Triangle(2).X)) Then
  376.       X0 = Triangle(1).X
  377.       Y0 = Triangle(1).Y
  378.       X1 = Triangle(0).X
  379.       Y1 = Triangle(0).Y
  380.       X2 = Triangle(0).X
  381.       Y2 = Triangle(0).Y
  382.       X3 = Triangle(1).X
  383.       Y3 = Triangle(1).Y
  384.       Call DisplayQuadrilateral(XMax#, XOffset#, YMax#, X0, Y0, RelativeHeightOfWall, X1, Y1, RelativeHeightOfWall, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, TriangleSSENNWColor)
  385.     End If
  386.   Else
  387.     X0 = Triangle(0).X
  388.     Y0 = Triangle(0).Y
  389.     X1 = Triangle(2).X
  390.     Y1 = Triangle(2).Y
  391.     X2 = Triangle(2).X
  392.     Y2 = Triangle(2).Y
  393.     X3 = Triangle(0).X
  394.     Y3 = Triangle(0).Y
  395.     Call DisplayQuadrilateral(XMax#, XOffset#, YMax#, X0, Y0, RelativeHeightOfWall, X1, Y1, RelativeHeightOfWall, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, FaceColor%)
  396.     X0 = Triangle(0).X
  397.     Y0 = Triangle(0).Y
  398.     X1 = Triangle(1).X
  399.     Y1 = Triangle(1).Y
  400.     X2 = Triangle(2).X
  401.     Y2 = Triangle(2).Y
  402.     Call DisplayTriangle(XMax#, XOffset#, YMax#, X0, Y0, RelativeHeightOfWall, X1, Y1, RelativeHeightOfWall, X2, Y2, RelativeHeightOfWall, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, TopColor)
  403.   End If
  404. End Sub
  405.  
  406. Private Sub OutputRectangle(XMax As Double, XOffset As Double, YMax As Double, Rectangle() As VertexRec, PixelsPerX As Double, PixelsPerZ As Double, CosTilt As Double, SinTilt As Double, RelDistOfUserFromScreen As Double, FaceColor As Integer)
  407.   Dim X0 As Double
  408.   Dim X1 As Double
  409.   Dim X2 As Double
  410.   Dim X3 As Double
  411.   Dim Y0 As Double
  412.   Dim Y1 As Double
  413.   Dim Y2 As Double
  414.   Dim Y3 As Double
  415.   X0 = Rectangle(3).X
  416.   Y0 = Rectangle(3).Y
  417.   X1 = Rectangle(2).X
  418.   Y1 = Rectangle(2).Y
  419.   X2 = Rectangle(2).X
  420.   Y2 = Rectangle(2).Y
  421.   X3 = Rectangle(3).X
  422.   Y3 = Rectangle(3).Y
  423.   Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, RelativeHeightOfWall, X1, Y1, RelativeHeightOfWall, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, FaceColor)
  424.   X0 = Rectangle(0).X
  425.   Y0 = Rectangle(0).Y
  426.   X1 = Rectangle(1).X
  427.   Y1 = Rectangle(1).Y
  428.   X2 = Rectangle(2).X
  429.   Y2 = Rectangle(2).Y
  430.   X3 = Rectangle(3).X
  431.   Y3 = Rectangle(3).Y
  432.   Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, RelativeHeightOfWall, X1, Y1, RelativeHeightOfWall, X2, Y2, RelativeHeightOfWall, X3, Y3, RelativeHeightOfWall, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, TopColor)
  433. End Sub
  434.  
  435. Private Sub OutputLeftRight(XMax As Double, XOffset As Double, YMax As Double, Rectangle() As VertexRec, PixelsPerX As Double, PixelsPerZ As Double, CosTilt As Double, SinTilt As Double, RelDistOfUserFromScreen As Double)
  436.   Dim X0 As Double
  437.   Dim X1 As Double
  438.   Dim X2 As Double
  439.   Dim X3 As Double
  440.   Dim Y0 As Double
  441.   Dim Y1 As Double
  442.   Dim Y2 As Double
  443.   Dim Y3 As Double
  444.   If 2# * Rectangle(0).X > XMax Then
  445.     X0 = Rectangle(0).X
  446.     Y0 = Rectangle(0).Y
  447.     X1 = Rectangle(3).X
  448.     Y1 = Rectangle(3).Y
  449.     X2 = Rectangle(3).X
  450.     Y2 = Rectangle(3).Y
  451.     X3 = Rectangle(0).X
  452.     Y3 = Rectangle(0).Y
  453.     Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, RelativeHeightOfWall, X1, Y1, RelativeHeightOfWall, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleSENWColor)
  454.   End If
  455.   If 2# * Rectangle(1).X < XMax Then
  456.     X0 = Rectangle(2).X
  457.     Y0 = Rectangle(2).Y
  458.     X1 = Rectangle(1).X
  459.     Y1 = Rectangle(1).Y
  460.     X2 = Rectangle(1).X
  461.     Y2 = Rectangle(1).Y
  462.     X3 = Rectangle(2).X
  463.     Y3 = Rectangle(2).Y
  464.     Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, RelativeHeightOfWall, X1, Y1, RelativeHeightOfWall, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleSWNEColor)
  465.   End If
  466. End Sub
  467.  
  468. Private Sub DrawLine(X1 As Double, Y1 As Double, X2 As Double, Y2 As Double, XMax As Double, XOffset As Double, YMax As Double, CosTilt As Double, SinTilt As Double, PixelsPerX As Double, PixelsPerZ As Double, RelDistOfUserFromScreen As Double)
  469.   Dim LineX1 As Long
  470.   Dim LineX2 As Long
  471.   Dim LineY1 As Long
  472.   Dim LineY2 As Long
  473.   Dim Pen As Long
  474.   Dim PreviousPen As Long
  475.   Dim rc As Long
  476.   Dim tem As CornerRec
  477.   Call GetCorner(X1, Y1, RelativeHeightOfWall, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, XMax, XOffset, YMax, tem)
  478.   LineX1 = tem.X
  479.   LineY1 = tem.Y
  480.   Call GetCorner(X2, Y2, RelativeHeightOfWall, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, XMax, XOffset, YMax, tem)
  481.   LineX2 = tem.X
  482.   LineY2 = tem.Y
  483.   If UsePalette Then
  484.     Pen = CreatePen(PS_SOLID, 2, 16777216 + CurrentColor)
  485.     If Pen Then
  486.       PreviousPen = SelectObject(frm3DMaze.hDC, Pen)
  487.       rc = MoveToEx(frm3DMaze.hDC, LineX1, LineY1, 0)
  488.       rc = LineTo(frm3DMaze.hDC, LineX2, LineY2)
  489.       rc = SelectObject(frm3DMaze.hDC, PreviousPen)
  490.       rc = DeleteObject(Pen)
  491.     End If
  492.   Else
  493.     Pen = CreatePen(PS_SOLID, 2, RedGreenBlue(CurrentColor))
  494.     If Pen Then
  495.       PreviousPen = SelectObject(frm3DMaze.hDC, Pen)
  496.       rc = MoveToEx(frm3DMaze.hDC, LineX1, LineY1, 0)
  497.       rc = LineTo(frm3DMaze.hDC, LineX2, LineY2)
  498.       rc = SelectObject(frm3DMaze.hDC, PreviousPen)
  499.       rc = DeleteObject(Pen)
  500.     End If
  501.   End If
  502. End Sub
  503.  
  504. Private Sub Hash(Counter0 As Byte, Counter1 As Byte, Counter2 As Byte, Counter3 As Byte, Counter4 As Byte, Counter5 As Byte, Counter6 As Byte, Counter7 As Byte)
  505.   Dim Iteration As Byte
  506.   Dim Seed0 As Byte
  507.   Dim Seed1 As Byte
  508.   Dim Seed2 As Byte
  509.   Dim Seed3 As Byte
  510.   Dim Seed4 As Byte
  511.   Dim Seed5 As Byte
  512.   Dim Seed6 As Byte
  513.   Dim Seed7 As Byte
  514.   Dim SubstitutionIndex As Byte
  515.   Dim Tem0 As Byte
  516.   Dim Tem1 As Byte
  517.   Dim Tem2 As Byte
  518.   Seed0 = Counter0
  519.   Seed1 = Counter1
  520.   Seed2 = Counter2
  521.   Seed3 = Counter3
  522.   Seed4 = Counter4
  523.   Seed5 = Counter5
  524.   Seed6 = Counter6
  525.   Seed7 = Counter7
  526.   For Iteration = 1 To 8
  527.     SubstitutionIndex = 10 * Seed1 + Seed0
  528.     Tem0 = SubstitutionLow(SubstitutionIndex)
  529.     Tem1 = SubstitutionHigh(SubstitutionIndex)
  530.     SubstitutionIndex = 10 * Seed3 + Seed2
  531.     Seed0 = SubstitutionLow(SubstitutionIndex)
  532.     Tem2 = SubstitutionHigh(SubstitutionIndex)
  533.     SubstitutionIndex = 10 * Seed5 + Seed4
  534.     Seed2 = SubstitutionLow(SubstitutionIndex)
  535.     Seed1 = SubstitutionHigh(SubstitutionIndex)
  536.     SubstitutionIndex = 10 * Seed7 + Seed6
  537.     Seed5 = SubstitutionLow(SubstitutionIndex)
  538.     Seed7 = SubstitutionHigh(SubstitutionIndex)
  539.     Seed3 = Tem0
  540.     Seed6 = Tem1
  541.     Seed4 = Tem2
  542.   Next Iteration
  543.   Counter0 = Seed0
  544.   Counter1 = Seed1
  545.   Counter2 = Seed2
  546.   Counter3 = Seed3
  547.   Counter4 = Seed4
  548.   Counter5 = Seed5
  549.   Counter6 = Seed6
  550.   Counter7 = Seed7
  551. End Sub
  552.  
  553. Private Sub Increment(Counter0 As Byte, Counter1 As Byte, Counter2 As Byte, Counter3 As Byte, Counter4 As Byte, Counter5 As Byte, Counter6 As Byte, Counter7 As Byte)
  554.   Dim tem As Byte
  555.   tem = Counter0 + 1
  556.   If tem <= 9 Then
  557.     Counter0 = tem
  558.   Else
  559.     Counter0 = 0
  560.     tem = Counter1 + 1
  561.     If tem <= 9 Then
  562.       Counter1 = tem
  563.     Else
  564.       Counter1 = 0
  565.       tem = Counter2 + 1
  566.       If tem <= 9 Then
  567.         Counter2 = tem
  568.       Else
  569.         Counter2 = 0
  570.         tem = Counter3 + 1
  571.         If tem <= 9 Then
  572.           Counter3 = tem
  573.         Else
  574.           Counter3 = 0
  575.           tem = Counter4 + 1
  576.           If tem <= 9 Then
  577.             Counter4 = tem
  578.           Else
  579.             Counter4 = 0
  580.             tem = Counter5 + 1
  581.             If tem <= 9 Then
  582.               Counter5 = tem
  583.             Else
  584.               Counter5 = 0
  585.               tem = Counter6 + 1
  586.               If tem <= 9 Then
  587.                 Counter6 = tem
  588.               Else
  589.                 Counter6 = 0
  590.                 tem = Counter7 + 1
  591.                 If tem <= 9 Then
  592.                   Counter7 = tem
  593.                 Else
  594.                   Counter7 = 0
  595.                 End If
  596.               End If
  597.             End If
  598.           End If
  599.         End If
  600.       End If
  601.     End If
  602.   End If
  603. End Sub
  604.  
  605. Private Sub HexDisplaySolution(MaxY As Integer, Page() As Byte, XMax As Double, XOffset As Double, YMax As Double, CosTilt As Double, SinTilt As Double, PixelsPerX As Double, PixelsPerZ As Double, RelDistOfUserFromScreen As Double)
  606.   Dim DeltaIndex As Byte
  607.   Dim OldPaletteHandle As Long
  608.   Dim PathFound As Integer
  609.   Dim X As Integer
  610.   Dim XNext As Integer
  611.   Dim XPrevious As Integer
  612.   Dim XRelative As Double
  613.   Dim XRelativeNext As Double
  614.   Dim Y As Integer
  615.   Dim YNext As Integer
  616.   Dim YPrevious As Integer
  617.   Dim YRelative As Double
  618.   Dim YRelativeNext As Double
  619.   If UsePalette Then
  620.     OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  621.     NumRealized = RealizePalette(frm3DMaze.hDC)
  622.   End If
  623.   XRelative = 1#
  624.   YRelative = Sqrt3 / 2#
  625.   CurrentColor = SolutionColor
  626.   Call DrawLine(1#, 0#, XRelative, YRelative, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  627.   XPrevious = 3
  628.   YPrevious = -2
  629.   X = 3
  630.   Y = 2
  631.   Do
  632.     PathFound = False
  633.     DeltaIndex = 0
  634.     Do While (Not PathFound)
  635.       XNext = X + HexDeltaX(DeltaIndex, 0)
  636.       YNext = Y + HexDeltaY(DeltaIndex, 0)
  637.       If Page(YNext, XNext) = 1 Then
  638.         XNext = XNext + HexDeltaX(DeltaIndex, 0)
  639.         YNext = YNext + HexDeltaY(DeltaIndex, 0)
  640.         If (XNext <> XPrevious) Or (YNext <> YPrevious) Then
  641.           PathFound = True
  642.         Else
  643.           DeltaIndex = DeltaIndex + 1
  644.         End If
  645.       Else
  646.         DeltaIndex = DeltaIndex + 1
  647.       End If
  648.     Loop
  649.     If YNext < MaxY Then
  650.       Select Case YNext - Y
  651.         Case -4
  652.           XRelativeNext = XRelative
  653.           YRelativeNext = YRelative - Sqrt3
  654.         Case -2
  655.           If XNext > X Then
  656.             XRelativeNext = XRelative + 3# / 2#
  657.             YRelativeNext = YRelative - Sqrt3 / 2#
  658.           Else
  659.             XRelativeNext = XRelative - 3# / 2#
  660.             YRelativeNext = YRelative - Sqrt3 / 2#
  661.           End If
  662.         Case 2
  663.           If XNext > X Then
  664.             XRelativeNext = XRelative + 3# / 2#
  665.             YRelativeNext = YRelative + Sqrt3 / 2#
  666.           Else
  667.             XRelativeNext = XRelative - 3# / 2#
  668.             YRelativeNext = YRelative + Sqrt3 / 2#
  669.           End If
  670.         Case Else
  671.           XRelativeNext = XRelative
  672.           YRelativeNext = YRelative + Sqrt3
  673.       End Select
  674.       Call DrawLine(XRelative, YRelative, XRelativeNext, YRelativeNext, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  675.     Else
  676.       Call DrawLine(XRelative, YRelative, XRelative, YMax, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  677.     End If
  678.     XPrevious = X
  679.     YPrevious = Y
  680.     X = XNext
  681.     Y = YNext
  682.     XRelative = XRelativeNext
  683.     YRelative = YRelativeNext
  684.   Loop While YNext < MaxY
  685.   If UsePalette Then
  686.     NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  687.   End If
  688. End Sub
  689.  
  690. Private Sub HexDisplayUserMoves(MaxX As Integer, MaxY As Integer, Page() As Byte, XMax As Double, XOffset As Double, YMax As Double, CosTilt As Double, SinTilt As Double, PixelsPerX As Double, PixelsPerZ As Double, RelDistOfUserFromScreen As Double)
  691.   Dim DeltaIndex As Byte
  692.   Dim EvenRow As Boolean
  693.   Dim OldPaletteHandle As Long
  694.   Dim X As Integer
  695.   Dim XNext As Integer
  696.   Dim XNextNext As Integer
  697.   Dim XRelative As Double
  698.   Dim XRelativeNext As Double
  699.   Dim Y As Integer
  700.   Dim YNext As Integer
  701.   Dim YNextNext As Integer
  702.   Dim YRelative As Double
  703.   Dim YRelativeNext As Double
  704.   If UsePalette Then
  705.     OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  706.     NumRealized = RealizePalette(frm3DMaze.hDC)
  707.   End If
  708.   Y = 2
  709.   YRelative = Sqrt3 / 2#
  710.   EvenRow = False
  711.   Do While (Y < MaxY)
  712.     If EvenRow Then
  713.       X = 7
  714.       XRelative = 2.5
  715.     Else
  716.       X = 3
  717.       XRelative = 1#
  718.     End If
  719.     Do While (X < MaxX)
  720.       If ((Page(Y, X) = 1) Or (Page(Y, X) = 3)) Then
  721.         For DeltaIndex = 0 To 5
  722.           XNext = X + HexDeltaX(DeltaIndex, 0)
  723.           YNext = Y + HexDeltaY(DeltaIndex, 0)
  724.           If Page(YNext, XNext) <> 0 Then
  725.             If YNext = 0 Then
  726.               CurrentColor = AdvanceColor
  727.               Call DrawLine(1#, 0#, XRelative, YRelative, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  728.             Else
  729.               If YNext = MaxY Then
  730.                 If UserHasSolved Then
  731.                   CurrentColor = AdvanceColor
  732.                   YRelativeNext = YRelative + Sqrt3 / 2#
  733.                   Call DrawLine(XRelative, YRelative, XRelative, YRelativeNext, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  734.                 End If
  735.               Else
  736.                 XNextNext = XNext + HexDeltaX(DeltaIndex, 0)
  737.                 If XNextNext > 0 Then
  738.                   If XNextNext < MaxX Then
  739.                     YNextNext = YNext + HexDeltaY(DeltaIndex, 0)
  740.                     If YNextNext > 0 Then
  741.                       If YNextNext < MaxY Then
  742.                         If ((Page(YNextNext, XNextNext) = 1) Or (Page(YNextNext, XNextNext) = 3)) Then
  743.                           If Page(Y, X) = Page(YNextNext, XNextNext) Then
  744.                             If Page(Y, X) = 1 Then
  745.                               CurrentColor = AdvanceColor
  746.                             Else
  747.                               CurrentColor = BackoutColor
  748.                             End If
  749.                           Else
  750.                             CurrentColor = BackoutColor
  751.                           End If
  752.                           Select Case (YNext - Y)
  753.                             Case -2
  754.                               XRelativeNext = XRelative
  755.                               YRelativeNext = YRelative - Sqrt3 / 2#
  756.                             Case -1
  757.                               If XNext > X Then
  758.                                 XRelativeNext = XRelative + 3# / 4#
  759.                                 YRelativeNext = YRelative - Sqrt3 / 4#
  760.                               Else
  761.                                 XRelativeNext = XRelative - 3# / 4#
  762.                                 YRelativeNext = YRelative - Sqrt3 / 4#
  763.                               End If
  764.                             Case 1
  765.                               If XNext > X Then
  766.                                 XRelativeNext = XRelative + 3# / 4#
  767.                                 YRelativeNext = YRelative + Sqrt3 / 4#
  768.                               Else
  769.                                 XRelativeNext = XRelative - 3# / 4#
  770.                                 YRelativeNext = YRelative + Sqrt3 / 4#
  771.                               End If
  772.                             Case Else
  773.                               XRelativeNext = XRelative
  774.                               YRelativeNext = YRelative + Sqrt3 / 2#
  775.                           End Select
  776.                           Call DrawLine(XRelative, YRelative, XRelativeNext, YRelativeNext, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  777.                         End If
  778.                        End If
  779.                     End If
  780.                   End If
  781.                 End If
  782.               End If
  783.             End If
  784.           End If
  785.         Next DeltaIndex
  786.       End If
  787.       XRelative = XRelative + 3#
  788.       X = X + 8
  789.     Loop
  790.     EvenRow = Not EvenRow
  791.     YRelative = YRelative + Sqrt3 / 2#
  792.     Y = Y + 2
  793.   Loop
  794.   If UsePalette Then
  795.     NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  796.   End If
  797. End Sub
  798.  
  799. Private Sub HexSolveMaze(Stack() As StackRec, Page() As Byte, NumRoomsInSolution As Integer, Adjacency As Integer, MaxX As Integer, MaxY As Integer)
  800.   Dim DeltaIndex As Byte
  801.   Dim PassageFound As Integer
  802.   Dim StackHead As Integer
  803.   Dim X As Integer
  804.   Dim XNext As Integer
  805.   Dim Y As Integer
  806.   Dim YNext As Integer
  807.  
  808.   NumRoomsInSolution = 1
  809.   Adjacency = 0
  810.   X = 3
  811.   Y = 2
  812.   StackHead = -1
  813.   Page(Y, X) = 1
  814.   Do
  815.     DeltaIndex = 0
  816.     PassageFound = False
  817.     Do
  818.       Do While ((DeltaIndex < 6) And (Not PassageFound))
  819.         XNext = X + HexDeltaX(DeltaIndex, 0)
  820.         YNext = Y + HexDeltaY(DeltaIndex, 0)
  821.         If Page(YNext, XNext) = 2 Then
  822.           PassageFound = True
  823.         Else
  824.           DeltaIndex = DeltaIndex + 1
  825.         End If
  826.       Loop
  827.       If Not PassageFound Then
  828.         DeltaIndex = Stack(StackHead).Index1
  829.         Page(Y, X) = 2
  830.         X = X - HexDeltaX(DeltaIndex, 0)
  831.         Y = Y - HexDeltaY(DeltaIndex, 0)
  832.         Page(Y, X) = 2
  833.         X = X - HexDeltaX(DeltaIndex, 0)
  834.         Y = Y - HexDeltaY(DeltaIndex, 0)
  835.         StackHead = StackHead - 1
  836.         DeltaIndex = DeltaIndex + 1
  837.       End If
  838.     Loop While Not PassageFound
  839.     Page(YNext, XNext) = 1
  840.     XNext = XNext + HexDeltaX(DeltaIndex, 0)
  841.     YNext = YNext + HexDeltaY(DeltaIndex, 0)
  842.     If YNext <= MaxY Then
  843.       StackHead = StackHead + 1
  844.       Stack(StackHead).Index1 = DeltaIndex
  845.       Page(YNext, XNext) = 1
  846.       X = XNext
  847.       Y = YNext
  848.     End If
  849.   Loop While YNext < MaxY
  850.   X = MaxX - 3
  851.   Y = MaxY - 2
  852.   Adjacency = 0
  853.   Do While (StackHead >= 0)
  854.     For DeltaIndex = 0 To 5
  855.       XNext = X + HexDeltaX(DeltaIndex, 0)
  856.       YNext = Y + HexDeltaY(DeltaIndex, 0)
  857.       If Page(YNext, XNext) <> 1 Then
  858.         If Page(YNext, XNext) = 0 Then
  859.           XNext = XNext + HexDeltaX(DeltaIndex, 0)
  860.           YNext = YNext + HexDeltaY(DeltaIndex, 0)
  861.           If XNext < 0 Then
  862.             Adjacency = Adjacency + 1
  863.           Else
  864.             If XNext > MaxX Then
  865.               Adjacency = Adjacency + 1
  866.             Else
  867.               If YNext < 0 Then
  868.                 Adjacency = Adjacency + 1
  869.               Else
  870.                 If YNext > MaxY Then
  871.                   Adjacency = Adjacency + 1
  872.                 Else
  873.                   If Page(YNext, XNext) = 1 Then
  874.                     Adjacency = Adjacency + 1
  875.                   End If
  876.                 End If
  877.               End If
  878.             End If
  879.           End If
  880.         End If
  881.       End If
  882.     Next DeltaIndex
  883.     X = X - 2 * HexDeltaX(Stack(StackHead).Index1, 0)
  884.     Y = Y - 2 * HexDeltaY(Stack(StackHead).Index1, 0)
  885.     StackHead = StackHead - 1
  886.     NumRoomsInSolution = NumRoomsInSolution + 1
  887.   Loop
  888.   For DeltaIndex = 0 To 5
  889.     XNext = X + HexDeltaX(DeltaIndex, 0)
  890.     YNext = X + HexDeltaY(DeltaIndex, 0)
  891.     If Page(YNext, XNext) <> 2 Then
  892.       If Page(YNext, XNext) = 0 Then
  893.         XNext = XNext + HexDeltaX(DeltaIndex, 0)
  894.         YNext = YNext + HexDeltaY(DeltaIndex, 0)
  895.         If XNext < 0 Then
  896.           Adjacency = Adjacency + 1
  897.         Else
  898.           If XNext > MaxX Then
  899.             Adjacency = Adjacency + 1
  900.           Else
  901.             If YNext < 0 Then
  902.               Adjacency = Adjacency + 1
  903.             Else
  904.               If YNext > MaxY Then
  905.                 Adjacency = Adjacency + 1
  906.               Else
  907.                 If Page(YNext, XNext) = 1 Then
  908.                   Adjacency = Adjacency + 1
  909.                 End If
  910.               End If
  911.             End If
  912.           End If
  913.         End If
  914.       End If
  915.     End If
  916.   Next DeltaIndex
  917. End Sub
  918.  
  919. Private Sub HexGenerateMaze(Page() As Byte, MaxX As Integer, MaxY As Integer, Stack() As StackRec, NumColumns As Integer, NumRows As Integer, Seed() As Byte)
  920.   Dim ColumnNum As Integer
  921.   Dim DeltaIndex1 As Integer
  922.   Dim DeltaIndex2 As Integer
  923.   Dim PassageFound As Integer
  924.   Dim RN(7) As Integer
  925.   Dim RNIndex1 As Integer
  926.   Dim RNIndex2 As Integer
  927.   Dim RowNum As Integer
  928.   Dim SearchComplete As Integer
  929.   Dim StackHead As Integer
  930.   Dim TemInt As Integer
  931.   Dim X As Integer
  932.   Dim XMod8 As Byte
  933.   Dim XNext As Integer
  934.   Dim Y As Integer
  935.   Dim YMod4 As Byte
  936.   Dim YNext As Integer
  937.  
  938.   RN(0) = Seed(0) + 1
  939.   RN(1) = Seed(1) + 1
  940.   RN(2) = Seed(2) + 1
  941.   RN(3) = Seed(3) + 1
  942.   RN(4) = Seed(4) + 1
  943.   RN(5) = Seed(5) + 1
  944.   RN(6) = Seed(6) + 1
  945.   RN(7) = Seed(7) + 1
  946.   YMod4 = 1
  947.   For Y = 0 To MaxY
  948.     If YMod4 = 1 Then
  949.       XMod8 = 1
  950.       For X = 0 To MaxX
  951.         If (((XMod8 = 0) And (Y <> 0) And (Y <> MaxY)) Or (XMod8 = 3) Or (XMod8 = 4) Or (XMod8 = 5)) Then
  952.           Page(Y, X) = 0
  953.         Else
  954.           Page(Y, X) = 2
  955.         End If
  956.         XMod8 = XMod8 + 1
  957.         If XMod8 >= 8 Then XMod8 = 0
  958.       Next X
  959.     Else
  960.       If YMod4 = 0 Or YMod4 = 2 Then
  961.         XMod8 = 1
  962.         For X = 0 To MaxX
  963.           If (XMod8 = 2) Or (XMod8 = 6) Then
  964.             Page(Y, X) = 0
  965.           Else
  966.             Page(Y, X) = 2
  967.           End If
  968.           XMod8 = XMod8 + 1
  969.           If XMod8 >= 8 Then XMod8 = 0
  970.         Next X
  971.       Else
  972.         XMod8 = 1
  973.         For X = 0 To MaxX
  974.           If (XMod8 = 0) Or (XMod8 = 1) Or (XMod8 = 4) Or (XMod8 = 7) Then
  975.             Page(Y, X) = 0
  976.           Else
  977.             Page(Y, X) = 2
  978.           End If
  979.           XMod8 = XMod8 + 1
  980.           If XMod8 >= 8 Then XMod8 = 0
  981.         Next X
  982.       End If
  983.     End If
  984.     YMod4 = YMod4 + 1
  985.     If YMod4 >= 4 Then YMod4 = 0
  986.   Next Y
  987.   ColumnNum = RN(0)
  988.   RNIndex1 = 0
  989.   RNIndex2 = 1
  990.   Do While (RNIndex2 < 8)
  991.     TemInt = RN(RNIndex2)
  992.     RN(RNIndex1) = TemInt
  993.     ColumnNum = ColumnNum + TemInt
  994.     If ColumnNum >= 727 Then ColumnNum = ColumnNum - 727
  995.     RNIndex1 = RNIndex2
  996.     RNIndex2 = RNIndex2 + 1
  997.   Loop
  998.   RN(7) = ColumnNum
  999.   ColumnNum = ColumnNum Mod NumColumns
  1000.   X = 4 * ColumnNum + 3
  1001.   RowNum = RN(0)
  1002.   RNIndex1 = 0
  1003.   RNIndex2 = 1
  1004.   Do While (RNIndex2 < 8)
  1005.     TemInt = RN(RNIndex2)
  1006.     RN(RNIndex1) = TemInt
  1007.     RowNum = RowNum + TemInt
  1008.     If RowNum >= 727 Then RowNum = RowNum - 727
  1009.     RNIndex1 = RNIndex2
  1010.     RNIndex2 = RNIndex2 + 1
  1011.   Loop
  1012.   RN(7) = RowNum
  1013.   If ColumnNum Mod 2 Then
  1014.     RowNum = RowNum Mod (NumRows - 1)
  1015.     Y = 4 * RowNum + 4
  1016.   Else
  1017.     RowNum = RowNum Mod NumRows
  1018.     Y = 4 * RowNum + 2
  1019.   End If
  1020.   Page(Y, X) = 2
  1021.   StackHead = -1
  1022.   Do
  1023.     DeltaIndex1 = 0
  1024.     Do
  1025.       DeltaIndex2 = RN(0)
  1026.       RNIndex1 = 0
  1027.       RNIndex2 = 1
  1028.       Do While (RNIndex2 < 8)
  1029.         TemInt = RN(RNIndex2)
  1030.         RN(RNIndex1) = TemInt
  1031.         DeltaIndex2 = DeltaIndex2 + TemInt
  1032.         If DeltaIndex2 >= 727 Then DeltaIndex2 = DeltaIndex2 - 727
  1033.         RNIndex1 = RNIndex2
  1034.         RNIndex2 = RNIndex2 + 1
  1035.       Loop
  1036.       RN(7) = DeltaIndex2
  1037.     Loop While DeltaIndex2 >= 720
  1038.     PassageFound = False
  1039.     SearchComplete = False
  1040.     Do While (Not SearchComplete)
  1041.       Do While ((DeltaIndex1 < 6) And (Not PassageFound))
  1042.         XNext = X + 2 * HexDeltaX(DeltaIndex1, DeltaIndex2)
  1043.         If XNext <= 0 Then
  1044.           DeltaIndex1 = DeltaIndex1 + 1
  1045.         Else
  1046.           If XNext > MaxX Then
  1047.             DeltaIndex1 = DeltaIndex1 + 1
  1048.           Else
  1049.             YNext = Y + 2 * HexDeltaY(DeltaIndex1, DeltaIndex2)
  1050.             If YNext <= 0 Then
  1051.               DeltaIndex1 = DeltaIndex1 + 1
  1052.             Else
  1053.               If YNext > MaxY Then
  1054.                 DeltaIndex1 = DeltaIndex1 + 1
  1055.               Else
  1056.                 If Page(YNext, XNext) = 0 Then
  1057.                   PassageFound = True
  1058.                 Else
  1059.                   DeltaIndex1 = DeltaIndex1 + 1
  1060.                 End If
  1061.               End If
  1062.             End If
  1063.           End If
  1064.         End If
  1065.       Loop
  1066.       If Not PassageFound Then
  1067.         If StackHead >= 0 Then
  1068.           DeltaIndex1 = Stack(StackHead).Index1
  1069.           DeltaIndex2 = Stack(StackHead).Index2
  1070.           X = X - 2 * HexDeltaX(DeltaIndex1, DeltaIndex2)
  1071.           Y = Y - 2 * HexDeltaY(DeltaIndex1, DeltaIndex2)
  1072.           StackHead = StackHead - 1
  1073.           DeltaIndex1 = DeltaIndex1 + 1
  1074.         End If
  1075.       End If
  1076.       If ((PassageFound) Or ((StackHead = -1) And (DeltaIndex1 >= 6))) Then
  1077.         SearchComplete = True
  1078.       Else
  1079.         SearchComplete = False
  1080.       End If
  1081.     Loop
  1082.     If PassageFound Then
  1083.       StackHead = StackHead + 1
  1084.       Stack(StackHead).Index1 = DeltaIndex1
  1085.       Stack(StackHead).Index2 = DeltaIndex2
  1086.       Page(YNext, XNext) = 2
  1087.       Page((Y + YNext) \ 2, (X + XNext) \ 2) = 2
  1088.       X = XNext
  1089.       Y = YNext
  1090.     End If
  1091.   Loop While StackHead <> -1
  1092.   Page(0, 3) = 1
  1093.   Page(MaxY, MaxX - 3) = 2
  1094. End Sub
  1095.  
  1096. Private Sub HexSelectMaze(Seed As String, Page() As Byte, MaxX As Integer, MaxY As Integer, Stack() As StackRec, NumRoomsInMaze As Integer, NumColumns As Integer, NumRows As Integer, SecondsForMazeSelection As Double)
  1097.   Dim Adjacency As Integer
  1098.   Dim Counter0 As Byte
  1099.   Dim Counter1 As Byte
  1100.   Dim Counter2 As Byte
  1101.   Dim Counter3 As Byte
  1102.   Dim Counter4 As Byte
  1103.   Dim Counter5 As Byte
  1104.   Dim Counter6 As Byte
  1105.   Dim Counter7 As Byte
  1106.   Dim ElapsedTime As Double
  1107.   Dim MinAdjacency As Integer
  1108.   Dim NumRoomsInSolution As Integer
  1109.   Dim NumRoomsInSolutionAtMin As Integer
  1110.   Dim RN(7) As Integer
  1111.   Dim RNIndex1 As Integer
  1112.   Dim RNIndex2 As Integer
  1113.   Dim SeedByte(7) As Byte
  1114.   Dim SeedByteAtMin(7) As Byte
  1115.   Dim SeedLength As Integer
  1116.   Dim StartTime As Double
  1117.  
  1118.   SeedLength = Len(Seed)
  1119.   If SeedLength > 8 Then SeedLength = 8
  1120.   RNIndex1 = 0
  1121.   For RNIndex2 = 1 To SeedLength
  1122.     RN(RNIndex1) = Asc(Mid$(Seed, RNIndex2, 1)) Mod 10
  1123.     RNIndex1 = RNIndex1 + 1
  1124.   Next RNIndex2
  1125.   RNIndex2 = 7
  1126.   Do While (RNIndex1 > 0)
  1127.     RNIndex1 = RNIndex1 - 1
  1128.     RN(RNIndex2) = RN(RNIndex1)
  1129.     RNIndex2 = RNIndex2 - 1
  1130.   Loop
  1131.   Do While (RNIndex2 >= 0)
  1132.     RN(RNIndex2) = 8
  1133.     RNIndex2 = RNIndex2 - 1
  1134.   Loop
  1135.   Counter0 = RN(0)
  1136.   Counter1 = RN(1)
  1137.   Counter2 = RN(2)
  1138.   Counter3 = RN(3)
  1139.   Counter4 = RN(4)
  1140.   Counter5 = RN(5)
  1141.   Counter6 = RN(6)
  1142.   Counter7 = RN(7)
  1143.   Call Hash(Counter0, Counter1, Counter2, Counter3, Counter4, Counter5, Counter6, Counter7)
  1144.   MinAdjacency = 4 * NumRoomsInMaze + 1
  1145.   NumRoomsInSolutionAtMin = 0
  1146.   SeedByteAtMin(0) = Counter0
  1147.   SeedByteAtMin(1) = Counter1
  1148.   SeedByteAtMin(2) = Counter2
  1149.   SeedByteAtMin(3) = Counter3
  1150.   SeedByteAtMin(4) = Counter4
  1151.   SeedByteAtMin(5) = Counter5
  1152.   SeedByteAtMin(6) = Counter6
  1153.   SeedByteAtMin(7) = Counter7
  1154.   StartTime = Timer
  1155.   Do
  1156.     SeedByte(0) = Counter0
  1157.     SeedByte(1) = Counter1
  1158.     SeedByte(2) = Counter2
  1159.     SeedByte(3) = Counter3
  1160.     SeedByte(4) = Counter4
  1161.     SeedByte(5) = Counter5
  1162.     SeedByte(6) = Counter6
  1163.     SeedByte(7) = Counter7
  1164.     Call HexGenerateMaze(Page(), MaxX, MaxY, Stack(), NumColumns, NumRows, SeedByte())
  1165.     Call HexSolveMaze(Stack(), Page(), NumRoomsInSolution, Adjacency, MaxX, MaxY)
  1166.     If 3 * NumRoomsInSolution >= NumRoomsInMaze Then
  1167.       If Adjacency < MinAdjacency Then
  1168.         MinAdjacency = Adjacency
  1169.         NumRoomsInSolutionAtMin = NumRoomsInSolution
  1170.         SeedByteAtMin(0) = SeedByte(0)
  1171.         SeedByteAtMin(1) = SeedByte(1)
  1172.         SeedByteAtMin(2) = SeedByte(2)
  1173.         SeedByteAtMin(3) = SeedByte(3)
  1174.         SeedByteAtMin(4) = SeedByte(4)
  1175.         SeedByteAtMin(5) = SeedByte(5)
  1176.         SeedByteAtMin(6) = SeedByte(6)
  1177.         SeedByteAtMin(7) = SeedByte(7)
  1178.       Else
  1179.         If Adjacency = MinAdjacency Then
  1180.           If NumRoomsInSolution > NumRoomsInSolutionAtMin Then
  1181.             NumRoomsInSolutionAtMin = NumRoomsInSolution
  1182.             SeedByteAtMin(0) = SeedByte(0)
  1183.             SeedByteAtMin(1) = SeedByte(1)
  1184.             SeedByteAtMin(2) = SeedByte(2)
  1185.             SeedByteAtMin(3) = SeedByte(3)
  1186.             SeedByteAtMin(4) = SeedByte(4)
  1187.             SeedByteAtMin(5) = SeedByte(5)
  1188.             SeedByteAtMin(6) = SeedByte(6)
  1189.             SeedByteAtMin(7) = SeedByte(7)
  1190.           End If
  1191.         End If
  1192.       End If
  1193.     End If
  1194.     Call Increment(Counter0, Counter1, Counter2, Counter3, Counter4, Counter5, Counter6, Counter7)
  1195.     ElapsedTime = Timer - StartTime
  1196.   Loop While ((ElapsedTime >= 0#) And (ElapsedTime < SecondsForMazeSelection))
  1197.   Call HexGenerateMaze(Page(), MaxX, MaxY, Stack(), NumColumns, NumRows, SeedByteAtMin())
  1198.   Call HexSolveMaze(Stack(), Page(), NumRoomsInSolution, Adjacency, MaxX, MaxY)
  1199. End Sub
  1200.  
  1201. Private Sub HexOutputMaze()
  1202.   Dim ObjectNum As Byte
  1203.   Dim Radians As Double
  1204.   Dim RadiansPerDegree As Double
  1205.   Dim SingleRectangle(3) As VertexRec
  1206.   Dim SingleTriangle(2) As VertexRec
  1207.   Dim TemDouble1 As Double
  1208.   Dim TemDouble2 As Double
  1209.   Dim TemDouble3 As Double
  1210.   Dim TemDouble4 As Double
  1211.   Dim Triangle(3, 2) As VertexRec
  1212.   Dim VertexNum As Byte
  1213.   Dim XMod8 As Byte
  1214.   Dim X0 As Double
  1215.   Dim X1 As Double
  1216.   Dim X2 As Double
  1217.   Dim X3 As Double
  1218.   Dim Y0 As Double
  1219.   Dim Y1 As Double
  1220.   Dim Y2 As Double
  1221.   Dim Y3 As Double
  1222.  
  1223.   Select Case State
  1224.     Case 0
  1225.       Text1.Text = ""
  1226.       ScaleMode = 1
  1227.       If (Resize) Then
  1228.         TemDouble1 = ScaleWidth - VScroll1.Width
  1229.         TemDouble2 = MinWallLengthInInches
  1230.         TemDouble2 = 1440# * TemDouble2
  1231.         TemDouble3 = RelativeWidthOfWall
  1232.         NumColumns = Int(2# * (TemDouble1 / TemDouble2 - 2# - TemDouble3 / Sqrt3) / 3# + 1#)
  1233.         If NumColumns Mod 2 = 0 Then NumColumns = NumColumns - 1
  1234.         If NumColumns < 3 Then NumColumns = 3
  1235.         TemDouble1 = ScaleHeight - Text1.Height
  1236.         TemDouble2 = ScaleWidth - VScroll1.Width
  1237.         ScaleMode = 3
  1238.         TemDouble3 = NumColumns
  1239.         TemDouble4 = RelativeWidthOfWall
  1240.         NumRows = Int(((TemDouble1 / TemDouble2) * (3# * (TemDouble3 - 1#) / 2# + 2# + TemDouble4 / Sqrt3) - TemDouble4) / Sqrt3)
  1241.         If NumRows < 2 Then NumRows = 2
  1242.         Tilt = 90 - VScroll1.Value
  1243.         MaxX = 8 * (NumColumns \ 2) + 6
  1244.         MaxY = 4 * NumRows
  1245.         NumRoomsInMaze = NumRows * NumColumns - (NumColumns \ 2)
  1246.         ReDim ComputerPage(MaxY, MaxX)
  1247.         ReDim UserPage(MaxY, MaxX)
  1248.         ReDim Stack(NumRoomsInMaze)
  1249.         Call HexSelectMaze(Seed, ComputerPage(), MaxX, MaxY, Stack(), NumRoomsInMaze, NumColumns, NumRows, SecondsForMazeSelection)
  1250.         For UserX = 0 To MaxX
  1251.           For UserY = 0 To MaxY
  1252.             If ComputerPage(UserY, UserX) = 0 Then
  1253.               UserPage(UserY, UserX) = 0
  1254.             Else
  1255.               UserPage(UserY, UserX) = 2
  1256.             End If
  1257.           Next UserY
  1258.         Next UserX
  1259.         UserX = 3
  1260.         UserXRelative = 1#
  1261.         UserY = 2
  1262.         UserYRelative = Sqrt3 / 2#
  1263.         UserPage(UserY, UserX) = 1
  1264.         Resize = False
  1265.       End If
  1266.       If (Paint) Then
  1267.         ScaleMode = 3
  1268.         Cls
  1269.         RadiansPerDegree = Atn(1#) / 45#
  1270.         Radians = Tilt * RadiansPerDegree
  1271.         SinTilt = Sin(Radians)
  1272.         CosTilt = Cos(Radians)
  1273.         TemDouble1 = NumColumns
  1274.         XMax = 3# * (TemDouble1 - 1#) / 2# + 2# + RelativeWidthOfWall / Sqrt3
  1275.         TemDouble1 = ScaleWidth - VScroll1.Width
  1276.         PixelsPerX = (TemDouble1 - 1#) / (XMax * (XMax / (XMax - RelativeHeightOfWall)))
  1277.         XOffset = (XMax / 2#) * (RelativeHeightOfWall / (XMax - RelativeHeightOfWall))
  1278.         TemDouble1 = NumRows
  1279.         YMax = TemDouble1 * Sqrt3 + RelativeWidthOfWall
  1280.         TemDouble1 = ScaleHeight - Text1.Height
  1281.         PixelsPerZ = (TemDouble1 - 1#) / Sqr(YMax * YMax + RelativeHeightOfWall * RelativeHeightOfWall)
  1282.         If YMax > XMax Then
  1283.           RelDistOfUserFromScreen = YMax
  1284.         Else
  1285.           RelDistOfUserFromScreen = XMax
  1286.         End If
  1287.         Paint = False
  1288.       End If
  1289.       If State = 0 Then
  1290.         State = 1
  1291.         DoEvents
  1292.         If State < 5 Then
  1293.           Timer1.Enabled = True
  1294.         End If
  1295.       End If
  1296.     Case 1
  1297.       BaseTriangle(0, 0).X = 0#
  1298.       BaseTriangle(0, 0).Y = RelativeWidthOfWall + Sqrt3 / 2#
  1299.       BaseTriangle(0, 1).X = 0#
  1300.       BaseTriangle(0, 1).Y = Sqrt3 / 2#
  1301.       BaseTriangle(0, 2).X = RelativeWidthOfWall * Sqrt3 / 2#
  1302.       BaseTriangle(0, 2).Y = (RelativeWidthOfWall + Sqrt3) / 2#
  1303.       BaseTriangle(1, 0).X = (1# - RelativeWidthOfWall / Sqrt3) / 2#
  1304.       BaseTriangle(1, 0).Y = RelativeWidthOfWall / 2#
  1305.       BaseTriangle(1, 1).X = 0.5 + RelativeWidthOfWall / Sqrt3
  1306.       BaseTriangle(1, 1).Y = 0#
  1307.       BaseTriangle(1, 2).X = BaseTriangle(1, 1).X
  1308.       BaseTriangle(1, 2).Y = RelativeWidthOfWall
  1309.       BaseTriangle(2, 0).X = 1.5
  1310.       BaseTriangle(2, 0).Y = RelativeWidthOfWall
  1311.       BaseTriangle(2, 1).X = 1.5
  1312.       BaseTriangle(2, 1).Y = 0#
  1313.       BaseTriangle(2, 2).X = 1.5 * (1# + RelativeWidthOfWall / Sqrt3)
  1314.       BaseTriangle(2, 2).Y = RelativeWidthOfWall / 2#
  1315.       BaseTriangle(3, 0).X = 2# - RelativeWidthOfWall / (2# * Sqrt3)
  1316.       BaseTriangle(3, 0).Y = BaseTriangle(0, 2).Y
  1317.       BaseTriangle(3, 1).X = 2# + RelativeWidthOfWall / Sqrt3
  1318.       BaseTriangle(3, 1).Y = BaseTriangle(0, 1).Y
  1319.       BaseTriangle(3, 2).X = BaseTriangle(3, 1).X
  1320.       BaseTriangle(3, 2).Y = BaseTriangle(0, 0).Y
  1321.       BaseRectangle(0, 0).X = BaseTriangle(0, 2).X
  1322.       BaseRectangle(0, 0).Y = BaseTriangle(0, 2).Y
  1323.       BaseRectangle(0, 1).X = BaseTriangle(1, 1).X
  1324.       BaseRectangle(0, 1).Y = Sqrt3
  1325.       BaseRectangle(0, 2).X = BaseTriangle(1, 0).X
  1326.       BaseRectangle(0, 2).Y = Sqrt3 + RelativeWidthOfWall / 2#
  1327.       BaseRectangle(0, 3).X = BaseTriangle(0, 0).X
  1328.       BaseRectangle(0, 3).Y = BaseTriangle(0, 0).Y
  1329.       BaseRectangle(1, 0).X = BaseTriangle(0, 1).X
  1330.       BaseRectangle(1, 0).Y = BaseTriangle(0, 1).Y
  1331.       BaseRectangle(1, 1).X = BaseTriangle(1, 0).X
  1332.       BaseRectangle(1, 1).Y = BaseTriangle(1, 0).Y
  1333.       BaseRectangle(1, 2).X = BaseTriangle(1, 2).X
  1334.       BaseRectangle(1, 2).Y = BaseTriangle(1, 2).Y
  1335.       BaseRectangle(1, 3).X = BaseTriangle(0, 2).X
  1336.       BaseRectangle(1, 3).Y = BaseTriangle(0, 2).Y
  1337.       BaseRectangle(2, 0).X = BaseTriangle(1, 1).X
  1338.       BaseRectangle(2, 0).Y = BaseTriangle(1, 1).Y
  1339.       BaseRectangle(2, 1).X = BaseTriangle(2, 1).X
  1340.       BaseRectangle(2, 1).Y = BaseTriangle(2, 1).Y
  1341.       BaseRectangle(2, 2).X = BaseTriangle(2, 0).X
  1342.       BaseRectangle(2, 2).Y = BaseTriangle(2, 0).Y
  1343.       BaseRectangle(2, 3).X = BaseTriangle(1, 2).X
  1344.       BaseRectangle(2, 3).Y = BaseTriangle(1, 2).Y
  1345.       BaseRectangle(3, 0).X = BaseTriangle(2, 2).X
  1346.       BaseRectangle(3, 0).Y = BaseTriangle(2, 2).Y
  1347.       BaseRectangle(3, 1).X = BaseTriangle(3, 1).X
  1348.       BaseRectangle(3, 1).Y = BaseTriangle(3, 1).Y
  1349.       BaseRectangle(3, 2).X = BaseTriangle(3, 0).X
  1350.       BaseRectangle(3, 2).Y = BaseTriangle(3, 0).Y
  1351.       BaseRectangle(3, 3).X = BaseTriangle(2, 0).X
  1352.       BaseRectangle(3, 3).Y = BaseTriangle(2, 0).Y
  1353.       BaseRectangle(4, 0).X = BaseTriangle(3, 1).X
  1354.       BaseRectangle(4, 0).Y = BaseTriangle(3, 1).Y
  1355.       BaseRectangle(4, 1).X = BaseTriangle(3, 1).X + (BaseTriangle(2, 1).X - BaseTriangle(1, 1).X)
  1356.       BaseRectangle(4, 1).Y = BaseTriangle(3, 1).Y
  1357.       BaseRectangle(4, 2).X = BaseRectangle(4, 1).X
  1358.       BaseRectangle(4, 2).Y = BaseTriangle(3, 2).Y
  1359.       BaseRectangle(4, 3).X = BaseTriangle(3, 2).X
  1360.       BaseRectangle(4, 3).Y = BaseTriangle(3, 2).Y
  1361.       BaseRectangle(5, 0).X = BaseRectangle(0, 1).X + (BaseTriangle(2, 1).X - BaseTriangle(1, 1).X)
  1362.       BaseRectangle(5, 0).Y = BaseRectangle(0, 1).Y
  1363.       BaseRectangle(5, 1).X = BaseTriangle(3, 0).X
  1364.       BaseRectangle(5, 1).Y = BaseTriangle(3, 0).Y
  1365.       BaseRectangle(5, 2).X = BaseTriangle(3, 2).X
  1366.       BaseRectangle(5, 2).Y = BaseTriangle(3, 2).Y
  1367.       BaseRectangle(5, 3).X = BaseRectangle(0, 2).X + (BaseTriangle(2, 2).X - BaseTriangle(1, 0).X)
  1368.       BaseRectangle(5, 3).Y = BaseRectangle(0, 2).Y
  1369.       Rectangle(0, 0).X = BaseTriangle(1, 1).X
  1370.       Rectangle(0, 0).Y = BaseTriangle(1, 1).Y
  1371.       Rectangle(0, 1).X = XMax - BaseTriangle(1, 1).X
  1372.       Rectangle(0, 1).Y = BaseTriangle(1, 1).Y
  1373.       Rectangle(0, 2).X = XMax - BaseTriangle(1, 2).X
  1374.       Rectangle(0, 2).Y = BaseTriangle(1, 2).Y
  1375.       Rectangle(0, 3).X = BaseTriangle(1, 2).X
  1376.       Rectangle(0, 3).Y = BaseTriangle(1, 2).Y
  1377.       Rectangle(1, 0).X = BaseTriangle(0, 1).X
  1378.       Rectangle(1, 0).Y = BaseTriangle(0, 1).Y
  1379.       Rectangle(1, 1).X = XMax - BaseTriangle(0, 1).X
  1380.       Rectangle(1, 1).Y = BaseTriangle(0, 1).Y
  1381.       Rectangle(1, 2).X = XMax - BaseTriangle(1, 2).X
  1382.       Rectangle(1, 2).Y = BaseTriangle(1, 2).Y
  1383.       Rectangle(1, 3).X = BaseTriangle(1, 2).X
  1384.       Rectangle(1, 3).Y = BaseTriangle(1, 2).Y
  1385.       Rectangle(2, 0).X = BaseTriangle(0, 1).X
  1386.       Rectangle(2, 0).Y = BaseTriangle(0, 1).Y
  1387.       Rectangle(2, 1).X = XMax - BaseTriangle(0, 1).X
  1388.       Rectangle(2, 1).Y = BaseTriangle(0, 1).Y
  1389.       Rectangle(2, 2).X = XMax - BaseTriangle(0, 0).X
  1390.       Rectangle(2, 2).Y = BaseTriangle(0, 0).Y
  1391.       Rectangle(2, 3).X = BaseTriangle(0, 0).X
  1392.       Rectangle(2, 3).Y = BaseTriangle(0, 0).Y
  1393.       Rectangle(3, 0).X = BaseTriangle(0, 0).X
  1394.       Rectangle(3, 0).Y = BaseTriangle(0, 0).Y
  1395.       Rectangle(3, 1).X = XMax - BaseTriangle(0, 0).X
  1396.       Rectangle(3, 1).Y = BaseTriangle(0, 0).Y
  1397.       Rectangle(3, 2).X = XMax - BaseRectangle(0, 1).X
  1398.       Rectangle(3, 2).Y = BaseRectangle(0, 1).Y
  1399.       Rectangle(3, 3).X = BaseRectangle(0, 1).X
  1400.       Rectangle(3, 3).Y = BaseRectangle(0, 1).Y
  1401.       Y = 0
  1402.       State = 2
  1403.       DoEvents
  1404.       If State < 5 Then
  1405.         Timer1.Enabled = True
  1406.       End If
  1407.     Case 2
  1408.       If UsePalette Then
  1409.         OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  1410.         NumRealized = RealizePalette(frm3DMaze.hDC)
  1411.       End If
  1412.       If (Y <= MaxY - 1) Then
  1413.         If Y > 0 Then
  1414.           X0 = Rectangle(0, 0).X
  1415.           Y0 = Rectangle(0, 0).Y
  1416.           X1 = Rectangle(0, 1).X
  1417.           Y1 = Rectangle(0, 1).Y
  1418.           X2 = Rectangle(0, 2).X
  1419.           Y2 = Rectangle(0, 2).Y
  1420.           X3 = Rectangle(0, 3).X
  1421.           Y3 = Rectangle(0, 3).Y
  1422.           Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, 0#, X1, Y1, 0#, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, FloorColor)
  1423.           X0 = Rectangle(1, 0).X
  1424.           Y0 = Rectangle(1, 0).Y
  1425.           X1 = Rectangle(1, 1).X
  1426.           Y1 = Rectangle(1, 1).Y
  1427.           X2 = Rectangle(1, 2).X
  1428.           Y2 = Rectangle(1, 2).Y
  1429.           X3 = Rectangle(1, 3).X
  1430.           Y3 = Rectangle(1, 3).Y
  1431.           Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, 0#, X1, Y1, 0#, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, FloorColor)
  1432.         End If
  1433.         X0 = Rectangle(2, 0).X
  1434.         Y0 = Rectangle(2, 0).Y
  1435.         X1 = Rectangle(2, 1).X
  1436.         Y1 = Rectangle(2, 1).Y
  1437.         X2 = Rectangle(2, 2).X
  1438.         Y2 = Rectangle(2, 2).Y
  1439.         X3 = Rectangle(2, 3).X
  1440.         Y3 = Rectangle(2, 3).Y
  1441.         Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, 0#, X1, Y1, 0#, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, FloorColor)
  1442.         If Y < MaxY - 4 Then
  1443.           X0 = Rectangle(3, 0).X
  1444.           Y0 = Rectangle(3, 0).Y
  1445.           X1 = Rectangle(3, 1).X
  1446.           Y1 = Rectangle(3, 1).Y
  1447.           X2 = Rectangle(3, 2).X
  1448.           Y2 = Rectangle(3, 2).Y
  1449.           X3 = Rectangle(3, 3).X
  1450.           Y3 = Rectangle(3, 3).Y
  1451.           Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, 0#, X1, Y1, 0#, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, FloorColor)
  1452.         End If
  1453.         For ObjectNum = 0 To 3
  1454.           For VertexNum = 0 To 3
  1455.             Rectangle(ObjectNum, VertexNum).Y = Rectangle(ObjectNum, VertexNum).Y + Sqrt3
  1456.           Next VertexNum
  1457.         Next ObjectNum
  1458.         Y = Y + 4
  1459.       Else
  1460.         Rectangle(0, 0).X = BaseTriangle(1, 0).X
  1461.         Rectangle(0, 0).Y = BaseTriangle(1, 0).Y
  1462.         Rectangle(0, 1).X = BaseTriangle(1, 1).X
  1463.         Rectangle(0, 1).Y = BaseTriangle(1, 1).Y
  1464.         Rectangle(0, 2).X = BaseTriangle(2, 1).X
  1465.         Rectangle(0, 2).Y = BaseTriangle(2, 1).Y
  1466.         Rectangle(0, 3).X = BaseTriangle(2, 2).X
  1467.         Rectangle(0, 3).Y = BaseTriangle(2, 2).Y
  1468.         Rectangle(1, 0).X = BaseTriangle(0, 1).X
  1469.         Rectangle(1, 0).Y = BaseTriangle(0, 1).Y
  1470.         Rectangle(1, 1).X = BaseTriangle(1, 0).X
  1471.         Rectangle(1, 1).Y = BaseTriangle(1, 0).Y
  1472.         Rectangle(1, 2).X = BaseTriangle(2, 2).X
  1473.         Rectangle(1, 2).Y = BaseTriangle(2, 2).Y
  1474.         Rectangle(1, 3).X = BaseTriangle(3, 1).X
  1475.         Rectangle(1, 3).Y = BaseTriangle(3, 1).Y
  1476.         Rectangle(2, 0).X = BaseTriangle(0, 0).X
  1477.         Rectangle(2, 0).Y = BaseTriangle(0, 0).Y
  1478.         Rectangle(2, 1).X = BaseTriangle(0, 1).X
  1479.         Rectangle(2, 1).Y = BaseTriangle(0, 1).Y
  1480.         Rectangle(2, 2).X = BaseTriangle(3, 1).X
  1481.         Rectangle(2, 2).Y = BaseTriangle(3, 1).Y
  1482.         Rectangle(2, 3).X = BaseTriangle(3, 2).X
  1483.         Rectangle(2, 3).Y = BaseTriangle(3, 2).Y
  1484.         X = 0
  1485.         State = 3
  1486.       End If
  1487.       If UsePalette Then
  1488.         NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  1489.       End If
  1490.       DoEvents
  1491.       If State < 5 Then
  1492.         Timer1.Enabled = True
  1493.       End If
  1494.     Case 3
  1495.       If UsePalette Then
  1496.         OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  1497.         NumRealized = RealizePalette(frm3DMaze.hDC)
  1498.       End If
  1499.       If X <= MaxX Then
  1500.         For ObjectNum = 0 To 2
  1501.           X0 = Rectangle(ObjectNum, 0).X
  1502.           Y0 = Rectangle(ObjectNum, 0).Y
  1503.           X1 = Rectangle(ObjectNum, 1).X
  1504.           Y1 = Rectangle(ObjectNum, 1).Y
  1505.           X2 = Rectangle(ObjectNum, 2).X
  1506.           Y2 = Rectangle(ObjectNum, 2).Y
  1507.           X3 = Rectangle(ObjectNum, 3).X
  1508.           Y3 = Rectangle(ObjectNum, 3).Y
  1509.           Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, 0#, X1, Y1, 0#, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, FloorColor)
  1510.           X0 = Rectangle(ObjectNum, 0).X
  1511.           Y0 = YMax - Rectangle(ObjectNum, 0).Y
  1512.           X1 = Rectangle(ObjectNum, 1).X
  1513.           Y1 = YMax - Rectangle(ObjectNum, 1).Y
  1514.           X2 = Rectangle(ObjectNum, 2).X
  1515.           Y2 = YMax - Rectangle(ObjectNum, 2).Y
  1516.           X3 = Rectangle(ObjectNum, 3).X
  1517.           Y3 = YMax - Rectangle(ObjectNum, 3).Y
  1518.           Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, 0#, X1, Y1, 0#, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, FloorColor)
  1519.           For VertexNum = 0 To 3
  1520.             Rectangle(ObjectNum, VertexNum).X = Rectangle(ObjectNum, VertexNum).X + 3#
  1521.           Next VertexNum
  1522.         Next ObjectNum
  1523.         X = X + 8
  1524.       Else
  1525.         YMod4 = 0
  1526.         YOffset = 0#
  1527.         Y = 0
  1528.         State = 4
  1529.       End If
  1530.       If UsePalette Then
  1531.         NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  1532.       End If
  1533.       DoEvents
  1534.       If State < 5 Then
  1535.         Timer1.Enabled = True
  1536.       End If
  1537.     Case 4
  1538.       If UsePalette Then
  1539.         OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  1540.         NumRealized = RealizePalette(frm3DMaze.hDC)
  1541.       End If
  1542.       If Y <= MaxY Then
  1543.         Select Case YMod4
  1544.           Case 0
  1545.             XMod8 = 0
  1546.             For ObjectNum = 1 To 2
  1547.               For VertexNum = 0 To 2
  1548.                 Triangle(ObjectNum, VertexNum).X = BaseTriangle(ObjectNum, VertexNum).X
  1549.                 Triangle(ObjectNum, VertexNum).Y = BaseTriangle(ObjectNum, VertexNum).Y + YOffset
  1550.               Next VertexNum
  1551.             Next ObjectNum
  1552.             For VertexNum = 0 To 3
  1553.               Rectangle(2, VertexNum).X = BaseRectangle(2, VertexNum).X
  1554.               Rectangle(2, VertexNum).Y = BaseRectangle(2, VertexNum).Y + YOffset
  1555.             Next VertexNum
  1556.             For X = 0 To MaxX
  1557.               Select Case XMod8
  1558.                 Case 2
  1559.                   SingleTriangle(0).X = Triangle(1, 0).X
  1560.                   SingleTriangle(0).Y = Triangle(1, 0).Y
  1561.                   SingleTriangle(1).X = Triangle(1, 1).X
  1562.                   SingleTriangle(1).Y = Triangle(1, 1).Y
  1563.                   SingleTriangle(2).X = Triangle(1, 2).X
  1564.                   SingleTriangle(2).Y = Triangle(1, 2).Y
  1565.                   Call OutputTriangle(XMax, XOffset, YMax, SingleTriangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, True, TriangleSSWNNEColor)
  1566.                 Case 4
  1567.                   SingleTriangle(0).X = Triangle(2, 0).X
  1568.                   SingleTriangle(0).Y = Triangle(2, 0).Y
  1569.                   SingleTriangle(1).X = Triangle(2, 1).X
  1570.                   SingleTriangle(1).Y = Triangle(2, 1).Y
  1571.                   SingleTriangle(2).X = Triangle(2, 2).X
  1572.                   SingleTriangle(2).Y = Triangle(2, 2).Y
  1573.                   Call OutputTriangle(XMax, XOffset, YMax, SingleTriangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, True, TriangleSSENNWColor)
  1574.                 Case Else
  1575.               End Select
  1576.               XMod8 = XMod8 + 1
  1577.               If XMod8 >= 8 Then
  1578.                 XMod8 = 0
  1579.                 For ObjectNum = 1 To 2
  1580.                   For VertexNum = 0 To 2
  1581.                     Triangle(ObjectNum, VertexNum).X = Triangle(ObjectNum, VertexNum).X + 3#
  1582.                   Next VertexNum
  1583.                 Next ObjectNum
  1584.                 For VertexNum = 0 To 3
  1585.                   Rectangle(2, VertexNum).X = Rectangle(2, VertexNum).X + 3#
  1586.                 Next VertexNum
  1587.               End If
  1588.             Next X
  1589.             XMod8 = 0
  1590.             For ObjectNum = 1 To 2
  1591.               For VertexNum = 0 To 2
  1592.                 Triangle(ObjectNum, VertexNum).X = BaseTriangle(ObjectNum, VertexNum).X
  1593.                 Triangle(ObjectNum, VertexNum).Y = BaseTriangle(ObjectNum, VertexNum).Y + YOffset
  1594.               Next VertexNum
  1595.             Next ObjectNum
  1596.             For VertexNum = 0 To 3
  1597.               Rectangle(2, VertexNum).X = BaseRectangle(2, VertexNum).X
  1598.               Rectangle(2, VertexNum).Y = BaseRectangle(2, VertexNum).Y + YOffset
  1599.             Next VertexNum
  1600.             For X = 0 To MaxX
  1601.               Select Case XMod8
  1602.                 Case 2
  1603.                   SingleTriangle(0).X = Triangle(1, 0).X
  1604.                   SingleTriangle(0).Y = Triangle(1, 0).Y
  1605.                   SingleTriangle(1).X = Triangle(1, 1).X
  1606.                   SingleTriangle(1).Y = Triangle(1, 1).Y
  1607.                   SingleTriangle(2).X = Triangle(1, 2).X
  1608.                   SingleTriangle(2).Y = Triangle(1, 2).Y
  1609.                   Call OutputTriangle(XMax, XOffset, YMax, SingleTriangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, False, TriangleSENWColor)
  1610.                 Case 3
  1611.                   If ComputerPage(Y, X) = 0 Then
  1612.                     SingleRectangle(0).X = Rectangle(2, 0).X
  1613.                     SingleRectangle(0).Y = Rectangle(2, 0).Y
  1614.                     SingleRectangle(1).X = Rectangle(2, 1).X
  1615.                     SingleRectangle(1).Y = Rectangle(2, 1).Y
  1616.                     SingleRectangle(2).X = Rectangle(2, 2).X
  1617.                     SingleRectangle(2).Y = Rectangle(2, 2).Y
  1618.                     SingleRectangle(3).X = Rectangle(2, 3).X
  1619.                     SingleRectangle(3).Y = Rectangle(2, 3).Y
  1620.                     Call OutputRectangle(XMax, XOffset, YMax, SingleRectangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleWEColor)
  1621.                   End If
  1622.                 Case 4
  1623.                   SingleTriangle(0).X = Triangle(2, 0).X
  1624.                   SingleTriangle(0).Y = Triangle(2, 0).Y
  1625.                   SingleTriangle(1).X = Triangle(2, 1).X
  1626.                   SingleTriangle(1).Y = Triangle(2, 1).Y
  1627.                   SingleTriangle(2).X = Triangle(2, 2).X
  1628.                   SingleTriangle(2).Y = Triangle(2, 2).Y
  1629.                   Call OutputTriangle(XMax, XOffset, YMax, SingleTriangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, False, TriangleSWNEColor)
  1630.                 Case Else
  1631.               End Select
  1632.               XMod8 = XMod8 + 1
  1633.               If XMod8 >= 8 Then
  1634.                 XMod8 = 0
  1635.                 For ObjectNum = 1 To 2
  1636.                   For VertexNum = 0 To 2
  1637.                     Triangle(ObjectNum, VertexNum).X = Triangle(ObjectNum, VertexNum).X + 3#
  1638.                   Next VertexNum
  1639.                 Next ObjectNum
  1640.                 For VertexNum = 0 To 3
  1641.                   Rectangle(2, VertexNum).X = Rectangle(2, VertexNum).X + 3#
  1642.                 Next VertexNum
  1643.               End If
  1644.             Next X
  1645.           Case 1
  1646.             XMod8 = 0
  1647.             For ObjectNum = 1 To 3 Step 2
  1648.               For VertexNum = 0 To 3
  1649.                 Rectangle(ObjectNum, VertexNum).X = BaseRectangle(ObjectNum, VertexNum).X
  1650.                 Rectangle(ObjectNum, VertexNum).Y = BaseRectangle(ObjectNum, VertexNum).Y + YOffset
  1651.               Next VertexNum
  1652.             Next ObjectNum
  1653.             For X = 0 To MaxX
  1654.               Select Case XMod8
  1655.                 Case 1
  1656.                   If ComputerPage(Y, X) = 0 Then
  1657.                     SingleRectangle(0).X = Rectangle(1, 0).X
  1658.                     SingleRectangle(0).Y = Rectangle(1, 0).Y
  1659.                     SingleRectangle(1).X = Rectangle(1, 1).X
  1660.                     SingleRectangle(1).Y = Rectangle(1, 1).Y
  1661.                     SingleRectangle(2).X = Rectangle(1, 2).X
  1662.                     SingleRectangle(2).Y = Rectangle(1, 2).Y
  1663.                     SingleRectangle(3).X = Rectangle(1, 3).X
  1664.                     SingleRectangle(3).Y = Rectangle(1, 3).Y
  1665.                     Call OutputRectangle(XMax, XOffset, YMax, SingleRectangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleSWNEColor)
  1666.                   End If
  1667.                 Case 5
  1668.                   If ComputerPage(Y, X) = 0 Then
  1669.                     SingleRectangle(0).X = Rectangle(3, 0).X
  1670.                     SingleRectangle(0).Y = Rectangle(3, 0).Y
  1671.                     SingleRectangle(1).X = Rectangle(3, 1).X
  1672.                     SingleRectangle(1).Y = Rectangle(3, 1).Y
  1673.                     SingleRectangle(2).X = Rectangle(3, 2).X
  1674.                     SingleRectangle(2).Y = Rectangle(3, 2).Y
  1675.                     SingleRectangle(3).X = Rectangle(3, 3).X
  1676.                     SingleRectangle(3).Y = Rectangle(3, 3).Y
  1677.                     Call OutputRectangle(XMax, XOffset, YMax, SingleRectangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleSENWColor)
  1678.                   End If
  1679.                 Case Else
  1680.               End Select
  1681.               XMod8 = XMod8 + 1
  1682.               If XMod8 >= 8 Then
  1683.                 XMod8 = 0
  1684.                 For ObjectNum = 1 To 3 Step 2
  1685.                   For VertexNum = 0 To 3
  1686.                     Rectangle(ObjectNum, VertexNum).X = Rectangle(ObjectNum, VertexNum).X + 3#
  1687.                   Next VertexNum
  1688.                 Next ObjectNum
  1689.               End If
  1690.             Next X
  1691.           Case 2
  1692.             XMod8 = 0
  1693.             For ObjectNum = 0 To 3 Step 3
  1694.               For VertexNum = 0 To 2
  1695.                 Triangle(ObjectNum, VertexNum).X = BaseTriangle(ObjectNum, VertexNum).X
  1696.                 Triangle(ObjectNum, VertexNum).Y = BaseTriangle(ObjectNum, VertexNum).Y + YOffset
  1697.               Next VertexNum
  1698.             Next ObjectNum
  1699.             For VertexNum = 0 To 3
  1700.               Rectangle(4, VertexNum).X = BaseRectangle(4, VertexNum).X
  1701.               Rectangle(4, VertexNum).Y = BaseRectangle(4, VertexNum).Y + YOffset
  1702.             Next VertexNum
  1703.             For X = 0 To MaxX
  1704.               Select Case XMod8
  1705.                 Case 0
  1706.                   SingleTriangle(0).X = Triangle(0, 0).X
  1707.                   SingleTriangle(0).Y = Triangle(0, 0).Y
  1708.                   SingleTriangle(1).X = Triangle(0, 1).X
  1709.                   SingleTriangle(1).Y = Triangle(0, 1).Y
  1710.                   SingleTriangle(2).X = Triangle(0, 2).X
  1711.                   SingleTriangle(2).Y = Triangle(0, 2).Y
  1712.                   Call OutputTriangle(XMax, XOffset, YMax, SingleTriangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, True, TriangleSSWNNEColor)
  1713.                 Case 6
  1714.                   SingleTriangle(0).X = Triangle(3, 0).X
  1715.                   SingleTriangle(0).Y = Triangle(3, 0).Y
  1716.                   SingleTriangle(1).X = Triangle(3, 1).X
  1717.                   SingleTriangle(1).Y = Triangle(3, 1).Y
  1718.                   SingleTriangle(2).X = Triangle(3, 2).X
  1719.                   SingleTriangle(2).Y = Triangle(3, 2).Y
  1720.                   Call OutputTriangle(XMax, XOffset, YMax, SingleTriangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, True, TriangleSSENNWColor)
  1721.                 Case Else
  1722.               End Select
  1723.               XMod8 = XMod8 + 1
  1724.               If XMod8 >= 8 Then
  1725.                 XMod8 = 0
  1726.                 For ObjectNum = 0 To 3 Step 3
  1727.                   For VertexNum = 0 To 2
  1728.                     Triangle(ObjectNum, VertexNum).X = Triangle(ObjectNum, VertexNum).X + 3#
  1729.                   Next VertexNum
  1730.                 Next ObjectNum
  1731.                 For VertexNum = 0 To 3
  1732.                   Rectangle(4, VertexNum).X = Rectangle(4, VertexNum).X + 3#
  1733.                 Next VertexNum
  1734.               End If
  1735.             Next X
  1736.             XMod8 = 0
  1737.             For ObjectNum = 0 To 3 Step 3
  1738.               For VertexNum = 0 To 2
  1739.                 Triangle(ObjectNum, VertexNum).X = BaseTriangle(ObjectNum, VertexNum).X
  1740.                 Triangle(ObjectNum, VertexNum).Y = BaseTriangle(ObjectNum, VertexNum).Y + YOffset
  1741.               Next VertexNum
  1742.             Next ObjectNum
  1743.             For VertexNum = 0 To 3
  1744.               Rectangle(4, VertexNum).X = BaseRectangle(4, VertexNum).X
  1745.               Rectangle(4, VertexNum).Y = BaseRectangle(4, VertexNum).Y + YOffset
  1746.             Next VertexNum
  1747.             For X = 0 To MaxX
  1748.               Select Case XMod8
  1749.                 Case 0
  1750.                   SingleTriangle(0).X = Triangle(0, 0).X
  1751.                   SingleTriangle(0).Y = Triangle(0, 0).Y
  1752.                   SingleTriangle(1).X = Triangle(0, 1).X
  1753.                   SingleTriangle(1).Y = Triangle(0, 1).Y
  1754.                   SingleTriangle(2).X = Triangle(0, 2).X
  1755.                   SingleTriangle(2).Y = Triangle(0, 2).Y
  1756.                   Call OutputTriangle(XMax, XOffset, YMax, SingleTriangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, False, TriangleSWNEColor)
  1757.                 Case 6
  1758.                   SingleTriangle(0).X = Triangle(3, 0).X
  1759.                   SingleTriangle(0).Y = Triangle(3, 0).Y
  1760.                   SingleTriangle(1).X = Triangle(3, 1).X
  1761.                   SingleTriangle(1).Y = Triangle(3, 1).Y
  1762.                   SingleTriangle(2).X = Triangle(3, 2).X
  1763.                   SingleTriangle(2).Y = Triangle(3, 2).Y
  1764.                   Call OutputTriangle(XMax, XOffset, YMax, SingleTriangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, False, TriangleSENWColor)
  1765.                 Case 7
  1766.                   If ComputerPage(Y, X) = 0 Then
  1767.                     SingleRectangle(0).X = Rectangle(4, 0).X
  1768.                     SingleRectangle(0).Y = Rectangle(4, 0).Y
  1769.                     SingleRectangle(1).X = Rectangle(4, 1).X
  1770.                     SingleRectangle(1).Y = Rectangle(4, 1).Y
  1771.                     SingleRectangle(2).X = Rectangle(4, 2).X
  1772.                     SingleRectangle(2).Y = Rectangle(4, 2).Y
  1773.                     SingleRectangle(3).X = Rectangle(4, 3).X
  1774.                     SingleRectangle(3).Y = Rectangle(4, 3).Y
  1775.                     Call OutputRectangle(XMax, XOffset, YMax, SingleRectangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleWEColor)
  1776.                   End If
  1777.                 Case Else
  1778.               End Select
  1779.               XMod8 = XMod8 + 1
  1780.               If XMod8 >= 8 Then
  1781.                 XMod8 = 0
  1782.                 For ObjectNum = 0 To 3 Step 3
  1783.                   For VertexNum = 0 To 2
  1784.                     Triangle(ObjectNum, VertexNum).X = Triangle(ObjectNum, VertexNum).X + 3#
  1785.                   Next VertexNum
  1786.                 Next ObjectNum
  1787.                 For VertexNum = 0 To 3
  1788.                   Rectangle(4, VertexNum).X = Rectangle(4, VertexNum).X + 3#
  1789.                 Next VertexNum
  1790.               End If
  1791.             Next X
  1792.           Case Else
  1793.             XMod8 = 0
  1794.             For ObjectNum = 0 To 5 Step 5
  1795.               For VertexNum = 0 To 3
  1796.                 Rectangle(ObjectNum, VertexNum).X = BaseRectangle(ObjectNum, VertexNum).X
  1797.                 Rectangle(ObjectNum, VertexNum).Y = BaseRectangle(ObjectNum, VertexNum).Y + YOffset
  1798.               Next VertexNum
  1799.             Next ObjectNum
  1800.             For X = 0 To MaxX
  1801.               Select Case XMod8
  1802.                 Case 1
  1803.                   If ComputerPage(Y, X) = 0 Then
  1804.                     SingleRectangle(0).X = Rectangle(0, 0).X
  1805.                     SingleRectangle(0).Y = Rectangle(0, 0).Y
  1806.                     SingleRectangle(1).X = Rectangle(0, 1).X
  1807.                     SingleRectangle(1).Y = Rectangle(0, 1).Y
  1808.                     SingleRectangle(2).X = Rectangle(0, 2).X
  1809.                     SingleRectangle(2).Y = Rectangle(0, 2).Y
  1810.                     SingleRectangle(3).X = Rectangle(0, 3).X
  1811.                     SingleRectangle(3).Y = Rectangle(0, 3).Y
  1812.                     Call OutputRectangle(XMax, XOffset, YMax, SingleRectangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleSENWColor)
  1813.                   End If
  1814.                 Case 5
  1815.                   If ComputerPage(Y, X) = 0 Then
  1816.                     SingleRectangle(0).X = Rectangle(5, 0).X
  1817.                     SingleRectangle(0).Y = Rectangle(5, 0).Y
  1818.                     SingleRectangle(1).X = Rectangle(5, 1).X
  1819.                     SingleRectangle(1).Y = Rectangle(5, 1).Y
  1820.                     SingleRectangle(2).X = Rectangle(5, 2).X
  1821.                     SingleRectangle(2).Y = Rectangle(5, 2).Y
  1822.                     SingleRectangle(3).X = Rectangle(5, 3).X
  1823.                     SingleRectangle(3).Y = Rectangle(5, 3).Y
  1824.                     Call OutputRectangle(XMax, XOffset, YMax, SingleRectangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleSWNEColor)
  1825.                   End If
  1826.                 Case Else
  1827.               End Select
  1828.               XMod8 = XMod8 + 1
  1829.               If XMod8 >= 8 Then
  1830.                 XMod8 = 0
  1831.                 For ObjectNum = 0 To 5 Step 5
  1832.                   For VertexNum = 0 To 3
  1833.                     Rectangle(ObjectNum, VertexNum).X = Rectangle(ObjectNum, VertexNum).X + 3#
  1834.                   Next VertexNum
  1835.                 Next ObjectNum
  1836.               End If
  1837.             Next X
  1838.         End Select
  1839.         YMod4 = YMod4 + 1
  1840.         If YMod4 >= 4 Then
  1841.           YMod4 = 0
  1842.           YOffset = YOffset + Sqrt3
  1843.         End If
  1844.         Y = Y + 1
  1845.       Else
  1846.         State = 5
  1847.       End If
  1848.       If UsePalette Then
  1849.         NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  1850.       End If
  1851.       DoEvents
  1852.       If State < 5 Then
  1853.         Timer1.Enabled = True
  1854.       Else
  1855.         If State = 5 Then
  1856.           AlreadyPainting = False
  1857.           Call HexDisplayUserMoves(MaxX, MaxY, UserPage, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  1858.           If SolutionDisplayed Then
  1859.             Call HexDisplaySolution(MaxY, ComputerPage, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  1860.             Text1.Text = ""
  1861.           Else
  1862.             If UserHasSolved Then
  1863.               Text1.Text = "Congratulations! you did it in" + " " + Text2: Timer2.Enabled = False
  1864.             Else
  1865.               Text1.Text = "Use Home,Up Arrow,PgUp,End,Down Arrow,PgDn to solve."
  1866.             End If
  1867.           End If
  1868.           mnuActionItem(1).Enabled = True
  1869.           mnuActionItem(2).Enabled = True
  1870.         End If
  1871.       End If
  1872.     Case Else
  1873.       DoEvents
  1874.   End Select
  1875. End Sub
  1876.  
  1877. Private Sub SqrDisplaySolution(MaxY As Integer, Page() As Byte, XMax As Double, XOffset As Double, YMax As Double, CosTilt As Double, SinTilt As Double, PixelsPerX As Double, PixelsPerZ As Double, RelDistOfUserFromScreen As Double)
  1878.   Dim DeltaIndex As Byte
  1879.   Dim OldPaletteHandle As Long
  1880.   Dim PathFound As Integer
  1881.   Dim TemDouble As Double
  1882.   Dim X As Integer
  1883.   Dim XNext As Integer
  1884.   Dim XPrevious As Integer
  1885.   Dim XRelative As Double
  1886.   Dim XRelativeNext As Double
  1887.   Dim Y As Integer
  1888.   Dim YNext As Integer
  1889.   Dim YPrevious As Integer
  1890.   Dim YRelative As Double
  1891.   Dim YRelativeNext As Double
  1892.   If UsePalette Then
  1893.     OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  1894.     NumRealized = RealizePalette(frm3DMaze.hDC)
  1895.   End If
  1896.   XRelative = (RelativeWidthOfWall + 1#) / 2#
  1897.   YRelative = (RelativeWidthOfWall + 1#) / 2#
  1898.   CurrentColor = SolutionColor
  1899.   Call DrawLine(XRelative, RelativeWidthOfWall / 2#, XRelative, YRelative, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  1900.   XPrevious = 1
  1901.   YPrevious = -1
  1902.   X = 1
  1903.   Y = 1
  1904.   Do
  1905.     PathFound = False
  1906.     DeltaIndex = 0
  1907.     Do While (Not PathFound)
  1908.       XNext = X + SqrDeltaX(DeltaIndex, 0)
  1909.       YNext = Y + SqrDeltaY(DeltaIndex, 0)
  1910.       If Page(YNext, XNext) = 1 Then
  1911.         XNext = XNext + SqrDeltaX(DeltaIndex, 0)
  1912.         YNext = YNext + SqrDeltaY(DeltaIndex, 0)
  1913.         If (XNext <> XPrevious) Or (YNext <> YPrevious) Then
  1914.           PathFound = True
  1915.         Else
  1916.           DeltaIndex = DeltaIndex + 1
  1917.         End If
  1918.       Else
  1919.         DeltaIndex = DeltaIndex + 1
  1920.       End If
  1921.     Loop
  1922.     If YNext < MaxY Then
  1923.       TemDouble = SqrDeltaX(DeltaIndex, 0)
  1924.       XRelativeNext = XRelative + TemDouble
  1925.       TemDouble = SqrDeltaY(DeltaIndex, 0)
  1926.       YRelativeNext = YRelative + TemDouble
  1927.       Call DrawLine(XRelative, YRelative, XRelativeNext, YRelativeNext, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  1928.     Else
  1929.       Call DrawLine(XRelative, YRelative, XRelative, YMax, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  1930.     End If
  1931.     XPrevious = X
  1932.     YPrevious = Y
  1933.     X = XNext
  1934.     Y = YNext
  1935.     XRelative = XRelativeNext
  1936.     YRelative = YRelativeNext
  1937.   Loop While YNext < MaxY
  1938.   If UsePalette Then
  1939.     NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  1940.   End If
  1941. End Sub
  1942.  
  1943. Private Sub SqrDisplayUserMoves(MaxX As Integer, MaxY As Integer, Page() As Byte, XMax As Double, XOffset As Double, YMax As Double, CosTilt As Double, SinTilt As Double, PixelsPerX As Double, PixelsPerZ As Double, RelDistOfUserFromScreen As Double)
  1944.   Dim DeltaIndex As Byte
  1945.   Dim OldPaletteHandle As Long
  1946.   Dim TemDouble As Double
  1947.   Dim X As Integer
  1948.   Dim XNext As Integer
  1949.   Dim XNextNext As Integer
  1950.   Dim XRelative As Double
  1951.   Dim XRelativeNext As Double
  1952.   Dim Y As Integer
  1953.   Dim YNext As Integer
  1954.   Dim YNextNext As Integer
  1955.   Dim YRelative As Double
  1956.   Dim YRelativeNext As Double
  1957.   If UsePalette Then
  1958.     OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  1959.     NumRealized = RealizePalette(frm3DMaze.hDC)
  1960.   End If
  1961.   Y = 1
  1962.   YRelative = (RelativeWidthOfWall + 1#) / 2#
  1963.   Do While (Y < MaxY)
  1964.     X = 1
  1965.     XRelative = (RelativeWidthOfWall + 1#) / 2#
  1966.     Do While (X < MaxX)
  1967.       If ((Page(Y, X) = 1) Or (Page(Y, X) = 3)) Then
  1968.         For DeltaIndex = 0 To 3
  1969.           XNext = X + SqrDeltaX(DeltaIndex, 0)
  1970.           YNext = Y + SqrDeltaY(DeltaIndex, 0)
  1971.           If Page(YNext, XNext) <> 0 Then
  1972.             If YNext = 0 Then
  1973.               CurrentColor = AdvanceColor
  1974.               Call DrawLine(XRelative, RelativeWidthOfWall / 2#, XRelative, YRelative, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  1975.             Else
  1976.               If YNext = MaxY Then
  1977.                 If UserHasSolved Then
  1978.                   CurrentColor = AdvanceColor
  1979.                   Call DrawLine(XRelative, YRelative, XRelative, YMax, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  1980.                 End If
  1981.               Else
  1982.                 XNextNext = XNext + SqrDeltaX(DeltaIndex, 0)
  1983.                 If XNextNext > 0 Then
  1984.                   If XNextNext < MaxX Then
  1985.                     YNextNext = YNext + SqrDeltaY(DeltaIndex, 0)
  1986.                     If YNextNext > 0 Then
  1987.                       If YNextNext < MaxY Then
  1988.                         If ((Page(YNextNext, XNextNext) = 1) Or (Page(YNextNext, XNextNext) = 3)) Then
  1989.                           If Page(Y, X) = Page(YNextNext, XNextNext) Then
  1990.                             If Page(Y, X) = 1 Then
  1991.                               CurrentColor = AdvanceColor
  1992.                             Else
  1993.                               CurrentColor = BackoutColor
  1994.                             End If
  1995.                           Else
  1996.                             CurrentColor = BackoutColor
  1997.                           End If
  1998.                           TemDouble = SqrDeltaX(DeltaIndex, 0)
  1999.                           XRelativeNext = XRelative + TemDouble / 2#
  2000.                           TemDouble = SqrDeltaY(DeltaIndex, 0)
  2001.                           YRelativeNext = YRelative + TemDouble / 2#
  2002.                           Call DrawLine(XRelative, YRelative, XRelativeNext, YRelativeNext, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  2003.                         End If
  2004.                        End If
  2005.                     End If
  2006.                   End If
  2007.                 End If
  2008.               End If
  2009.             End If
  2010.           End If
  2011.         Next DeltaIndex
  2012.       End If
  2013.       XRelative = XRelative + 1#
  2014.       X = X + 2
  2015.     Loop
  2016.     YRelative = YRelative + 1#
  2017.     Y = Y + 2
  2018.   Loop
  2019.   If UsePalette Then
  2020.     NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  2021.   End If
  2022. End Sub
  2023.  
  2024. Private Sub SqrSolveMaze(Stack() As StackRec, Page() As Byte, NumRoomsInSolution As Integer, Adjacency As Integer, MaxX As Integer, MaxY As Integer)
  2025.   Dim DeltaIndex As Byte
  2026.   Dim PassageFound As Integer
  2027.   Dim StackHead As Integer
  2028.   Dim X As Integer
  2029.   Dim XNext As Integer
  2030.   Dim Y As Integer
  2031.   Dim YNext As Integer
  2032.  
  2033.   NumRoomsInSolution = 1
  2034.   Adjacency = 0
  2035.   X = 1
  2036.   Y = 1
  2037.   StackHead = -1
  2038.   Page(Y, X) = 1
  2039.   Do
  2040.     DeltaIndex = 0
  2041.     PassageFound = False
  2042.     Do
  2043.       Do While ((DeltaIndex < 4) And (Not PassageFound))
  2044.         XNext = X + SqrDeltaX(DeltaIndex, 0)
  2045.         YNext = Y + SqrDeltaY(DeltaIndex, 0)
  2046.         If Page(YNext, XNext) = 2 Then
  2047.           PassageFound = True
  2048.         Else
  2049.           DeltaIndex = DeltaIndex + 1
  2050.         End If
  2051.       Loop
  2052.       If Not PassageFound Then
  2053.         DeltaIndex = Stack(StackHead).Index1
  2054.         Page(Y, X) = 2
  2055.         X = X - SqrDeltaX(DeltaIndex, 0)
  2056.         Y = Y - SqrDeltaY(DeltaIndex, 0)
  2057.         Page(Y, X) = 2
  2058.         X = X - SqrDeltaX(DeltaIndex, 0)
  2059.         Y = Y - SqrDeltaY(DeltaIndex, 0)
  2060.         StackHead = StackHead - 1
  2061.         DeltaIndex = DeltaIndex + 1
  2062.       End If
  2063.     Loop While Not PassageFound
  2064.     Page(YNext, XNext) = 1
  2065.     XNext = XNext + SqrDeltaX(DeltaIndex, 0)
  2066.     YNext = YNext + SqrDeltaY(DeltaIndex, 0)
  2067.     If YNext <= MaxY Then
  2068.       StackHead = StackHead + 1
  2069.       Stack(StackHead).Index1 = DeltaIndex
  2070.       Page(YNext, XNext) = 1
  2071.       X = XNext
  2072.       Y = YNext
  2073.     End If
  2074.   Loop While YNext < MaxY
  2075.   X = MaxX - 1
  2076.   Y = MaxY - 1
  2077.   Adjacency = 0
  2078.   Do While (StackHead >= 0)
  2079.     For DeltaIndex = 0 To 3
  2080.       XNext = X + SqrDeltaX(DeltaIndex, 0)
  2081.       YNext = Y + SqrDeltaY(DeltaIndex, 0)
  2082.       If Page(YNext, XNext) <> 1 Then
  2083.         If Page(YNext, XNext) = 0 Then
  2084.           XNext = XNext + SqrDeltaX(DeltaIndex, 0)
  2085.           YNext = YNext + SqrDeltaY(DeltaIndex, 0)
  2086.           If XNext < 0 Then
  2087.             Adjacency = Adjacency + 1
  2088.           Else
  2089.             If XNext > MaxX Then
  2090.               Adjacency = Adjacency + 1
  2091.             Else
  2092.               If YNext < 0 Then
  2093.                 Adjacency = Adjacency + 1
  2094.               Else
  2095.                 If YNext > MaxY Then
  2096.                   Adjacency = Adjacency + 1
  2097.                 Else
  2098.                   If Page(YNext, XNext) = 1 Then
  2099.                     Adjacency = Adjacency + 1
  2100.                   End If
  2101.                 End If
  2102.               End If
  2103.             End If
  2104.           End If
  2105.         End If
  2106.       End If
  2107.     Next DeltaIndex
  2108.     X = X - 2 * SqrDeltaX(Stack(StackHead).Index1, 0)
  2109.     Y = Y - 2 * SqrDeltaY(Stack(StackHead).Index1, 0)
  2110.     StackHead = StackHead - 1
  2111.     NumRoomsInSolution = NumRoomsInSolution + 1
  2112.   Loop
  2113.   For DeltaIndex = 0 To 3
  2114.     XNext = X + SqrDeltaX(DeltaIndex, 0)
  2115.     YNext = X + SqrDeltaY(DeltaIndex, 0)
  2116.     If Page(YNext, XNext) <> 2 Then
  2117.       If Page(YNext, XNext) = 0 Then
  2118.         XNext = XNext + SqrDeltaX(DeltaIndex, 0)
  2119.         YNext = YNext + SqrDeltaY(DeltaIndex, 0)
  2120.         If XNext < 0 Then
  2121.           Adjacency = Adjacency + 1
  2122.         Else
  2123.           If XNext > MaxX Then
  2124.             Adjacency = Adjacency + 1
  2125.           Else
  2126.             If YNext < 0 Then
  2127.               Adjacency = Adjacency + 1
  2128.             Else
  2129.               If YNext > MaxY Then
  2130.                 Adjacency = Adjacency + 1
  2131.               Else
  2132.                 If Page(YNext, XNext) = 1 Then
  2133.                   Adjacency = Adjacency + 1
  2134.                 End If
  2135.               End If
  2136.             End If
  2137.           End If
  2138.         End If
  2139.       End If
  2140.     End If
  2141.   Next DeltaIndex
  2142. End Sub
  2143.  
  2144. Private Sub SqrGenerateMaze(Page() As Byte, MaxX As Integer, MaxY As Integer, Stack() As StackRec, NumColumns As Integer, NumRows As Integer, Seed() As Byte)
  2145.   Dim DeltaIndex1 As Byte
  2146.   Dim DeltaIndex2 As Integer
  2147.   Dim Digit As Integer
  2148.   Dim DigitNum As Byte
  2149.   Dim PassageFound As Integer
  2150.   Dim RN(7) As Integer
  2151.   Dim RNIndex1 As Integer
  2152.   Dim RNIndex2 As Integer
  2153.   Dim SearchComplete As Integer
  2154.   Dim StackHead As Integer
  2155.   Dim Sum As Integer
  2156.   Dim TemInt As Integer
  2157.   Dim X As Integer
  2158.   Dim XNext As Integer
  2159.   Dim Y As Integer
  2160.   Dim YNext As Integer
  2161.  
  2162.   RN(0) = Seed(0) + 1
  2163.   RN(1) = Seed(1) + 1
  2164.   RN(2) = Seed(2) + 1
  2165.   RN(3) = Seed(3) + 1
  2166.   RN(4) = Seed(4) + 1
  2167.   RN(5) = Seed(5) + 1
  2168.   RN(6) = Seed(6) + 1
  2169.   RN(7) = Seed(7) + 1
  2170.   For Y = 0 To MaxY
  2171.     For X = 0 To MaxX
  2172.       Page(Y, X) = 0
  2173.     Next X
  2174.   Next Y
  2175.   Sum = 0
  2176.   For DigitNum = 1 To 3
  2177.     Digit = RN(0)
  2178.     RNIndex1 = 0
  2179.     RNIndex2 = 1
  2180.     Do While (RNIndex2 < 8)
  2181.       TemInt = RN(RNIndex2)
  2182.       RN(RNIndex1) = TemInt
  2183.       Digit = Digit + TemInt
  2184.       If Digit >= 29 Then Digit = Digit - 29
  2185.       RNIndex1 = RNIndex2
  2186.       RNIndex2 = RNIndex2 + 1
  2187.     Loop
  2188.     RN(7) = Digit
  2189.     Sum = 29 * Sum + Digit
  2190.   Next DigitNum
  2191.   X = 2 * (Sum Mod NumColumns) + 1
  2192.   Sum = 0
  2193.   For DigitNum = 1 To 3
  2194.     Digit = RN(0)
  2195.     RNIndex1 = 0
  2196.     RNIndex2 = 1
  2197.     Do While (RNIndex2 < 8)
  2198.       TemInt = RN(RNIndex2)
  2199.       RN(RNIndex1) = TemInt
  2200.       Digit = Digit + TemInt
  2201.       If Digit >= 29 Then Digit = Digit - 29
  2202.       RNIndex1 = RNIndex2
  2203.       RNIndex2 = RNIndex2 + 1
  2204.     Loop
  2205.     RN(7) = Digit
  2206.     Sum = 29 * Sum + Digit
  2207.   Next DigitNum
  2208.   Y = 2 * (Sum Mod NumRows) + 1
  2209.   Page(Y, X) = 2
  2210.   StackHead = -1
  2211.   Do
  2212.     DeltaIndex1 = 0
  2213.     Do
  2214.       DeltaIndex2 = RN(0)
  2215.       RNIndex1 = 0
  2216.       RNIndex2 = 1
  2217.       Do While (RNIndex2 < 8)
  2218.         TemInt = RN(RNIndex2)
  2219.         RN(RNIndex1) = TemInt
  2220.         DeltaIndex2 = DeltaIndex2 + TemInt
  2221.         If DeltaIndex2 >= 29 Then DeltaIndex2 = DeltaIndex2 - 29
  2222.         RNIndex1 = RNIndex2
  2223.         RNIndex2 = RNIndex2 + 1
  2224.       Loop
  2225.       RN(7) = DeltaIndex2
  2226.     Loop While DeltaIndex2 >= 24
  2227.     PassageFound = False
  2228.     SearchComplete = False
  2229.     Do While (Not SearchComplete)
  2230.       Do While ((DeltaIndex1 < 4) And (Not PassageFound))
  2231.         XNext = X + 2 * SqrDeltaX(DeltaIndex1, DeltaIndex2)
  2232.         If XNext <= 0 Then
  2233.           DeltaIndex1 = DeltaIndex1 + 1
  2234.         Else
  2235.           If XNext > MaxX Then
  2236.             DeltaIndex1 = DeltaIndex1 + 1
  2237.           Else
  2238.             YNext = Y + 2 * SqrDeltaY(DeltaIndex1, DeltaIndex2)
  2239.             If YNext <= 0 Then
  2240.               DeltaIndex1 = DeltaIndex1 + 1
  2241.             Else
  2242.               If YNext > MaxY Then
  2243.                 DeltaIndex1 = DeltaIndex1 + 1
  2244.               Else
  2245.                 If Page(YNext, XNext) = 0 Then
  2246.                   PassageFound = True
  2247.                 Else
  2248.                   DeltaIndex1 = DeltaIndex1 + 1
  2249.                 End If
  2250.               End If
  2251.             End If
  2252.           End If
  2253.         End If
  2254.       Loop
  2255.       If Not PassageFound Then
  2256.         If StackHead >= 0 Then
  2257.           DeltaIndex1 = Stack(StackHead).Index1
  2258.           DeltaIndex2 = Stack(StackHead).Index2
  2259.           X = X - 2 * SqrDeltaX(DeltaIndex1, DeltaIndex2)
  2260.           Y = Y - 2 * SqrDeltaY(DeltaIndex1, DeltaIndex2)
  2261.           StackHead = StackHead - 1
  2262.           DeltaIndex1 = DeltaIndex1 + 1
  2263.         End If
  2264.       End If
  2265.       If ((PassageFound) Or ((StackHead = -1) And (DeltaIndex1 >= 4))) Then
  2266.         SearchComplete = True
  2267.       Else
  2268.         SearchComplete = False
  2269.       End If
  2270.     Loop
  2271.     If PassageFound Then
  2272.       StackHead = StackHead + 1
  2273.       Stack(StackHead).Index1 = DeltaIndex1
  2274.       Stack(StackHead).Index2 = DeltaIndex2
  2275.       Page(YNext, XNext) = 2
  2276.       Page((Y + YNext) \ 2, (X + XNext) \ 2) = 2
  2277.       X = XNext
  2278.       Y = YNext
  2279.     End If
  2280.   Loop While StackHead <> -1
  2281.   Page(0, 1) = 1
  2282.   Page(MaxY, MaxX - 1) = 2
  2283. End Sub
  2284.  
  2285. Private Sub SqrSelectMaze(Seed As String, Page() As Byte, MaxX As Integer, MaxY As Integer, Stack() As StackRec, NumRoomsInMaze As Integer, NumColumns As Integer, NumRows As Integer, SecondsForMazeSelection As Double)
  2286.   Dim Adjacency As Integer
  2287.   Dim Counter0 As Byte
  2288.   Dim Counter1 As Byte
  2289.   Dim Counter2 As Byte
  2290.   Dim Counter3 As Byte
  2291.   Dim Counter4 As Byte
  2292.   Dim Counter5 As Byte
  2293.   Dim Counter6 As Byte
  2294.   Dim Counter7 As Byte
  2295.   Dim ElapsedTime As Double
  2296.   Dim MinAdjacency As Integer
  2297.   Dim NumRoomsInSolution As Integer
  2298.   Dim NumRoomsInSolutionAtMin As Integer
  2299.   Dim RN(7) As Integer
  2300.   Dim RNIndex1 As Integer
  2301.   Dim RNIndex2 As Integer
  2302.   Dim SeedByte(7) As Byte
  2303.   Dim SeedByteAtMin(7) As Byte
  2304.   Dim SeedLength As Integer
  2305.   Dim StartTime As Double
  2306.  
  2307.   SeedLength = Len(Seed)
  2308.   If SeedLength > 8 Then SeedLength = 8
  2309.   RNIndex1 = 0
  2310.   For RNIndex2 = 1 To SeedLength
  2311.     RN(RNIndex1) = Asc(Mid$(Seed, RNIndex2, 1)) Mod 10
  2312.     RNIndex1 = RNIndex1 + 1
  2313.   Next RNIndex2
  2314.   RNIndex2 = 7
  2315.   Do While (RNIndex1 > 0)
  2316.     RNIndex1 = RNIndex1 - 1
  2317.     RN(RNIndex2) = RN(RNIndex1)
  2318.     RNIndex2 = RNIndex2 - 1
  2319.   Loop
  2320.   Do While (RNIndex2 >= 0)
  2321.     RN(RNIndex2) = 8
  2322.     RNIndex2 = RNIndex2 - 1
  2323.   Loop
  2324.   Counter0 = RN(0)
  2325.   Counter1 = RN(1)
  2326.   Counter2 = RN(2)
  2327.   Counter3 = RN(3)
  2328.   Counter4 = RN(4)
  2329.   Counter5 = RN(5)
  2330.   Counter6 = RN(6)
  2331.   Counter7 = RN(7)
  2332.   Call Hash(Counter0, Counter1, Counter2, Counter3, Counter4, Counter5, Counter6, Counter7)
  2333.   MinAdjacency = 2 * NumRoomsInMaze + 1
  2334.   NumRoomsInSolutionAtMin = 0
  2335.   SeedByteAtMin(0) = Counter0
  2336.   SeedByteAtMin(1) = Counter1
  2337.   SeedByteAtMin(2) = Counter2
  2338.   SeedByteAtMin(3) = Counter3
  2339.   SeedByteAtMin(4) = Counter4
  2340.   SeedByteAtMin(5) = Counter5
  2341.   SeedByteAtMin(6) = Counter6
  2342.   SeedByteAtMin(7) = Counter7
  2343.   StartTime = Timer
  2344.   Do
  2345.     SeedByte(0) = Counter0
  2346.     SeedByte(1) = Counter1
  2347.     SeedByte(2) = Counter2
  2348.     SeedByte(3) = Counter3
  2349.     SeedByte(4) = Counter4
  2350.     SeedByte(5) = Counter5
  2351.     SeedByte(6) = Counter6
  2352.     SeedByte(7) = Counter7
  2353.     Call SqrGenerateMaze(Page(), MaxX, MaxY, Stack(), NumColumns, NumRows, SeedByte())
  2354.     Call SqrSolveMaze(Stack(), Page(), NumRoomsInSolution, Adjacency, MaxX, MaxY)
  2355.     If 3 * NumRoomsInSolution >= NumRoomsInMaze Then
  2356.       If Adjacency < MinAdjacency Then
  2357.         MinAdjacency = Adjacency
  2358.         NumRoomsInSolutionAtMin = NumRoomsInSolution
  2359.         SeedByteAtMin(0) = SeedByte(0)
  2360.         SeedByteAtMin(1) = SeedByte(1)
  2361.         SeedByteAtMin(2) = SeedByte(2)
  2362.         SeedByteAtMin(3) = SeedByte(3)
  2363.         SeedByteAtMin(4) = SeedByte(4)
  2364.         SeedByteAtMin(5) = SeedByte(5)
  2365.         SeedByteAtMin(6) = SeedByte(6)
  2366.         SeedByteAtMin(7) = SeedByte(7)
  2367.       Else
  2368.         If Adjacency = MinAdjacency Then
  2369.           If NumRoomsInSolution > NumRoomsInSolutionAtMin Then
  2370.             NumRoomsInSolutionAtMin = NumRoomsInSolution
  2371.             SeedByteAtMin(0) = SeedByte(0)
  2372.             SeedByteAtMin(1) = SeedByte(1)
  2373.             SeedByteAtMin(2) = SeedByte(2)
  2374.             SeedByteAtMin(3) = SeedByte(3)
  2375.             SeedByteAtMin(4) = SeedByte(4)
  2376.             SeedByteAtMin(5) = SeedByte(5)
  2377.             SeedByteAtMin(6) = SeedByte(6)
  2378.             SeedByteAtMin(7) = SeedByte(7)
  2379.           End If
  2380.         End If
  2381.       End If
  2382.     End If
  2383.     Call Increment(Counter0, Counter1, Counter2, Counter3, Counter4, Counter5, Counter6, Counter7)
  2384.     ElapsedTime = Timer - StartTime
  2385.   Loop While ((ElapsedTime >= 0#) And (ElapsedTime < SecondsForMazeSelection))
  2386.   Call SqrGenerateMaze(Page(), MaxX, MaxY, Stack(), NumColumns, NumRows, SeedByteAtMin())
  2387.   Call SqrSolveMaze(Stack(), Page(), NumRoomsInSolution, Adjacency, MaxX, MaxY)
  2388. End Sub
  2389.  
  2390. Private Sub SqrOutputMaze()
  2391.   Dim ObjectNum As Byte
  2392.   Dim Radians As Double
  2393.   Dim RadiansPerDegree As Double
  2394.   Dim SingleRectangle(3) As VertexRec
  2395.   Dim SingleTriangle(2) As VertexRec
  2396.   Dim TemDouble1 As Double
  2397.   Dim TemDouble2 As Double
  2398.   Dim TemDouble3 As Double
  2399.   Dim TemDouble4 As Double
  2400.   Dim Triangle(3, 2) As VertexRec
  2401.   Dim VertexNum As Byte
  2402.   Dim XMod8 As Byte
  2403.   Dim X0 As Double
  2404.   Dim X1 As Double
  2405.   Dim X2 As Double
  2406.   Dim X3 As Double
  2407.   Dim Y0 As Double
  2408.   Dim Y1 As Double
  2409.   Dim Y2 As Double
  2410.   Dim Y3 As Double
  2411.  
  2412.   Select Case State
  2413.     Case 0
  2414.       Text1.Text = ""
  2415.       ScaleMode = 1
  2416.       If (Resize) Then
  2417.         Text2.Left = ScaleWidth - 1000
  2418.         TemDouble1 = ScaleWidth - VScroll1.Width
  2419.         TemDouble2 = MinWallLengthInInches
  2420.         TemDouble2 = 1440# * TemDouble2
  2421.         TemDouble3 = RelativeWidthOfWall
  2422.         NumColumns = Int(TemDouble1 / TemDouble2 - TemDouble3)
  2423.         If NumColumns < 2 Then NumColumns = 2
  2424.         TemDouble1 = ScaleHeight - Text1.Height
  2425.         TemDouble2 = ScaleWidth - VScroll1.Width
  2426.         ScaleMode = 3
  2427.         TemDouble3 = NumColumns
  2428.         NumRows = Int((TemDouble1 * TemDouble3) / TemDouble2)
  2429.         If NumRows < 2 Then NumRows = 2
  2430.         Tilt = 90 - VScroll1.Value
  2431.         MaxX = 2 * NumColumns
  2432.         MaxY = 2 * NumRows
  2433.         NumRoomsInMaze = NumRows * NumColumns
  2434.         ReDim ComputerPage(MaxY, MaxX)
  2435.         ReDim UserPage(MaxY, MaxX)
  2436.         ReDim Stack(NumRoomsInMaze)
  2437.         Call SqrSelectMaze(Seed, ComputerPage(), MaxX, MaxY, Stack(), NumRoomsInMaze, NumColumns, NumRows, SecondsForMazeSelection)
  2438.         For UserX = 0 To MaxX
  2439.           For UserY = 0 To MaxY
  2440.             If ComputerPage(UserY, UserX) = 0 Then
  2441.               UserPage(UserY, UserX) = 0
  2442.             Else
  2443.               UserPage(UserY, UserX) = 2
  2444.             End If
  2445.           Next UserY
  2446.         Next UserX
  2447.         UserX = 1
  2448.         UserXRelative = (RelativeWidthOfWall + 1#) / 2#
  2449.         UserY = 1
  2450.         UserYRelative = (RelativeWidthOfWall + 1#) / 2#
  2451.         UserPage(UserY, UserX) = 1
  2452.         Resize = False
  2453.       End If
  2454.       If (Paint) Then
  2455.         ScaleMode = 3
  2456.         Cls
  2457.         RadiansPerDegree = Atn(1#) / 45#
  2458.         Radians = Tilt * RadiansPerDegree
  2459.         SinTilt = Sin(Radians)
  2460.         CosTilt = Cos(Radians)
  2461.         TemDouble1 = PerDegree
  2462.         SinTilMaze)
  2463.         Call SqrSelectdjacency < MinAdjacency ThY0 To 5 Step 5
  2464.    E2 = PerDegreeTilt = Sin(Radians)
  2465.         CosTilt = Cos(Radians)
  2466.         TemDouble1 = PerDegree
  2467.         SinTilMaze)
  2468.         Call SqrSelectdjacency < MinAdjacency ThY0 To 5 Step 5
  2469.    E2 = PerDegreeTilt = Sin(Radians)
  2470.         CosTilier4, Counte SeedByteAt(6)
  2471.   Counter7 = RN(7)e(0  X = 2 * (Sum Mod NumColumns) + 1
  2472.   Sum = 0YhY0 To 5 Sth0 Then
  2473.  o 5 Step 5
  2474.    E2 = PerDegr To 5   X = 2 * (Sum Mod NumCol2Int(nter0 = RN(0)
  2475.   Counter1 = Rnunter1 = Rnunter1 Singlep 5
  2476.    Y)
  2477.     If 3 =         SingleTriangle(0).Y =E2 = PerDegreeTilt = Sin(Radians)
  2478.     1    CaI)
  2479.     If 3 =        2HeadbCol2Int( 3 =       Radi92 = PerDegr To 5   X = 2 * 15 Step 5
  2480.    E2 = PerDegr 062X7   E2 = PieMax, SingleRectangle()06, NumRows, SeedByteAtMin())
  2481. MinAdjacency ThY0 To 5 Step 5
  2482.    E2 = PerDegreeTilt = Sin(Radians)
  2483.         Ct PerD    e SeedByteAt(6)
  2484.   erD    e   93 =        2HeadbCol2IntbjectNum, Vertee(0  X = 2 * (Sum Mod NumColesize) Then
  2485.           PerD =e5hen
  2486.    7ntbjectNum, Vertee(0  X = 2 * (Sum Mod NumColesi= RN(0)
  2487.   Coectangle(Ye(0  X = 2 * (Sum 6n
  2488.  
  2489.   Coectangle(Ye(0  X  2 * (Sum Mod NumColesize) Th1.Text = ""
  2490.       ScaleMoL 45#
  2491.         Radt,   CosTilt
  2492.    Y)
  2493.     If 3 =         SingleTriangle(0).Y =ERadtfUserFromScreen, False, r1  YesTilt
  2494.    Y)
  2495.     If 3 =       Y)
  2496.     If 3 =       Y)
  2497.   Ye(0  X  2 * (2) As Ver) + 1
  2498.   Page(Y, X)eor, St2 VertexNum
  2499.      -rtsTilt
  2500.   nSolutionAtMin As 7re) Then
  2501.           PerD =e5hen
  2502.  = SeeD8oL 45#
  2503.       irD r2
  2504.  = SeeD8oL 4  Y)
  2505.     If 3 =       Y)sT Step 5
  2506.   X = 2 F1th - VScroll1.Wn nSoluTe)
  2507.     RN(RNIndex2) = 8
  2508.     RNIf 3 =       Y)sT Step 5
  2509.   X = 2 F1th - VScroll1.Wn nSolu22ectNum, Vertee(0  X =  PerD =e5h X  2 * (2) As Ver) + VScroll1.Wn5
  2510. 2ll1.Wn nSolu22ectNum, Ve=  PerD =e5h X  2 ter1 Singlep 5
  2511.    irD r2
  2512. teron-en
  2513.               UserPage(UserY, UserX) = 0
  2514.             Else
  2515.               UserPage(UserY, UserX) = 2
  2516.             End If
  2517.           Next UserY
  2518.         Next UserX
  2519.         UserX = 1
  2520.         UserXRelative = (RelativeWidthOfWall + 1#) / 2#
  2521.         UserY lativeWidthOfWall + 1#)Y laep 5
  2522.    irD r2
  2523. terontRectangle(Xl1.Wn nSolu22ecFg1 S      UserXRelative = (Rel    X = 2 * 15 Stephile ((Delt2            If YNext > Max          If YNext esi= RN(0 TemDouble3 = Relll1.Wn nSolu22ectNum, V            r>ext > Max  f YNext esi= RN(0              UserPaCdS       BytttttttttDlve9S       r2
  2524.  = SeeD8oL 4  Y)
  2525.    ji       Else
  2526.             6cNai       ElH1 UserX) = 2
  2527.             
  2528.    j+acNai       ElH1 n1n n     UserY = 1
  2529.       NumRoomsInMaze = NumRows * NumColumns
  2530.     Rows * NumC  ElH1 UserX) = 2
  2531.   ue
  2532.        = 3
  2533.    erX) = 2    = 3
  2534.    erX) = 2  2    = 3
  2535.    er= 3
  2536.                        = 2  2    = 3
  2537.    er= 3
  2538.               er= 3
  2539.         6e(1).X =     
  2540.    erX) = 2    = 3
  2541.    erX) = 2  2    = 3
  2542.    er= 3
  2543.                        age(UserYsPerDegree = Atn(1#) / 45#
  2544.         Radif
  2545.    lution > NumRoomsInSodif
  2546.    lution > Nuoomslt, PixeliiY
  2547.         TemDoubleH 2 r2
  2548.  = SeeS r2
  2549.  = SeeS r2
  2550.  = SeeS  RectreeTilt SeeS r2
  2551.  = SeeS r2eeS r2
  2552.  = SeeS r2eeS r2
  2553.  = SeeS r2eeS r2
  2554.  =e   = 2  2    = 3
  2555.    e
  2556.         UserXRel 
  2557.    erX) = 2    = 3
  2558.    erX) = 2  UseeU7cSeeS r2
  2559.  = SeeS  RectreeTilt Y 3
  2560.    erX) = 2  UseeU7  TemDouble1 = PerDegreeeeD8oL 4  Y)1 = PerDegreeeeD8eU7  TemDouble1Yext = "Use Home,Up Arro0eeTilt Y2    = 3
  2561.    erX) = 2  UseeU7cSeeS r2
  2562.  = SeeS  RectreeTilt Y 3
  2563.    erX) = 2  UseeU7  TemDouble1 = PerDe)1ltaIndex, 0)
  2564.     If YNext <= MaxY Then
  2565. IxY Then
  2566. IxY Then
  2567. In
  2568. IxNeeS r2
  2569.  sInMaze, Nr Objn
  2570. IxNeeS r2
  2571.  sInMaze,   UserPage Arro0eeTiltr2
  2572.  sInMazeAaze01           For VertexNum = 0 To  
  2573.    erX) = 2    = 3
  2574.    e
  2575.  sInMaze, Nr Objn
  2576. IxNeeS r2
  2577.  VertexNum = 0 To  
  2578.    7azee   93 =    7erX) = 2  azee   93 =    7erX) nMaze, Nr Objn
  2579. IxNe2lN VertexNum = 0 To  
  2580.    7azee 
  2581.    erX) = 2jn
  2582. IxNeeS r2
  2583.  sIn 93 =    7erX) nMaze2 3
  2584.    erX) = 2  2    = 3= 3
  2585.    e
  2586.  sInMaze, Nr Objn
  2587. IxNeeS rx  = LemFor VertexNu 0 To  
  2588.    erX) = 2    = 3
  2589.   To  
  2590.    1)Y / 45#
  2591.         Radif
  2592.    luTilt
  2593.    Y)
  2594.     If 3 = ,3 3S Y)
  2595.     If u2egIDegreeTilt = Sin(Rad  Radif
  2596.   
  2597.     If u2eYRelative, Yp(r Objn0
  2598. IxNeeS r2
  2599.  sInMaze,   U = PerDegr To 5   X = 2 * 151
  2600.  sInMaze,   U6L Y 3
  2601.    erX) = 2  Usee sInMazeAaze01           Fo      Radi92 = PerDegr S  luTilt
  2602.    Y)
  2603.     If 3 =1 1)Y / 45   lt
  2604.    Y)
  2605. 7 Yp(r Objn0
  2606. IxNeeS r2
  2607.  sInMazaze,   U6L 8)Y / 45   lt
  2608.    Y)
  2609. 7 .sp SeeS  RectreeTilt Y 3
  2610.    erX) = 2  UseeU7  TemDous = Y
  2611.     Xdh= SeeS r2eeS r2
  2612.  =e   = 2  2   tegreeTil r2
  2613.  = SeeS  RectreeTilt Y 3
  2614.  tPage(Usep2
  2615.  sIn As Integer, Page() As Byte, XMax As e2    = = Adjacency + 1
  2616.           Else
  2617.     3
  2618.  tPage As Integer, P= SeeD8olt
  2619.    Y)
  2620. 7 .sp SeeS = = Adjacenc esi= RN erX) = 2  UseeU7  T
  2621.       End If= SeeD8oL 4SolutionAtMin As ,MaxY T= YOemDoutbjectNum, Vertee(0  X = 2 *rDegr S  luTilt
  2622.    Y)
  2623.     If *rDeL71o Step 5
  2624.   X m  3
  2625.  tPage As Integer, P= SeeD8olt
  2626.    Y)
  2627. tive As Double
  2628.   D er= 3
  2629.         6e(1).X 19)Step 5
  2630.   X sgle(2).X = Tl     If YN   If 3 =   2e() As If YN   If 3 =   2e() As f YNtive   X sgle(2lt
  2631.    Y)
  2632.     If *rD Then
  2633. In
  2634. en
  2635.       r2
  2636.  VertexNum = 0 To =VertexNumY = 1
  2637.         UserYRelaA   If (RelativeWidthOfWall + A X sgl#
  2638.         UserPage(UserA / 45)
  2639.     IC=Page(UserA /  = FalsAUserA If 3 =   2esAUserA If 3 =   2esAUserA If 3 =   2esAUserA If 3 =   2esAUserA If 3 =  2 ScaleMode = 3
  2640.   (mDoutbjectNum, Vertee(  If 3 =   Arro0eeTilt Y2                         = 1
  2641.         AUserA If 3 =
  2642.         AUserA If 3 =
  2643.         AUserA If  If 3 =
  2644.         AUserA If  2x     =3 =07emDoutbjectNum, Vertee(0  X azee   93eS  Rectreet
  2645.    Y)
  2646. 7 .sp S Rect SqrDeltaX(DeltaIndex, 0YYelat3 AUserA If BRect Sq tegreeelat3 AUserA If BRe1o ze,   U6L 8)Y / 45   ltreeTimDouble1 / Tem7  r2
  2647.  = SeeD8oL  .sp SeeS  RectreeTilt.sp SeeS  Rectrex, 0YYelat3 AUserA mtegreeelat3 AUserA IPage As Integer, P= Se SeeS  Rectrn P=   = 2  2   Yelat3 AUserA mteA / 45)
  2648.     IC=PP=   = 2  2 2   X sgle(2)lt Y 3
  2649.  tPa 2   X sgle(2)lt UserA If 3 =
  2650.         AUserA If 3 =
  2651.       
  2652.    Y)  er= 3ge As Integer, P= Se Se) 3 =VertexNum = 0 To  
  2653.  i  
  2654.    Y)  er= 3ge As IntegeoYNext, XNext) = 0 Then2 - TemDo3 =VertexNum = 0 To  
  2655.  i  
  2656.    Y)  er= 3ge As IntegeoYNext, XNext) = 0 Then2 - TemDo3 =VertexNum = 0 To  
  2657.  i  
  2658.    Y)  er= 3ge As IntegeoYNext, XNext) = 0 Then2 - TemDo3 =VertexNum = 0 To  
  2659.  i  
  2660.    Y)  er= 3ge As IntegeoYNext, XNext) = 0 Then2 - TemDo3 =nl
  2661.         Scal 1
  2662.     XNext = X    XNext = X    XNext = X    XNea3t
  2663.    TemDo3 =nl
  2664.         Sc3 =VertexNu2 * SqrDeltaY(Stack(Sxreeelat3 AUegreeTilt = Sin(Rad  Rad0-3 =nl
  2665.         Sc3)0 Then2U=nl
  2666.         Sc3)0 ThaY(Stack(Sxreeelat3 AUegr0 ThaY(Stack(Sxreeelat3 AUetack(SxreeelYlativeWidthOfWall + A Xa
  2667.    7azentiveWmDo3 =VertexNum = 0 To  
  2668.  i  
  2669.    Y)  er= 3ge As IntegeoYNext, XNext) = 0 Then2 - TemDo3 =VertexNum = 0 To  
  2670.  i  
  2671.    Y)  er= 3ge As IntegeoYNext, XNext) = 0 Then2 - TemDo3 SqrDeltaX(DeltaX(DeltaX(DeltaX(DeIndex2 + TemDo3 =Vertex2tNext) = 0 Then2 - TemDo3 S
  2672.         2 - TemDo3 S2(DeIndex2 + TemDo3 =Vertex2telat3 = 0 Then2 e1/ Tem7  r2xNum = 0 To  
  2673.  pemDo3 S2(DeIndex2 +x2telat3    7ntbject1*eS r2
  2674.    7n1, 0)
  2675.     NumRealized =0)
  2676.     NumRealizedat3    7ntbject1*eS r2
  2677.    e1/ Tem7eS r2
  2678.    e1/ Te e1/ Tem7eS r2
  2679.    e
  2680.    e1/ Te e1/ Tem7eS r2
  2681.    e
  2682.    e1/ Te e1/ Tem7eS r2
  2683.     dxe As Intenl
  2684.         Sc3)0 ThaY(Stack(e1/ TS1/ Tem7eS r2
  2685.    e
  2686.   Y(Stack(e1/ TS1/ Tem7 Sc3 =Vert)exNum PteoYNext, XNeTem7eS r2
  2687.    e1/ Te e1/ Tem7ext, XNeTem7e XNeTe7ext, XNeTem7e XNeTe7ext, Nr eTem7e XNeTeDL PteoYNext7MazeAaze0XNeTeDL PteoYNext7MazeAt, Nr eTem7e XNeTeDL 1DL Pte1Aiiiii r2
  2688.    If *rD Then
  2689. In
  2690. en
  2691.       r  Sc3)0 ThaY(Stack(Sxr eTem7e XNeTeDL 1DL Pte1Aiiiii r2
  2692.    If *rD ThentreeTilt Y 3
  2693.    erX) (l3
  2694.    erX) (l3
  2695.    
  2696.    erX) (l3
  2697.    
  2698.    erX
  2699.    erX) r eTem7 r  erX) (l3
  2700.    
  2701.    erX
  2702.    e erX
  2703.  lr  erX) (Sd3 = Sin(RaerX) (l3
  2704. y        ).) (l3
  2705. y   ge As In-t           If UserHasSot1*eS r2
  2706.    e1/ Tem7eS r2
  2707.    e1/  e1/ Tem7eS r2
  2708.    e1/  e1/ Tem7eS tlat3 AUetack(SxreeelYlative-tSLerX) (l3m7 r  erX) (leS taNr eTem7e XNeTeDL 1DL Pte1Aii9 5
  2709.    E2 = erX) (l3aDeltaX(DeltaX(DeltaX(DeIndexeltaX(DeltRectangle(5, 1).X
  2710.                     Sinem7e XNeTeDL 1DL Pte1Aii9 5
  2711.    E2 = erX) (l3aDeltaX(DeltaX(DeltaX(DeIndexeltaX(DeltRectangle(5, 1).X
  2712.                     Sinem7e XNeTeDL 1DL Pte1Aii9 5
  2713.    E2 = erX) (l3aDeltaX(DeltaX(DeltaX(DeIndexeltaX(DeltRectangle(5, 1).X
  2714.               Y An(Rad  Rad0 erX) (l3sD =e5h X  2 ter1 Singlep 5
  2715.    iad0 erX) (l3sD =e5h  iad0 erX) (l3sD =e3sD =e5h X  2 ter1 Singld0   iad0 ere3sD =e5h X  2 ter1   TemDoubl             Sinem7e XNeTeDL 1DDDDDDDDDDDDDDDDDD3 =ubl DL 1DL Pte1Aii9 5L 1DL Pte1Ate1Aii9 5L 1DL Pt-lse
  2716.     SearchComplete = False
  2717.     Do While (Not SearchComplete)
  2718.       Do While ((DeltaIndex1 < 4) And (Not PassageFound))
  2719.         XNext = X + 2 * SqrDeltaX(DeltaIndex1, DeltaIndex2)
  2720.         If XNext <= 0 T
  2721.    e erX
  2722.  lr  erX) eg2= 0 T
  2723.    e erX
  2724.  1).X
  2725.          X
  2726.  1).Xeg2= 0 T
  2727.    e erX
  2728.  1).X
  2729.  XNext <= 0 T
  2730.    e   TemDoubl     X
  2731.   XNNNNNNNxt7Mabl     X
  2732. DDDDaaaaaaaaaaYl     X
  2733.   XNNNNNN=texNum).X + 3#
  2734.                   Next VertexNum
  2735.                 Next Ol     X(
  2736.    E2 = erX) (l3aDelNext Ol     X(
  2737.    Y An(Rad  RalNext Ol     X(
  2738.    Y An(Rad  Ral9,DelNext Olm(
  2739.    Y AngleTriangle(0).Y =ERadtfUseFDoubl     X
  2740.   XNNXRelativeNex-oubl     X
  2741.   XNNX  Y An(Rad  RalNext Ol     X(
  2742.    Y An(RaY61   
  2743.    e
  2744.   Y)      = 3ge As IntegeoYNext, XNext) = 0 Then2 - TemDeltaXxNumFromSC        3s6ge AxNumFromSC        3s6ge s1)2lative-tSLerX) (l3m7 r  erX) (leS taNr eTem7e XNeTeDrX) (l) 0 Then2 - TemDeltaXxNumFros I   UserPage(UserA / 45UserA If 3 =
  2745.         AUse 3ge UserA If 3 =
  2746.      e s1)2lativ 8)Y / 45   ltreeTimDouble1 / Tem7 =
  2747.      e s1)2lativ 8)Y / 45  =P83 =
  2748.         AUse 3  =P83 =
  2749.         AUse 3  =P83 =
  2750.         AUse 3 ,3    Next oIntegeoYNext, XNext) = 0 Then2 - TemDeltaXxNumFromSC        3s6ge AxNumFromSC        3s6ge s1)2lative-tSLerX) (l3m7 r  erX) (leS taNr eTem7e XNPerZ, RelDistOfUsee
  2751.     SearchComplete = FOfUsee
  2752.     Sea
  2753.    Y An(Rad  Raea
  2754.    Y 2
  2755.    e1/  e1/ Tem7eS tlatlete = FOfUsee
  2756.  
  2757.    7nm7 r  eoNPerZ,AUetack61PF1ext) = e
  2758.  
  2759.    7nm
  2760.      e s1)2lativ 8)Y / 46emDeltaXxNumFromSC        3s6ge AxNumFromSC        3s6ge s1)2lative-tSLerX) (l3m7 r  erX) (leS taNr eTem7e XNeTeDrX) (l) 0 Then2 - TeXmFromSC       )s6mFromSC        wRadif
  2761.    lution > NumRoomsInnl
  2762.   ,e 3  =P83 =
  2763.         AUseBn > NumRoo=
  2764.   7Vertee(0  T3  =P83 =7 SearchComplete)
  2765.     3NX  Y An(Rad        NexIext, XNe, Puuuuu XNe, Puuuuu XNen=
  2766.    e1/  e1/ Tem7eS tlat3 AUetack(Sxr6= Di 3NX  Y An(Rad     SqrDeltaY(Stack(Sxreeela SqrDeltaY(Stack(Sxreeela 1    X(
  2767.    E2 = erX) (l3DeltaIX(
  2768.    E2 = eectdjacency < Min16)Pte1Ate1Aii9 5L 1DL P(n1Ate1Ai1Aii9 5e) Y An(Rad   ) (l3DeltaIX<i1Aii9 5e) Y An(Rerlized = RealizePalette(frm3DMaze.hDC)
  2769.   End Ifn16)Pte1Ate1Aii9 5L 1DL P(n1Ate1Ai1Aii9 5e) Y .veWidthOfWall /5L 1DL P(n1Yn16)Pte1Ate1Aii9 5L 1DL P(n1At37S r2n nSolu22ectNum, Ve=  PerD =e5h X  2 ter1 SinglepL 1DL Pte1Aii9 5
  2770.    E2m7e XNeTeDrXlu22ectNum, Ve=  PerD =e5h X  2 ter1 SinglepL 1DL Pte1Aii9 5
  2771.    E2m7e XNeTeDrXlu22ectNum, Ve=  PerD =e5h X  2 ter1 SinglepL 1DL Pte1Aii9 5
  2772.    E2m7e XNeTeDrXlu22ectNum, Ve=  PerD =e5h X  2 ter1 SinglepL 1DL Pte1Aii9 5
  2773.    E2m7e XNeTeDrXlu22ectNum, Ve=  PerDctNum, Ve=  PerD =e5h X  2 ter1 SinglepL 1DL Pte1Aii9 5
  2774.    E2m7e XNeTeDrXlu22ectNum, Ve=  PerD =e5h X  2 ter1 SinglepL 1DL Pte1Aii9 5
  2775.    E2m7e XNeTeDrXlu22ectNum, Ve=  PerDctNum, Ve=  PerD =e5h X     Y An(Rad  RalNext Ol     X(1SeeS  RectreeTilt.sp SeeS  Rectrex, 0YYelat3 AUsesD =e52 RectreeTilt.sp SeeS L P(n1t.sp SeeS  Rectrex, 0YYelat3 AUsesD =e5)= 0 Then2 - TemDeltaXdex1 - 1
  2776.   YctreeTilt.sp SeeS L P(oYYelat3 D =e52 RectreeTilt.sp SeeS L P(n1t.sp SeeS  Rects,e5)= 0 Then2 - TemDeltaXdex1 - 1
  2777.   YctreeTilt.sp SeeS L P(oYYelat3 D =e52 RectreeTilt.sp SeeS L P(n1t.sp SeeS  Rects,e5)= 0 Then2 - TemDeltaXdex1 - 1
  2778.   YctreeTilt.sp SeeS L P(oYYelat3 D =e52 RectreeTieTilt.sp SeeS22 - TemDeltaXdex1 - 1
  2779.   Ys IntegeoYNext, XNext) = 0 Then2 - TemDeltaXxNumFromSC        3s6ge AxNumFromSC        3s6P(n1At37S r2n nSolu22ectNum, Ve=  PerD =etaXdex1 - 1
  2780.   Ys IntegeoY
  2781.   XNNNNNNNxt7Mabl     X
  2782. DDtNNxMabl   )0uA5h X  2 ter1 SinglepL 1DL Ptein SeeS L P(n1oNumR+e(0).Y =ERadtfUseFDoubl     X
  2783.   XNNXRelativeNex-oubl     X
  2784.   XNNX  Y An(Rad  RalNext Ol     X(
  2785.    Y An(RaY61   
  2786.    e
  2787.   Y)      = 3ge As IntegeoYNext, XNext) = 0 Then2 - TemDeltaXxNumFromSC        3s6ge AxNumFromSC        3s6ge s1)2lative-tSLerX) (l3m7e Ve=  PerD =e5h X  2 ter1 SinglepL 1DL Pte1Aii9 5
  2788.    E2m7e XNeTeDrXlu22ectNum, Ve=  PerDctTeDrXlu22ectNum, sectNum, sectNum, sectN PerDctTeDrXlu22ec, sectN PerDctTerIserA If  2x     =3 )Pte1Ate1Aii9 5L 1DL P(1DL Pte1Aii9 5
  2789.    E2m7L 1         Sinem7e XNeTeDe1At 1DL P(1DL Pte1Aii9 5
  2790.       DrDctTerIserA If  2x     ectN PerDctTNx     ectae(1DL Pte1Aii9 5
  2791.    ae(1DL Pte1Aii9 5 sectNum, s   1DL P(1=e5PerDctTeDrXl     DrDctTerIserA If  S taNr eTem7e XNeTeDrX) (l) 0 Then2 - TemerDctTerIserA If  2x2YW0L Ptein SeeS L P(n1oNumR+e(0).Y =ERadtfUseFDoubl     X
  2792.   XNNXRelativeNex-oubl     X
  2793.   XNNX  Y An(Rad  RalNext Ol     X(
  2794.    Y An(RaY61   
  2795.    e
  2796.   Y)      = 3ge As IntegeoYNext, XNext) = 0 Then2 - TemDeltaXxNumFromSC        3s6ge AxNumFromSC        3s6ge  0 Then2 NeTeDrA    
  2797.    Y)  er= 3g30eDrA    
  2798.    Y)  ertaXdex1 - 1
  2799.  
  2800.    Y)  erta&6ge  0 Then2 Ne,1erta&6ge  0 Then2 Ne,1erta&6ge  0    ae(rta&6ge  0,o6o-t      eTilt.s&6ge