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