home *** CD-ROM | disk | FTP | other *** search
/ 1,000 Best Games for Windows / 1000BestGamesForWindows.iso / sharewarefin / 3DMAZE12.ZIP / 3DMAZE.FR_ / 3DMAZE.FR
Text File  |  1995-11-26  |  125KB  |  3,387 lines

  1. VERSION 4.00
  2. Begin VB.Form frm3DMaze 
  3.    BackColor       =   &H00FFFFFF&
  4.    Caption         =   "3DMaze"
  5.    ClientHeight    =   4464
  6.    ClientLeft      =   1560
  7.    ClientTop       =   1980
  8.    ClientWidth     =   6000
  9.    Height          =   5136
  10.    Icon            =   "3dmaze.frx":0000
  11.    KeyPreview      =   -1  'True
  12.    Left            =   1512
  13.    LinkTopic       =   "Form1"
  14.    ScaleHeight     =   4464
  15.    ScaleWidth      =   6000
  16.    Top             =   1356
  17.    Width           =   6096
  18.    Begin VB.TextBox Text1 
  19.       BackColor       =   &H00FFFFFF&
  20.       BorderStyle     =   0  'None
  21.       Height          =   288
  22.       Left            =   0
  23.       Locked          =   -1  'True
  24.       TabIndex        =   1
  25.       Top             =   4200
  26.       Width           =   6012
  27.    End
  28.    Begin VB.VScrollBar VScroll1 
  29.       Height          =   4212
  30.       LargeChange     =   5
  31.       Left            =   5760
  32.       Max             =   60
  33.       Min             =   30
  34.       TabIndex        =   0
  35.       Top             =   0
  36.       Value           =   45
  37.       Width           =   252
  38.    End
  39.    Begin VB.Timer Timer1 
  40.       Enabled         =   0   'False
  41.       Interval        =   55
  42.       Left            =   0
  43.       Top             =   0
  44.    End
  45.    Begin VB.Menu mnuAction 
  46.       Caption         =   "&Action"
  47.       Begin VB.Menu mnuActionItem 
  48.          Caption         =   "&New"
  49.          Index           =   0
  50.       End
  51.       Begin VB.Menu mnuActionItem 
  52.          Caption         =   "&Solve"
  53.          Enabled         =   0   'False
  54.          Index           =   1
  55.       End
  56.       Begin VB.Menu mnuActionItem 
  57.          Caption         =   "&Clear"
  58.          Enabled         =   0   'False
  59.          Index           =   2
  60.       End
  61.       Begin VB.Menu mnuActionItem 
  62.          Caption         =   "-"
  63.          Index           =   3
  64.       End
  65.       Begin VB.Menu mnuActionItem 
  66.          Caption         =   "E&xit"
  67.          Index           =   4
  68.       End
  69.    End
  70.    Begin VB.Menu mnuStyle 
  71.       Caption         =   "&Style"
  72.       Begin VB.Menu mnuStyleItem 
  73.          Caption         =   "&Hexagonal rooms"
  74.          Index           =   0
  75.       End
  76.       Begin VB.Menu mnuStyleItem 
  77.          Caption         =   "&Square rooms"
  78.          Index           =   1
  79.       End
  80.    End
  81.    Begin VB.Menu mnuHelp 
  82.       Caption         =   "&Help"
  83.       Begin VB.Menu mnuHelpItem 
  84.          Caption         =   "&About..."
  85.          Index           =   0
  86.       End
  87.    End
  88. End
  89. Attribute VB_Name = "frm3DMaze"
  90. Attribute VB_Creatable = False
  91. Attribute VB_Exposed = False
  92.  
  93. Option Explicit
  94.  
  95. Private Type CornerRec
  96.   X As Long
  97.   Y As Long
  98. End Type
  99.  
  100. Private Type VertexRec
  101.   X As Double
  102.   Y As Double
  103. End Type
  104.  
  105. Private Type StackRec
  106.   Index1 As Byte
  107.   Index2 As Integer
  108. End Type
  109.  
  110. Private Type PALETTEENTRY
  111.   peRed As Byte
  112.   peGreen As Byte
  113.   peBlue As Byte
  114.   peFlags As Byte
  115. End Type
  116.  
  117. Private Type LOGPALETTE
  118.   palVersion As Integer
  119.   palNumEntries As Integer
  120.   palPalEntry(16) As PALETTEENTRY
  121. End Type
  122.  
  123. Private Declare Function CreatePalette Lib "GDI32" (LogicalPalette As LOGPALETTE) As Long
  124. Private Declare Function CreatePen Lib "GDI32" (ByVal PenStyle As Long, ByVal Width As Long, ByVal Color As Long) As Long
  125. Private Declare Function CreatePolygonRgn Lib "GDI32" (lpPoints As Any, ByVal nCount As Long, ByVal nPolyFillMode As Long) As Long
  126. Private Declare Function CreateSolidBrush Lib "GDI32" (ByVal rgbColor As Long) As Long
  127. Private Declare Function DeleteObject Lib "GDI32" (ByVal hndobj As Long) As Long
  128. Private Declare Function FillRgn Lib "GDI32" (ByVal hDC As Long, ByVal hRegion As Long, ByVal hBrush As Long) As Long
  129. Private Declare Function GetDeviceCaps Lib "GDI32" (ByVal hDC As Long, ByVal Index As Long) As Long
  130. Private Declare Function LineTo Lib "GDI32" (ByVal hDC As Long, ByVal X As Long, ByVal Y As Long) As Long
  131. Private Declare Function MoveToEx Lib "GDI32" (ByVal hDC As Long, ByVal X As Long, ByVal Y As Long, ByVal NullPtr As Long) As Long
  132. Private Declare Function RealizePalette Lib "GDI32" (ByVal hDC As Long) As Long
  133. Private Declare Function SelectPalette Lib "GDI32" (ByVal hDC As Long, ByVal PaletteHandle As Long, ByVal Background As Long) As Long
  134. Private Declare Function SelectObject Lib "GDI32" (ByVal hDC As Long, ByVal ObjectHandle As Long) As Long
  135.  
  136. Const PLANES = 14
  137. Const BITSPIXEL = 12
  138. Const PC_NOCOLLAPSE = 4
  139. Const COLORS = 24
  140. Const PS_SOLID = 0
  141.  
  142. Const NumColors = 16
  143. Const TopColor = 12: ' all but last 3 colors are gray
  144. Const RectangleSENWColor = 10
  145. Const TriangleSSENNWColor = 9
  146. Const TriangleSENWColor = 8
  147. Const RectangleWEColor = 7
  148. Const FloorColor = 6
  149. Const TriangleSWNEColor = 5
  150. Const RectangleSWNEColor = 4
  151. Const TriangleSSWNNEColor = 3
  152. Const BackoutColor = 13
  153. Const AdvanceColor = 14
  154. Const SolutionColor = 15
  155.  
  156. Const RelativeWidthOfWall = 0.25: ' relative to side of hexagon or square
  157. Const RelativeHeightOfWall = 2#: ' relative to side of hexagon or square
  158. Const MinWallLengthInInches = 0.25
  159.  
  160. Const SecondsForMazeSelection = 0.25
  161.  
  162. Dim AlreadyPainting As Boolean
  163. Dim BaseRectangle(5, 3) As VertexRec
  164. Dim BaseTriangle(3, 2) As VertexRec
  165. Dim ComputerPage() As Byte
  166. Dim CosTilt As Double
  167. Dim CurrentColor As Integer
  168. Dim HexDeltaX(5, 719) As Integer
  169. Dim HexDeltaY(5, 719) As Integer
  170. Dim MaxX As Integer
  171. Dim MaxY As Integer
  172. Dim Minimized As Boolean
  173. Dim NumColumns As Integer
  174. Dim NumRealized As Long
  175. Dim NumRoomsInMaze As Integer
  176. Dim NumRows As Integer
  177. Dim OldPaletteHandle As Long
  178. Dim Paint As Boolean
  179. Dim PaletteHandle As Long
  180. Dim PixelsPerX As Double
  181. Dim PixelsPerZ As Double
  182. Dim Rectangle(5, 3) As VertexRec
  183. Dim RedGreenBlue(16) As Long
  184. Dim RelDistOfUserFromScreen As Double
  185. Dim Resize As Boolean
  186. Dim Seed As String
  187. Dim SinTilt As Double
  188. Dim SolutionDisplayed As Boolean
  189. Dim SqrDeltaX(3, 23) As Integer
  190. Dim SqrDeltaY(3, 23) As Integer
  191. Dim Sqrt3 As Double
  192. Dim Stack() As StackRec
  193. Dim State As Byte
  194. Dim SubstitutionHigh(99) As Byte
  195. Dim SubstitutionLow(99) As Byte
  196. Dim Tilt As Double
  197. Dim UsePalette As Boolean
  198. Dim UserHasSolved As Boolean
  199. Dim UserPage() As Byte
  200. Dim UserX As Integer
  201. Dim UserXRelative As Double
  202. Dim UserY As Integer
  203. Dim UserYRelative As Double
  204. Dim X As Integer
  205. Dim XMax As Double
  206. Dim XOffset As Double
  207. Dim Y As Integer
  208. Dim YMax As Double
  209. Dim YMod4 As Byte
  210. Dim YOffset As Double
  211.  
  212. Private Sub DrawQuadrilateral(Box() As CornerRec, ColorNum As Integer)
  213.   Dim Brush As Long
  214.   Dim rc As Long
  215.   Dim Region As Long
  216.   If UsePalette Then
  217.     Brush = CreateSolidBrush(16777216 + ColorNum)
  218.     If Brush Then
  219.       Region = CreatePolygonRgn(Box(0), 4, 1)
  220.       If Region Then
  221.         rc = FillRgn(frm3DMaze.hDC, Region, Brush)
  222.         rc = DeleteObject(Region)
  223.       End If
  224.       rc = DeleteObject(Brush)
  225.     End If
  226.   Else
  227.     Brush = CreateSolidBrush(RedGreenBlue(ColorNum))
  228.     If Brush Then
  229.       Region = CreatePolygonRgn(Box(0), 4, 1)
  230.       If Region Then
  231.         rc = FillRgn(frm3DMaze.hDC, Region, Brush)
  232.         rc = DeleteObject(Region)
  233.       End If
  234.       rc = DeleteObject(Brush)
  235.     End If
  236.   End If
  237. End Sub
  238.  
  239. Private Sub GetCorner(X#, Y#, Z#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, XMax#, XOffset#, YMax#, Corner As CornerRec)
  240.   Dim XAdjusted As Double
  241.   Dim YPrime As Double
  242.   Dim ZAdjusted As Double
  243.   Dim ZPrime As Double
  244.  
  245.   YPrime = (YMax# - Y#) * CosTilt# - Z# * SinTilt#
  246.   ZPrime = (YMax# - Y#) * SinTilt# + Z# * CosTilt#
  247.   ZAdjusted = (YMax# / 2#) + RelDistOfUserFromScreen# * (ZPrime - (YMax# / 2#)) / (YPrime + RelDistOfUserFromScreen#)
  248.   XAdjusted = (XMax# / 2#) + RelDistOfUserFromScreen# * (X# - (XMax# / 2#)) / (YPrime + RelDistOfUserFromScreen#)
  249.   XAdjusted = XAdjusted + XOffset#
  250.   Corner.X = Int(PixelsPerX# * XAdjusted)
  251.   Corner.Y = (ScaleHeight - Text1.Height) - Int(PixelsPerZ# * ZAdjusted)
  252. End Sub
  253.  
  254. Private Sub DisplayQuadrilateral(XMax#, XOffset#, YMax#, X0#, Y0#, Z0#, X1#, Y1#, Z1#, X2#, Y2#, Z2#, X3#, Y3#, Z3#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, Shade%)
  255.   Dim Quadrilateral(3) As CornerRec
  256.   Dim TemQuad As CornerRec
  257.   Call GetCorner(X0#, Y0#, Z0#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, XMax#, XOffset#, YMax#, TemQuad)
  258.   Quadrilateral(0).X = TemQuad.X
  259.   Quadrilateral(0).Y = TemQuad.Y
  260.   Call GetCorner(X1#, Y1#, Z1#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, XMax#, XOffset#, YMax#, TemQuad)
  261.   Quadrilateral(1).X = TemQuad.X
  262.   Quadrilateral(1).Y = TemQuad.Y
  263.   Call GetCorner(X2#, Y2#, Z2#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, XMax#, XOffset#, YMax#, TemQuad)
  264.   Quadrilateral(2).X = TemQuad.X
  265.   Quadrilateral(2).Y = TemQuad.Y
  266.   Call GetCorner(X3#, Y3#, Z3#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, XMax#, XOffset#, YMax#, TemQuad)
  267.   Quadrilateral(3).X = TemQuad.X
  268.   Quadrilateral(3).Y = TemQuad.Y
  269.   Call DrawQuadrilateral(Quadrilateral(), Shade%)
  270. End Sub
  271.  
  272. Private Sub DrawTriangle(Box() As CornerRec, ColorNum As Integer)
  273.   Dim Brush As Long
  274.   Dim rc As Long
  275.   Dim Region As Long
  276.   If UsePalette Then
  277.     Brush = CreateSolidBrush(16777216 + ColorNum)
  278.     If Brush Then
  279.       Region = CreatePolygonRgn(Box(0), 3, 1)
  280.       If Region Then
  281.         rc = FillRgn(frm3DMaze.hDC, Region, Brush)
  282.         rc = DeleteObject(Region)
  283.       End If
  284.       rc = DeleteObject(Brush)
  285.     End If
  286.   Else
  287.     Brush = CreateSolidBrush(RedGreenBlue(ColorNum))
  288.     If Brush Then
  289.       Region = CreatePolygonRgn(Box(0), 3, 1)
  290.       If Region Then
  291.         rc = FillRgn(frm3DMaze.hDC, Region, Brush)
  292.         rc = DeleteObject(Region)
  293.       End If
  294.       rc = DeleteObject(Brush)
  295.     End If
  296.   End If
  297. End Sub
  298.  
  299. Private Sub DisplayTriangle(XMax#, XOffset#, YMax#, X0#, Y0#, Z0#, X1#, Y1#, Z1#, X2#, Y2#, Z2#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, Shade%)
  300.   Dim Triangle(2) As CornerRec
  301.   Dim TemTriangle As CornerRec
  302.   Call GetCorner(X0#, Y0#, Z0#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, XMax#, XOffset#, YMax#, TemTriangle)
  303.   Triangle(0).X = TemTriangle.X
  304.   Triangle(0).Y = TemTriangle.Y
  305.   Call GetCorner(X1#, Y1#, Z1#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, XMax#, XOffset#, YMax#, TemTriangle)
  306.   Triangle(1).X = TemTriangle.X
  307.   Triangle(1).Y = TemTriangle.Y
  308.   Call GetCorner(X2#, Y2#, Z2#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, XMax#, XOffset#, YMax#, TemTriangle)
  309.   Triangle(2).X = TemTriangle.X
  310.   Triangle(2).Y = TemTriangle.Y
  311.   Call DrawTriangle(Triangle(), Shade%)
  312. End Sub
  313.  
  314. Private Sub OutputTriangle(XMax#, XOffset#, YMax#, Triangle() As VertexRec, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, FirstPass%, FaceColor%)
  315.   Dim X0 As Double
  316.   Dim X1 As Double
  317.   Dim X2 As Double
  318.   Dim X3 As Double
  319.   Dim Y0 As Double
  320.   Dim Y1 As Double
  321.   Dim Y2 As Double
  322.   Dim Y3 As Double
  323.   If FirstPass% Then
  324.     If ((Triangle(1).X < XMax# / 2#) And (Triangle(1).X > Triangle(0).X)) Then
  325.       X0 = Triangle(2).X
  326.       Y0 = Triangle(2).Y
  327.       X1 = Triangle(1).X
  328.       Y1 = Triangle(1).Y
  329.       X2 = Triangle(1).X
  330.       Y2 = Triangle(1).Y
  331.       X3 = Triangle(2).X
  332.       Y3 = Triangle(2).Y
  333.       Call DisplayQuadrilateral(XMax#, XOffset#, YMax#, X0, Y0, RelativeHeightOfWall, X1, Y1, RelativeHeightOfWall, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, TriangleSSWNNEColor)
  334.     End If
  335.     If ((Triangle(1).X > XMax# / 2#) And (Triangle(1).X < Triangle(2).X)) Then
  336.       X0 = Triangle(1).X
  337.       Y0 = Triangle(1).Y
  338.       X1 = Triangle(0).X
  339.       Y1 = Triangle(0).Y
  340.       X2 = Triangle(0).X
  341.       Y2 = Triangle(0).Y
  342.       X3 = Triangle(1).X
  343.       Y3 = Triangle(1).Y
  344.       Call DisplayQuadrilateral(XMax#, XOffset#, YMax#, X0, Y0, RelativeHeightOfWall, X1, Y1, RelativeHeightOfWall, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, TriangleSSENNWColor)
  345.     End If
  346.   Else
  347.     X0 = Triangle(0).X
  348.     Y0 = Triangle(0).Y
  349.     X1 = Triangle(2).X
  350.     Y1 = Triangle(2).Y
  351.     X2 = Triangle(2).X
  352.     Y2 = Triangle(2).Y
  353.     X3 = Triangle(0).X
  354.     Y3 = Triangle(0).Y
  355.     Call DisplayQuadrilateral(XMax#, XOffset#, YMax#, X0, Y0, RelativeHeightOfWall, X1, Y1, RelativeHeightOfWall, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, FaceColor%)
  356.     X0 = Triangle(0).X
  357.     Y0 = Triangle(0).Y
  358.     X1 = Triangle(1).X
  359.     Y1 = Triangle(1).Y
  360.     X2 = Triangle(2).X
  361.     Y2 = Triangle(2).Y
  362.     Call DisplayTriangle(XMax#, XOffset#, YMax#, X0, Y0, RelativeHeightOfWall, X1, Y1, RelativeHeightOfWall, X2, Y2, RelativeHeightOfWall, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, TopColor)
  363.   End If
  364. End Sub
  365.  
  366. 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)
  367.   Dim X0 As Double
  368.   Dim X1 As Double
  369.   Dim X2 As Double
  370.   Dim X3 As Double
  371.   Dim Y0 As Double
  372.   Dim Y1 As Double
  373.   Dim Y2 As Double
  374.   Dim Y3 As Double
  375.   X0 = Rectangle(3).X
  376.   Y0 = Rectangle(3).Y
  377.   X1 = Rectangle(2).X
  378.   Y1 = Rectangle(2).Y
  379.   X2 = Rectangle(2).X
  380.   Y2 = Rectangle(2).Y
  381.   X3 = Rectangle(3).X
  382.   Y3 = Rectangle(3).Y
  383.   Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, RelativeHeightOfWall, X1, Y1, RelativeHeightOfWall, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, FaceColor)
  384.   X0 = Rectangle(0).X
  385.   Y0 = Rectangle(0).Y
  386.   X1 = Rectangle(1).X
  387.   Y1 = Rectangle(1).Y
  388.   X2 = Rectangle(2).X
  389.   Y2 = Rectangle(2).Y
  390.   X3 = Rectangle(3).X
  391.   Y3 = Rectangle(3).Y
  392.   Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, RelativeHeightOfWall, X1, Y1, RelativeHeightOfWall, X2, Y2, RelativeHeightOfWall, X3, Y3, RelativeHeightOfWall, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, TopColor)
  393. End Sub
  394.  
  395. 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)
  396.   Dim X0 As Double
  397.   Dim X1 As Double
  398.   Dim X2 As Double
  399.   Dim X3 As Double
  400.   Dim Y0 As Double
  401.   Dim Y1 As Double
  402.   Dim Y2 As Double
  403.   Dim Y3 As Double
  404.   If 2# * Rectangle(0).X > XMax Then
  405.     X0 = Rectangle(0).X
  406.     Y0 = Rectangle(0).Y
  407.     X1 = Rectangle(3).X
  408.     Y1 = Rectangle(3).Y
  409.     X2 = Rectangle(3).X
  410.     Y2 = Rectangle(3).Y
  411.     X3 = Rectangle(0).X
  412.     Y3 = Rectangle(0).Y
  413.     Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, RelativeHeightOfWall, X1, Y1, RelativeHeightOfWall, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleSENWColor)
  414.   End If
  415.   If 2# * Rectangle(1).X < XMax Then
  416.     X0 = Rectangle(2).X
  417.     Y0 = Rectangle(2).Y
  418.     X1 = Rectangle(1).X
  419.     Y1 = Rectangle(1).Y
  420.     X2 = Rectangle(1).X
  421.     Y2 = Rectangle(1).Y
  422.     X3 = Rectangle(2).X
  423.     Y3 = Rectangle(2).Y
  424.     Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, RelativeHeightOfWall, X1, Y1, RelativeHeightOfWall, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleSWNEColor)
  425.   End If
  426. End Sub
  427.  
  428. 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)
  429.   Dim LineX1 As Long
  430.   Dim LineX2 As Long
  431.   Dim LineY1 As Long
  432.   Dim LineY2 As Long
  433.   Dim Pen As Long
  434.   Dim PreviousPen As Long
  435.   Dim rc As Long
  436.   Dim tem As CornerRec
  437.   Call GetCorner(X1, Y1, RelativeHeightOfWall, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, XMax, XOffset, YMax, tem)
  438.   LineX1 = tem.X
  439.   LineY1 = tem.Y
  440.   Call GetCorner(X2, Y2, RelativeHeightOfWall, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, XMax, XOffset, YMax, tem)
  441.   LineX2 = tem.X
  442.   LineY2 = tem.Y
  443.   If UsePalette Then
  444.     Pen = CreatePen(PS_SOLID, 2, 16777216 + CurrentColor)
  445.     If Pen Then
  446.       PreviousPen = SelectObject(frm3DMaze.hDC, Pen)
  447.       rc = MoveToEx(frm3DMaze.hDC, LineX1, LineY1, 0)
  448.       rc = LineTo(frm3DMaze.hDC, LineX2, LineY2)
  449.       rc = SelectObject(frm3DMaze.hDC, PreviousPen)
  450.       rc = DeleteObject(Pen)
  451.     End If
  452.   Else
  453.     Pen = CreatePen(PS_SOLID, 2, RedGreenBlue(CurrentColor))
  454.     If Pen Then
  455.       PreviousPen = SelectObject(frm3DMaze.hDC, Pen)
  456.       rc = MoveToEx(frm3DMaze.hDC, LineX1, LineY1, 0)
  457.       rc = LineTo(frm3DMaze.hDC, LineX2, LineY2)
  458.       rc = SelectObject(frm3DMaze.hDC, PreviousPen)
  459.       rc = DeleteObject(Pen)
  460.     End If
  461.   End If
  462. End Sub
  463.  
  464. 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)
  465.   Dim Iteration As Byte
  466.   Dim Seed0 As Byte
  467.   Dim Seed1 As Byte
  468.   Dim Seed2 As Byte
  469.   Dim Seed3 As Byte
  470.   Dim Seed4 As Byte
  471.   Dim Seed5 As Byte
  472.   Dim Seed6 As Byte
  473.   Dim Seed7 As Byte
  474.   Dim SubstitutionIndex As Byte
  475.   Dim Tem0 As Byte
  476.   Dim Tem1 As Byte
  477.   Dim Tem2 As Byte
  478.   Seed0 = Counter0
  479.   Seed1 = Counter1
  480.   Seed2 = Counter2
  481.   Seed3 = Counter3
  482.   Seed4 = Counter4
  483.   Seed5 = Counter5
  484.   Seed6 = Counter6
  485.   Seed7 = Counter7
  486.   For Iteration = 1 To 8
  487.     SubstitutionIndex = 10 * Seed1 + Seed0
  488.     Tem0 = SubstitutionLow(SubstitutionIndex)
  489.     Tem1 = SubstitutionHigh(SubstitutionIndex)
  490.     SubstitutionIndex = 10 * Seed3 + Seed2
  491.     Seed0 = SubstitutionLow(SubstitutionIndex)
  492.     Tem2 = SubstitutionHigh(SubstitutionIndex)
  493.     SubstitutionIndex = 10 * Seed5 + Seed4
  494.     Seed2 = SubstitutionLow(SubstitutionIndex)
  495.     Seed1 = SubstitutionHigh(SubstitutionIndex)
  496.     SubstitutionIndex = 10 * Seed7 + Seed6
  497.     Seed5 = SubstitutionLow(SubstitutionIndex)
  498.     Seed7 = SubstitutionHigh(SubstitutionIndex)
  499.     Seed3 = Tem0
  500.     Seed6 = Tem1
  501.     Seed4 = Tem2
  502.   Next Iteration
  503.   Counter0 = Seed0
  504.   Counter1 = Seed1
  505.   Counter2 = Seed2
  506.   Counter3 = Seed3
  507.   Counter4 = Seed4
  508.   Counter5 = Seed5
  509.   Counter6 = Seed6
  510.   Counter7 = Seed7
  511. End Sub
  512.  
  513. 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)
  514.   Dim tem As Byte
  515.   tem = Counter0 + 1
  516.   If tem <= 9 Then
  517.     Counter0 = tem
  518.   Else
  519.     Counter0 = 0
  520.     tem = Counter1 + 1
  521.     If tem <= 9 Then
  522.       Counter1 = tem
  523.     Else
  524.       Counter1 = 0
  525.       tem = Counter2 + 1
  526.       If tem <= 9 Then
  527.         Counter2 = tem
  528.       Else
  529.         Counter2 = 0
  530.         tem = Counter3 + 1
  531.         If tem <= 9 Then
  532.           Counter3 = tem
  533.         Else
  534.           Counter3 = 0
  535.           tem = Counter4 + 1
  536.           If tem <= 9 Then
  537.             Counter4 = tem
  538.           Else
  539.             Counter4 = 0
  540.             tem = Counter5 + 1
  541.             If tem <= 9 Then
  542.               Counter5 = tem
  543.             Else
  544.               Counter5 = 0
  545.               tem = Counter6 + 1
  546.               If tem <= 9 Then
  547.                 Counter6 = tem
  548.               Else
  549.                 Counter6 = 0
  550.                 tem = Counter7 + 1
  551.                 If tem <= 9 Then
  552.                   Counter7 = tem
  553.                 Else
  554.                   Counter7 = 0
  555.                 End If
  556.               End If
  557.             End If
  558.           End If
  559.         End If
  560.       End If
  561.     End If
  562.   End If
  563. End Sub
  564.  
  565. 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)
  566.   Dim DeltaIndex As Byte
  567.   Dim OldPaletteHandle As Long
  568.   Dim PathFound As Integer
  569.   Dim X As Integer
  570.   Dim XNext As Integer
  571.   Dim XPrevious As Integer
  572.   Dim XRelative As Double
  573.   Dim XRelativeNext As Double
  574.   Dim Y As Integer
  575.   Dim YNext As Integer
  576.   Dim YPrevious As Integer
  577.   Dim YRelative As Double
  578.   Dim YRelativeNext As Double
  579.   If UsePalette Then
  580.     OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  581.     NumRealized = RealizePalette(frm3DMaze.hDC)
  582.   End If
  583.   XRelative = 1#
  584.   YRelative = Sqrt3 / 2#
  585.   CurrentColor = SolutionColor
  586.   Call DrawLine(1#, 0#, XRelative, YRelative, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  587.   XPrevious = 3
  588.   YPrevious = -2
  589.   X = 3
  590.   Y = 2
  591.   Do
  592.     PathFound = False
  593.     DeltaIndex = 0
  594.     Do While (Not PathFound)
  595.       XNext = X + HexDeltaX(DeltaIndex, 0)
  596.       YNext = Y + HexDeltaY(DeltaIndex, 0)
  597.       If Page(YNext, XNext) = 1 Then
  598.         XNext = XNext + HexDeltaX(DeltaIndex, 0)
  599.         YNext = YNext + HexDeltaY(DeltaIndex, 0)
  600.         If (XNext <> XPrevious) Or (YNext <> YPrevious) Then
  601.           PathFound = True
  602.         Else
  603.           DeltaIndex = DeltaIndex + 1
  604.         End If
  605.       Else
  606.         DeltaIndex = DeltaIndex + 1
  607.       End If
  608.     Loop
  609.     If YNext < MaxY Then
  610.       Select Case YNext - Y
  611.         Case -4
  612.           XRelativeNext = XRelative
  613.           YRelativeNext = YRelative - Sqrt3
  614.         Case -2
  615.           If XNext > X Then
  616.             XRelativeNext = XRelative + 3# / 2#
  617.             YRelativeNext = YRelative - Sqrt3 / 2#
  618.           Else
  619.             XRelativeNext = XRelative - 3# / 2#
  620.             YRelativeNext = YRelative - Sqrt3 / 2#
  621.           End If
  622.         Case 2
  623.           If XNext > X Then
  624.             XRelativeNext = XRelative + 3# / 2#
  625.             YRelativeNext = YRelative + Sqrt3 / 2#
  626.           Else
  627.             XRelativeNext = XRelative - 3# / 2#
  628.             YRelativeNext = YRelative + Sqrt3 / 2#
  629.           End If
  630.         Case Else
  631.           XRelativeNext = XRelative
  632.           YRelativeNext = YRelative + Sqrt3
  633.       End Select
  634.       Call DrawLine(XRelative, YRelative, XRelativeNext, YRelativeNext, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  635.     Else
  636.       Call DrawLine(XRelative, YRelative, XRelative, YMax, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  637.     End If
  638.     XPrevious = X
  639.     YPrevious = Y
  640.     X = XNext
  641.     Y = YNext
  642.     XRelative = XRelativeNext
  643.     YRelative = YRelativeNext
  644.   Loop While YNext < MaxY
  645.   If UsePalette Then
  646.     NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  647.   End If
  648. End Sub
  649.  
  650. 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)
  651.   Dim DeltaIndex As Byte
  652.   Dim EvenRow As Boolean
  653.   Dim OldPaletteHandle As Long
  654.   Dim X As Integer
  655.   Dim XNext As Integer
  656.   Dim XNextNext As Integer
  657.   Dim XRelative As Double
  658.   Dim XRelativeNext As Double
  659.   Dim Y As Integer
  660.   Dim YNext As Integer
  661.   Dim YNextNext As Integer
  662.   Dim YRelative As Double
  663.   Dim YRelativeNext As Double
  664.   If UsePalette Then
  665.     OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  666.     NumRealized = RealizePalette(frm3DMaze.hDC)
  667.   End If
  668.   Y = 2
  669.   YRelative = Sqrt3 / 2#
  670.   EvenRow = False
  671.   Do While (Y < MaxY)
  672.     If EvenRow Then
  673.       X = 7
  674.       XRelative = 2.5
  675.     Else
  676.       X = 3
  677.       XRelative = 1#
  678.     End If
  679.     Do While (X < MaxX)
  680.       If ((Page(Y, X) = 1) Or (Page(Y, X) = 3)) Then
  681.         For DeltaIndex = 0 To 5
  682.           XNext = X + HexDeltaX(DeltaIndex, 0)
  683.           YNext = Y + HexDeltaY(DeltaIndex, 0)
  684.           If Page(YNext, XNext) <> 0 Then
  685.             If YNext = 0 Then
  686.               CurrentColor = AdvanceColor
  687.               Call DrawLine(1#, 0#, XRelative, YRelative, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  688.             Else
  689.               If YNext = MaxY Then
  690.                 If UserHasSolved Then
  691.                   CurrentColor = AdvanceColor
  692.                   YRelativeNext = YRelative + Sqrt3 / 2#
  693.                   Call DrawLine(XRelative, YRelative, XRelative, YRelativeNext, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  694.                 End If
  695.               Else
  696.                 XNextNext = XNext + HexDeltaX(DeltaIndex, 0)
  697.                 If XNextNext > 0 Then
  698.                   If XNextNext < MaxX Then
  699.                     YNextNext = YNext + HexDeltaY(DeltaIndex, 0)
  700.                     If YNextNext > 0 Then
  701.                       If YNextNext < MaxY Then
  702.                         If ((Page(YNextNext, XNextNext) = 1) Or (Page(YNextNext, XNextNext) = 3)) Then
  703.                           If Page(Y, X) = Page(YNextNext, XNextNext) Then
  704.                             If Page(Y, X) = 1 Then
  705.                               CurrentColor = AdvanceColor
  706.                             Else
  707.                               CurrentColor = BackoutColor
  708.                             End If
  709.                           Else
  710.                             CurrentColor = BackoutColor
  711.                           End If
  712.                           Select Case (YNext - Y)
  713.                             Case -2
  714.                               XRelativeNext = XRelative
  715.                               YRelativeNext = YRelative - Sqrt3 / 2#
  716.                             Case -1
  717.                               If XNext > X Then
  718.                                 XRelativeNext = XRelative + 3# / 4#
  719.                                 YRelativeNext = YRelative - Sqrt3 / 4#
  720.                               Else
  721.                                 XRelativeNext = XRelative - 3# / 4#
  722.                                 YRelativeNext = YRelative - Sqrt3 / 4#
  723.                               End If
  724.                             Case 1
  725.                               If XNext > X Then
  726.                                 XRelativeNext = XRelative + 3# / 4#
  727.                                 YRelativeNext = YRelative + Sqrt3 / 4#
  728.                               Else
  729.                                 XRelativeNext = XRelative - 3# / 4#
  730.                                 YRelativeNext = YRelative + Sqrt3 / 4#
  731.                               End If
  732.                             Case Else
  733.                               XRelativeNext = XRelative
  734.                               YRelativeNext = YRelative + Sqrt3 / 2#
  735.                           End Select
  736.                           Call DrawLine(XRelative, YRelative, XRelativeNext, YRelativeNext, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  737.                         End If
  738.                        End If
  739.                     End If
  740.                   End If
  741.                 End If
  742.               End If
  743.             End If
  744.           End If
  745.         Next DeltaIndex
  746.       End If
  747.       XRelative = XRelative + 3#
  748.       X = X + 8
  749.     Loop
  750.     EvenRow = Not EvenRow
  751.     YRelative = YRelative + Sqrt3 / 2#
  752.     Y = Y + 2
  753.   Loop
  754.   If UsePalette Then
  755.     NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  756.   End If
  757. End Sub
  758.  
  759. Private Sub HexSolveMaze(Stack() As StackRec, Page() As Byte, NumRoomsInSolution As Integer, Adjacency As Integer, MaxX As Integer, MaxY As Integer)
  760.   Dim DeltaIndex As Byte
  761.   Dim PassageFound As Integer
  762.   Dim StackHead As Integer
  763.   Dim X As Integer
  764.   Dim XNext As Integer
  765.   Dim Y As Integer
  766.   Dim YNext As Integer
  767.  
  768.   NumRoomsInSolution = 1
  769.   Adjacency = 0
  770.   X = 3
  771.   Y = 2
  772.   StackHead = -1
  773.   Page(Y, X) = 1
  774.   Do
  775.     DeltaIndex = 0
  776.     PassageFound = False
  777.     Do
  778.       Do While ((DeltaIndex < 6) And (Not PassageFound))
  779.         XNext = X + HexDeltaX(DeltaIndex, 0)
  780.         YNext = Y + HexDeltaY(DeltaIndex, 0)
  781.         If Page(YNext, XNext) = 2 Then
  782.           PassageFound = True
  783.         Else
  784.           DeltaIndex = DeltaIndex + 1
  785.         End If
  786.       Loop
  787.       If Not PassageFound Then
  788.         DeltaIndex = Stack(StackHead).Index1
  789.         Page(Y, X) = 2
  790.         X = X - HexDeltaX(DeltaIndex, 0)
  791.         Y = Y - HexDeltaY(DeltaIndex, 0)
  792.         Page(Y, X) = 2
  793.         X = X - HexDeltaX(DeltaIndex, 0)
  794.         Y = Y - HexDeltaY(DeltaIndex, 0)
  795.         StackHead = StackHead - 1
  796.         DeltaIndex = DeltaIndex + 1
  797.       End If
  798.     Loop While Not PassageFound
  799.     Page(YNext, XNext) = 1
  800.     XNext = XNext + HexDeltaX(DeltaIndex, 0)
  801.     YNext = YNext + HexDeltaY(DeltaIndex, 0)
  802.     If YNext <= MaxY Then
  803.       StackHead = StackHead + 1
  804.       Stack(StackHead).Index1 = DeltaIndex
  805.       Page(YNext, XNext) = 1
  806.       X = XNext
  807.       Y = YNext
  808.     End If
  809.   Loop While YNext < MaxY
  810.   X = MaxX - 3
  811.   Y = MaxY - 2
  812.   Adjacency = 0
  813.   Do While (StackHead >= 0)
  814.     For DeltaIndex = 0 To 5
  815.       XNext = X + HexDeltaX(DeltaIndex, 0)
  816.       YNext = Y + HexDeltaY(DeltaIndex, 0)
  817.       If Page(YNext, XNext) <> 1 Then
  818.         If Page(YNext, XNext) = 0 Then
  819.           XNext = XNext + HexDeltaX(DeltaIndex, 0)
  820.           YNext = YNext + HexDeltaY(DeltaIndex, 0)
  821.           If XNext < 0 Then
  822.             Adjacency = Adjacency + 1
  823.           Else
  824.             If XNext > MaxX Then
  825.               Adjacency = Adjacency + 1
  826.             Else
  827.               If YNext < 0 Then
  828.                 Adjacency = Adjacency + 1
  829.               Else
  830.                 If YNext > MaxY Then
  831.                   Adjacency = Adjacency + 1
  832.                 Else
  833.                   If Page(YNext, XNext) = 1 Then
  834.                     Adjacency = Adjacency + 1
  835.                   End If
  836.                 End If
  837.               End If
  838.             End If
  839.           End If
  840.         End If
  841.       End If
  842.     Next DeltaIndex
  843.     X = X - 2 * HexDeltaX(Stack(StackHead).Index1, 0)
  844.     Y = Y - 2 * HexDeltaY(Stack(StackHead).Index1, 0)
  845.     StackHead = StackHead - 1
  846.     NumRoomsInSolution = NumRoomsInSolution + 1
  847.   Loop
  848.   For DeltaIndex = 0 To 5
  849.     XNext = X + HexDeltaX(DeltaIndex, 0)
  850.     YNext = X + HexDeltaY(DeltaIndex, 0)
  851.     If Page(YNext, XNext) <> 2 Then
  852.       If Page(YNext, XNext) = 0 Then
  853.         XNext = XNext + HexDeltaX(DeltaIndex, 0)
  854.         YNext = YNext + HexDeltaY(DeltaIndex, 0)
  855.         If XNext < 0 Then
  856.           Adjacency = Adjacency + 1
  857.         Else
  858.           If XNext > MaxX Then
  859.             Adjacency = Adjacency + 1
  860.           Else
  861.             If YNext < 0 Then
  862.               Adjacency = Adjacency + 1
  863.             Else
  864.               If YNext > MaxY Then
  865.                 Adjacency = Adjacency + 1
  866.               Else
  867.                 If Page(YNext, XNext) = 1 Then
  868.                   Adjacency = Adjacency + 1
  869.                 End If
  870.               End If
  871.             End If
  872.           End If
  873.         End If
  874.       End If
  875.     End If
  876.   Next DeltaIndex
  877. End Sub
  878.  
  879. Private Sub HexGenerateMaze(Page() As Byte, MaxX As Integer, MaxY As Integer, Stack() As StackRec, NumColumns As Integer, NumRows As Integer, Seed() As Byte)
  880.   Dim ColumnNum As Integer
  881.   Dim DeltaIndex1 As Integer
  882.   Dim DeltaIndex2 As Integer
  883.   Dim PassageFound As Integer
  884.   Dim RN(7) As Integer
  885.   Dim RNIndex1 As Integer
  886.   Dim RNIndex2 As Integer
  887.   Dim RowNum As Integer
  888.   Dim SearchComplete As Integer
  889.   Dim StackHead As Integer
  890.   Dim TemInt As Integer
  891.   Dim X As Integer
  892.   Dim XMod8 As Byte
  893.   Dim XNext As Integer
  894.   Dim Y As Integer
  895.   Dim YMod4 As Byte
  896.   Dim YNext As Integer
  897.  
  898.   RN(0) = Seed(0) + 1
  899.   RN(1) = Seed(1) + 1
  900.   RN(2) = Seed(2) + 1
  901.   RN(3) = Seed(3) + 1
  902.   RN(4) = Seed(4) + 1
  903.   RN(5) = Seed(5) + 1
  904.   RN(6) = Seed(6) + 1
  905.   RN(7) = Seed(7) + 1
  906.   YMod4 = 1
  907.   For Y = 0 To MaxY
  908.     If YMod4 = 1 Then
  909.       XMod8 = 1
  910.       For X = 0 To MaxX
  911.         If (((XMod8 = 0) And (Y <> 0) And (Y <> MaxY)) Or (XMod8 = 3) Or (XMod8 = 4) Or (XMod8 = 5)) Then
  912.           Page(Y, X) = 0
  913.         Else
  914.           Page(Y, X) = 2
  915.         End If
  916.         XMod8 = XMod8 + 1
  917.         If XMod8 >= 8 Then XMod8 = 0
  918.       Next X
  919.     Else
  920.       If YMod4 = 0 Or YMod4 = 2 Then
  921.         XMod8 = 1
  922.         For X = 0 To MaxX
  923.           If (XMod8 = 2) Or (XMod8 = 6) Then
  924.             Page(Y, X) = 0
  925.           Else
  926.             Page(Y, X) = 2
  927.           End If
  928.           XMod8 = XMod8 + 1
  929.           If XMod8 >= 8 Then XMod8 = 0
  930.         Next X
  931.       Else
  932.         XMod8 = 1
  933.         For X = 0 To MaxX
  934.           If (XMod8 = 0) Or (XMod8 = 1) Or (XMod8 = 4) Or (XMod8 = 7) Then
  935.             Page(Y, X) = 0
  936.           Else
  937.             Page(Y, X) = 2
  938.           End If
  939.           XMod8 = XMod8 + 1
  940.           If XMod8 >= 8 Then XMod8 = 0
  941.         Next X
  942.       End If
  943.     End If
  944.     YMod4 = YMod4 + 1
  945.     If YMod4 >= 4 Then YMod4 = 0
  946.   Next Y
  947.   ColumnNum = RN(0)
  948.   RNIndex1 = 0
  949.   RNIndex2 = 1
  950.   Do While (RNIndex2 < 8)
  951.     TemInt = RN(RNIndex2)
  952.     RN(RNIndex1) = TemInt
  953.     ColumnNum = ColumnNum + TemInt
  954.     If ColumnNum >= 727 Then ColumnNum = ColumnNum - 727
  955.     RNIndex1 = RNIndex2
  956.     RNIndex2 = RNIndex2 + 1
  957.   Loop
  958.   RN(7) = ColumnNum
  959.   ColumnNum = ColumnNum Mod NumColumns
  960.   X = 4 * ColumnNum + 3
  961.   RowNum = RN(0)
  962.   RNIndex1 = 0
  963.   RNIndex2 = 1
  964.   Do While (RNIndex2 < 8)
  965.     TemInt = RN(RNIndex2)
  966.     RN(RNIndex1) = TemInt
  967.     RowNum = RowNum + TemInt
  968.     If RowNum >= 727 Then RowNum = RowNum - 727
  969.     RNIndex1 = RNIndex2
  970.     RNIndex2 = RNIndex2 + 1
  971.   Loop
  972.   RN(7) = RowNum
  973.   If ColumnNum Mod 2 Then
  974.     RowNum = RowNum Mod (NumRows - 1)
  975.     Y = 4 * RowNum + 4
  976.   Else
  977.     RowNum = RowNum Mod NumRows
  978.     Y = 4 * RowNum + 2
  979.   End If
  980.   Page(Y, X) = 2
  981.   StackHead = -1
  982.   Do
  983.     DeltaIndex1 = 0
  984.     Do
  985.       DeltaIndex2 = RN(0)
  986.       RNIndex1 = 0
  987.       RNIndex2 = 1
  988.       Do While (RNIndex2 < 8)
  989.         TemInt = RN(RNIndex2)
  990.         RN(RNIndex1) = TemInt
  991.         DeltaIndex2 = DeltaIndex2 + TemInt
  992.         If DeltaIndex2 >= 727 Then DeltaIndex2 = DeltaIndex2 - 727
  993.         RNIndex1 = RNIndex2
  994.         RNIndex2 = RNIndex2 + 1
  995.       Loop
  996.       RN(7) = DeltaIndex2
  997.     Loop While DeltaIndex2 >= 720
  998.     PassageFound = False
  999.     SearchComplete = False
  1000.     Do While (Not SearchComplete)
  1001.       Do While ((DeltaIndex1 < 6) And (Not PassageFound))
  1002.         XNext = X + 2 * HexDeltaX(DeltaIndex1, DeltaIndex2)
  1003.         If XNext <= 0 Then
  1004.           DeltaIndex1 = DeltaIndex1 + 1
  1005.         Else
  1006.           If XNext > MaxX Then
  1007.             DeltaIndex1 = DeltaIndex1 + 1
  1008.           Else
  1009.             YNext = Y + 2 * HexDeltaY(DeltaIndex1, DeltaIndex2)
  1010.             If YNext <= 0 Then
  1011.               DeltaIndex1 = DeltaIndex1 + 1
  1012.             Else
  1013.               If YNext > MaxY Then
  1014.                 DeltaIndex1 = DeltaIndex1 + 1
  1015.               Else
  1016.                 If Page(YNext, XNext) = 0 Then
  1017.                   PassageFound = True
  1018.                 Else
  1019.                   DeltaIndex1 = DeltaIndex1 + 1
  1020.                 End If
  1021.               End If
  1022.             End If
  1023.           End If
  1024.         End If
  1025.       Loop
  1026.       If Not PassageFound Then
  1027.         If StackHead >= 0 Then
  1028.           DeltaIndex1 = Stack(StackHead).Index1
  1029.           DeltaIndex2 = Stack(StackHead).Index2
  1030.           X = X - 2 * HexDeltaX(DeltaIndex1, DeltaIndex2)
  1031.           Y = Y - 2 * HexDeltaY(DeltaIndex1, DeltaIndex2)
  1032.           StackHead = StackHead - 1
  1033.           DeltaIndex1 = DeltaIndex1 + 1
  1034.         End If
  1035.       End If
  1036.       If ((PassageFound) Or ((StackHead = -1) And (DeltaIndex1 >= 6))) Then
  1037.         SearchComplete = True
  1038.       Else
  1039.         SearchComplete = False
  1040.       End If
  1041.     Loop
  1042.     If PassageFound Then
  1043.       StackHead = StackHead + 1
  1044.       Stack(StackHead).Index1 = DeltaIndex1
  1045.       Stack(StackHead).Index2 = DeltaIndex2
  1046.       Page(YNext, XNext) = 2
  1047.       Page((Y + YNext) \ 2, (X + XNext) \ 2) = 2
  1048.       X = XNext
  1049.       Y = YNext
  1050.     End If
  1051.   Loop While StackHead <> -1
  1052.   Page(0, 3) = 1
  1053.   Page(MaxY, MaxX - 3) = 2
  1054. End Sub
  1055.  
  1056. 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)
  1057.   Dim Adjacency As Integer
  1058.   Dim Counter0 As Byte
  1059.   Dim Counter1 As Byte
  1060.   Dim Counter2 As Byte
  1061.   Dim Counter3 As Byte
  1062.   Dim Counter4 As Byte
  1063.   Dim Counter5 As Byte
  1064.   Dim Counter6 As Byte
  1065.   Dim Counter7 As Byte
  1066.   Dim ElapsedTime As Double
  1067.   Dim MinAdjacency As Integer
  1068.   Dim NumRoomsInSolution As Integer
  1069.   Dim NumRoomsInSolutionAtMin As Integer
  1070.   Dim RN(7) As Integer
  1071.   Dim RNIndex1 As Integer
  1072.   Dim RNIndex2 As Integer
  1073.   Dim SeedByte(7) As Byte
  1074.   Dim SeedByteAtMin(7) As Byte
  1075.   Dim SeedLength As Integer
  1076.   Dim StartTime As Double
  1077.  
  1078.   SeedLength = Len(Seed)
  1079.   If SeedLength > 8 Then SeedLength = 8
  1080.   RNIndex1 = 0
  1081.   For RNIndex2 = 1 To SeedLength
  1082.     RN(RNIndex1) = Asc(Mid$(Seed, RNIndex2, 1)) Mod 10
  1083.     RNIndex1 = RNIndex1 + 1
  1084.   Next RNIndex2
  1085.   RNIndex2 = 7
  1086.   Do While (RNIndex1 > 0)
  1087.     RNIndex1 = RNIndex1 - 1
  1088.     RN(RNIndex2) = RN(RNIndex1)
  1089.     RNIndex2 = RNIndex2 - 1
  1090.   Loop
  1091.   Do While (RNIndex2 >= 0)
  1092.     RN(RNIndex2) = 8
  1093.     RNIndex2 = RNIndex2 - 1
  1094.   Loop
  1095.   Counter0 = RN(0)
  1096.   Counter1 = RN(1)
  1097.   Counter2 = RN(2)
  1098.   Counter3 = RN(3)
  1099.   Counter4 = RN(4)
  1100.   Counter5 = RN(5)
  1101.   Counter6 = RN(6)
  1102.   Counter7 = RN(7)
  1103.   Call Hash(Counter0, Counter1, Counter2, Counter3, Counter4, Counter5, Counter6, Counter7)
  1104.   MinAdjacency = 4 * NumRoomsInMaze + 1
  1105.   NumRoomsInSolutionAtMin = 0
  1106.   SeedByteAtMin(0) = Counter0
  1107.   SeedByteAtMin(1) = Counter1
  1108.   SeedByteAtMin(2) = Counter2
  1109.   SeedByteAtMin(3) = Counter3
  1110.   SeedByteAtMin(4) = Counter4
  1111.   SeedByteAtMin(5) = Counter5
  1112.   SeedByteAtMin(6) = Counter6
  1113.   SeedByteAtMin(7) = Counter7
  1114.   StartTime = Timer
  1115.   Do
  1116.     SeedByte(0) = Counter0
  1117.     SeedByte(1) = Counter1
  1118.     SeedByte(2) = Counter2
  1119.     SeedByte(3) = Counter3
  1120.     SeedByte(4) = Counter4
  1121.     SeedByte(5) = Counter5
  1122.     SeedByte(6) = Counter6
  1123.     SeedByte(7) = Counter7
  1124.     Call HexGenerateMaze(Page(), MaxX, MaxY, Stack(), NumColumns, NumRows, SeedByte())
  1125.     Call HexSolveMaze(Stack(), Page(), NumRoomsInSolution, Adjacency, MaxX, MaxY)
  1126.     If 3 * NumRoomsInSolution >= NumRoomsInMaze Then
  1127.       If Adjacency < MinAdjacency Then
  1128.         MinAdjacency = Adjacency
  1129.         NumRoomsInSolutionAtMin = NumRoomsInSolution
  1130.         SeedByteAtMin(0) = SeedByte(0)
  1131.         SeedByteAtMin(1) = SeedByte(1)
  1132.         SeedByteAtMin(2) = SeedByte(2)
  1133.         SeedByteAtMin(3) = SeedByte(3)
  1134.         SeedByteAtMin(4) = SeedByte(4)
  1135.         SeedByteAtMin(5) = SeedByte(5)
  1136.         SeedByteAtMin(6) = SeedByte(6)
  1137.         SeedByteAtMin(7) = SeedByte(7)
  1138.       Else
  1139.         If Adjacency = MinAdjacency Then
  1140.           If NumRoomsInSolution > NumRoomsInSolutionAtMin Then
  1141.             NumRoomsInSolutionAtMin = NumRoomsInSolution
  1142.             SeedByteAtMin(0) = SeedByte(0)
  1143.             SeedByteAtMin(1) = SeedByte(1)
  1144.             SeedByteAtMin(2) = SeedByte(2)
  1145.             SeedByteAtMin(3) = SeedByte(3)
  1146.             SeedByteAtMin(4) = SeedByte(4)
  1147.             SeedByteAtMin(5) = SeedByte(5)
  1148.             SeedByteAtMin(6) = SeedByte(6)
  1149.             SeedByteAtMin(7) = SeedByte(7)
  1150.           End If
  1151.         End If
  1152.       End If
  1153.     End If
  1154.     Call Increment(Counter0, Counter1, Counter2, Counter3, Counter4, Counter5, Counter6, Counter7)
  1155.     ElapsedTime = Timer - StartTime
  1156.   Loop While ((ElapsedTime >= 0#) And (ElapsedTime < SecondsForMazeSelection))
  1157.   Call HexGenerateMaze(Page(), MaxX, MaxY, Stack(), NumColumns, NumRows, SeedByteAtMin())
  1158.   Call HexSolveMaze(Stack(), Page(), NumRoomsInSolution, Adjacency, MaxX, MaxY)
  1159. End Sub
  1160.  
  1161. Private Sub HexOutputMaze()
  1162.   Dim ObjectNum As Byte
  1163.   Dim Radians As Double
  1164.   Dim RadiansPerDegree As Double
  1165.   Dim SingleRectangle(3) As VertexRec
  1166.   Dim SingleTriangle(2) As VertexRec
  1167.   Dim TemDouble1 As Double
  1168.   Dim TemDouble2 As Double
  1169.   Dim TemDouble3 As Double
  1170.   Dim TemDouble4 As Double
  1171.   Dim Triangle(3, 2) As VertexRec
  1172.   Dim VertexNum As Byte
  1173.   Dim XMod8 As Byte
  1174.   Dim X0 As Double
  1175.   Dim X1 As Double
  1176.   Dim X2 As Double
  1177.   Dim X3 As Double
  1178.   Dim Y0 As Double
  1179.   Dim Y1 As Double
  1180.   Dim Y2 As Double
  1181.   Dim Y3 As Double
  1182.  
  1183.   Select Case State
  1184.     Case 0
  1185.       Text1.Text = ""
  1186.       ScaleMode = 1
  1187.       If (Resize) Then
  1188.         TemDouble1 = ScaleWidth - VScroll1.Width
  1189.         TemDouble2 = MinWallLengthInInches
  1190.         TemDouble2 = 1440# * TemDouble2
  1191.         TemDouble3 = RelativeWidthOfWall
  1192.         NumColumns = Int(2# * (TemDouble1 / TemDouble2 - 2# - TemDouble3 / Sqrt3) / 3# + 1#)
  1193.         If NumColumns Mod 2 = 0 Then NumColumns = NumColumns - 1
  1194.         If NumColumns < 3 Then NumColumns = 3
  1195.         TemDouble1 = ScaleHeight - Text1.Height
  1196.         TemDouble2 = ScaleWidth - VScroll1.Width
  1197.         ScaleMode = 3
  1198.         TemDouble3 = NumColumns
  1199.         TemDouble4 = RelativeWidthOfWall
  1200.         NumRows = Int(((TemDouble1 / TemDouble2) * (3# * (TemDouble3 - 1#) / 2# + 2# + TemDouble4 / Sqrt3) - TemDouble4) / Sqrt3)
  1201.         If NumRows < 2 Then NumRows = 2
  1202.         Tilt = 90 - VScroll1.Value
  1203.         MaxX = 8 * (NumColumns \ 2) + 6
  1204.         MaxY = 4 * NumRows
  1205.         NumRoomsInMaze = NumRows * NumColumns - (NumColumns \ 2)
  1206.         ReDim ComputerPage(MaxY, MaxX)
  1207.         ReDim UserPage(MaxY, MaxX)
  1208.         ReDim Stack(NumRoomsInMaze)
  1209.         Call HexSelectMaze(Seed, ComputerPage(), MaxX, MaxY, Stack(), NumRoomsInMaze, NumColumns, NumRows, SecondsForMazeSelection)
  1210.         For UserX = 0 To MaxX
  1211.           For UserY = 0 To MaxY
  1212.             If ComputerPage(UserY, UserX) = 0 Then
  1213.               UserPage(UserY, UserX) = 0
  1214.             Else
  1215.               UserPage(UserY, UserX) = 2
  1216.             End If
  1217.           Next UserY
  1218.         Next UserX
  1219.         UserX = 3
  1220.         UserXRelative = 1#
  1221.         UserY = 2
  1222.         UserYRelative = Sqrt3 / 2#
  1223.         UserPage(UserY, UserX) = 1
  1224.         Resize = False
  1225.       End If
  1226.       If (Paint) Then
  1227.         ScaleMode = 3
  1228.         Cls
  1229.         RadiansPerDegree = Atn(1#) / 45#
  1230.         Radians = Tilt * RadiansPerDegree
  1231.         SinTilt = Sin(Radians)
  1232.         CosTilt = Cos(Radians)
  1233.         TemDouble1 = NumColumns
  1234.         XMax = 3# * (TemDouble1 - 1#) / 2# + 2# + RelativeWidthOfWall / Sqrt3
  1235.         TemDouble1 = ScaleWidth - VScroll1.Width
  1236.         PixelsPerX = (TemDouble1 - 1#) / (XMax * (XMax / (XMax - RelativeHeightOfWall)))
  1237.         XOffset = (XMax / 2#) * (RelativeHeightOfWall / (XMax - RelativeHeightOfWall))
  1238.         TemDouble1 = NumRows
  1239.         YMax = TemDouble1 * Sqrt3 + RelativeWidthOfWall
  1240.         TemDouble1 = ScaleHeight - Text1.Height
  1241.         PixelsPerZ = (TemDouble1 - 1#) / Sqr(YMax * YMax + RelativeHeightOfWall * RelativeHeightOfWall)
  1242.         If YMax > XMax Then
  1243.           RelDistOfUserFromScreen = YMax
  1244.         Else
  1245.           RelDistOfUserFromScreen = XMax
  1246.         End If
  1247.         Paint = False
  1248.       End If
  1249.       If State = 0 Then
  1250.         State = 1
  1251.         DoEvents
  1252.         If State < 5 Then
  1253.           Timer1.Enabled = True
  1254.         End If
  1255.       End If
  1256.     Case 1
  1257.       BaseTriangle(0, 0).X = 0#
  1258.       BaseTriangle(0, 0).Y = RelativeWidthOfWall + Sqrt3 / 2#
  1259.       BaseTriangle(0, 1).X = 0#
  1260.       BaseTriangle(0, 1).Y = Sqrt3 / 2#
  1261.       BaseTriangle(0, 2).X = RelativeWidthOfWall * Sqrt3 / 2#
  1262.       BaseTriangle(0, 2).Y = (RelativeWidthOfWall + Sqrt3) / 2#
  1263.       BaseTriangle(1, 0).X = (1# - RelativeWidthOfWall / Sqrt3) / 2#
  1264.       BaseTriangle(1, 0).Y = RelativeWidthOfWall / 2#
  1265.       BaseTriangle(1, 1).X = 0.5 + RelativeWidthOfWall / Sqrt3
  1266.       BaseTriangle(1, 1).Y = 0#
  1267.       BaseTriangle(1, 2).X = BaseTriangle(1, 1).X
  1268.       BaseTriangle(1, 2).Y = RelativeWidthOfWall
  1269.       BaseTriangle(2, 0).X = 1.5
  1270.       BaseTriangle(2, 0).Y = RelativeWidthOfWall
  1271.       BaseTriangle(2, 1).X = 1.5
  1272.       BaseTriangle(2, 1).Y = 0#
  1273.       BaseTriangle(2, 2).X = 1.5 * (1# + RelativeWidthOfWall / Sqrt3)
  1274.       BaseTriangle(2, 2).Y = RelativeWidthOfWall / 2#
  1275.       BaseTriangle(3, 0).X = 2# - RelativeWidthOfWall / (2# * Sqrt3)
  1276.       BaseTriangle(3, 0).Y = BaseTriangle(0, 2).Y
  1277.       BaseTriangle(3, 1).X = 2# + RelativeWidthOfWall / Sqrt3
  1278.       BaseTriangle(3, 1).Y = BaseTriangle(0, 1).Y
  1279.       BaseTriangle(3, 2).X = BaseTriangle(3, 1).X
  1280.       BaseTriangle(3, 2).Y = BaseTriangle(0, 0).Y
  1281.       BaseRectangle(0, 0).X = BaseTriangle(0, 2).X
  1282.       BaseRectangle(0, 0).Y = BaseTriangle(0, 2).Y
  1283.       BaseRectangle(0, 1).X = BaseTriangle(1, 1).X
  1284.       BaseRectangle(0, 1).Y = Sqrt3
  1285.       BaseRectangle(0, 2).X = BaseTriangle(1, 0).X
  1286.       BaseRectangle(0, 2).Y = Sqrt3 + RelativeWidthOfWall / 2#
  1287.       BaseRectangle(0, 3).X = BaseTriangle(0, 0).X
  1288.       BaseRectangle(0, 3).Y = BaseTriangle(0, 0).Y
  1289.       BaseRectangle(1, 0).X = BaseTriangle(0, 1).X
  1290.       BaseRectangle(1, 0).Y = BaseTriangle(0, 1).Y
  1291.       BaseRectangle(1, 1).X = BaseTriangle(1, 0).X
  1292.       BaseRectangle(1, 1).Y = BaseTriangle(1, 0).Y
  1293.       BaseRectangle(1, 2).X = BaseTriangle(1, 2).X
  1294.       BaseRectangle(1, 2).Y = BaseTriangle(1, 2).Y
  1295.       BaseRectangle(1, 3).X = BaseTriangle(0, 2).X
  1296.       BaseRectangle(1, 3).Y = BaseTriangle(0, 2).Y
  1297.       BaseRectangle(2, 0).X = BaseTriangle(1, 1).X
  1298.       BaseRectangle(2, 0).Y = BaseTriangle(1, 1).Y
  1299.       BaseRectangle(2, 1).X = BaseTriangle(2, 1).X
  1300.       BaseRectangle(2, 1).Y = BaseTriangle(2, 1).Y
  1301.       BaseRectangle(2, 2).X = BaseTriangle(2, 0).X
  1302.       BaseRectangle(2, 2).Y = BaseTriangle(2, 0).Y
  1303.       BaseRectangle(2, 3).X = BaseTriangle(1, 2).X
  1304.       BaseRectangle(2, 3).Y = BaseTriangle(1, 2).Y
  1305.       BaseRectangle(3, 0).X = BaseTriangle(2, 2).X
  1306.       BaseRectangle(3, 0).Y = BaseTriangle(2, 2).Y
  1307.       BaseRectangle(3, 1).X = BaseTriangle(3, 1).X
  1308.       BaseRectangle(3, 1).Y = BaseTriangle(3, 1).Y
  1309.       BaseRectangle(3, 2).X = BaseTriangle(3, 0).X
  1310.       BaseRectangle(3, 2).Y = BaseTriangle(3, 0).Y
  1311.       BaseRectangle(3, 3).X = BaseTriangle(2, 0).X
  1312.       BaseRectangle(3, 3).Y = BaseTriangle(2, 0).Y
  1313.       BaseRectangle(4, 0).X = BaseTriangle(3, 1).X
  1314.       BaseRectangle(4, 0).Y = BaseTriangle(3, 1).Y
  1315.       BaseRectangle(4, 1).X = BaseTriangle(3, 1).X + (BaseTriangle(2, 1).X - BaseTriangle(1, 1).X)
  1316.       BaseRectangle(4, 1).Y = BaseTriangle(3, 1).Y
  1317.       BaseRectangle(4, 2).X = BaseRectangle(4, 1).X
  1318.       BaseRectangle(4, 2).Y = BaseTriangle(3, 2).Y
  1319.       BaseRectangle(4, 3).X = BaseTriangle(3, 2).X
  1320.       BaseRectangle(4, 3).Y = BaseTriangle(3, 2).Y
  1321.       BaseRectangle(5, 0).X = BaseRectangle(0, 1).X + (BaseTriangle(2, 1).X - BaseTriangle(1, 1).X)
  1322.       BaseRectangle(5, 0).Y = BaseRectangle(0, 1).Y
  1323.       BaseRectangle(5, 1).X = BaseTriangle(3, 0).X
  1324.       BaseRectangle(5, 1).Y = BaseTriangle(3, 0).Y
  1325.       BaseRectangle(5, 2).X = BaseTriangle(3, 2).X
  1326.       BaseRectangle(5, 2).Y = BaseTriangle(3, 2).Y
  1327.       BaseRectangle(5, 3).X = BaseRectangle(0, 2).X + (BaseTriangle(2, 2).X - BaseTriangle(1, 0).X)
  1328.       BaseRectangle(5, 3).Y = BaseRectangle(0, 2).Y
  1329.       Rectangle(0, 0).X = BaseTriangle(1, 1).X
  1330.       Rectangle(0, 0).Y = BaseTriangle(1, 1).Y
  1331.       Rectangle(0, 1).X = XMax - BaseTriangle(1, 1).X
  1332.       Rectangle(0, 1).Y = BaseTriangle(1, 1).Y
  1333.       Rectangle(0, 2).X = XMax - BaseTriangle(1, 2).X
  1334.       Rectangle(0, 2).Y = BaseTriangle(1, 2).Y
  1335.       Rectangle(0, 3).X = BaseTriangle(1, 2).X
  1336.       Rectangle(0, 3).Y = BaseTriangle(1, 2).Y
  1337.       Rectangle(1, 0).X = BaseTriangle(0, 1).X
  1338.       Rectangle(1, 0).Y = BaseTriangle(0, 1).Y
  1339.       Rectangle(1, 1).X = XMax - BaseTriangle(0, 1).X
  1340.       Rectangle(1, 1).Y = BaseTriangle(0, 1).Y
  1341.       Rectangle(1, 2).X = XMax - BaseTriangle(1, 2).X
  1342.       Rectangle(1, 2).Y = BaseTriangle(1, 2).Y
  1343.       Rectangle(1, 3).X = BaseTriangle(1, 2).X
  1344.       Rectangle(1, 3).Y = BaseTriangle(1, 2).Y
  1345.       Rectangle(2, 0).X = BaseTriangle(0, 1).X
  1346.       Rectangle(2, 0).Y = BaseTriangle(0, 1).Y
  1347.       Rectangle(2, 1).X = XMax - BaseTriangle(0, 1).X
  1348.       Rectangle(2, 1).Y = BaseTriangle(0, 1).Y
  1349.       Rectangle(2, 2).X = XMax - BaseTriangle(0, 0).X
  1350.       Rectangle(2, 2).Y = BaseTriangle(0, 0).Y
  1351.       Rectangle(2, 3).X = BaseTriangle(0, 0).X
  1352.       Rectangle(2, 3).Y = BaseTriangle(0, 0).Y
  1353.       Rectangle(3, 0).X = BaseTriangle(0, 0).X
  1354.       Rectangle(3, 0).Y = BaseTriangle(0, 0).Y
  1355.       Rectangle(3, 1).X = XMax - BaseTriangle(0, 0).X
  1356.       Rectangle(3, 1).Y = BaseTriangle(0, 0).Y
  1357.       Rectangle(3, 2).X = XMax - BaseRectangle(0, 1).X
  1358.       Rectangle(3, 2).Y = BaseRectangle(0, 1).Y
  1359.       Rectangle(3, 3).X = BaseRectangle(0, 1).X
  1360.       Rectangle(3, 3).Y = BaseRectangle(0, 1).Y
  1361.       Y = 0
  1362.       State = 2
  1363.       DoEvents
  1364.       If State < 5 Then
  1365.         Timer1.Enabled = True
  1366.       End If
  1367.     Case 2
  1368.       If UsePalette Then
  1369.         OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  1370.         NumRealized = RealizePalette(frm3DMaze.hDC)
  1371.       End If
  1372.       If (Y <= MaxY - 1) Then
  1373.         If Y > 0 Then
  1374.           X0 = Rectangle(0, 0).X
  1375.           Y0 = Rectangle(0, 0).Y
  1376.           X1 = Rectangle(0, 1).X
  1377.           Y1 = Rectangle(0, 1).Y
  1378.           X2 = Rectangle(0, 2).X
  1379.           Y2 = Rectangle(0, 2).Y
  1380.           X3 = Rectangle(0, 3).X
  1381.           Y3 = Rectangle(0, 3).Y
  1382.           Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, 0#, X1, Y1, 0#, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, FloorColor)
  1383.           X0 = Rectangle(1, 0).X
  1384.           Y0 = Rectangle(1, 0).Y
  1385.           X1 = Rectangle(1, 1).X
  1386.           Y1 = Rectangle(1, 1).Y
  1387.           X2 = Rectangle(1, 2).X
  1388.           Y2 = Rectangle(1, 2).Y
  1389.           X3 = Rectangle(1, 3).X
  1390.           Y3 = Rectangle(1, 3).Y
  1391.           Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, 0#, X1, Y1, 0#, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, FloorColor)
  1392.         End If
  1393.         X0 = Rectangle(2, 0).X
  1394.         Y0 = Rectangle(2, 0).Y
  1395.         X1 = Rectangle(2, 1).X
  1396.         Y1 = Rectangle(2, 1).Y
  1397.         X2 = Rectangle(2, 2).X
  1398.         Y2 = Rectangle(2, 2).Y
  1399.         X3 = Rectangle(2, 3).X
  1400.         Y3 = Rectangle(2, 3).Y
  1401.         Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, 0#, X1, Y1, 0#, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, FloorColor)
  1402.         If Y < MaxY - 4 Then
  1403.           X0 = Rectangle(3, 0).X
  1404.           Y0 = Rectangle(3, 0).Y
  1405.           X1 = Rectangle(3, 1).X
  1406.           Y1 = Rectangle(3, 1).Y
  1407.           X2 = Rectangle(3, 2).X
  1408.           Y2 = Rectangle(3, 2).Y
  1409.           X3 = Rectangle(3, 3).X
  1410.           Y3 = Rectangle(3, 3).Y
  1411.           Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, 0#, X1, Y1, 0#, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, FloorColor)
  1412.         End If
  1413.         For ObjectNum = 0 To 3
  1414.           For VertexNum = 0 To 3
  1415.             Rectangle(ObjectNum, VertexNum).Y = Rectangle(ObjectNum, VertexNum).Y + Sqrt3
  1416.           Next VertexNum
  1417.         Next ObjectNum
  1418.         Y = Y + 4
  1419.       Else
  1420.         Rectangle(0, 0).X = BaseTriangle(1, 0).X
  1421.         Rectangle(0, 0).Y = BaseTriangle(1, 0).Y
  1422.         Rectangle(0, 1).X = BaseTriangle(1, 1).X
  1423.         Rectangle(0, 1).Y = BaseTriangle(1, 1).Y
  1424.         Rectangle(0, 2).X = BaseTriangle(2, 1).X
  1425.         Rectangle(0, 2).Y = BaseTriangle(2, 1).Y
  1426.         Rectangle(0, 3).X = BaseTriangle(2, 2).X
  1427.         Rectangle(0, 3).Y = BaseTriangle(2, 2).Y
  1428.         Rectangle(1, 0).X = BaseTriangle(0, 1).X
  1429.         Rectangle(1, 0).Y = BaseTriangle(0, 1).Y
  1430.         Rectangle(1, 1).X = BaseTriangle(1, 0).X
  1431.         Rectangle(1, 1).Y = BaseTriangle(1, 0).Y
  1432.         Rectangle(1, 2).X = BaseTriangle(2, 2).X
  1433.         Rectangle(1, 2).Y = BaseTriangle(2, 2).Y
  1434.         Rectangle(1, 3).X = BaseTriangle(3, 1).X
  1435.         Rectangle(1, 3).Y = BaseTriangle(3, 1).Y
  1436.         Rectangle(2, 0).X = BaseTriangle(0, 0).X
  1437.         Rectangle(2, 0).Y = BaseTriangle(0, 0).Y
  1438.         Rectangle(2, 1).X = BaseTriangle(0, 1).X
  1439.         Rectangle(2, 1).Y = BaseTriangle(0, 1).Y
  1440.         Rectangle(2, 2).X = BaseTriangle(3, 1).X
  1441.         Rectangle(2, 2).Y = BaseTriangle(3, 1).Y
  1442.         Rectangle(2, 3).X = BaseTriangle(3, 2).X
  1443.         Rectangle(2, 3).Y = BaseTriangle(3, 2).Y
  1444.         X = 0
  1445.         State = 3
  1446.       End If
  1447.       If UsePalette Then
  1448.         NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  1449.       End If
  1450.       DoEvents
  1451.       If State < 5 Then
  1452.         Timer1.Enabled = True
  1453.       End If
  1454.     Case 3
  1455.       If UsePalette Then
  1456.         OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  1457.         NumRealized = RealizePalette(frm3DMaze.hDC)
  1458.       End If
  1459.       If X <= MaxX Then
  1460.         For ObjectNum = 0 To 2
  1461.           X0 = Rectangle(ObjectNum, 0).X
  1462.           Y0 = Rectangle(ObjectNum, 0).Y
  1463.           X1 = Rectangle(ObjectNum, 1).X
  1464.           Y1 = Rectangle(ObjectNum, 1).Y
  1465.           X2 = Rectangle(ObjectNum, 2).X
  1466.           Y2 = Rectangle(ObjectNum, 2).Y
  1467.           X3 = Rectangle(ObjectNum, 3).X
  1468.           Y3 = Rectangle(ObjectNum, 3).Y
  1469.           Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, 0#, X1, Y1, 0#, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, FloorColor)
  1470.           X0 = Rectangle(ObjectNum, 0).X
  1471.           Y0 = YMax - Rectangle(ObjectNum, 0).Y
  1472.           X1 = Rectangle(ObjectNum, 1).X
  1473.           Y1 = YMax - Rectangle(ObjectNum, 1).Y
  1474.           X2 = Rectangle(ObjectNum, 2).X
  1475.           Y2 = YMax - Rectangle(ObjectNum, 2).Y
  1476.           X3 = Rectangle(ObjectNum, 3).X
  1477.           Y3 = YMax - Rectangle(ObjectNum, 3).Y
  1478.           Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, 0#, X1, Y1, 0#, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, FloorColor)
  1479.           For VertexNum = 0 To 3
  1480.             Rectangle(ObjectNum, VertexNum).X = Rectangle(ObjectNum, VertexNum).X + 3#
  1481.           Next VertexNum
  1482.         Next ObjectNum
  1483.         X = X + 8
  1484.       Else
  1485.         YMod4 = 0
  1486.         YOffset = 0#
  1487.         Y = 0
  1488.         State = 4
  1489.       End If
  1490.       If UsePalette Then
  1491.         NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  1492.       End If
  1493.       DoEvents
  1494.       If State < 5 Then
  1495.         Timer1.Enabled = True
  1496.       End If
  1497.     Case 4
  1498.       If UsePalette Then
  1499.         OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  1500.         NumRealized = RealizePalette(frm3DMaze.hDC)
  1501.       End If
  1502.       If Y <= MaxY Then
  1503.         Select Case YMod4
  1504.           Case 0
  1505.             XMod8 = 0
  1506.             For ObjectNum = 1 To 2
  1507.               For VertexNum = 0 To 2
  1508.                 Triangle(ObjectNum, VertexNum).X = BaseTriangle(ObjectNum, VertexNum).X
  1509.                 Triangle(ObjectNum, VertexNum).Y = BaseTriangle(ObjectNum, VertexNum).Y + YOffset
  1510.               Next VertexNum
  1511.             Next ObjectNum
  1512.             For VertexNum = 0 To 3
  1513.               Rectangle(2, VertexNum).X = BaseRectangle(2, VertexNum).X
  1514.               Rectangle(2, VertexNum).Y = BaseRectangle(2, VertexNum).Y + YOffset
  1515.             Next VertexNum
  1516.             For X = 0 To MaxX
  1517.               Select Case XMod8
  1518.                 Case 2
  1519.                   SingleTriangle(0).X = Triangle(1, 0).X
  1520.                   SingleTriangle(0).Y = Triangle(1, 0).Y
  1521.                   SingleTriangle(1).X = Triangle(1, 1).X
  1522.                   SingleTriangle(1).Y = Triangle(1, 1).Y
  1523.                   SingleTriangle(2).X = Triangle(1, 2).X
  1524.                   SingleTriangle(2).Y = Triangle(1, 2).Y
  1525.                   Call OutputTriangle(XMax, XOffset, YMax, SingleTriangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, True, TriangleSSWNNEColor)
  1526.                 Case 4
  1527.                   SingleTriangle(0).X = Triangle(2, 0).X
  1528.                   SingleTriangle(0).Y = Triangle(2, 0).Y
  1529.                   SingleTriangle(1).X = Triangle(2, 1).X
  1530.                   SingleTriangle(1).Y = Triangle(2, 1).Y
  1531.                   SingleTriangle(2).X = Triangle(2, 2).X
  1532.                   SingleTriangle(2).Y = Triangle(2, 2).Y
  1533.                   Call OutputTriangle(XMax, XOffset, YMax, SingleTriangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, True, TriangleSSENNWColor)
  1534.                 Case Else
  1535.               End Select
  1536.               XMod8 = XMod8 + 1
  1537.               If XMod8 >= 8 Then
  1538.                 XMod8 = 0
  1539.                 For ObjectNum = 1 To 2
  1540.                   For VertexNum = 0 To 2
  1541.                     Triangle(ObjectNum, VertexNum).X = Triangle(ObjectNum, VertexNum).X + 3#
  1542.                   Next VertexNum
  1543.                 Next ObjectNum
  1544.                 For VertexNum = 0 To 3
  1545.                   Rectangle(2, VertexNum).X = Rectangle(2, VertexNum).X + 3#
  1546.                 Next VertexNum
  1547.               End If
  1548.             Next X
  1549.             XMod8 = 0
  1550.             For ObjectNum = 1 To 2
  1551.               For VertexNum = 0 To 2
  1552.                 Triangle(ObjectNum, VertexNum).X = BaseTriangle(ObjectNum, VertexNum).X
  1553.                 Triangle(ObjectNum, VertexNum).Y = BaseTriangle(ObjectNum, VertexNum).Y + YOffset
  1554.               Next VertexNum
  1555.             Next ObjectNum
  1556.             For VertexNum = 0 To 3
  1557.               Rectangle(2, VertexNum).X = BaseRectangle(2, VertexNum).X
  1558.               Rectangle(2, VertexNum).Y = BaseRectangle(2, VertexNum).Y + YOffset
  1559.             Next VertexNum
  1560.             For X = 0 To MaxX
  1561.               Select Case XMod8
  1562.                 Case 2
  1563.                   SingleTriangle(0).X = Triangle(1, 0).X
  1564.                   SingleTriangle(0).Y = Triangle(1, 0).Y
  1565.                   SingleTriangle(1).X = Triangle(1, 1).X
  1566.                   SingleTriangle(1).Y = Triangle(1, 1).Y
  1567.                   SingleTriangle(2).X = Triangle(1, 2).X
  1568.                   SingleTriangle(2).Y = Triangle(1, 2).Y
  1569.                   Call OutputTriangle(XMax, XOffset, YMax, SingleTriangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, False, TriangleSENWColor)
  1570.                 Case 3
  1571.                   If ComputerPage(Y, X) = 0 Then
  1572.                     SingleRectangle(0).X = Rectangle(2, 0).X
  1573.                     SingleRectangle(0).Y = Rectangle(2, 0).Y
  1574.                     SingleRectangle(1).X = Rectangle(2, 1).X
  1575.                     SingleRectangle(1).Y = Rectangle(2, 1).Y
  1576.                     SingleRectangle(2).X = Rectangle(2, 2).X
  1577.                     SingleRectangle(2).Y = Rectangle(2, 2).Y
  1578.                     SingleRectangle(3).X = Rectangle(2, 3).X
  1579.                     SingleRectangle(3).Y = Rectangle(2, 3).Y
  1580.                     Call OutputRectangle(XMax, XOffset, YMax, SingleRectangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleWEColor)
  1581.                   End If
  1582.                 Case 4
  1583.                   SingleTriangle(0).X = Triangle(2, 0).X
  1584.                   SingleTriangle(0).Y = Triangle(2, 0).Y
  1585.                   SingleTriangle(1).X = Triangle(2, 1).X
  1586.                   SingleTriangle(1).Y = Triangle(2, 1).Y
  1587.                   SingleTriangle(2).X = Triangle(2, 2).X
  1588.                   SingleTriangle(2).Y = Triangle(2, 2).Y
  1589.                   Call OutputTriangle(XMax, XOffset, YMax, SingleTriangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, False, TriangleSWNEColor)
  1590.                 Case Else
  1591.               End Select
  1592.               XMod8 = XMod8 + 1
  1593.               If XMod8 >= 8 Then
  1594.                 XMod8 = 0
  1595.                 For ObjectNum = 1 To 2
  1596.                   For VertexNum = 0 To 2
  1597.                     Triangle(ObjectNum, VertexNum).X = Triangle(ObjectNum, VertexNum).X + 3#
  1598.                   Next VertexNum
  1599.                 Next ObjectNum
  1600.                 For VertexNum = 0 To 3
  1601.                   Rectangle(2, VertexNum).X = Rectangle(2, VertexNum).X + 3#
  1602.                 Next VertexNum
  1603.               End If
  1604.             Next X
  1605.           Case 1
  1606.             XMod8 = 0
  1607.             For ObjectNum = 1 To 3 Step 2
  1608.               For VertexNum = 0 To 3
  1609.                 Rectangle(ObjectNum, VertexNum).X = BaseRectangle(ObjectNum, VertexNum).X
  1610.                 Rectangle(ObjectNum, VertexNum).Y = BaseRectangle(ObjectNum, VertexNum).Y + YOffset
  1611.               Next VertexNum
  1612.             Next ObjectNum
  1613.             For X = 0 To MaxX
  1614.               Select Case XMod8
  1615.                 Case 1
  1616.                   If ComputerPage(Y, X) = 0 Then
  1617.                     SingleRectangle(0).X = Rectangle(1, 0).X
  1618.                     SingleRectangle(0).Y = Rectangle(1, 0).Y
  1619.                     SingleRectangle(1).X = Rectangle(1, 1).X
  1620.                     SingleRectangle(1).Y = Rectangle(1, 1).Y
  1621.                     SingleRectangle(2).X = Rectangle(1, 2).X
  1622.                     SingleRectangle(2).Y = Rectangle(1, 2).Y
  1623.                     SingleRectangle(3).X = Rectangle(1, 3).X
  1624.                     SingleRectangle(3).Y = Rectangle(1, 3).Y
  1625.                     Call OutputRectangle(XMax, XOffset, YMax, SingleRectangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleSWNEColor)
  1626.                   End If
  1627.                 Case 5
  1628.                   If ComputerPage(Y, X) = 0 Then
  1629.                     SingleRectangle(0).X = Rectangle(3, 0).X
  1630.                     SingleRectangle(0).Y = Rectangle(3, 0).Y
  1631.                     SingleRectangle(1).X = Rectangle(3, 1).X
  1632.                     SingleRectangle(1).Y = Rectangle(3, 1).Y
  1633.                     SingleRectangle(2).X = Rectangle(3, 2).X
  1634.                     SingleRectangle(2).Y = Rectangle(3, 2).Y
  1635.                     SingleRectangle(3).X = Rectangle(3, 3).X
  1636.                     SingleRectangle(3).Y = Rectangle(3, 3).Y
  1637.                     Call OutputRectangle(XMax, XOffset, YMax, SingleRectangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleSENWColor)
  1638.                   End If
  1639.                 Case Else
  1640.               End Select
  1641.               XMod8 = XMod8 + 1
  1642.               If XMod8 >= 8 Then
  1643.                 XMod8 = 0
  1644.                 For ObjectNum = 1 To 3 Step 2
  1645.                   For VertexNum = 0 To 3
  1646.                     Rectangle(ObjectNum, VertexNum).X = Rectangle(ObjectNum, VertexNum).X + 3#
  1647.                   Next VertexNum
  1648.                 Next ObjectNum
  1649.               End If
  1650.             Next X
  1651.           Case 2
  1652.             XMod8 = 0
  1653.             For ObjectNum = 0 To 3 Step 3
  1654.               For VertexNum = 0 To 2
  1655.                 Triangle(ObjectNum, VertexNum).X = BaseTriangle(ObjectNum, VertexNum).X
  1656.                 Triangle(ObjectNum, VertexNum).Y = BaseTriangle(ObjectNum, VertexNum).Y + YOffset
  1657.               Next VertexNum
  1658.             Next ObjectNum
  1659.             For VertexNum = 0 To 3
  1660.               Rectangle(4, VertexNum).X = BaseRectangle(4, VertexNum).X
  1661.               Rectangle(4, VertexNum).Y = BaseRectangle(4, VertexNum).Y + YOffset
  1662.             Next VertexNum
  1663.             For X = 0 To MaxX
  1664.               Select Case XMod8
  1665.                 Case 0
  1666.                   SingleTriangle(0).X = Triangle(0, 0).X
  1667.                   SingleTriangle(0).Y = Triangle(0, 0).Y
  1668.                   SingleTriangle(1).X = Triangle(0, 1).X
  1669.                   SingleTriangle(1).Y = Triangle(0, 1).Y
  1670.                   SingleTriangle(2).X = Triangle(0, 2).X
  1671.                   SingleTriangle(2).Y = Triangle(0, 2).Y
  1672.                   Call OutputTriangle(XMax, XOffset, YMax, SingleTriangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, True, TriangleSSWNNEColor)
  1673.                 Case 6
  1674.                   SingleTriangle(0).X = Triangle(3, 0).X
  1675.                   SingleTriangle(0).Y = Triangle(3, 0).Y
  1676.                   SingleTriangle(1).X = Triangle(3, 1).X
  1677.                   SingleTriangle(1).Y = Triangle(3, 1).Y
  1678.                   SingleTriangle(2).X = Triangle(3, 2).X
  1679.                   SingleTriangle(2).Y = Triangle(3, 2).Y
  1680.                   Call OutputTriangle(XMax, XOffset, YMax, SingleTriangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, True, TriangleSSENNWColor)
  1681.                 Case Else
  1682.               End Select
  1683.               XMod8 = XMod8 + 1
  1684.               If XMod8 >= 8 Then
  1685.                 XMod8 = 0
  1686.                 For ObjectNum = 0 To 3 Step 3
  1687.                   For VertexNum = 0 To 2
  1688.                     Triangle(ObjectNum, VertexNum).X = Triangle(ObjectNum, VertexNum).X + 3#
  1689.                   Next VertexNum
  1690.                 Next ObjectNum
  1691.                 For VertexNum = 0 To 3
  1692.                   Rectangle(4, VertexNum).X = Rectangle(4, VertexNum).X + 3#
  1693.                 Next VertexNum
  1694.               End If
  1695.             Next X
  1696.             XMod8 = 0
  1697.             For ObjectNum = 0 To 3 Step 3
  1698.               For VertexNum = 0 To 2
  1699.                 Triangle(ObjectNum, VertexNum).X = BaseTriangle(ObjectNum, VertexNum).X
  1700.                 Triangle(ObjectNum, VertexNum).Y = BaseTriangle(ObjectNum, VertexNum).Y + YOffset
  1701.               Next VertexNum
  1702.             Next ObjectNum
  1703.             For VertexNum = 0 To 3
  1704.               Rectangle(4, VertexNum).X = BaseRectangle(4, VertexNum).X
  1705.               Rectangle(4, VertexNum).Y = BaseRectangle(4, VertexNum).Y + YOffset
  1706.             Next VertexNum
  1707.             For X = 0 To MaxX
  1708.               Select Case XMod8
  1709.                 Case 0
  1710.                   SingleTriangle(0).X = Triangle(0, 0).X
  1711.                   SingleTriangle(0).Y = Triangle(0, 0).Y
  1712.                   SingleTriangle(1).X = Triangle(0, 1).X
  1713.                   SingleTriangle(1).Y = Triangle(0, 1).Y
  1714.                   SingleTriangle(2).X = Triangle(0, 2).X
  1715.                   SingleTriangle(2).Y = Triangle(0, 2).Y
  1716.                   Call OutputTriangle(XMax, XOffset, YMax, SingleTriangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, False, TriangleSWNEColor)
  1717.                 Case 6
  1718.                   SingleTriangle(0).X = Triangle(3, 0).X
  1719.                   SingleTriangle(0).Y = Triangle(3, 0).Y
  1720.                   SingleTriangle(1).X = Triangle(3, 1).X
  1721.                   SingleTriangle(1).Y = Triangle(3, 1).Y
  1722.                   SingleTriangle(2).X = Triangle(3, 2).X
  1723.                   SingleTriangle(2).Y = Triangle(3, 2).Y
  1724.                   Call OutputTriangle(XMax, XOffset, YMax, SingleTriangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, False, TriangleSENWColor)
  1725.                 Case 7
  1726.                   If ComputerPage(Y, X) = 0 Then
  1727.                     SingleRectangle(0).X = Rectangle(4, 0).X
  1728.                     SingleRectangle(0).Y = Rectangle(4, 0).Y
  1729.                     SingleRectangle(1).X = Rectangle(4, 1).X
  1730.                     SingleRectangle(1).Y = Rectangle(4, 1).Y
  1731.                     SingleRectangle(2).X = Rectangle(4, 2).X
  1732.                     SingleRectangle(2).Y = Rectangle(4, 2).Y
  1733.                     SingleRectangle(3).X = Rectangle(4, 3).X
  1734.                     SingleRectangle(3).Y = Rectangle(4, 3).Y
  1735.                     Call OutputRectangle(XMax, XOffset, YMax, SingleRectangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleWEColor)
  1736.                   End If
  1737.                 Case Else
  1738.               End Select
  1739.               XMod8 = XMod8 + 1
  1740.               If XMod8 >= 8 Then
  1741.                 XMod8 = 0
  1742.                 For ObjectNum = 0 To 3 Step 3
  1743.                   For VertexNum = 0 To 2
  1744.                     Triangle(ObjectNum, VertexNum).X = Triangle(ObjectNum, VertexNum).X + 3#
  1745.                   Next VertexNum
  1746.                 Next ObjectNum
  1747.                 For VertexNum = 0 To 3
  1748.                   Rectangle(4, VertexNum).X = Rectangle(4, VertexNum).X + 3#
  1749.                 Next VertexNum
  1750.               End If
  1751.             Next X
  1752.           Case Else
  1753.             XMod8 = 0
  1754.             For ObjectNum = 0 To 5 Step 5
  1755.               For VertexNum = 0 To 3
  1756.                 Rectangle(ObjectNum, VertexNum).X = BaseRectangle(ObjectNum, VertexNum).X
  1757.                 Rectangle(ObjectNum, VertexNum).Y = BaseRectangle(ObjectNum, VertexNum).Y + YOffset
  1758.               Next VertexNum
  1759.             Next ObjectNum
  1760.             For X = 0 To MaxX
  1761.               Select Case XMod8
  1762.                 Case 1
  1763.                   If ComputerPage(Y, X) = 0 Then
  1764.                     SingleRectangle(0).X = Rectangle(0, 0).X
  1765.                     SingleRectangle(0).Y = Rectangle(0, 0).Y
  1766.                     SingleRectangle(1).X = Rectangle(0, 1).X
  1767.                     SingleRectangle(1).Y = Rectangle(0, 1).Y
  1768.                     SingleRectangle(2).X = Rectangle(0, 2).X
  1769.                     SingleRectangle(2).Y = Rectangle(0, 2).Y
  1770.                     SingleRectangle(3).X = Rectangle(0, 3).X
  1771.                     SingleRectangle(3).Y = Rectangle(0, 3).Y
  1772.                     Call OutputRectangle(XMax, XOffset, YMax, SingleRectangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleSENWColor)
  1773.                   End If
  1774.                 Case 5
  1775.                   If ComputerPage(Y, X) = 0 Then
  1776.                     SingleRectangle(0).X = Rectangle(5, 0).X
  1777.                     SingleRectangle(0).Y = Rectangle(5, 0).Y
  1778.                     SingleRectangle(1).X = Rectangle(5, 1).X
  1779.                     SingleRectangle(1).Y = Rectangle(5, 1).Y
  1780.                     SingleRectangle(2).X = Rectangle(5, 2).X
  1781.                     SingleRectangle(2).Y = Rectangle(5, 2).Y
  1782.                     SingleRectangle(3).X = Rectangle(5, 3).X
  1783.                     SingleRectangle(3).Y = Rectangle(5, 3).Y
  1784.                     Call OutputRectangle(XMax, XOffset, YMax, SingleRectangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleSWNEColor)
  1785.                   End If
  1786.                 Case Else
  1787.               End Select
  1788.               XMod8 = XMod8 + 1
  1789.               If XMod8 >= 8 Then
  1790.                 XMod8 = 0
  1791.                 For ObjectNum = 0 To 5 Step 5
  1792.                   For VertexNum = 0 To 3
  1793.                     Rectangle(ObjectNum, VertexNum).X = Rectangle(ObjectNum, VertexNum).X + 3#
  1794.                   Next VertexNum
  1795.                 Next ObjectNum
  1796.               End If
  1797.             Next X
  1798.         End Select
  1799.         YMod4 = YMod4 + 1
  1800.         If YMod4 >= 4 Then
  1801.           YMod4 = 0
  1802.           YOffset = YOffset + Sqrt3
  1803.         End If
  1804.         Y = Y + 1
  1805.       Else
  1806.         State = 5
  1807.       End If
  1808.       If UsePalette Then
  1809.         NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  1810.       End If
  1811.       DoEvents
  1812.       If State < 5 Then
  1813.         Timer1.Enabled = True
  1814.       Else
  1815.         If State = 5 Then
  1816.           AlreadyPainting = False
  1817.           Call HexDisplayUserMoves(MaxX, MaxY, UserPage, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  1818.           If SolutionDisplayed Then
  1819.             Call HexDisplaySolution(MaxY, ComputerPage, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  1820.             Text1.Text = ""
  1821.           Else
  1822.             If UserHasSolved Then
  1823.               Text1.Text = "Congratulations!"
  1824.             Else
  1825.               Text1.Text = "Use Home, Up Arrow, PgUp, End, Down Arrow, and PgDn to solve."
  1826.             End If
  1827.           End If
  1828.           mnuActionItem(1).Enabled = True
  1829.           mnuActionItem(2).Enabled = True
  1830.         End If
  1831.       End If
  1832.     Case Else
  1833.       DoEvents
  1834.   End Select
  1835. End Sub
  1836.  
  1837. 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)
  1838.   Dim DeltaIndex As Byte
  1839.   Dim OldPaletteHandle As Long
  1840.   Dim PathFound As Integer
  1841.   Dim TemDouble As Double
  1842.   Dim X As Integer
  1843.   Dim XNext As Integer
  1844.   Dim XPrevious As Integer
  1845.   Dim XRelative As Double
  1846.   Dim XRelativeNext As Double
  1847.   Dim Y As Integer
  1848.   Dim YNext As Integer
  1849.   Dim YPrevious As Integer
  1850.   Dim YRelative As Double
  1851.   Dim YRelativeNext As Double
  1852.   If UsePalette Then
  1853.     OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  1854.     NumRealized = RealizePalette(frm3DMaze.hDC)
  1855.   End If
  1856.   XRelative = (RelativeWidthOfWall + 1#) / 2#
  1857.   YRelative = (RelativeWidthOfWall + 1#) / 2#
  1858.   CurrentColor = SolutionColor
  1859.   Call DrawLine(XRelative, RelativeWidthOfWall / 2#, XRelative, YRelative, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  1860.   XPrevious = 1
  1861.   YPrevious = -1
  1862.   X = 1
  1863.   Y = 1
  1864.   Do
  1865.     PathFound = False
  1866.     DeltaIndex = 0
  1867.     Do While (Not PathFound)
  1868.       XNext = X + SqrDeltaX(DeltaIndex, 0)
  1869.       YNext = Y + SqrDeltaY(DeltaIndex, 0)
  1870.       If Page(YNext, XNext) = 1 Then
  1871.         XNext = XNext + SqrDeltaX(DeltaIndex, 0)
  1872.         YNext = YNext + SqrDeltaY(DeltaIndex, 0)
  1873.         If (XNext <> XPrevious) Or (YNext <> YPrevious) Then
  1874.           PathFound = True
  1875.         Else
  1876.           DeltaIndex = DeltaIndex + 1
  1877.         End If
  1878.       Else
  1879.         DeltaIndex = DeltaIndex + 1
  1880.       End If
  1881.     Loop
  1882.     If YNext < MaxY Then
  1883.       TemDouble = SqrDeltaX(DeltaIndex, 0)
  1884.       XRelativeNext = XRelative + TemDouble
  1885.       TemDouble = SqrDeltaY(DeltaIndex, 0)
  1886.       YRelativeNext = YRelative + TemDouble
  1887.       Call DrawLine(XRelative, YRelative, XRelativeNext, YRelativeNext, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  1888.     Else
  1889.       Call DrawLine(XRelative, YRelative, XRelative, YMax, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  1890.     End If
  1891.     XPrevious = X
  1892.     YPrevious = Y
  1893.     X = XNext
  1894.     Y = YNext
  1895.     XRelative = XRelativeNext
  1896.     YRelative = YRelativeNext
  1897.   Loop While YNext < MaxY
  1898.   If UsePalette Then
  1899.     NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  1900.   End If
  1901. End Sub
  1902.  
  1903. 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)
  1904.   Dim DeltaIndex As Byte
  1905.   Dim OldPaletteHandle As Long
  1906.   Dim TemDouble As Double
  1907.   Dim X As Integer
  1908.   Dim XNext As Integer
  1909.   Dim XNextNext As Integer
  1910.   Dim XRelative As Double
  1911.   Dim XRelativeNext As Double
  1912.   Dim Y As Integer
  1913.   Dim YNext As Integer
  1914.   Dim YNextNext As Integer
  1915.   Dim YRelative As Double
  1916.   Dim YRelativeNext As Double
  1917.   If UsePalette Then
  1918.     OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  1919.     NumRealized = RealizePalette(frm3DMaze.hDC)
  1920.   End If
  1921.   Y = 1
  1922.   YRelative = (RelativeWidthOfWall + 1#) / 2#
  1923.   Do While (Y < MaxY)
  1924.     X = 1
  1925.     XRelative = (RelativeWidthOfWall + 1#) / 2#
  1926.     Do While (X < MaxX)
  1927.       If ((Page(Y, X) = 1) Or (Page(Y, X) = 3)) Then
  1928.         For DeltaIndex = 0 To 3
  1929.           XNext = X + SqrDeltaX(DeltaIndex, 0)
  1930.           YNext = Y + SqrDeltaY(DeltaIndex, 0)
  1931.           If Page(YNext, XNext) <> 0 Then
  1932.             If YNext = 0 Then
  1933.               CurrentColor = AdvanceColor
  1934.               Call DrawLine(XRelative, RelativeWidthOfWall / 2#, XRelative, YRelative, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  1935.             Else
  1936.               If YNext = MaxY Then
  1937.                 If UserHasSolved Then
  1938.                   CurrentColor = AdvanceColor
  1939.                   Call DrawLine(XRelative, YRelative, XRelative, YMax, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  1940.                 End If
  1941.               Else
  1942.                 XNextNext = XNext + SqrDeltaX(DeltaIndex, 0)
  1943.                 If XNextNext > 0 Then
  1944.                   If XNextNext < MaxX Then
  1945.                     YNextNext = YNext + SqrDeltaY(DeltaIndex, 0)
  1946.                     If YNextNext > 0 Then
  1947.                       If YNextNext < MaxY Then
  1948.                         If ((Page(YNextNext, XNextNext) = 1) Or (Page(YNextNext, XNextNext) = 3)) Then
  1949.                           If Page(Y, X) = Page(YNextNext, XNextNext) Then
  1950.                             If Page(Y, X) = 1 Then
  1951.                               CurrentColor = AdvanceColor
  1952.                             Else
  1953.                               CurrentColor = BackoutColor
  1954.                             End If
  1955.                           Else
  1956.                             CurrentColor = BackoutColor
  1957.                           End If
  1958.                           TemDouble = SqrDeltaX(DeltaIndex, 0)
  1959.                           XRelativeNext = XRelative + TemDouble / 2#
  1960.                           TemDouble = SqrDeltaY(DeltaIndex, 0)
  1961.                           YRelativeNext = YRelative + TemDouble / 2#
  1962.                           Call DrawLine(XRelative, YRelative, XRelativeNext, YRelativeNext, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  1963.                         End If
  1964.                        End If
  1965.                     End If
  1966.                   End If
  1967.                 End If
  1968.               End If
  1969.             End If
  1970.           End If
  1971.         Next DeltaIndex
  1972.       End If
  1973.       XRelative = XRelative + 1#
  1974.       X = X + 2
  1975.     Loop
  1976.     YRelative = YRelative + 1#
  1977.     Y = Y + 2
  1978.   Loop
  1979.   If UsePalette Then
  1980.     NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  1981.   End If
  1982. End Sub
  1983.  
  1984. Private Sub SqrSolveMaze(Stack() As StackRec, Page() As Byte, NumRoomsInSolution As Integer, Adjacency As Integer, MaxX As Integer, MaxY As Integer)
  1985.   Dim DeltaIndex As Byte
  1986.   Dim PassageFound As Integer
  1987.   Dim StackHead As Integer
  1988.   Dim X As Integer
  1989.   Dim XNext As Integer
  1990.   Dim Y As Integer
  1991.   Dim YNext As Integer
  1992.  
  1993.   NumRoomsInSolution = 1
  1994.   Adjacency = 0
  1995.   X = 1
  1996.   Y = 1
  1997.   StackHead = -1
  1998.   Page(Y, X) = 1
  1999.   Do
  2000.     DeltaIndex = 0
  2001.     PassageFound = False
  2002.     Do
  2003.       Do While ((DeltaIndex < 4) And (Not PassageFound))
  2004.         XNext = X + SqrDeltaX(DeltaIndex, 0)
  2005.         YNext = Y + SqrDeltaY(DeltaIndex, 0)
  2006.         If Page(YNext, XNext) = 2 Then
  2007.           PassageFound = True
  2008.         Else
  2009.           DeltaIndex = DeltaIndex + 1
  2010.         End If
  2011.       Loop
  2012.       If Not PassageFound Then
  2013.         DeltaIndex = Stack(StackHead).Index1
  2014.         Page(Y, X) = 2
  2015.         X = X - SqrDeltaX(DeltaIndex, 0)
  2016.         Y = Y - SqrDeltaY(DeltaIndex, 0)
  2017.         Page(Y, X) = 2
  2018.         X = X - SqrDeltaX(DeltaIndex, 0)
  2019.         Y = Y - SqrDeltaY(DeltaIndex, 0)
  2020.         StackHead = StackHead - 1
  2021.         DeltaIndex = DeltaIndex + 1
  2022.       End If
  2023.     Loop While Not PassageFound
  2024.     Page(YNext, XNext) = 1
  2025.     XNext = XNext + SqrDeltaX(DeltaIndex, 0)
  2026.     YNext = YNext + SqrDeltaY(DeltaIndex, 0)
  2027.     If YNext <= MaxY Then
  2028.       StackHead = StackHead + 1
  2029.       Stack(StackHead).Index1 = DeltaIndex
  2030.       Page(YNext, XNext) = 1
  2031.       X = XNext
  2032.       Y = YNext
  2033.     End If
  2034.   Loop While YNext < MaxY
  2035.   X = MaxX - 1
  2036.   Y = MaxY - 1
  2037.   Adjacency = 0
  2038.   Do While (StackHead >= 0)
  2039.     For DeltaIndex = 0 To 3
  2040.       XNext = X + SqrDeltaX(DeltaIndex, 0)
  2041.       YNext = Y + SqrDeltaY(DeltaIndex, 0)
  2042.       If Page(YNext, XNext) <> 1 Then
  2043.         If Page(YNext, XNext) = 0 Then
  2044.           XNext = XNext + SqrDeltaX(DeltaIndex, 0)
  2045.           YNext = YNext + SqrDeltaY(DeltaIndex, 0)
  2046.           If XNext < 0 Then
  2047.             Adjacency = Adjacency + 1
  2048.           Else
  2049.             If XNext > MaxX Then
  2050.               Adjacency = Adjacency + 1
  2051.             Else
  2052.               If YNext < 0 Then
  2053.                 Adjacency = Adjacency + 1
  2054.               Else
  2055.                 If YNext > MaxY Then
  2056.                   Adjacency = Adjacency + 1
  2057.                 Else
  2058.                   If Page(YNext, XNext) = 1 Then
  2059.                     Adjacency = Adjacency + 1
  2060.                   End If
  2061.                 End If
  2062.               End If
  2063.             End If
  2064.           End If
  2065.         End If
  2066.       End If
  2067.     Next DeltaIndex
  2068.     X = X - 2 * SqrDeltaX(Stack(StackHead).Index1, 0)
  2069.     Y = Y - 2 * SqrDeltaY(Stack(StackHead).Index1, 0)
  2070.     StackHead = StackHead - 1
  2071.     NumRoomsInSolution = NumRoomsInSolution + 1
  2072.   Loop
  2073.   For DeltaIndex = 0 To 3
  2074.     XNext = X + SqrDeltaX(DeltaIndex, 0)
  2075.     YNext = X + SqrDeltaY(DeltaIndex, 0)
  2076.     If Page(YNext, XNext) <> 2 Then
  2077.       If Page(YNext, XNext) = 0 Then
  2078.         XNext = XNext + SqrDeltaX(DeltaIndex, 0)
  2079.         YNext = YNext + SqrDeltaY(DeltaIndex, 0)
  2080.         If XNext < 0 Then
  2081.           Adjacency = Adjacency + 1
  2082.         Else
  2083.           If XNext > MaxX Then
  2084.             Adjacency = Adjacency + 1
  2085.           Else
  2086.             If YNext < 0 Then
  2087.               Adjacency = Adjacency + 1
  2088.             Else
  2089.               If YNext > MaxY Then
  2090.                 Adjacency = Adjacency + 1
  2091.               Else
  2092.                 If Page(YNext, XNext) = 1 Then
  2093.                   Adjacency = Adjacency + 1
  2094.                 End If
  2095.               End If
  2096.             End If
  2097.           End If
  2098.         End If
  2099.       End If
  2100.     End If
  2101.   Next DeltaIndex
  2102. End Sub
  2103.  
  2104. Private Sub SqrGenerateMaze(Page() As Byte, MaxX As Integer, MaxY As Integer, Stack() As StackRec, NumColumns As Integer, NumRows As Integer, Seed() As Byte)
  2105.   Dim DeltaIndex1 As Byte
  2106.   Dim DeltaIndex2 As Integer
  2107.   Dim Digit As Integer
  2108.   Dim DigitNum As Byte
  2109.   Dim PassageFound As Integer
  2110.   Dim RN(7) As Integer
  2111.   Dim RNIndex1 As Integer
  2112.   Dim RNIndex2 As Integer
  2113.   Dim SearchComplete As Integer
  2114.   Dim StackHead As Integer
  2115.   Dim Sum As Integer
  2116.   Dim TemInt As Integer
  2117.   Dim X As Integer
  2118.   Dim XNext As Integer
  2119.   Dim Y As Integer
  2120.   Dim YNext As Integer
  2121.  
  2122.   RN(0) = Seed(0) + 1
  2123.   RN(1) = Seed(1) + 1
  2124.   RN(2) = Seed(2) + 1
  2125.   RN(3) = Seed(3) + 1
  2126.   RN(4) = Seed(4) + 1
  2127.   RN(5) = Seed(5) + 1
  2128.   RN(6) = Seed(6) + 1
  2129.   RN(7) = Seed(7) + 1
  2130.   For Y = 0 To MaxY
  2131.     For X = 0 To MaxX
  2132.       Page(Y, X) = 0
  2133.     Next X
  2134.   Next Y
  2135.   Sum = 0
  2136.   For DigitNum = 1 To 3
  2137.     Digit = RN(0)
  2138.     RNIndex1 = 0
  2139.     RNIndex2 = 1
  2140.     Do While (RNIndex2 < 8)
  2141.       TemInt = RN(RNIndex2)
  2142.       RN(RNIndex1) = TemInt
  2143.       Digit = Digit + TemInt
  2144.       If Digit >= 29 Then Digit = Digit - 29
  2145.       RNIndex1 = RNIndex2
  2146.       RNIndex2 = RNIndex2 + 1
  2147.     Loop
  2148.     RN(7) = Digit
  2149.     Sum = 29 * Sum + Digit
  2150.   Next DigitNum
  2151.   X = 2 * (Sum Mod NumColumns) + 1
  2152.   Sum = 0
  2153.   For DigitNum = 1 To 3
  2154.     Digit = RN(0)
  2155.     RNIndex1 = 0
  2156.     RNIndex2 = 1
  2157.     Do While (RNIndex2 < 8)
  2158.       TemInt = RN(RNIndex2)
  2159.       RN(RNIndex1) = TemInt
  2160.       Digit = Digit + TemInt
  2161.       If Digit >= 29 Then Digit = Digit - 29
  2162.       RNIndex1 = RNIndex2
  2163.       RNIndex2 = RNIndex2 + 1
  2164.     Loop
  2165.     RN(7) = Digit
  2166.     Sum = 29 * Sum + Digit
  2167.   Next DigitNum
  2168.   Y = 2 * (Sum Mod NumRows) + 1
  2169.   Page(Y, X) = 2
  2170.   StackHead = -1
  2171.   Do
  2172.     DeltaIndex1 = 0
  2173.     Do
  2174.       DeltaIndex2 = RN(0)
  2175.       RNIndex1 = 0
  2176.       RNIndex2 = 1
  2177.       Do While (RNIndex2 < 8)
  2178.         TemInt = RN(RNIndex2)
  2179.         RN(RNIndex1) = TemInt
  2180.         DeltaIndex2 = DeltaIndex2 + TemInt
  2181.         If DeltaIndex2 >= 29 Then DeltaIndex2 = DeltaIndex2 - 29
  2182.         RNIndex1 = RNIndex2
  2183.         RNIndex2 = RNIndex2 + 1
  2184.       Loop
  2185.       RN(7) = DeltaIndex2
  2186.     Loop While DeltaIndex2 >= 24
  2187.     PassageFound = False
  2188.     SearchComplete = False
  2189.     Do While (Not SearchComplete)
  2190.       Do While ((DeltaIndex1 < 4) And (Not PassageFound))
  2191.         XNext = X + 2 * SqrDeltaX(DeltaIndex1, DeltaIndex2)
  2192.         If XNext <= 0 Then
  2193.           DeltaIndex1 = DeltaIndex1 + 1
  2194.         Else
  2195.           If XNext > MaxX Then
  2196.             DeltaIndex1 = DeltaIndex1 + 1
  2197.           Else
  2198.             YNext = Y + 2 * SqrDeltaY(DeltaIndex1, DeltaIndex2)
  2199.             If YNext <= 0 Then
  2200.               DeltaIndex1 = DeltaIndex1 + 1
  2201.             Else
  2202.               If YNext > MaxY Then
  2203.                 DeltaIndex1 = DeltaIndex1 + 1
  2204.               Else
  2205.                 If Page(YNext, XNext) = 0 Then
  2206.                   PassageFound = True
  2207.                 Else
  2208.                   DeltaIndex1 = DeltaIndex1 + 1
  2209.                 End If
  2210.               End If
  2211.             End If
  2212.           End If
  2213.         End If
  2214.       Loop
  2215.       If Not PassageFound Then
  2216.         If StackHead >= 0 Then
  2217.           DeltaIndex1 = Stack(StackHead).Index1
  2218.           DeltaIndex2 = Stack(StackHead).Index2
  2219.           X = X - 2 * SqrDeltaX(DeltaIndex1, DeltaIndex2)
  2220.           Y = Y - 2 * SqrDeltaY(DeltaIndex1, DeltaIndex2)
  2221.           StackHead = StackHead - 1
  2222.           DeltaIndex1 = DeltaIndex1 + 1
  2223.         End If
  2224.       End If
  2225.       If ((PassageFound) Or ((StackHead = -1) And (DeltaIndex1 >= 4))) Then
  2226.         SearchComplete = True
  2227.       Else
  2228.         SearchComplete = False
  2229.       End If
  2230.     Loop
  2231.     If PassageFound Then
  2232.       StackHead = StackHead + 1
  2233.       Stack(StackHead).Index1 = DeltaIndex1
  2234.       Stack(StackHead).Index2 = DeltaIndex2
  2235.       Page(YNext, XNext) = 2
  2236.       Page((Y + YNext) \ 2, (X + XNext) \ 2) = 2
  2237.       X = XNext
  2238.       Y = YNext
  2239.     End If
  2240.   Loop While StackHead <> -1
  2241.   Page(0, 1) = 1
  2242.   Page(MaxY, MaxX - 1) = 2
  2243. End Sub
  2244.  
  2245. 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)
  2246.   Dim Adjacency As Integer
  2247.   Dim Counter0 As Byte
  2248.   Dim Counter1 As Byte
  2249.   Dim Counter2 As Byte
  2250.   Dim Counter3 As Byte
  2251.   Dim Counter4 As Byte
  2252.   Dim Counter5 As Byte
  2253.   Dim Counter6 As Byte
  2254.   Dim Counter7 As Byte
  2255.   Dim ElapsedTime As Double
  2256.   Dim MinAdjacency As Integer
  2257.   Dim NumRoomsInSolution As Integer
  2258.   Dim NumRoomsInSolutionAtMin As Integer
  2259.   Dim RN(7) As Integer
  2260.   Dim RNIndex1 As Integer
  2261.   Dim RNIndex2 As Integer
  2262.   Dim SeedByte(7) As Byte
  2263.   Dim SeedByteAtMin(7) As Byte
  2264.   Dim SeedLength As Integer
  2265.   Dim StartTime As Double
  2266.  
  2267.   SeedLength = Len(Seed)
  2268.   If SeedLength > 8 Then SeedLength = 8
  2269.   RNIndex1 = 0
  2270.   For RNIndex2 = 1 To SeedLength
  2271.     RN(RNIndex1) = Asc(Mid$(Seed, RNIndex2, 1)) Mod 10
  2272.     RNIndex1 = RNIndex1 + 1
  2273.   Next RNIndex2
  2274.   RNIndex2 = 7
  2275.   Do While (RNIndex1 > 0)
  2276.     RNIndex1 = RNIndex1 - 1
  2277.     RN(RNIndex2) = RN(RNIndex1)
  2278.     RNIndex2 = RNIndex2 - 1
  2279.   Loop
  2280.   Do While (RNIndex2 >= 0)
  2281.     RN(RNIndex2) = 8
  2282.     RNIndex2 = RNIndex2 - 1
  2283.   Loop
  2284.   Counter0 = RN(0)
  2285.   Counter1 = RN(1)
  2286.   Counter2 = RN(2)
  2287.   Counter3 = RN(3)
  2288.   Counter4 = RN(4)
  2289.   Counter5 = RN(5)
  2290.   Counter6 = RN(6)
  2291.   Counter7 = RN(7)
  2292.   Call Hash(Counter0, Counter1, Counter2, Counter3, Counter4, Counter5, Counter6, Counter7)
  2293.   MinAdjacency = 2 * NumRoomsInMaze + 1
  2294.   NumRoomsInSolutionAtMin = 0
  2295.   SeedByteAtMin(0) = Counter0
  2296.   SeedByteAtMin(1) = Counter1
  2297.   SeedByteAtMin(2) = Counter2
  2298.   SeedByteAtMin(3) = Counter3
  2299.   SeedByteAtMin(4) = Counter4
  2300.   SeedByteAtMin(5) = Counter5
  2301.   SeedByteAtMin(6) = Counter6
  2302.   SeedByteAtMin(7) = Counter7
  2303.   StartTime = Timer
  2304.   Do
  2305.     SeedByte(0) = Counter0
  2306.     SeedByte(1) = Counter1
  2307.     SeedByte(2) = Counter2
  2308.     SeedByte(3) = Counter3
  2309.     SeedByte(4) = Counter4
  2310.     SeedByte(5) = Counter5
  2311.     SeedByte(6) = Counter6
  2312.     SeedByte(7) = Counter7
  2313.     Call SqrGenerateMaze(Page(), MaxX, MaxY, Stack(), NumColumns, NumRows, SeedByte())
  2314.     Call SqrSolveMaze(Stack(), Page(), NumRoomsInSolution, Adjacency, MaxX, MaxY)
  2315.     If 3 * NumRoomsInSolution >= NumRoomsInMaze Then
  2316.       If Adjacency < MinAdjacency Then
  2317.         MinAdjacency = Adjacency
  2318.         NumRoomsInSolutionAtMin = NumRoomsInSolution
  2319.         SeedByteAtMin(0) = SeedByte(0)
  2320.         SeedByteAtMin(1) = SeedByte(1)
  2321.         SeedByteAtMin(2) = SeedByte(2)
  2322.         SeedByteAtMin(3) = SeedByte(3)
  2323.         SeedByteAtMin(4) = SeedByte(4)
  2324.         SeedByteAtMin(5) = SeedByte(5)
  2325.         SeedByteAtMin(6) = SeedByte(6)
  2326.         SeedByteAtMin(7) = SeedByte(7)
  2327.       Else
  2328.         If Adjacency = MinAdjacency Then
  2329.           If NumRoomsInSolution > NumRoomsInSolutionAtMin Then
  2330.             NumRoomsInSolutionAtMin = NumRoomsInSolution
  2331.             SeedByteAtMin(0) = SeedByte(0)
  2332.             SeedByteAtMin(1) = SeedByte(1)
  2333.             SeedByteAtMin(2) = SeedByte(2)
  2334.             SeedByteAtMin(3) = SeedByte(3)
  2335.             SeedByteAtMin(4) = SeedByte(4)
  2336.             SeedByteAtMin(5) = SeedByte(5)
  2337.             SeedByteAtMin(6) = SeedByte(6)
  2338.             SeedByteAtMin(7) = SeedByte(7)
  2339.           End If
  2340.         End If
  2341.       End If
  2342.     End If
  2343.     Call Increment(Counter0, Counter1, Counter2, Counter3, Counter4, Counter5, Counter6, Counter7)
  2344.     ElapsedTime = Timer - StartTime
  2345.   Loop While ((ElapsedTime >= 0#) And (ElapsedTime < SecondsForMazeSelection))
  2346.   Call SqrGenerateMaze(Page(), MaxX, MaxY, Stack(), NumColumns, NumRows, SeedByteAtMin())
  2347.   Call SqrSolveMaze(Stack(), Page(), NumRoomsInSolution, Adjacency, MaxX, MaxY)
  2348. End Sub
  2349.  
  2350. Private Sub SqrOutputMaze()
  2351.   Dim ObjectNum As Byte
  2352.   Dim Radians As Double
  2353.   Dim RadiansPerDegree As Double
  2354.   Dim SingleRectangle(3) As VertexRec
  2355.   Dim SingleTriangle(2) As VertexRec
  2356.   Dim TemDouble1 As Double
  2357.   Dim TemDouble2 As Double
  2358.   Dim TemDouble3 As Double
  2359.   Dim TemDouble4 As Double
  2360.   Dim Triangle(3, 2) As VertexRec
  2361.   Dim VertexNum As Byte
  2362.   Dim XMod8 As Byte
  2363.   Dim X0 As Double
  2364.   Dim X1 As Double
  2365.   Dim X2 As Double
  2366.   Dim X3 As Double
  2367.   Dim Y0 As Double
  2368.   Dim Y1 As Double
  2369.   Dim Y2 As Double
  2370.   Dim Y3 As Double
  2371.  
  2372.   Select Case State
  2373.     Case 0
  2374.       Text1.Text = ""
  2375.       ScaleMode = 1
  2376.       If (Resize) Then
  2377.         TemDouble1 = ScaleWidth - VScroll1.Width
  2378.         TemDouble2 = MinWallLengthInInches
  2379.         TemDouble2 = 1440# * TemDouble2
  2380.         TemDouble3 = RelativeWidthOfWall
  2381.         NumColumns = Int(TemDouble1 / TemDouble2 - TemDouble3)
  2382.         If NumColumns < 2 Then NumColumns = 2
  2383.         TemDouble1 = ScaleHeight - Text1.Height
  2384.         TemDouble2 = ScaleWidth - VScroll1.Width
  2385.         ScaleMode = 3
  2386.         TemDouble3 = NumColumns
  2387.         NumRows = Int((TemDouble1 * TemDouble3) / TemDouble2)
  2388.         If NumRows < 2 Then NumRows = 2
  2389.         Tilt = 90 - VScroll1.Value
  2390.         MaxX = 2 * NumColumns
  2391.         MaxY = 2 * NumRows
  2392.         NumRoomsInMaze = NumRows * NumColumns
  2393.         ReDim ComputerPage(MaxY, MaxX)
  2394.         ReDim UserPage(MaxY, MaxX)
  2395.         ReDim Stack(NumRoomsInMaze)
  2396.         Call SqrSelectMaze(Seed, ComputerPage(), MaxX, MaxY, Stack(), NumRoomsInMaze, NumColumns, NumRows, SecondsForMazeSelection)
  2397.         For UserX = 0 To MaxX
  2398.           For UserY = 0 To MaxY
  2399.             If ComputerPage(UserY, UserX) = 0 Then
  2400.               UserPage(UserY, UserX) = 0
  2401.             Else
  2402.               UserPage(UserY, UserX) = 2
  2403.             End If
  2404.           Next UserY
  2405.         Next UserX
  2406.         UserX = 1
  2407.         UserXRelative = (RelativeWidthOfWall + 1#) / 2#
  2408.         UserY = 1
  2409.         UserYRelative = (RelativeWidthOfWall + 1#) / 2#
  2410.         UserPage(UserY, UserX) = 1
  2411.         Resize = False
  2412.       End If
  2413.       If (Paint) Then
  2414.         ScaleMode = 3
  2415.         Cls
  2416.         RadiansPerDegree = Atn(1#) / 45#
  2417.         Radians = Tilt * RadiansPerDegree
  2418.         SinTilt = Sin(Radians)
  2419.         CosTilt = Cos(Radians)
  2420.         TemDouble1 = NumColumns
  2421.         XMax = TemDouble1 + RelativeWidthOfWall
  2422.         TemDouble1 = ScaleWidth - VScroll1.Width
  2423.         PixelsPerX = (TemDouble1 - 1#) / (XMax * (XMax / (XMax - RelativeHeightOfWall)))
  2424.         XOffset = (XMax / 2#) * (RelativeHeightOfWall / (XMax - RelativeHeightOfWall))
  2425.         TemDouble1 = NumRows
  2426.         YMax = TemDouble1 + RelativeWidthOfWall
  2427.         TemDouble1 = ScaleHeight - Text1.Height
  2428.         PixelsPerZ = (TemDouble1 - 1#) / Sqr(YMax * YMax + RelativeHeightOfWall * RelativeHeightOfWall)
  2429.         If YMax > XMax Then
  2430.           RelDistOfUserFromScreen = YMax
  2431.         Else
  2432.           RelDistOfUserFromScreen = XMax
  2433.         End If
  2434.         Paint = False
  2435.       End If
  2436.       If State = 0 Then
  2437.         State = 1
  2438.         DoEvents
  2439.         If State < 5 Then
  2440.           Timer1.Enabled = True
  2441.         End If
  2442.       End If
  2443.     Case 1
  2444.       BaseRectangle(0, 0).X = 0#
  2445.       BaseRectangle(0, 0).Y = 0#
  2446.       BaseRectangle(0, 1).X = RelativeWidthOfWall
  2447.       BaseRectangle(0, 1).Y = 0#
  2448.       BaseRectangle(0, 2).X = RelativeWidthOfWall
  2449.       BaseRectangle(0, 2).Y = RelativeWidthOfWall
  2450.       BaseRectangle(0, 3).X = 0#
  2451.       BaseRectangle(0, 3).Y = RelativeWidthOfWall
  2452.       BaseRectangle(1, 0).X = RelativeWidthOfWall
  2453.       BaseRectangle(1, 0).Y = 0#
  2454.       BaseRectangle(1, 1).X = 1#
  2455.       BaseRectangle(1, 1).Y = 0#
  2456.       BaseRectangle(1, 2).X = 1#
  2457.       BaseRectangle(1, 2).Y = RelativeWidthOfWall
  2458.       BaseRectangle(1, 3).X = RelativeWidthOfWall
  2459.       BaseRectangle(1, 3).Y = RelativeWidthOfWall
  2460.       BaseRectangle(2, 0).X = RelativeWidthOfWall
  2461.       BaseRectangle(2, 0).Y = RelativeWidthOfWall
  2462.       BaseRectangle(2, 1).X = 1#
  2463.       BaseRectangle(2, 1).Y = RelativeWidthOfWall
  2464.       BaseRectangle(2, 2).X = 1#
  2465.       BaseRectangle(2, 2).Y = 1#
  2466.       BaseRectangle(2, 3).X = RelativeWidthOfWall
  2467.       BaseRectangle(2, 3).Y = 1#
  2468.       BaseRectangle(3, 0).X = 0#
  2469.       BaseRectangle(3, 0).Y = RelativeWidthOfWall
  2470.       BaseRectangle(3, 1).X = RelativeWidthOfWall
  2471.       BaseRectangle(3, 1).Y = RelativeWidthOfWall
  2472.       BaseRectangle(3, 2).X = RelativeWidthOfWall
  2473.       BaseRectangle(3, 2).Y = 1#
  2474.       BaseRectangle(3, 3).X = 0#
  2475.       BaseRectangle(3, 3).Y = 1#
  2476.       Rectangle(0, 0).X = 0#
  2477.       Rectangle(0, 0).Y = 0#
  2478.       Rectangle(0, 1).X = XMax
  2479.       Rectangle(0, 1).Y = 0#
  2480.       Rectangle(0, 2).X = XMax
  2481.       Rectangle(0, 2).Y = YMax
  2482.       Rectangle(0, 3).X = 0#
  2483.       Rectangle(0, 3).Y = YMax
  2484.       If UsePalette Then
  2485.         OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  2486.         NumRealized = RealizePalette(frm3DMaze.hDC)
  2487.       End If
  2488.       X0 = Rectangle(0, 0).X
  2489.       Y0 = Rectangle(0, 0).Y
  2490.       X1 = Rectangle(0, 1).X
  2491.       Y1 = Rectangle(0, 1).Y
  2492.       X2 = Rectangle(0, 2).X
  2493.       Y2 = Rectangle(0, 2).Y
  2494.       X3 = Rectangle(0, 3).X
  2495.       Y3 = Rectangle(0, 3).Y
  2496.       Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, 0#, X1, Y1, 0#, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, FloorColor)
  2497.       Y = 0
  2498.       YOffset = 0
  2499.       State = 4
  2500.       If UsePalette Then
  2501.         NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  2502.       End If
  2503.       DoEvents
  2504.       If State < 5 Then
  2505.         Timer1.Enabled = True
  2506.       End If
  2507.     Case 4
  2508.       If UsePalette Then
  2509.         OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  2510.         NumRealized = RealizePalette(frm3DMaze.hDC)
  2511.       End If
  2512.       If Y <= MaxY Then
  2513.         For VertexNum = 0 To 3
  2514.           Rectangle(0, VertexNum).X = BaseRectangle(0, VertexNum).X
  2515.           Rectangle(0, VertexNum).Y = BaseRectangle(0, VertexNum).Y + YOffset
  2516.         Next VertexNum
  2517.         X = 0
  2518.         Do While X <= MaxX
  2519.           If ComputerPage(Y, X) = 0 Then
  2520.             SingleRectangle(0).X = Rectangle(0, 0).X
  2521.             SingleRectangle(0).Y = Rectangle(0, 0).Y
  2522.             SingleRectangle(1).X = Rectangle(0, 1).X
  2523.             SingleRectangle(1).Y = Rectangle(0, 1).Y
  2524.             SingleRectangle(2).X = Rectangle(0, 2).X
  2525.             SingleRectangle(2).Y = Rectangle(0, 2).Y
  2526.             SingleRectangle(3).X = Rectangle(0, 3).X
  2527.             SingleRectangle(3).Y = Rectangle(0, 3).Y
  2528.             Call OutputLeftRight(XMax, XOffset, YMax, SingleRectangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen)
  2529.           End If
  2530.           For VertexNum = 0 To 3
  2531.             Rectangle(0, VertexNum).X = Rectangle(0, VertexNum).X + 1
  2532.           Next VertexNum
  2533.           X = X + 2
  2534.         Loop
  2535.         For VertexNum = 0 To 3
  2536.           Rectangle(0, VertexNum).X = BaseRectangle(0, VertexNum).X
  2537.           Rectangle(0, VertexNum).Y = BaseRectangle(0, VertexNum).Y + YOffset
  2538.         Next VertexNum
  2539.         For VertexNum = 0 To 3
  2540.           Rectangle(1, VertexNum).X = BaseRectangle(1, VertexNum).X
  2541.           Rectangle(1, VertexNum).Y = BaseRectangle(1, VertexNum).Y + YOffset
  2542.         Next VertexNum
  2543.         X = 0
  2544.         Do While X <= MaxX
  2545.           If ComputerPage(Y, X) = 0 Then
  2546.             SingleRectangle(0).X = Rectangle(0, 0).X
  2547.             SingleRectangle(0).Y = Rectangle(0, 0).Y
  2548.             SingleRectangle(1).X = Rectangle(0, 1).X
  2549.             SingleRectangle(1).Y = Rectangle(0, 1).Y
  2550.             SingleRectangle(2).X = Rectangle(0, 2).X
  2551.             SingleRectangle(2).Y = Rectangle(0, 2).Y
  2552.             SingleRectangle(3).X = Rectangle(0, 3).X
  2553.             SingleRectangle(3).Y = Rectangle(0, 3).Y
  2554.             Call OutputRectangle(XMax, XOffset, YMax, SingleRectangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleWEColor)
  2555.           End If
  2556.           For VertexNum = 0 To 3
  2557.             Rectangle(0, VertexNum).X = Rectangle(0, VertexNum).X + 1
  2558.           Next VertexNum
  2559.           X = X + 1
  2560.           If X <= MaxX Then
  2561.             If ComputerPage(Y, X) = 0 Then
  2562.               SingleRectangle(0).X = Rectangle(1, 0).X
  2563.               SingleRectangle(0).Y = Rectangle(1, 0).Y
  2564.               SingleRectangle(1).X = Rectangle(1, 1).X
  2565.               SingleRectangle(1).Y = Rectangle(1, 1).Y
  2566.               SingleRectangle(2).X = Rectangle(1, 2).X
  2567.               SingleRectangle(2).Y = Rectangle(1, 2).Y
  2568.               SingleRectangle(3).X = Rectangle(1, 3).X
  2569.               SingleRectangle(3).Y = Rectangle(1, 3).Y
  2570.               Call OutputRectangle(XMax, XOffset, YMax, SingleRectangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleWEColor)
  2571.             End If
  2572.             For VertexNum = 0 To 3
  2573.               Rectangle(1, VertexNum).X = Rectangle(1, VertexNum).X + 1
  2574.             Next VertexNum
  2575.             X = X + 1
  2576.           End If
  2577.         Loop
  2578.         Y = Y + 1
  2579.         If Y <= MaxY Then
  2580.           For VertexNum = 0 To 3
  2581.             Rectangle(3, VertexNum).X = BaseRectangle(3, VertexNum).X
  2582.             Rectangle(3, VertexNum).Y = BaseRectangle(3, VertexNum).Y + YOffset
  2583.           Next VertexNum
  2584.           X = 0
  2585.           Do While X <= MaxX
  2586.             If ComputerPage(Y, X) = 0 Then
  2587.               SingleRectangle(0).X = Rectangle(3, 0).X
  2588.               SingleRectangle(0).Y = Rectangle(3, 0).Y
  2589.               SingleRectangle(1).X = Rectangle(3, 1).X
  2590.               SingleRectangle(1).Y = Rectangle(3, 1).Y
  2591.               SingleRectangle(2).X = Rectangle(3, 2).X
  2592.               SingleRectangle(2).Y = Rectangle(3, 2).Y
  2593.               SingleRectangle(3).X = Rectangle(3, 3).X
  2594.               SingleRectangle(3).Y = Rectangle(3, 3).Y
  2595.               Call OutputLeftRight(XMax, XOffset, YMax, SingleRectangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen)
  2596.             End If
  2597.             For VertexNum = 0 To 3
  2598.               Rectangle(3, VertexNum).X = Rectangle(3, VertexNum).X + 1
  2599.             Next VertexNum
  2600.             X = X + 2
  2601.           Loop
  2602.           For VertexNum = 0 To 3
  2603.             Rectangle(3, VertexNum).X = BaseRectangle(3, VertexNum).X
  2604.             Rectangle(3, VertexNum).Y = BaseRectangle(3, VertexNum).Y + YOffset
  2605.           Next VertexNum
  2606.           X = 0
  2607.           Do While X <= MaxX
  2608.             If ComputerPage(Y, X) = 0 Then
  2609.               SingleRectangle(0).X = Rectangle(3, 0).X
  2610.               SingleRectangle(0).Y = Rectangle(3, 0).Y
  2611.               SingleRectangle(1).X = Rectangle(3, 1).X
  2612.               SingleRectangle(1).Y = Rectangle(3, 1).Y
  2613.               SingleRectangle(2).X = Rectangle(3, 2).X
  2614.               SingleRectangle(2).Y = Rectangle(3, 2).Y
  2615.               SingleRectangle(3).X = Rectangle(3, 3).X
  2616.               SingleRectangle(3).Y = Rectangle(3, 3).Y
  2617.               Call OutputRectangle(XMax, XOffset, YMax, SingleRectangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleWEColor)
  2618.             End If
  2619.             For VertexNum = 0 To 3
  2620.               Rectangle(3, VertexNum).X = Rectangle(3, VertexNum).X + 1
  2621.             Next VertexNum
  2622.             X = X + 2
  2623.           Loop
  2624.           Y = Y + 1
  2625.         End If
  2626.         YOffset = YOffset + 1
  2627.       Else
  2628.         State = 5
  2629.       End If
  2630.       If UsePalette Then
  2631.         NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  2632.       End If
  2633.       DoEvents
  2634.       If State < 5 Then
  2635.         Timer1.Enabled = True
  2636.       Else
  2637.         If State = 5 Then
  2638.           AlreadyPainting = False
  2639.           Call SqrDisplayUserMoves(MaxX, MaxY, UserPage, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  2640.           If SolutionDisplayed Then
  2641.             Call SqrDisplaySolution(MaxY, ComputerPage, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  2642.             Text1.Text = ""
  2643.           Else
  2644.             If UserHasSolved Then
  2645.               Text1.Text = "Congratulations!"
  2646.             Else
  2647.               Text1.Text = "Use the arrow keys to solve."
  2648.             End If
  2649.           End If
  2650.           mnuActionItem(1).Enabled = True
  2651.           mnuActionItem(2).Enabled = True
  2652.         End If
  2653.       End If
  2654.     Case Else
  2655.       DoEvents
  2656.   End Select
  2657. End Sub
  2658.  
  2659. Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
  2660.   If ((State = 5) And (Not SolutionDisplayed) And (Not UserHasSolved)) Then
  2661.     Dim DeltaIndex1 As Integer
  2662.     Dim OldPaletteHandle As Long
  2663.     Dim PassageFound As Integer
  2664.     Dim TemDouble As Double
  2665.     Dim XNext As Integer
  2666.     Dim XRelativeNext As Double
  2667.     Dim YNext As Integer
  2668.     Dim YRelativeNext As Double
  2669.     PassageFound = True
  2670.     DeltaIndex1 = -1
  2671.     If mnuStyleItem(0).Checked Then
  2672.       Select Case KeyCode
  2673.         Case vbKeyPageDown, vbKeyNumpad3
  2674.           DeltaIndex1 = 5
  2675.           KeyCode = 0
  2676.         Case vbKeyHome, vbKeyNumpad7
  2677.           DeltaIndex1 = 0
  2678.           KeyCode = 0
  2679.         Case vbKeyLeft, vbKeyNumpad4
  2680.           Beep
  2681.           KeyCode = 0
  2682.         Case vbKeyUp, vbKeyNumpad8
  2683.           DeltaIndex1 = 2
  2684.           KeyCode = 0
  2685.         Case vbKeyRight, vbKeyNumpad6
  2686.           Beep
  2687.           KeyCode = 0
  2688.         Case vbKeyDown, vbKeyNumpad2
  2689.           DeltaIndex1 = 3
  2690.           KeyCode = 0
  2691.         Case vbKeyPageUp, vbKeyNumpad9
  2692.           DeltaIndex1 = 4
  2693.           KeyCode = 0
  2694.         Case vbKeyEnd, vbKeyNumpad1
  2695.           DeltaIndex1 = 1
  2696.           KeyCode = 0
  2697.       End Select
  2698.       If DeltaIndex1 >= 0 Then
  2699.         XNext = UserX + HexDeltaX(DeltaIndex1, 0)
  2700.         If XNext <= 0 Then
  2701.           PassageFound = False
  2702.         Else
  2703.           If XNext >= MaxX Then
  2704.             PassageFound = False
  2705.           Else
  2706.             YNext = UserY + HexDeltaY(DeltaIndex1, 0)
  2707.             If YNext <= 0 Then
  2708.               PassageFound = False
  2709.             Else
  2710.               If YNext > MaxY Then
  2711.                 PassageFound = False
  2712.               Else
  2713.                 If UserPage(YNext, XNext) = 0 Then
  2714.                   PassageFound = False
  2715.                 End If
  2716.               End If
  2717.             End If
  2718.           End If
  2719.         End If
  2720.         If PassageFound Then
  2721.           XNext = XNext + HexDeltaX(DeltaIndex1, 0)
  2722.           YNext = YNext + HexDeltaY(DeltaIndex1, 0)
  2723.           If YNext < MaxY Then
  2724.             If UserPage(YNext, XNext) = 1 Then
  2725.               CurrentColor = BackoutColor
  2726.               UserPage(UserY, UserX) = 3
  2727.             Else
  2728.               CurrentColor = AdvanceColor
  2729.               UserPage(YNext, XNext) = 1
  2730.             End If
  2731.             Select Case (YNext - UserY)
  2732.               Case -4
  2733.                 XRelativeNext = UserXRelative
  2734.                 YRelativeNext = UserYRelative - Sqrt3
  2735.               Case -2
  2736.                 If XNext > UserX Then
  2737.                   XRelativeNext = UserXRelative + 3# / 2#
  2738.                   YRelativeNext = UserYRelative - Sqrt3 / 2#
  2739.                 Else
  2740.                   XRelativeNext = UserXRelative - 3# / 2#
  2741.                   YRelativeNext = UserYRelative - Sqrt3 / 2#
  2742.                 End If
  2743.               Case 2
  2744.                 If XNext > UserX Then
  2745.                   XRelativeNext = UserXRelative + 3# / 2#
  2746.                   YRelativeNext = UserYRelative + Sqrt3 / 2#
  2747.                 Else
  2748.                   XRelativeNext = UserXRelative - 3# / 2#
  2749.                   YRelativeNext = UserYRelative + Sqrt3 / 2#
  2750.                 End If
  2751.               Case Else
  2752.                 XRelativeNext = UserXRelative
  2753.                 YRelativeNext = UserYRelative + Sqrt3
  2754.             End Select
  2755.             If UsePalette Then
  2756.               OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  2757.               NumRealized = RealizePalette(frm3DMaze.hDC)
  2758.             End If
  2759.             Call DrawLine(UserXRelative, UserYRelative, XRelativeNext, YRelativeNext, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  2760.             If UsePalette Then
  2761.               NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  2762.             End If
  2763.           Else
  2764.             CurrentColor = AdvanceColor
  2765.             If UsePalette Then
  2766.               OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  2767.               NumRealized = RealizePalette(frm3DMaze.hDC)
  2768.             End If
  2769.             Call DrawLine(UserXRelative, UserYRelative, UserXRelative, YMax, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  2770.             If UsePalette Then
  2771.               NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  2772.             End If
  2773.             UserHasSolved = True
  2774.             Text1.Text = "Congratulations!"
  2775.           End If
  2776.           UserX = XNext
  2777.           UserY = YNext
  2778.           UserXRelative = XRelativeNext
  2779.           UserYRelative = YRelativeNext
  2780.         Else
  2781.           Beep
  2782.         End If
  2783.       End If
  2784.     Else
  2785.       Select Case KeyCode
  2786.         Case vbKeyPageDown, vbKeyNumpad3
  2787.           Beep
  2788.           KeyCode = 0
  2789.         Case vbKeyHome, vbKeyNumpad7
  2790.           Beep
  2791.           KeyCode = 0
  2792.         Case vbKeyLeft, vbKeyNumpad4
  2793.           DeltaIndex1 = 0
  2794.           KeyCode = 0
  2795.         Case vbKeyUp, vbKeyNumpad8
  2796.           DeltaIndex1 = 3
  2797.           KeyCode = 0
  2798.         Case vbKeyRight, vbKeyNumpad6
  2799.           DeltaIndex1 = 2
  2800.           KeyCode = 0
  2801.         Case vbKeyDown, vbKeyNumpad2
  2802.           DeltaIndex1 = 1
  2803.           KeyCode = 0
  2804.         Case vbKeyPageUp, vbKeyNumpad9
  2805.           Beep
  2806.           KeyCode = 0
  2807.         Case vbKeyEnd, vbKeyNumpad1
  2808.           Beep
  2809.           KeyCode = 0
  2810.       End Select
  2811.       If DeltaIndex1 >= 0 Then
  2812.         XNext = UserX + SqrDeltaX(DeltaIndex1, 0)
  2813.         If XNext <= 0 Then
  2814.           PassageFound = False
  2815.         Else
  2816.           If XNext >= MaxX Then
  2817.             PassageFound = False
  2818.           Else
  2819.             YNext = UserY + SqrDeltaY(DeltaIndex1, 0)
  2820.             If YNext <= 0 Then
  2821.               PassageFound = False
  2822.             Else
  2823.               If YNext > MaxY Then
  2824.                 PassageFound = False
  2825.               Else
  2826.                 If UserPage(YNext, XNext) = 0 Then
  2827.                   PassageFound = False
  2828.                 End If
  2829.               End If
  2830.             End If
  2831.           End If
  2832.         End If
  2833.         If PassageFound Then
  2834.           XNext = XNext + SqrDeltaX(DeltaIndex1, 0)
  2835.           YNext = YNext + SqrDeltaY(DeltaIndex1, 0)
  2836.           If YNext < MaxY Then
  2837.             If UserPage(YNext, XNext) = 1 Then
  2838.               CurrentColor = BackoutColor
  2839.               UserPage(UserY, UserX) = 3
  2840.             Else
  2841.               CurrentColor = AdvanceColor
  2842.               UserPage(YNext, XNext) = 1
  2843.             End If
  2844.             TemDouble = SqrDeltaX(DeltaIndex1, 0)
  2845.             XRelativeNext = UserXRelative + TemDouble
  2846.             TemDouble = SqrDeltaY(DeltaIndex1, 0)
  2847.             YRelativeNext = UserYRelative + TemDouble
  2848.             If UsePalette Then
  2849.               OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  2850.               NumRealized = RealizePalette(frm3DMaze.hDC)
  2851.             End If
  2852.             Call DrawLine(UserXRelative, UserYRelative, XRelativeNext, YRelativeNext, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  2853.             If UsePalette Then
  2854.               NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  2855.             End If
  2856.           Else
  2857.             CurrentColor = AdvanceColor
  2858.             If UsePalette Then
  2859.               OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  2860.               NumRealized = RealizePalette(frm3DMaze.hDC)
  2861.             End If
  2862.             Call DrawLine(UserXRelative, UserYRelative, UserXRelative, YMax, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  2863.             If UsePalette Then
  2864.               NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  2865.             End If
  2866.             UserHasSolved = True
  2867.             Text1.Text = "Congratulations!"
  2868.           End If
  2869.           UserX = XNext
  2870.           UserY = YNext
  2871.           UserXRelative = XRelativeNext
  2872.           UserYRelative = YRelativeNext
  2873.         Else
  2874.           Beep
  2875.         End If
  2876.       End If
  2877.     End If
  2878.   End If
  2879. End Sub
  2880.  
  2881. Private Sub Form_Load()
  2882.   Dim ColorNum As Integer
  2883.   Dim DeltaIndex1a As Byte
  2884.   Dim DeltaIndex1b As Byte
  2885.   Dim DeltaIndex1c As Byte
  2886.   Dim DeltaIndex1d As Byte
  2887.   Dim DeltaIndex1e As Byte
  2888.   Dim DeltaIndex1f As Byte
  2889.   Dim DeltaIndex2 As Integer
  2890.   Dim LogicalPalette As LOGPALETTE
  2891.   Dim NumBits As Long
  2892.   Dim NumColorsFree As Long
  2893.   Dim Tint As Integer
  2894.   OldPaletteHandle = 0
  2895.   AlreadyPainting = False
  2896.   SolutionDisplayed = False
  2897.   UserHasSolved = False
  2898.   State = 0
  2899.   Minimized = False
  2900.   mnuStyleItem(0).Checked = False
  2901.   mnuStyleItem(1).Checked = True
  2902.   SubstitutionHigh(0) = 4
  2903.   SubstitutionHigh(1) = 1
  2904.   SubstitutionHigh(2) = 2
  2905.   SubstitutionHigh(3) = 8
  2906.   SubstitutionHigh(4) = 8
  2907.   SubstitutionHigh(5) = 9
  2908.   SubstitutionHigh(6) = 9
  2909.   SubstitutionHigh(7) = 6
  2910.   SubstitutionHigh(8) = 5
  2911.   SubstitutionHigh(9) = 7
  2912.   SubstitutionHigh(10) = 2
  2913.   SubstitutionHigh(11) = 1
  2914.   SubstitutionHigh(12) = 2
  2915.   SubstitutionHigh(13) = 9
  2916.   SubstitutionHigh(14) = 8
  2917.   SubstitutionHigh(15) = 8
  2918.   SubstitutionHigh(16) = 6
  2919.   SubstitutionHigh(17) = 3
  2920.   SubstitutionHigh(18) = 5
  2921.   SubstitutionHigh(19) = 1
  2922.   SubstitutionHigh(20) = 9
  2923.   SubstitutionHigh(21) = 5
  2924.   SubstitutionHigh(22) = 4
  2925.   SubstitutionHigh(23) = 4
  2926.   SubstitutionHigh(24) = 9
  2927.   SubstitutionHigh(25) = 8
  2928.   SubstitutionHigh(26) = 6
  2929.   SubstitutionHigh(27) = 0
  2930.   SubstitutionHigh(28) = 8
  2931.   SubstitutionHigh(29) = 0
  2932.   SubstitutionHigh(30) = 6
  2933.   SubstitutionHigh(31) = 0
  2934.   SubstitutionHigh(32) = 2
  2935.   SubstitutionHigh(33) = 4
  2936.   SubstitutionHigh(34) = 1
  2937.   SubstitutionHigh(35) = 9
  2938.   SubstitutionHigh(36) = 2
  2939.   SubstitutionHigh(37) = 0
  2940.   SubstitutionHigh(38) = 7
  2941.   SubstitutionHigh(39) = 4
  2942.   SubstitutionHigh(40) = 7
  2943.   SubstitutionHigh(41) = 3
  2944.   SubstitutionHigh(42) = 0
  2945.   SubstitutionHigh(43) = 0
  2946.   SubstitutionHigh(44) = 2
  2947.   SubstitutionHigh(45) = 6
  2948.   SubstitutionHigh(46) = 8
  2949.   SubstitutionHigh(47) = 9
  2950.   SubstitutionHigh(48) = 4
  2951.   SubstitutionHigh(49) = 0
  2952.   SubstitutionHigh(50) = 8
  2953.   SubstitutionHigh(51) = 3
  2954.   SubstitutionHigh(52) = 2
  2955.   SubstitutionHigh(53) = 3
  2956.   SubstitutionHigh(54) = 2
  2957.   SubstitutionHigh(55) = 5
  2958.   SubstitutionHigh(56) = 2
  2959.   SubstitutionHigh(57) = 4
  2960.   SubstitutionHigh(58) = 6
  2961.   SubstitutionHigh(59) = 9
  2962.   SubstitutionHigh(60) = 7
  2963.   SubstitutionHigh(61) = 9
  2964.   SubstitutionHigh(62) = 1
  2965.   SubstitutionHigh(63) = 3
  2966.   SubstitutionHigh(64) = 5
  2967.   SubstitutionHigh(65) = 7
  2968.   SubstitutionHigh(66) = 1
  2969.   SubstitutionHigh(67) = 1
  2970.   SubstitutionHigh(68) = 4
  2971.   SubstitutionHigh(69) = 5
  2972.   SubstitutionHigh(70) = 8
  2973.   SubstitutionHigh(71) = 1
  2974.   SubstitutionHigh(72) = 6
  2975.   SubstitutionHigh(73) = 0
  2976.   SubstitutionHigh(74) = 5
  2977.   SubstitutionHigh(75) = 7
  2978.   SubstitutionHigh(76) = 8
  2979.   SubstitutionHigh(77) = 2
  2980.   SubstitutionHigh(78) = 3
  2981.   SubstitutionHigh(79) = 3
  2982.   SubstitutionHigh(80) = 7
  2983.   SubstitutionHigh(81) = 3
  2984.   SubstitutionHigh(82) = 5
  2985.   SubstitutionHigh(83) = 1
  2986.   SubstitutionHigh(84) = 7
  2987.   SubstitutionHigh(85) = 5
  2988.   SubstitutionHigh(86) = 4
  2989.   SubstitutionHigh(87) = 0
  2990.   SubstitutionHigh(88) = 3
  2991.   SubstitutionHigh(89) = 6
  2992.   SubstitutionHigh(90) = 3
  2993.   SubstitutionHigh(91) = 7
  2994.   SubstitutionHigh(92) = 7
  2995.   SubstitutionHigh(93) = 1
  2996.   SubstitutionHigh(94) = 9
  2997.   SubstitutionHigh(95) = 4
  2998.   SubstitutionHigh(96) = 0
  2999.   SubstitutionHigh(97) = 5
  3000.   SubstitutionHigh(98) = 6
  3001.   SubstitutionHigh(99) = 6
  3002.   SubstitutionLow(0) = 1
  3003.   SubstitutionLow(1) = 2
  3004.   SubstitutionLow(2) = 2
  3005.   SubstitutionLow(3) = 1
  3006.   SubstitutionLow(4) = 5
  3007.   SubstitutionLow(5) = 5
  3008.   SubstitutionLow(6) = 4
  3009.   SubstitutionLow(7) = 6
  3010.   SubstitutionLow(8) = 4
  3011.   SubstitutionLow(9) = 6
  3012.   SubstitutionLow(10) = 4
  3013.   SubstitutionLow(11) = 4
  3014.   SubstitutionLow(12) = 5
  3015.   SubstitutionLow(13) = 6
  3016.   SubstitutionLow(14) = 6
  3017.   SubstitutionLow(15) = 3
  3018.   SubstitutionLow(16) = 0
  3019.   SubstitutionLow(17) = 9
  3020.   SubstitutionLow(18) = 6
  3021.   SubstitutionLow(19) = 5
  3022.   SubstitutionLow(20) = 7
  3023.   SubstitutionLow(21) = 2
  3024.   SubstitutionLow(22) = 0
  3025.   SubstitutionLow(23) = 9
  3026.   SubstitutionLow(24) = 3
  3027.   SubstitutionLow(25) = 4
  3028.   SubstitutionLow(26) = 2
  3029.   SubstitutionLow(27) = 3
  3030.   SubstitutionLow(28) = 9
  3031.   SubstitutionLow(29) = 1
  3032.   SubstitutionLow(30) = 9
  3033.   SubstitutionLow(31) = 9
  3034.   SubstitutionLow(32) = 9
  3035.   SubstitutionLow(33) = 3
  3036.   SubstitutionLow(34) = 8
  3037.   SubstitutionLow(35) = 9
  3038.   SubstitutionLow(36) = 3
  3039.   SubstitutionLow(37) = 4
  3040.   SubstitutionLow(38) = 1
  3041.   SubstitutionLow(39) = 5
  3042.   SubstitutionLow(40) = 0
  3043.   SubstitutionLow(41) = 5
  3044.   SubstitutionLow(42) = 2
  3045.   SubstitutionLow(43) = 7
  3046.   SubstitutionLow(44) = 0
  3047.   SubstitutionLow(45) = 8
  3048.   SubstitutionLow(46) = 8
  3049.   SubstitutionLow(47) = 0
  3050.   SubstitutionLow(48) = 4
  3051.   SubstitutionLow(49) = 5
  3052.   SubstitutionLow(50) = 0
  3053.   SubstitutionLow(51) = 3
  3054.   SubstitutionLow(52) = 6
  3055.   SubstitutionLow(53) = 8
  3056.   SubstitutionLow(54) = 1
  3057.   SubstitutionLow(55) = 7
  3058.   SubstitutionLow(56) = 8
  3059.   SubstitutionLow(57) = 8
  3060.   SubstitutionLow(58) = 7
  3061.   SubstitutionLow(59) = 1
  3062.   SubstitutionLow(60) = 3
  3063.   SubstitutionLow(61) = 2
  3064.   SubstitutionLow(62) = 7
  3065.   SubstitutionLow(63) = 7
  3066.   SubstitutionLow(64) = 1
  3067.   SubstitutionLow(65) = 8
  3068.   SubstitutionLow(66) = 0
  3069.   SubstitutionLow(67) = 3
  3070.   SubstitutionLow(68) = 7
  3071.   SubstitutionLow(69) = 5
  3072.   SubstitutionLow(70) = 2
  3073.   SubstitutionLow(71) = 6
  3074.   SubstitutionLow(72) = 4
  3075.   SubstitutionLow(73) = 0
  3076.   SubstitutionLow(74) = 9
  3077.   SubstitutionLow(75) = 9
  3078.   SubstitutionLow(76) = 7
  3079.   SubstitutionLow(77) = 7
  3080.   SubstitutionLow(78) = 4
  3081.   SubstitutionLow(79) = 6
  3082.   SubstitutionLow(80) = 2
  3083.   SubstitutionLow(81) = 0
  3084.   SubstitutionLow(82) = 0
  3085.   SubstitutionLow(83) = 1
  3086.   SubstitutionLow(84) = 7
  3087.   SubstitutionLow(85) = 3
  3088.   SubstitutionLow(86) = 6
  3089.   SubstitutionLow(87) = 6
  3090.   SubstitutionLow(88) = 1
  3091.   SubstitutionLow(89) = 1
  3092.   SubstitutionLow(90) = 2
  3093.   SubstitutionLow(91) = 4
  3094.   SubstitutionLow(92) = 5
  3095.   SubstitutionLow(93) = 9
  3096.   SubstitutionLow(94) = 8
  3097.   SubstitutionLow(95) = 2
  3098.   SubstitutionLow(96) = 8
  3099.   SubstitutionLow(97) = 8
  3100.   SubstitutionLow(98) = 3
  3101.   SubstitutionLow(99) = 5
  3102.   NumColorsFree = 1
  3103.   NumBits = GetDeviceCaps(frm3DMaze.hDC, PLANES) * GetDeviceCaps(frm3DMaze.hDC, BITSPIXEL)
  3104.   If NumBits >= 31 Then
  3105.     UsePalette = False
  3106.   Else
  3107.     Do While (NumBits > 0)
  3108.       NumColorsFree = 2 * NumColorsFree
  3109.       NumBits = NumBits - 1
  3110.     Loop
  3111.     NumColorsFree = NumColorsFree - GetDeviceCaps(frm3DMaze.hDC, COLORS)
  3112.     If NumColorsFree < 16 Then
  3113.       UsePalette = False
  3114.     Else
  3115.       UsePalette = True
  3116.     End If
  3117.   End If
  3118.   LogicalPalette.palVersion = 3 * 256
  3119.   LogicalPalette.palNumEntries = 16
  3120.   For ColorNum = 0 To NumColors - 4
  3121.     ' evenly spaced shades of gray
  3122.     Tint = (256 * ColorNum) \ (NumColors - 3)
  3123.     LogicalPalette.palPalEntry(ColorNum).peRed = Tint
  3124.     LogicalPalette.palPalEntry(ColorNum).peGreen = Tint
  3125.     LogicalPalette.palPalEntry(ColorNum).peBlue = Tint
  3126.     LogicalPalette.palPalEntry(ColorNum).peFlags = PC_NOCOLLAPSE
  3127.     RedGreenBlue(ColorNum) = RGB(Tint, Tint, Tint)
  3128.   Next ColorNum
  3129.   LogicalPalette.palPalEntry(BackoutColor).peRed = 255
  3130.   LogicalPalette.palPalEntry(BackoutColor).peGreen = 255
  3131.   LogicalPalette.palPalEntry(BackoutColor).peBlue = 0
  3132.   LogicalPalette.palPalEntry(BackoutColor).peFlags = PC_NOCOLLAPSE
  3133.   RedGreenBlue(BackoutColor) = RGB(255, 255, 0)
  3134.   LogicalPalette.palPalEntry(AdvanceColor).peRed = 0
  3135.   LogicalPalette.palPalEntry(AdvanceColor).peGreen = 255
  3136.   LogicalPalette.palPalEntry(AdvanceColor).peBlue = 0
  3137.   LogicalPalette.palPalEntry(AdvanceColor).peFlags = PC_NOCOLLAPSE
  3138.   RedGreenBlue(AdvanceColor) = RGB(0, 255, 0)
  3139.   LogicalPalette.palPalEntry(SolutionColor).peRed = 255
  3140.   LogicalPalette.palPalEntry(SolutionColor).peGreen = 0
  3141.   LogicalPalette.palPalEntry(SolutionColor).peBlue = 0
  3142.   LogicalPalette.palPalEntry(SolutionColor).peFlags = PC_NOCOLLAPSE
  3143.   RedGreenBlue(SolutionColor) = RGB(255, 0, 0)
  3144.   If UsePalette Then
  3145.     PaletteHandle = CreatePalette(LogicalPalette)
  3146.   End If
  3147.  
  3148.   HexDeltaY(0, 0) = -1
  3149.   HexDeltaX(0, 0) = -2
  3150.   HexDeltaY(1, 0) = 1
  3151.   HexDeltaX(1, 0) = -2
  3152.   HexDeltaY(2, 0) = -2
  3153.   HexDeltaX(2, 0) = 0
  3154.   HexDeltaY(3, 0) = 2
  3155.   HexDeltaX(3, 0) = 0
  3156.   HexDeltaY(4, 0) = -1
  3157.   HexDeltaX(4, 0) = 2
  3158.   HexDeltaY(5, 0) = 1
  3159.   HexDeltaX(5, 0) = 2
  3160.   DeltaIndex2 = 0
  3161.   For DeltaIndex1a = 0 To 5
  3162.     For DeltaIndex1b = 0 To 5
  3163.       If DeltaIndex1a <> DeltaIndex1b Then
  3164.         For DeltaIndex1c = 0 To 5
  3165.           If (DeltaIndex1a <> DeltaIndex1c) And (DeltaIndex1b <> DeltaIndex1c) Then
  3166.             For DeltaIndex1d = 0 To 5
  3167.               If (DeltaIndex1a <> DeltaIndex1d) And (DeltaIndex1b <> DeltaIndex1d) And (DeltaIndex1c <> DeltaIndex1d) Then
  3168.                 For DeltaIndex1e = 0 To 5
  3169.                   If (DeltaIndex1a <> DeltaIndex1e) And (DeltaIndex1b <> DeltaIndex1e) And (DeltaIndex1c <> DeltaIndex1e) And (DeltaIndex1d <> DeltaIndex1e) Then
  3170.                     For DeltaIndex1f = 0 To 5
  3171.                       If (DeltaIndex1a <> DeltaIndex1f) And (DeltaIndex1b <> DeltaIndex1f) And (DeltaIndex1c <> DeltaIndex1f) And (DeltaIndex1d <> DeltaIndex1f) And (DeltaIndex1e <> DeltaIndex1f) Then
  3172.                         HexDeltaX(DeltaIndex1a, DeltaIndex2) = HexDeltaX(0, 0)
  3173.                         HexDeltaY(DeltaIndex1a, DeltaIndex2) = HexDeltaY(0, 0)
  3174.                         HexDeltaX(DeltaIndex1b, DeltaIndex2) = HexDeltaX(1, 0)
  3175.                         HexDeltaY(DeltaIndex1b, DeltaIndex2) = HexDeltaY(1, 0)
  3176.                         HexDeltaX(DeltaIndex1c, DeltaIndex2) = HexDeltaX(2, 0)
  3177.                         HexDeltaY(DeltaIndex1c, DeltaIndex2) = HexDeltaY(2, 0)
  3178.                         HexDeltaX(DeltaIndex1d, DeltaIndex2) = HexDeltaX(3, 0)
  3179.                         HexDeltaY(DeltaIndex1d, DeltaIndex2) = HexDeltaY(3, 0)
  3180.                         HexDeltaX(DeltaIndex1e, DeltaIndex2) = HexDeltaX(4, 0)
  3181.                         HexDeltaY(DeltaIndex1e, DeltaIndex2) = HexDeltaY(4, 0)
  3182.                         HexDeltaX(DeltaIndex1f, DeltaIndex2) = HexDeltaX(5, 0)
  3183.                         HexDeltaY(DeltaIndex1f, DeltaIndex2) = HexDeltaY(5, 0)
  3184.                         DeltaIndex2 = DeltaIndex2 + 1
  3185.                       End If
  3186.                     Next DeltaIndex1f
  3187.                   End If
  3188.                 Next DeltaIndex1e
  3189.               End If
  3190.             Next DeltaIndex1d
  3191.           End If
  3192.         Next DeltaIndex1c
  3193.       End If
  3194.     Next DeltaIndex1b
  3195.   Next DeltaIndex1a
  3196.   SqrDeltaY(0, 0) = 0
  3197.   SqrDeltaX(0, 0) = -1
  3198.   SqrDeltaY(1, 0) = 1
  3199.   SqrDeltaX(1, 0) = 0
  3200.   SqrDeltaY(2, 0) = 0
  3201.   SqrDeltaX(2, 0) = 1
  3202.   SqrDeltaY(3, 0) = -1
  3203.   SqrDeltaX(3, 0) = 0
  3204.   DeltaIndex2 = 0
  3205.   For DeltaIndex1a = 0 To 3
  3206.     For DeltaIndex1b = 0 To 3
  3207.       If DeltaIndex1a <> DeltaIndex1b Then
  3208.         For DeltaIndex1c = 0 To 3
  3209.           If (DeltaIndex1a <> DeltaIndex1c) And (DeltaIndex1b <> DeltaIndex1c) Then
  3210.             For DeltaIndex1d = 0 To 3
  3211.               If (DeltaIndex1a <> DeltaIndex1d) And (DeltaIndex1b <> DeltaIndex1d) And (DeltaIndex1c <> DeltaIndex1d) Then
  3212.                 SqrDeltaX(DeltaIndex1a, DeltaIndex2) = SqrDeltaX(0, 0)
  3213.                 SqrDeltaY(DeltaIndex1a, DeltaIndex2) = SqrDeltaY(0, 0)
  3214.                 SqrDeltaX(DeltaIndex1b, DeltaIndex2) = SqrDeltaX(1, 0)
  3215.                 SqrDeltaY(DeltaIndex1b, DeltaIndex2) = SqrDeltaY(1, 0)
  3216.                 SqrDeltaX(DeltaIndex1c, DeltaIndex2) = SqrDeltaX(2, 0)
  3217.                 SqrDeltaY(DeltaIndex1c, DeltaIndex2) = SqrDeltaY(2, 0)
  3218.                 SqrDeltaX(DeltaIndex1d, DeltaIndex2) = SqrDeltaX(3, 0)
  3219.                 SqrDeltaY(DeltaIndex1d, DeltaIndex2) = SqrDeltaY(3, 0)
  3220.                 DeltaIndex2 = DeltaIndex2 + 1
  3221.               End If
  3222.             Next DeltaIndex1d
  3223.           End If
  3224.         Next DeltaIndex1c
  3225.       End If
  3226.     Next DeltaIndex1b
  3227.   Next DeltaIndex1a
  3228.   Sqrt3 = Sqr(3#)
  3229. End Sub
  3230.  
  3231.  
  3232. Private Sub Form_Paint()
  3233.   mnuActionItem(1).Enabled = False
  3234.   mnuActionItem(2).Enabled = False
  3235.   Paint = True
  3236.   State = 0
  3237.   If Not AlreadyPainting Then
  3238.     AlreadyPainting = True
  3239.     Timer1.Enabled = True
  3240.   End If
  3241. End Sub
  3242.  
  3243. Private Sub Form_Resize()
  3244.   If WindowState = 1 Then
  3245.     Minimized = True
  3246.     Cls
  3247.     State = 5
  3248.     AlreadyPainting = False
  3249.   Else
  3250.     If ScaleHeight < 3 * Text1.Height Then
  3251.       Minimized = False
  3252.       Cls
  3253.       State = 5
  3254.       AlreadyPainting = False
  3255.       Text1.Text = "This window is too small!"
  3256.     Else
  3257.       VScroll1.Height = ScaleHeight - Text1.Height
  3258.       VScroll1.Left = ScaleWidth - VScroll1.Width
  3259.       Text1.Top = ScaleHeight - Text1.Height
  3260.       Text1.Width = ScaleWidth
  3261.       Paint = True
  3262.       State = 0
  3263.       If (Not Minimized) Then
  3264.         Resize = True
  3265.         UserHasSolved = False
  3266.         SolutionDisplayed = False
  3267.         Seed = Str(Timer)
  3268.       End If
  3269.       Minimized = False
  3270.       Refresh
  3271.     End If
  3272.   End If
  3273. End Sub
  3274.  
  3275.  
  3276. Private Sub Form_Unload(Cancel As Integer)
  3277.   State = 6
  3278.   Timer1.Enabled = False
  3279.   Erase Stack
  3280.   Erase UserPage
  3281.   Erase ComputerPage
  3282. End Sub
  3283.  
  3284.  
  3285.  
  3286. Private Sub mnuActionItem_Click(Index As Integer)
  3287.   Select Case Index
  3288.     Case 0
  3289.       SolutionDisplayed = False
  3290.       Call Form_Resize
  3291.     Case 1
  3292.       SolutionDisplayed = True
  3293.       Text1.Text = ""
  3294.       If mnuStyleItem(0).Checked Then
  3295.         Call HexDisplaySolution(MaxY, ComputerPage, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  3296.       Else
  3297.         Call SqrDisplaySolution(MaxY, ComputerPage, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  3298.       End If
  3299.     Case 2
  3300.       UserHasSolved = False
  3301.       SolutionDisplayed = False
  3302.       Paint = True
  3303.       State = 0
  3304.       For UserX = 0 To MaxX
  3305.         For UserY = 0 To MaxY
  3306.           If ComputerPage(UserY, UserX) = 0 Then
  3307.             UserPage(UserY, UserX) = 0
  3308.           Else
  3309.             UserPage(UserY, UserX) = 2
  3310.           End If
  3311.         Next UserY
  3312.       Next UserX
  3313.       If mnuStyleItem(0).Checked Then
  3314.         UserX = 3
  3315.         UserXRelative = 1#
  3316.         UserY = 2
  3317.         UserYRelative = Sqrt3 / 2#
  3318.       Else
  3319.         UserX = 1
  3320.         UserXRelative = (RelativeWidthOfWall + 1#) / 2#
  3321.         UserY = 1
  3322.         UserYRelative = (RelativeWidthOfWall + 1#) / 2#
  3323.       End If
  3324.       UserPage(UserY, UserX) = 1
  3325.       Refresh
  3326.     Case 4
  3327.       State = 6
  3328.       Timer1.Enabled = False
  3329.       Erase Stack
  3330.       Erase UserPage
  3331.       Erase ComputerPage
  3332.       End
  3333.     Case Else
  3334.   End Select
  3335. End Sub
  3336.  
  3337. Private Sub mnuHelpItem_Click(Index As Integer)
  3338.   Dim rc As Integer
  3339.   rc = MsgBox("3DMaze" + Chr(13) + Chr(13) + "Copyright " + Chr(169) + " 1995 James L. Dean (csvcjld@nomvs.lsumc.edu)" + Chr(13) + Chr(13) + "This application may be distributed without payment to James L. Dean." + Chr(13) + Chr(13) + "As per Microsoft's license for Visual Basic 4.0, the end-user may not distribute the components having names starting with other than " + Chr(34) + "3dmaze" + Chr(34) + ".", vbOKOnly, "About 3DMaze")
  3340. End Sub
  3341.  
  3342. Private Sub mnuStyleItem_Click(Index As Integer)
  3343.   Select Case Index
  3344.     Case 0
  3345.       If mnuStyleItem(1).Checked Then
  3346.         mnuStyleItem(0).Checked = True
  3347.         mnuStyleItem(1).Checked = False
  3348.         SolutionDisplayed = False
  3349.         Call Form_Resize
  3350.       End If
  3351.     Case 1
  3352.       If mnuStyleItem(0).Checked Then
  3353.         mnuStyleItem(0).Checked = False
  3354.         mnuStyleItem(1).Checked = True
  3355.         SolutionDisplayed = False
  3356.         Call Form_Resize
  3357.       End If
  3358.   End Select
  3359. End Sub
  3360.  
  3361. Private Sub Timer1_Timer()
  3362.   Timer1.Enabled = False
  3363.   If mnuStyleItem(0).Checked Then
  3364.     Call HexOutputMaze
  3365.   Else
  3366.     Call SqrOutputMaze
  3367.   End If
  3368. End Sub
  3369.  
  3370. Private Sub VScroll1_Change()
  3371.   Tilt = 90 - VScroll1.Value
  3372.   Paint = True
  3373.   State = 0
  3374.   If Not AlreadyPainting Then Call Form_Paint
  3375. End Sub
  3376.  
  3377. Private Sub VScroll1_Scroll()
  3378.   If AlreadyPainting Then
  3379.     Tilt = 90 - VScroll1.Value
  3380.     Paint = True
  3381.     State = 0
  3382.   End If
  3383. End Sub
  3384.  
  3385.  
  3386.  
  3387.