VERSION 5.00
Begin VB.Form frm3DMaze
BackColor = &H00FFFFFF&
BorderStyle = 0 'None
Caption = "Maze 'O' MaNiA!"
ClientHeight = 4470
ClientLeft = 1545
ClientTop = 1965
ClientWidth = 6000
Icon = "frm3DMaze.frx":0000
KeyPreview = -1 'True
LinkTopic = "Form1"
PaletteMode = 1 'UseZOrder
ScaleHeight = 4470
ScaleWidth = 6000
ShowInTaskbar = 0 'False
Begin VB.TextBox Text1
BackColor = &H00FFFFFF&
BorderStyle = 0 'None
Height = 288
Left = 0
Locked = -1 'True
TabIndex = 1
Top = 4200
Width = 6012
End
Begin VB.VScrollBar VScroll1
Height = 4212
LargeChange = 5
Left = 5760
Max = 60
Min = 30
TabIndex = 0
Top = 0
Value = 45
Width = 252
End
Begin VB.Timer Timer1
Enabled = 0 'False
Interval = 55
Left = 0
Top = 0
End
Begin VB.Menu mnuAction
Caption = "&Action"
Begin VB.Menu mnuActionItem
Caption = "&New"
Index = 0
Shortcut = ^N
End
Begin VB.Menu mnuActionItem
Caption = "&Solve"
Enabled = 0 'False
Index = 1
Shortcut = ^S
End
Begin VB.Menu mnuActionItem
Caption = "&Clear"
Enabled = 0 'False
Index = 2
Shortcut = ^C
End
Begin VB.Menu mnuActionItem
Caption = "-"
Index = 3
End
Begin VB.Menu mnuActionItem
Caption = "E&xit"
Index = 4
Shortcut = ^E
End
End
Begin VB.Menu mnuStyle
Caption = "&Style"
Begin VB.Menu mnuStyleItem
Caption = "&Hexagonal rooms"
Index = 0
Shortcut = ^H
End
Begin VB.Menu mnuStyleItem
Caption = "&Square rooms"
Index = 1
Shortcut = ^Q
End
End
Begin VB.Menu mnuHelp
Caption = "&Help"
Begin VB.Menu mnuHelpItem
Caption = "&About..."
Index = 0
Shortcut = ^A
End
End
End
Attribute VB_Name = "frm3DMaze"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Private Type CornerRec
X As Long
Y As Long
End Type
Private Type VertexRec
X As Double
Y As Double
End Type
Private Type StackRec
Index1 As Byte
Index2 As Integer
End Type
Private Type PALETTEENTRY
peRed As Byte
peGreen As Byte
peBlue As Byte
peFlags As Byte
End Type
Private Type LOGPALETTE
palVersion As Integer
palNumEntries As Integer
palPalEntry(16) As PALETTEENTRY
End Type
Private Declare Function CreatePalette Lib "GDI32" (LogicalPalette As LOGPALETTE) As Long
Private Declare Function CreatePen Lib "GDI32" (ByVal PenStyle As Long, ByVal Width As Long, ByVal Color As Long) As Long
Private Declare Function CreatePolygonRgn Lib "GDI32" (lpPoints As Any, ByVal nCount As Long, ByVal nPolyFillMode As Long) As Long
Private Declare Function CreateSolidBrush Lib "GDI32" (ByVal rgbColor As Long) As Long
Private Declare Function DeleteObject Lib "GDI32" (ByVal hndobj As Long) As Long
Private Declare Function FillRgn Lib "GDI32" (ByVal hDC As Long, ByVal hRegion As Long, ByVal hBrush As Long) As Long
Private Declare Function GetDeviceCaps Lib "GDI32" (ByVal hDC As Long, ByVal Index As Long) As Long
Private Declare Function LineTo Lib "GDI32" (ByVal hDC As Long, ByVal X As Long, ByVal Y As Long) As Long
Private Declare Function MoveToEx Lib "GDI32" (ByVal hDC As Long, ByVal X As Long, ByVal Y As Long, ByVal NullPtr As Long) As Long
Private Declare Function RealizePalette Lib "GDI32" (ByVal hDC As Long) As Long
Private Declare Function SelectPalette Lib "GDI32" (ByVal hDC As Long, ByVal PaletteHandle As Long, ByVal Background As Long) As Long
Private Declare Function SelectObject Lib "GDI32" (ByVal hDC As Long, ByVal ObjectHandle As Long) As Long
Const PLANES = 14
Const BITSPIXEL = 12
Const PC_NOCOLLAPSE = 4
Const COLORS = 24
Const PS_SOLID = 0
Const NumColors = 16
Const TopColor = 12:
Const RectangleSENWColor = 10
Const TriangleSSENNWColor = 9
Const TriangleSENWColor = 8
Const RectangleWEColor = 7
Const FloorColor = 6
Const TriangleSWNEColor = 5
Const RectangleSWNEColor = 4
Const TriangleSSWNNEColor = 3
Const BackoutColor = 13
Const AdvanceColor = 14
Const SolutionColor = 15
Const RelativeWidthOfWall = 0.25:
Const RelativeHeightOfWall = 2#:
Const MinWallLengthInInches = 0.25
Const SecondsForMazeSelection = 0.25
Dim AlreadyPainting As Boolean
Dim BaseRectangle(5, 3) As VertexRec
Dim BaseTriangle(3, 2) As VertexRec
Dim ComputerPage() As Byte
Dim CosTilt As Double
Dim CurrentColor As Integer
Dim HexDeltaX(5, 719) As Integer
Dim HexDeltaY(5, 719) As Integer
Dim MaxX As Integer
Dim MaxY As Integer
Dim Minimized As Boolean
Dim NumColumns As Integer
Dim NumRealized As Long
Dim NumRoomsInMaze As Integer
Dim NumRows As Integer
Dim OldPaletteHandle As Long
Dim Paint As Boolean
Dim PaletteHandle As Long
Dim PixelsPerX As Double
Dim PixelsPerZ As Double
Dim Rectangle(5, 3) As VertexRec
Dim RedGreenBlue(16) As Long
Dim RelDistOfUserFromScreen As Double
Dim Resize As Boolean
Dim Seed As String
Dim SinTilt As Double
Dim SolutionDisplayed As Boolean
Dim SqrDeltaX(3, 23) As Integer
Dim SqrDeltaY(3, 23) As Integer
Dim Sqrt3 As Double
Dim Stack() As StackRec
Dim State As Byte
Dim SubstitutionHigh(99) As Byte
Dim SubstitutionLow(99) As Byte
Dim Tilt As Double
Dim UsePalette As Boolean
Dim UserHasSolved As Boolean
Dim UserPage() As Byte
Dim UserX As Integer
Dim UserXRelative As Double
Dim UserY As Integer
Dim UserYRelative As Double
Dim X As Integer
Dim XMax As Double
Dim XOffset As Double
Dim Y As Integer
Dim YMax As Double
Dim YMod4 As Byte
Dim YOffset As Double
Private Sub DrawQuadrilateral(Box() As CornerRec, ColorNum As Integer)
Dim Brush As Long
Dim rc As Long
Dim Region As Long
If UsePalette Then
Brush = CreateSolidBrush(16777216 + ColorNum)
If Brush Then
Region = CreatePolygonRgn(Box(0), 4, 1)
If Region Then
rc = FillRgn(frm3DMaze.hDC, Region, Brush)
rc = DeleteObject(Region)
End If
rc = DeleteObject(Brush)
End If
Else
Brush = CreateSolidBrush(RedGreenBlue(ColorNum))
If Brush Then
Region = CreatePolygonRgn(Box(0), 4, 1)
If Region Then
rc = FillRgn(frm3DMaze.hDC, Region, Brush)
rc = DeleteObject(Region)
End If
rc = DeleteObject(Brush)
End If
End If
End Sub
Private Sub GetCorner(X#, Y#, Z#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, XMax#, XOffset#, YMax#, Corner As CornerRec)
Dim XAdjusted As Double
Dim YPrime As Double
Dim ZAdjusted As Double
Dim ZPrime As Double
YPrime = (YMax# - Y#) * CosTilt# - Z# * SinTilt#
ZPrime = (YMax# - Y#) * SinTilt# + Z# * CosTilt#
ZAdjusted = (YMax# / 2#) + RelDistOfUserFromScreen# * (ZPrime - (YMax# / 2#)) / (YPrime + RelDistOfUserFromScreen#)
XAdjusted = (XMax# / 2#) + RelDistOfUserFromScreen# * (X# - (XMax# / 2#)) / (YPrime + RelDistOfUserFromScreen#)
XAdjusted = XAdjusted + XOffset#
Corner.X = Int(PixelsPerX# * XAdjusted)
Corner.Y = (ScaleHeight - Text1.Height) - Int(PixelsPerZ# * ZAdjusted)
End Sub
Private Sub DisplayQuadrilateral(XMax#, XOffset#, YMax#, X0#, Y0#, Z0#, X1#, Y1#, Z1#, X2#, Y2#, Z2#, X3#, Y3#, Z3#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, Shade%)
Dim Quadrilateral(3) As CornerRec
Dim TemQuad As CornerRec
Call GetCorner(X0#, Y0#, Z0#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, XMax#, XOffset#, YMax#, TemQuad)
Quadrilateral(0).X = TemQuad.X
Quadrilateral(0).Y = TemQuad.Y
Call GetCorner(X1#, Y1#, Z1#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, XMax#, XOffset#, YMax#, TemQuad)
Quadrilateral(1).X = TemQuad.X
Quadrilateral(1).Y = TemQuad.Y
Call GetCorner(X2#, Y2#, Z2#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, XMax#, XOffset#, YMax#, TemQuad)
Quadrilateral(2).X = TemQuad.X
Quadrilateral(2).Y = TemQuad.Y
Call GetCorner(X3#, Y3#, Z3#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, XMax#, XOffset#, YMax#, TemQuad)
Quadrilateral(3).X = TemQuad.X
Quadrilateral(3).Y = TemQuad.Y
Call DrawQuadrilateral(Quadrilateral(), Shade%)
End Sub
Private Sub DrawTriangle(Box() As CornerRec, ColorNum As Integer)
Dim Brush As Long
Dim rc As Long
Dim Region As Long
If UsePalette Then
Brush = CreateSolidBrush(16777216 + ColorNum)
If Brush Then
Region = CreatePolygonRgn(Box(0), 3, 1)
If Region Then
rc = FillRgn(frm3DMaze.hDC, Region, Brush)
rc = DeleteObject(Region)
End If
rc = DeleteObject(Brush)
End If
Else
Brush = CreateSolidBrush(RedGreenBlue(ColorNum))
If Brush Then
Region = CreatePolygonRgn(Box(0), 3, 1)
If Region Then
rc = FillRgn(frm3DMaze.hDC, Region, Brush)
rc = DeleteObject(Region)
End If
rc = DeleteObject(Brush)
End If
End If
End Sub
Private Sub DisplayTriangle(XMax#, XOffset#, YMax#, X0#, Y0#, Z0#, X1#, Y1#, Z1#, X2#, Y2#, Z2#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, Shade%)
Dim Triangle(2) As CornerRec
Dim TemTriangle As CornerRec
Call GetCorner(X0#, Y0#, Z0#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, XMax#, XOffset#, YMax#, TemTriangle)
Triangle(0).X = TemTriangle.X
Triangle(0).Y = TemTriangle.Y
Call GetCorner(X1#, Y1#, Z1#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, XMax#, XOffset#, YMax#, TemTriangle)
Triangle(1).X = TemTriangle.X
Triangle(1).Y = TemTriangle.Y
Call GetCorner(X2#, Y2#, Z2#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, XMax#, XOffset#, YMax#, TemTriangle)
Triangle(2).X = TemTriangle.X
Triangle(2).Y = TemTriangle.Y
Call DrawTriangle(Triangle(), Shade%)
End Sub
Private Sub OutputTriangle(XMax#, XOffset#, YMax#, Triangle() As VertexRec, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, FirstPass%, FaceColor%)
Dim X0 As Double
Dim X1 As Double
Dim X2 As Double
Dim X3 As Double
Dim Y0 As Double
Dim Y1 As Double
Dim Y2 As Double
Dim Y3 As Double
If FirstPass% Then
If ((Triangle(1).X < XMax# / 2#) And (Triangle(1).X > Triangle(0).X)) Then
X0 = Triangle(2).X
Y0 = Triangle(2).Y
X1 = Triangle(1).X
Y1 = Triangle(1).Y
X2 = Triangle(1).X
Y2 = Triangle(1).Y
X3 = Triangle(2).X
Y3 = Triangle(2).Y
Call DisplayQuadrilateral(XMax#, XOffset#, YMax#, X0, Y0, RelativeHeightOfWall, X1, Y1, RelativeHeightOfWall, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, TriangleSSWNNEColor)
End If
If ((Triangle(1).X > XMax# / 2#) And (Triangle(1).X < Triangle(2).X)) Then
X0 = Triangle(1).X
Y0 = Triangle(1).Y
X1 = Triangle(0).X
Y1 = Triangle(0).Y
X2 = Triangle(0).X
Y2 = Triangle(0).Y
X3 = Triangle(1).X
Y3 = Triangle(1).Y
Call DisplayQuadrilateral(XMax#, XOffset#, YMax#, X0, Y0, RelativeHeightOfWall, X1, Y1, RelativeHeightOfWall, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, TriangleSSENNWColor)
End If
Else
X0 = Triangle(0).X
Y0 = Triangle(0).Y
X1 = Triangle(2).X
Y1 = Triangle(2).Y
X2 = Triangle(2).X
Y2 = Triangle(2).Y
X3 = Triangle(0).X
Y3 = Triangle(0).Y
Call DisplayQuadrilateral(XMax#, XOffset#, YMax#, X0, Y0, RelativeHeightOfWall, X1, Y1, RelativeHeightOfWall, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, FaceColor%)
X0 = Triangle(0).X
Y0 = Triangle(0).Y
X1 = Triangle(1).X
Y1 = Triangle(1).Y
X2 = Triangle(2).X
Y2 = Triangle(2).Y
Call DisplayTriangle(XMax#, XOffset#, YMax#, X0, Y0, RelativeHeightOfWall, X1, Y1, RelativeHeightOfWall, X2, Y2, RelativeHeightOfWall, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, TopColor)
End If
End Sub
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)
Dim X0 As Double
Dim X1 As Double
Dim X2 As Double
Dim X3 As Double
Dim Y0 As Double
Dim Y1 As Double
Dim Y2 As Double
Dim Y3 As Double
X0 = Rectangle(3).X
Y0 = Rectangle(3).Y
X1 = Rectangle(2).X
Y1 = Rectangle(2).Y
X2 = Rectangle(2).X
Y2 = Rectangle(2).Y
X3 = Rectangle(3).X
Y3 = Rectangle(3).Y
Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, RelativeHeightOfWall, X1, Y1, RelativeHeightOfWall, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, FaceColor)
X0 = Rectangle(0).X
Y0 = Rectangle(0).Y
X1 = Rectangle(1).X
Y1 = Rectangle(1).Y
X2 = Rectangle(2).X
Y2 = Rectangle(2).Y
X3 = Rectangle(3).X
Y3 = Rectangle(3).Y
Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, RelativeHeightOfWall, X1, Y1, RelativeHeightOfWall, X2, Y2, RelativeHeightOfWall, X3, Y3, RelativeHeightOfWall, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, TopColor)
End Sub
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)
Dim X0 As Double
Dim X1 As Double
Dim X2 As Double
Dim X3 As Double
Dim Y0 As Double
Dim Y1 As Double
Dim Y2 As Double
Dim Y3 As Double
If 2# * Rectangle(0).X > XMax Then
X0 = Rectangle(0).X
Y0 = Rectangle(0).Y
X1 = Rectangle(3).X
Y1 = Rectangle(3).Y
X2 = Rectangle(3).X
Y2 = Rectangle(3).Y
X3 = Rectangle(0).X
Y3 = Rectangle(0).Y
Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, RelativeHeightOfWall, X1, Y1, RelativeHeightOfWall, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleSENWColor)
End If
If 2# * Rectangle(1).X < XMax Then
X0 = Rectangle(2).X
Y0 = Rectangle(2).Y
X1 = Rectangle(1).X
Y1 = Rectangle(1).Y
X2 = Rectangle(1).X
Y2 = Rectangle(1).Y
X3 = Rectangle(2).X
Y3 = Rectangle(2).Y
Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, RelativeHeightOfWall, X1, Y1, RelativeHeightOfWall, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleSWNEColor)
End If
End Sub
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)
Dim LineX1 As Long
Dim LineX2 As Long
Dim LineY1 As Long
Dim LineY2 As Long
Dim Pen As Long
Dim PreviousPen As Long
Dim rc As Long
Dim tem As CornerRec
Call GetCorner(X1, Y1, RelativeHeightOfWall, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, XMax, XOffset, YMax, tem)
LineX1 = tem.X
LineY1 = tem.Y
Call GetCorner(X2, Y2, RelativeHeightOfWall, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, XMax, XOffset, YMax, tem)
LineX2 = tem.X
LineY2 = tem.Y
If UsePalette Then
Pen = CreatePen(PS_SOLID, 2, 16777216 + CurrentColor)
If Pen Then
PreviousPen = SelectObject(frm3DMaze.hDC, Pen)
rc = MoveToEx(frm3DMaze.hDC, LineX1, LineY1, 0)
rc = LineTo(frm3DMaze.hDC, LineX2, LineY2)
rc = SelectObject(frm3DMaze.hDC, PreviousPen)
rc = DeleteObject(Pen)
End If
Else
Pen = CreatePen(PS_SOLID, 2, RedGreenBlue(CurrentColor))
If Pen Then
PreviousPen = SelectObject(frm3DMaze.hDC, Pen)
rc = MoveToEx(frm3DMaze.hDC, LineX1, LineY1, 0)
rc = LineTo(frm3DMaze.hDC, LineX2, LineY2)
rc = SelectObject(frm3DMaze.hDC, PreviousPen)
rc = DeleteObject(Pen)
End If
End If
End Sub
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)
Dim Iteration As Byte
Dim Seed0 As Byte
Dim Seed1 As Byte
Dim Seed2 As Byte
Dim Seed3 As Byte
Dim Seed4 As Byte
Dim Seed5 As Byte
Dim Seed6 As Byte
Dim Seed7 As Byte
Dim SubstitutionIndex As Byte
Dim Tem0 As Byte
Dim Tem1 As Byte
Dim Tem2 As Byte
Seed0 = Counter0
Seed1 = Counter1
Seed2 = Counter2
Seed3 = Counter3
Seed4 = Counter4
Seed5 = Counter5
Seed6 = Counter6
Seed7 = Counter7
For Iteration = 1 To 8
SubstitutionIndex = 10 * Seed1 + Seed0
Tem0 = SubstitutionLow(SubstitutionIndex)
Tem1 = SubstitutionHigh(SubstitutionIndex)
SubstitutionIndex = 10 * Seed3 + Seed2
Seed0 = SubstitutionLow(SubstitutionIndex)
Tem2 = SubstitutionHigh(SubstitutionIndex)
SubstitutionIndex = 10 * Seed5 + Seed4
Seed2 = SubstitutionLow(SubstitutionIndex)
Seed1 = SubstitutionHigh(SubstitutionIndex)
SubstitutionIndex = 10 * Seed7 + Seed6
Seed5 = SubstitutionLow(SubstitutionIndex)
Seed7 = SubstitutionHigh(SubstitutionIndex)
Seed3 = Tem0
Seed6 = Tem1
Seed4 = Tem2
Next Iteration
Counter0 = Seed0
Counter1 = Seed1
Counter2 = Seed2
Counter3 = Seed3
Counter4 = Seed4
Counter5 = Seed5
Counter6 = Seed6
Counter7 = Seed7
End Sub
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)
Dim tem As Byte
tem = Counter0 + 1
If tem <= 9 Then
Counter0 = tem
Else
Counter0 = 0
tem = Counter1 + 1
If tem <= 9 Then
Counter1 = tem
Else
Counter1 = 0
tem = Counter2 + 1
If tem <= 9 Then
Counter2 = tem
Else
Counter2 = 0
tem = Counter3 + 1
If tem <= 9 Then
Counter3 = tem
Else
Counter3 = 0
tem = Counter4 + 1
If tem <= 9 Then
Counter4 = tem
Else
Counter4 = 0
tem = Counter5 + 1
If tem <= 9 Then
Counter5 = tem
Else
Counter5 = 0
tem = Counter6 + 1
If tem <= 9 Then
Counter6 = tem
Else
Counter6 = 0
tem = Counter7 + 1
If tem <= 9 Then
Counter7 = tem
Else
Counter7 = 0
End If
End If
End If
End If
End If
End If
End If
End If
End Sub
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)
Dim DeltaIndex As Byte
Dim OldPaletteHandle As Long
Dim PathFound As Integer
Dim X As Integer
Dim XNext As Integer
Dim XPrevious As Integer
Dim XRelative As Double
Dim XRelativeNext As Double
Dim Y As Integer
Dim YNext As Integer
Dim YPrevious As Integer
Dim YRelative As Double
Dim YRelativeNext As Double
If UsePalette Then
OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
NumRealized = RealizePalette(frm3DMaze.hDC)
End If
XRelative = 1#
YRelative = Sqrt3 / 2#
CurrentColor = SolutionColor
Call DrawLine(1#, 0#, XRelative, YRelative, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
XPrevious = 3
YPrevious = -2
X = 3
Y = 2
Do
PathFound = False
DeltaIndex = 0
Do While (Not PathFound)
XNext = X + HexDeltaX(DeltaIndex, 0)
YNext = Y + HexDeltaY(DeltaIndex, 0)
If Page(YNext, XNext) = 1 Then
XNext = XNext + HexDeltaX(DeltaIndex, 0)
YNext = YNext + HexDeltaY(DeltaIndex, 0)
If (XNext <> XPrevious) Or (YNext <> YPrevious) Then
PathFound = True
Else
DeltaIndex = DeltaIndex + 1
End If
Else
DeltaIndex = DeltaIndex + 1
End If
Loop
If YNext < MaxY Then
Select Case YNext - Y
Case -4
XRelativeNext = XRelative
YRelativeNext = YRelative - Sqrt3
Case -2
If XNext > X Then
XRelativeNext = XRelative + 3# / 2#
YRelativeNext = YRelative - Sqrt3 / 2#
Else
XRelativeNext = XRelative - 3# / 2#
YRelativeNext = YRelative - Sqrt3 / 2#
End If
Case 2
If XNext > X Then
XRelativeNext = XRelative + 3# / 2#
YRelativeNext = YRelative + Sqrt3 / 2#
Else
XRelativeNext = XRelative - 3# / 2#
YRelativeNext = YRelative + Sqrt3 / 2#
End If
Case Else
XRelativeNext = XRelative
YRelativeNext = YRelative + Sqrt3
End Select
Call DrawLine(XRelative, YRelative, XRelativeNext, YRelativeNext, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
Else
Call DrawLine(XRelative, YRelative, XRelative, YMax, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
End If
XPrevious = X
YPrevious = Y
X = XNext
Y = YNext
XRelative = XRelativeNext
YRelative = YRelativeNext
Loop While YNext < MaxY
If UsePalette Then
NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
End If
End Sub
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)
Dim DeltaIndex As Byte
Dim EvenRow As Boolean
Dim OldPaletteHandle As Long
Dim X As Integer
Dim XNext As Integer
Dim XNextNext As Integer
Dim XRelative As Double
Dim XRelativeNext As Double
Dim Y As Integer
Dim YNext As Integer
Dim YNextNext As Integer
Dim YRelative As Double
Dim YRelativeNext As Double
If UsePalette Then
OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
NumRealized = RealizePalette(frm3DMaze.hDC)
End If
Y = 2
YRelative = Sqrt3 / 2#
EvenRow = False
Do While (Y < MaxY)
If EvenRow Then
X = 7
XRelative = 2.5
Else
X = 3
XRelative = 1#
End If
Do While (X < MaxX)
If ((Page(Y, X) = 1) Or (Page(Y, X) = 3)) Then
For DeltaIndex = 0 To 5
XNext = X + HexDeltaX(DeltaIndex, 0)
YNext = Y + HexDeltaY(DeltaIndex, 0)
If Page(YNext, XNext) <> 0 Then
If YNext = 0 Then
CurrentColor = AdvanceColor
Call DrawLine(1#, 0#, XRelative, YRelative, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
Else
If YNext = MaxY Then
If UserHasSolved Then
CurrentColor = AdvanceColor
YRelativeNext = YRelative + Sqrt3 / 2#
Call DrawLine(XRelative, YRelative, XRelative, YRelativeNext, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
End If
Else
XNextNext = XNext + HexDeltaX(DeltaIndex, 0)
If XNextNext > 0 Then
If XNextNext < MaxX Then
YNextNext = YNext + HexDeltaY(DeltaIndex, 0)
If YNextNext > 0 Then
If YNextNext < MaxY Then
If ((Page(YNextNext, XNextNext) = 1) Or (Page(YNextNext, XNextNext) = 3)) Then
If Page(Y, X) = Page(YNextNext, XNextNext) Then
If Page(Y, X) = 1 Then
CurrentColor = AdvanceColor
Else
CurrentColor = BackoutColor
End If
Else
CurrentColor = BackoutColor
End If
Select Case (YNext - Y)
Case -2
XRelativeNext = XRelative
YRelativeNext = YRelative - Sqrt3 / 2#
Case -1
If XNext > X Then
XRelativeNext = XRelative + 3# / 4#
YRelativeNext = YRelative - Sqrt3 / 4#
Else
XRelativeNext = XRelative - 3# / 4#
YRelativeNext = YRelative - Sqrt3 / 4#
End If
Case 1
If XNext > X Then
XRelativeNext = XRelative + 3# / 4#
YRelativeNext = YRelative + Sqrt3 / 4#