home *** CD-ROM | disk | FTP | other *** search
/ Planet Source Code Jumbo …e CD Visual Basic 1 to 7 / 3_2004-2005.ISO / Data / Zips / Polygon_Sc171729372004.psc / mod_Polygon.bas < prev    next >
BASIC Source File  |  2004-03-08  |  23KB  |  833 lines

  1. Attribute VB_Name = "mod_Polygon"
  2. 'Thanks to
  3. ''Bouncing Polygon screensaver' by Brian Adriance at PSC txtCodeId=52063.
  4. '
  5. Option Explicit
  6. Private Const PolyName             As String = "PolygonIV"
  7. Public lngTimer                    As Long
  8. Private bDoingReset                As Boolean
  9. Public lngCol                      As Long
  10. Public lngFat                      As Long
  11. Public bLoadingList                As Boolean
  12. Public BSelecting                  As Boolean
  13. Public Motion                      As Long
  14. Public Spinner                     As Long
  15. Public Const SettingHighSmall      As Long = 4035
  16. Public Const SettingHighLarge      As Long = 7020
  17. Public bRndCol                     As Boolean
  18. Public VertMin                     As Long                                       ' min = 1 a dot
  19. Public VertMax                     As Long                                       ' max = 20 could be higher but not likely to give visible differences
  20. Public Type SPOLYGON
  21.   XCenter                          As Long
  22.   YCenter                          As Long
  23.   XVertex(1 To 21)                 As Long                                         ' the upper range must maximum value for VertMax + 1
  24.   YVertex(1 To 21)                 As Long
  25.   DispX                            As Long
  26.   DispY                            As Long
  27.   Mass                             As Double
  28.   Angle                            As Double
  29.   RSpeed                           As Double
  30.   AngleR                           As Double
  31.   Color                            As Long
  32.   NVertex                          As Long
  33.   DispVector                       As Double
  34.   Displacement                     As Double
  35.   IncVert                          As Boolean
  36.   SpinC                            As Boolean
  37. End Type
  38. Public MSpeed                      As Long                                       'at very high speeds(2000+) some of the objects disappear as the distance between draws is so great that they spend most of the time off screen
  39. Public SCount                      As Long                                       'no real limit but above about 250 (on a PII) the redraw cycle is too slow for good animation
  40. Public SetMode                     As Long
  41. Private Polygon()                  As SPOLYGON
  42. Private Const PIDiv180             As Double = 3.14159265358979 / 180
  43. Public Declare Function ShowCursor Lib "user32" (ByVal bShow As Long) As Long                                                                    'mouse visible(0 or 1)
  44.  
  45. Public Function AtBoundry(poly As SPOLYGON) As Boolean
  46. 'detect edge of screen
  47.   With poly
  48.     If .XCenter + (.Mass * 2 + lngFat * 1.5) >= Screen.Width Then
  49.       AtBoundry = True
  50.      ElseIf .YCenter + (.Mass * 2 + lngFat * 1.5) >= Screen.Height Then
  51.       AtBoundry = True
  52.      ElseIf .XCenter - (.Mass * 2 + lngFat * 1.5) <= 0 Then
  53.       AtBoundry = True
  54.      Else
  55.       If .YCenter - (.Mass * 2 + lngFat * 1.5) <= 0 Then
  56.         AtBoundry = True
  57.       End If
  58.     End If
  59.   End With
  60.  
  61. End Function
  62.  
  63. Private Function Dist(X1 As Long, _
  64.                       Y1 As Long, _
  65.                       X2 As Long, _
  66.                       Y2 As Long, _
  67.                       Optional Z1 As Long = 0, _
  68.                       Optional Z2 As Long = 0) As Double
  69. 'detect distance between 2 points
  70.   If Z1 = 0 Then
  71.     Dist = Sqr((X2 - X1) ^ 2 + (Y2 - Y1) ^ 2)
  72.    Else
  73.     Dist = Sqr((X2 - X1) ^ 2 + (Y2 - Y1) ^ 2 + (Z2 - Z1) ^ 2)
  74.   End If
  75.  
  76. End Function
  77.  
  78. Private Sub DoCollision(n As Long)
  79. ' check for collisions
  80.   Dim M As Long
  81.  
  82.   On Error Resume Next
  83.   With Polygon(n)
  84.     Do While .AngleR >= 360
  85.       .AngleR = .AngleR - 360
  86.     Loop
  87.     For M = 1 To SCount
  88.       If M <> n Then
  89.         If Dist(.XCenter, .YCenter, Polygon(M).XCenter, Polygon(M).YCenter) <= (.Mass * 2) + (Polygon(M).Mass * 2 + lngFat * 1.5) Then
  90.           PolygonChangeShape n
  91.           PolygonChangeShape M
  92.         End If
  93.       End If
  94.     Next M
  95.     If .DispVector = 0 Then
  96.       .DispVector = Rnd * MSpeed + 0.1
  97.     End If
  98.   End With
  99.   On Error GoTo 0
  100.  
  101. End Sub
  102.  
  103. Public Sub DoPreferences(ByVal intIndex As Integer)
  104.  
  105.   Dim strPRef As String
  106.  
  107.   Select Case intIndex
  108.    Case 0
  109.     PreferenceSave
  110.    Case 1
  111.     PreferenceDelete frmSettings.lstPreferences.ListIndex
  112.    Case 2
  113.     PreferenceReNumber
  114.    Case 3
  115.     BSelecting = True
  116.     PreferenceLoad "Random"
  117.     ResetControls strPRef
  118.     PolygonCreateAll
  119.     BSelecting = False
  120.    Case 4
  121.     BSelecting = True
  122.     strPRef = "Rnd User"
  123.     PreferenceLoad strPRef
  124.     ResetControls strPRef
  125.     PolygonCreateAll
  126.     BSelecting = False
  127.   End Select
  128.  
  129. End Sub
  130.  
  131. Private Function FatFactor(dblMass As Double) As Long
  132. ' apply fat value
  133.   FatFactor = lngFat
  134.   If FatFactor < 1 Then
  135.     FatFactor = 1
  136.   End If
  137.  
  138. Exit Function
  139.  
  140.   Select Case lngFat
  141.    Case 0
  142.     FatFactor = 1
  143.    Case 1
  144.     If dblMass / 100 > 1 Then
  145.       FatFactor = dblMass / 10
  146.      Else
  147.       FatFactor = 10
  148.     End If
  149.    Case 2
  150.     If dblMass / 100 > 1 Then
  151.       FatFactor = dblMass / 4
  152.      Else
  153.       FatFactor = 50
  154.     End If
  155.    Case 3
  156.     FatFactor = 150
  157.    Case 3
  158.     FatFactor = 250
  159.   End Select
  160.  
  161. End Function
  162.  
  163. Private Function GetDoit() As String
  164. ' get the saved start up behaviour
  165.   Dim sets As Variant
  166.   Dim I    As Long
  167.  
  168.   sets = GetAllSettings(PolyName, "Options")
  169.   If Not IsEmpty(sets) Then
  170.     For I = LBound(sets, 1) To UBound(sets, 1)
  171.       If sets(I, 0) = "Doit" Then
  172.         GetDoit = sets(I, 1)
  173.         Exit Function
  174.       End If
  175.     Next I
  176.   End If
  177.  
  178. End Function
  179.  
  180. Private Function GetFreeUser() As Long
  181. ' get a number of a new user preference set
  182.   Dim sets As Variant
  183.   Dim I    As Long
  184.  
  185.   GetFreeUser = 1
  186.   sets = GetAllSettings(PolyName, "Options")
  187.   If Not IsEmpty(sets) Then
  188.     For I = LBound(sets, 1) To UBound(sets, 1)
  189.       If Left$(sets(I, 0), 4) = "User" Then
  190.         If CLng(Mid$(sets(I, 0), InStr(sets(I, 0), " ") + 1)) = GetFreeUser Then
  191.           GetFreeUser = GetFreeUser + 1
  192.         End If
  193.       End If
  194.     Next I
  195.   End If
  196.  
  197. End Function
  198.  
  199. Private Sub KeepInRange(ByVal lngMin As Long, _
  200.                         lngVal As Long, _
  201.                         ByVal lngMax As Long)
  202.  
  203.   If lngVal < lngMin Then
  204.     lngVal = lngMin
  205.    ElseIf lngVal > lngMax Then
  206.     lngVal = lngMax
  207.   End If
  208.  
  209. End Sub
  210.  
  211. Public Sub loadInitialSettings()
  212.  
  213. 'This will force a random setting on first usage
  214.  
  215.   Dim strSet As String
  216.  
  217.   bLoadingList = True
  218.   strSet = GetSetting(PolyName, "Options", "Doit", "Random")
  219.   PreferenceLoad strSet
  220.   ResetControls strSet
  221.   bLoadingList = False
  222.  
  223. End Sub
  224.  
  225. Private Sub Main()
  226.  
  227.   Select Case Mid$(UCase$(Trim$(Command$)), 1, 2)
  228.    Case "/C"
  229.     SetMode = 1
  230.     PreferenceFillList
  231.     loadInitialSettings
  232.     frmSettings.Height = SettingHighSmall
  233.     frmSettings.Show 1
  234.     SetMode = 0
  235.    Case "", "/S"
  236.     SetMode = 0 '
  237.     On Error Resume Next
  238.     frm_Polygon.Show
  239.   End Select
  240.   On Error GoTo 0
  241.  
  242. End Sub
  243.  
  244. Public Function MotionName() As String
  245. 'caption for the Motion scrollbar
  246.   Select Case Motion
  247.    Case 1
  248.     MotionName = "Linear"
  249.    Case 2
  250.     MotionName = "L3:B1"
  251.    Case 3
  252.     MotionName = "L:B"
  253.    Case 4
  254.     MotionName = "L1:B3"
  255.    Case 5
  256.     MotionName = "Brownian"
  257.   End Select
  258.  
  259. End Function
  260.  
  261. Public Sub MoveBrownian()
  262. 'simple brownian (jiggle around current location)
  263.  
  264.   Dim n    As Long
  265.   Dim divF As Single
  266.  
  267.   For n = 1 To SCount
  268.     With Polygon(n)
  269.       If AtBoundry(Polygon(n)) Then
  270.         .Angle = .Angle + 15#
  271.         .DispX = .XCenter
  272.         .DispY = .YCenter
  273.         .Displacement = 0
  274.       End If
  275.       If .Mass < 300 Then
  276.         .Mass = .Mass * 1.01
  277.       End If
  278.       If .Mass > 10000 Then
  279.         .Mass = .Mass * 0.9
  280.       End If
  281.  
  282.       divF = Int(Rnd * MSpeed) + 1
  283.       .XCenter = .XCenter + IIf(Rnd > 0.5, .Mass / divF, -.Mass / divF)
  284.       .YCenter = .YCenter + IIf(Rnd > 0.5, -.Mass / divF, .Mass / divF)
  285.       PolygonSetUp n
  286.       DoCollision n
  287.     End With
  288.   Next n
  289.  
  290. End Sub
  291.  
  292. Public Sub MoveLinear()
  293. 'move in a straight line
  294.   Dim n As Long
  295.  
  296.   For n = 1 To SCount
  297.     With Polygon(n)
  298.       If AtBoundry(Polygon(n)) Then
  299.         .Angle = .Angle + 15#
  300.         .DispX = .XCenter
  301.         .DispY = .YCenter
  302.         .Displacement = 0
  303.       End If
  304.       If .Mass < 300 Then
  305.         .Mass = .Mass + 0.025
  306.       End If
  307.       If .Mass > 10000 Then
  308.         .Mass = .Mass * 0.9
  309.       End If
  310.       .Displacement = .Displacement + (.DispVector) + IIf(.SpinC, 4, -4)
  311.       .XCenter = Cos(Rad(.Angle)) * .Displacement + .DispX
  312.       .YCenter = Sin(Rad(.Angle)) * .Displacement + .DispY
  313.       PolygonSetUp n
  314.       DoCollision n
  315.     End With
  316.   Next n
  317.  
  318. End Sub
  319.  
  320. Public Sub PolygonChangeShape(ByVal PNum As Long)
  321. 'apply changes to object
  322.   Dim I As Long
  323.  
  324.   On Error Resume Next
  325.   With Polygon(PNum)
  326.     For I = 1 To .NVertex
  327.       .XVertex(I) = 0
  328.       .YVertex(I) = 0
  329.     Next I
  330.     If VertMax <> VertMin Then        'min & max are different
  331.       If .IncVert Then                'due to increase sides
  332.         If .NVertex < VertMax Then    'if not already at max
  333.           .NVertex = .NVertex + 1
  334.           .Mass = .Mass - 1
  335.          Else
  336.           .IncVert = False            'else reverse side increase/decrease
  337.           .NVertex = .NVertex - 1     ' and decrease
  338.           .Mass = .Mass + 1
  339.         End If
  340.        Else                           'due to decrease size
  341.         If .NVertex > VertMin Then    'if not at min
  342.           .NVertex = .NVertex - 1
  343.           .Mass = .Mass - 1
  344.          Else
  345.           .IncVert = True             'else reverse side increase/decrease
  346.           .NVertex = .NVertex + 1     ' and increase
  347.           .Mass = .Mass + 1
  348.         End If
  349.       End If
  350.       .Mass = .Mass * IIf(.IncVert, 1.1, 0.9) ' resize according to side count
  351.      Else                                      'same Min & Max
  352.       .NVertex = VertMax                       ' force to value just in case
  353.       .Mass = .Mass * IIf(Rnd > 0.5, 0.9, 1.1) ' randomly choose size
  354.     End If
  355.     .Angle = Rnd * 361
  356.     .AngleR = .Angle
  357.     .Displacement = 0
  358.     .DispX = .XCenter
  359.     .DispY = .YCenter
  360.     .RSpeed = Rnd * 0.125 - 0.0625
  361.     .DispVector = Rnd * MSpeed + 0.1
  362.     If bRndCol Then
  363.       .Color = RandomColour
  364.     End If
  365.     PolygonSetUp PNum
  366.   End With
  367.   On Error GoTo 0
  368.  
  369. End Sub
  370.  
  371. Private Sub PolygonCreate(ByVal num As Long)
  372.  
  373. 'create a new object
  374.  
  375.   With Polygon(num)
  376.     .IncVert = True
  377.     .XCenter = Int(Rnd * (Screen.Width - 400)) + 200
  378.     .YCenter = Int(Rnd * (Screen.Height - 400)) + 200
  379.     If VertMax = VertMin Then
  380.       .NVertex = VertMax
  381.      Else
  382.       .NVertex = Int(Rnd * (VertMax)) + VertMin
  383.     End If
  384.     .Mass = Int(Rnd * 300) + 100
  385.     .Angle = Rnd * 361
  386.     .AngleR = .Angle
  387.     .Displacement = 0
  388.     .DispX = .XCenter
  389.     .DispY = .YCenter
  390.     .SpinC = Rnd > 0.5
  391.     .RSpeed = Rnd * 0.125 - 0.0625
  392.     .DispVector = Rnd * MSpeed + 0.1
  393.     .Color = RandomColour
  394.   End With
  395.  
  396. End Sub
  397.  
  398. Public Sub PolygonCreateAll()
  399.  
  400.   Dim n As Long
  401.  
  402.   ReDim Polygon(1 To SCount) As SPOLYGON
  403.   For n = 1 To SCount
  404.     PolygonCreate n
  405.     PolygonSetUp n
  406.   Next n
  407.  
  408. End Sub
  409.  
  410. Public Sub PolygonCycle(frm As Form, _
  411.                         ByVal num As Long)
  412. 'main loop for the screensaver
  413.   Dim I As Long
  414.  
  415.   With Polygon(num)
  416.     frm.DrawWidth = lngFat
  417.     For I = 1 To UBound(.XVertex)
  418.       If UBound(.XVertex) = VertMax Then
  419.         If I = VertMax Then
  420.           GoTo MaxSize
  421.         End If
  422.       End If
  423.       If .XVertex(I + 1) <> 0 Then
  424.         frm.Line (.XVertex(I), .YVertex(I))-(.XVertex(I + 1), .YVertex(I + 1)), .Color
  425.        Else
  426. MaxSize:
  427.         frm.Line (.XVertex(I), .YVertex(I))-(.XVertex(1), .YVertex(1)), .Color
  428.         Exit For
  429.       End If
  430.     Next I
  431.   End With
  432.  
  433. End Sub
  434.  
  435. Private Sub PolygonSetUp(n As Long)
  436.  
  437.   Dim M          As Long
  438.   Dim SpinFactor As Double
  439.  
  440.   On Error Resume Next ' copes with objects that escape the frame by jumping beyound the limits of screen witout triggering the boundry tests
  441.   With Polygon(n)
  442.     For M = 1 To .NVertex
  443.       .XVertex(M) = .Mass * 2 * Cos(Rad(.AngleR)) + .XCenter
  444.       .YVertex(M) = .Mass * 2 * Sin(Rad(.AngleR)) + .YCenter
  445.       SpinFactor = .DispVector * (Spinner / 5) / 100
  446.       If Not .SpinC Then
  447.         SpinFactor = -SpinFactor
  448.       End If
  449.       .AngleR = .AngleR + (360 / .NVertex) + SpinFactor
  450.     Next M
  451.   End With
  452.   If Err.Number <> 0 Then
  453.     PolygonCreate n
  454.   End If
  455.   On Error GoTo 0
  456.  
  457. End Sub
  458.  
  459. Private Sub PolygonUpdate(ByVal num As Long)
  460.  
  461. 'change object shape/colour
  462.  
  463.   With Polygon(num)
  464.     If VertMax = VertMin Then
  465.       .NVertex = VertMax
  466.      Else
  467.       .NVertex = Int(Rnd * (VertMax)) + VertMin
  468.     End If
  469.     .Color = RandomColour
  470.     PolygonChangeShape num
  471.   End With
  472.  
  473. End Sub
  474.  
  475. Public Sub PolygonUpdateAll()
  476. ' reset only the appearance of objects
  477.   Dim n As Long
  478.  
  479.   If Not bDoingReset Then
  480.     ReDim Preserve Polygon(1 To SCount) As SPOLYGON
  481.     For n = 1 To SCount
  482.       PolygonUpdate n
  483.       PolygonSetUp n
  484.     Next n
  485.   End If
  486.  
  487. End Sub
  488.  
  489. Public Sub PreferenceDelete(ByVal intIndex As Integer)
  490.  
  491.   Dim sets    As Variant
  492.   Dim I       As Long
  493.   Dim strPRef As String
  494.   Dim lngPos  As Long
  495.  
  496.   lngPos = frmSettings.lstPreferences.ListIndex
  497.   strPRef = frmSettings.lstPreferences.List(intIndex)
  498.   If strPRef = "Random" Then
  499.     Exit Sub
  500.   End If
  501.   If strPRef = "Random Pref" Then
  502.     Exit Sub
  503.   End If
  504.   sets = GetAllSettings(PolyName, "Options")
  505.   For I = LBound(sets, 1) To UBound(sets, 1)
  506.     If sets(I, 0) = strPRef Then
  507.       If GetDoit = strPRef Then
  508.         SaveSetting PolyName, "Options", "Doit", "Random"
  509.       End If
  510.       DeleteSetting PolyName, "Options", strPRef
  511.       PreferenceReNumber
  512.       PreferenceFillList
  513.       With frmSettings
  514.         If lngPos < .lstPreferences.ListCount Then
  515.           .lstPreferences.ListIndex = -1
  516.           .lstPreferences.ListIndex = lngPos
  517.          Else
  518.           .lstPreferences.ListIndex = 0
  519.         End If
  520.       End With 'frmSettings
  521.       Exit Sub
  522.     End If
  523.   Next I
  524.  
  525. End Sub
  526.  
  527. Public Sub PreferenceFillList()
  528.  
  529.   Dim sets As Variant
  530.   Dim I    As Long
  531.   Dim Prev As Long
  532.  
  533.   Prev = frmSettings.lstPreferences.ListIndex
  534.   frmSettings.lstPreferences.Clear
  535.   bLoadingList = True
  536.   sets = GetAllSettings(PolyName, "Options")
  537.   frmSettings.lstPreferences.AddItem "Random"
  538.   frmSettings.cmdPreferences(4).Enabled = False
  539.   If Not IsEmpty(sets) Then
  540.     frmSettings.lstPreferences.AddItem "Rnd User"
  541.     frmSettings.cmdPreferences(4).Enabled = True
  542.     For I = LBound(sets, 1) To UBound(sets, 1)
  543.       If sets(I, 0) <> "Doit" Then
  544.         frmSettings.lstPreferences.AddItem sets(I, 0)
  545.        Else
  546.       End If
  547.     Next I
  548.   End If
  549.   If Prev > -1 Then
  550.     If Prev < frmSettings.lstPreferences.ListCount Then
  551.       frmSettings.lstPreferences.ListIndex = Prev
  552.      Else
  553.       frmSettings.lstPreferences.Text = GetDoit
  554.     End If
  555.    Else
  556.     frmSettings.lstPreferences.Text = GetDoit
  557.   End If
  558.   bLoadingList = False
  559.  
  560. End Sub
  561.  
  562. Public Sub PreferenceLoad(strName As String)
  563.  
  564.   Dim sets     As Variant
  565.   Dim I        As Long
  566.   Dim tmpA     As Variant
  567.   Dim bRndUSer As Boolean
  568.  
  569.   Select Case strName
  570.    Case "Random"
  571.     RandomDisplay
  572.     Exit Sub
  573.    Case Else
  574.     sets = GetAllSettings(PolyName, "Options")
  575.     If strName = "Rnd User" Then
  576.       bRndUSer = True
  577.       SaveSetting PolyName, "Options", "Doit", strName
  578.       strName = PreferenceRandom
  579.       If LenB(strName) = 0 Then
  580.         strName = "Random"
  581.       End If
  582.     End If
  583.     For I = LBound(sets, 1) To UBound(sets, 1)
  584.       If sets(I, 0) = strName Then
  585.         If bRndUSer = False Then
  586.           SaveSetting PolyName, "Options", "Doit", strName
  587.         End If
  588.         tmpA = Split(sets(I, 1), "|")
  589.         SCount = tmpA(0)
  590.         MSpeed = tmpA(1)
  591.         VertMax = tmpA(2)
  592.         VertMin = tmpA(3)
  593.         Spinner = tmpA(4)
  594.         lngFat = tmpA(5)
  595.         lngCol = tmpA(6)
  596.         bRndCol = IIf(tmpA(7) = "True", True, False)
  597.         Motion = tmpA(8)
  598.         lngTimer = tmpA(9)
  599.       End If
  600.     Next I
  601.   End Select
  602.  
  603. End Sub
  604.  
  605. Private Function PreferenceRandom() As String
  606.  
  607.   Dim sets   As Variant
  608.   Dim arrTmp As Variant
  609.   Dim I      As Long
  610.   Dim strTmp As String
  611.  
  612.   sets = GetAllSettings(PolyName, "Options")
  613.   For I = LBound(sets, 1) To UBound(sets, 1)
  614.     If Left$(sets(I, 0), 5) = "User " Then
  615.       strTmp = strTmp & "|" & sets(I, 0)
  616.     End If
  617.   Next I
  618.   If Len(strTmp) Then
  619.     strTmp = Mid$(strTmp, 2)
  620.     arrTmp = Split(strTmp, "|")
  621.     PreferenceRandom = arrTmp(Int(Rnd * (UBound(arrTmp) + 1)))
  622.   End If
  623.  
  624. End Function
  625.  
  626. Public Sub PreferenceReNumber()
  627.  
  628.   Dim sets      As Variant
  629.   Dim I         As Long
  630.   Dim lngGuard  As Long
  631.   Dim lngNewNum As Long
  632.  
  633.   sets = GetAllSettings(PolyName, "Options")
  634.   For I = LBound(sets, 1) To UBound(sets, 1)
  635.     If Left$(sets(I, 0), 4) = "Doit" Then
  636.       lngGuard = I
  637.     End If
  638.     If Left$(sets(I, 0), 5) = "User " Then
  639.       lngNewNum = lngNewNum + 1
  640.       If I = lngGuard Then 'ensure that Doit is updated
  641.         sets(lngGuard, 1) = "User " & lngNewNum
  642.       End If
  643.       sets(I, 0) = "User " & lngNewNum
  644.     End If
  645.   Next I
  646.   DeleteSetting PolyName, "Options"
  647.   For I = LBound(sets, 1) To UBound(sets, 1)
  648.     SaveSetting PolyName, "Options", sets(I, 0), sets(I, 1)
  649.   Next I
  650.   PreferenceFillList
  651.  
  652. End Sub
  653.  
  654. Public Sub PreferenceSave()
  655.  
  656.   Dim sets As Variant
  657.   Dim I    As Long
  658.  
  659.   If frmSettings.lstPreferences.ListCount < 32768 Then ' not likely but you never know
  660.     sets = GetAllSettings(PolyName, "Options")
  661.     GetFreeUser
  662.     For I = LBound(sets, 1) To UBound(sets, 1)
  663.       If sets(I, 0) <> "Doit" Then
  664.         If StorageString = sets(I, 1) Then ' skip duplicates
  665.           MsgBox sets(I, 0) & " already has these settings", vbOKOnly, PolyName
  666.           Exit Sub
  667.         End If
  668.       End If
  669.     Next I
  670.     SaveSetting PolyName, "Options", "User " & GetFreeUser, StorageString
  671.     PreferenceFillList
  672.   End If
  673.  
  674. End Sub
  675.  
  676. Public Function Rad(Degrees As Double) As Double
  677.  
  678.   Rad = Degrees * PIDiv180
  679.  
  680. End Function
  681.  
  682. Private Function RandomColour() As Long
  683. ' generate a random colour within the various colour sets
  684.   Dim vG As Long
  685.  
  686.   Select Case lngCol
  687.    Case 0 ' B/W dark
  688.     vG = Int(Rnd * 30) + 16
  689.     RandomColour = RGB(vG, vG, vG)
  690.    Case 1 ' B/W average
  691.     vG = Int(Rnd * 127) + 6
  692.     RandomColour = RGB(vG, vG, vG)
  693.    Case 2 ' B/W bright
  694.     vG = Int(Rnd * 230) + 26
  695.     RandomColour = RGB(vG, vG, vG)
  696.    Case 3 'dull
  697.     RandomColour = RGB(Int(Rnd * 100) + 6, Int(Rnd * 100) + 6, Int(Rnd * 100) + 6)
  698.    Case 4 'pastel
  699.     RandomColour = RGB(Int(Rnd * 100) + 156, Int(Rnd * 100) + 156, Int(Rnd * 100) + 156)
  700.    Case 5
  701.     RandomColour = RGB(Int(Rnd * 200) + 56, 0, 0)
  702.    Case 6
  703.     RandomColour = RGB(0, Int(Rnd * 200) + 56, 0)
  704.    Case 7
  705.     RandomColour = RGB(0, 0, Int(Rnd * 200) + 56)
  706.    Case 8
  707.     RandomColour = RGB(Int(Rnd * 200) + 56, Int(Rnd * 200) + 56, 0)
  708.    Case 9
  709.     RandomColour = RGB(Int(Rnd * 200) + 56, 0, Int(Rnd * 200) + 56)
  710.    Case 10
  711.     RandomColour = RGB(0, Int(Rnd * 200) + 56, Int(Rnd * 200) + 56)
  712.    Case 11
  713.     vG = Int(Rnd * 230) + 26
  714.     RandomColour = RGB(0, vG, vG)
  715.    Case 12
  716.     vG = Int(Rnd * 230) + 26
  717.     RandomColour = RGB(vG, 0, vG)
  718.    Case 13
  719.     vG = Int(Rnd * 230) + 26
  720.     RandomColour = RGB(vG, vG, 0)
  721.    Case 14
  722.     RandomColour = RGB(0, Int(Rnd * 230) + 26, 0)
  723.    Case 15
  724.     RandomColour = RGB(Int(Rnd * 130) + 26, Int(Rnd * 130) + 26, Int(Rnd * 130) + 26)
  725.    Case 16
  726.     RandomColour = RGB(Int(Rnd * 200) + 56, Int(Rnd * 200) + 56, Int(Rnd * 200) + 56)
  727.    Case 17
  728.     RandomColour = RGB(Int(Rnd * 230) + 26, Int(Rnd * 230) + 26, Int(Rnd * 230) + 26)
  729.   End Select
  730.  
  731. End Function
  732.  
  733. Public Sub RandomDisplay()
  734.  
  735.   SaveSetting PolyName, "Options", "Doit", "Random"
  736.   RandomValues
  737.   If SetMode = 0 Then
  738.     PolygonCreateAll
  739.   End If
  740.  
  741. End Sub
  742.  
  743. Public Sub RandomTimeShift()
  744. 'randomly change one property of polygon sets
  745. 'NOTE if the selected action is at the limits of its range no change may occur
  746.   Dim OCount As Long ' used to test wheater a new object needs t be created
  747.  
  748.   Select Case Int(Rnd * 7)
  749.    Case 0
  750.     OCount = SCount
  751.     SCount = SCount + IIf(Int(Rnd > 0.5), 1, -1)
  752.     ReDim Preserve Polygon(1 To SCount) As SPOLYGON
  753.     If OCount > SCount Then
  754.       PolygonCreate UBound(Polygon)
  755.     End If
  756.     KeepInRange 2, SCount, 250
  757.    Case 1
  758.     MSpeed = MSpeed + IIf(Int(Rnd > 0.5), 1, -1)
  759.     KeepInRange 1, MSpeed, 1000
  760.    Case 2
  761.     VertMin = VertMin + IIf(Int(Rnd > 0.5), 1, -1)
  762.     KeepInRange 1, VertMin, VertMax
  763.    Case 3
  764.     VertMax = VertMax + IIf(Int(Rnd > 0.5), 1, -1)
  765.     KeepInRange VertMin, VertMax, 20
  766.    Case 4
  767.     Spinner = Spinner + IIf(Int(Rnd > 0.5), 1, -1)
  768.     KeepInRange 1, Spinner, 100
  769.    Case 5
  770.     lngFat = lngFat + IIf(Int(Rnd > 0.5), 1, -1)
  771.     KeepInRange 1, lngFat, 200
  772.    Case 6
  773.     lngCol = lngCol + IIf(Int(Rnd > 0.5), 1, -1)
  774.     KeepInRange 0, lngCol, 17
  775.    Case 7
  776.     bRndCol = Rnd > 0.5
  777.   End Select
  778.   ResetControls ""
  779.  
  780. End Sub
  781.  
  782. Public Sub RandomValues()
  783. ' generate random values for all settings
  784. ' note lngTimer and Spinner are skewed to prefer the off position
  785.   If frmSettings.lstPreferences.Text <> "Random" Then
  786.     frmSettings.lstPreferences.Text = "Random"
  787.   End If
  788.   lngTimer = IIf(Rnd > 0.8, Int(Rnd * 6), 0)
  789.   bRndCol = Rnd > 0.5
  790.   lngCol = Int(Rnd * 17)
  791.   lngFat = Int(Rnd * 100) + 1
  792.   SCount = Int(Rnd * 100) + 10
  793.   MSpeed = Int(Rnd * 500) + 30
  794.   VertMax = Int(Rnd * 10) + 3
  795.   Spinner = IIf(Rnd > 0.5, 0, Int(Rnd * 100))
  796.   Do ' this makes sure that VertMin is less than or equal to VertMax
  797.     VertMin = Int(Rnd * 10) + 1
  798.   Loop While VertMin > VertMax
  799.   Motion = Int(Rnd * 5) + 1
  800.  
  801. End Sub
  802.  
  803. Public Sub ResetControls(ByVal strName As String)
  804. 'resets the controls without causing cascades
  805.   bDoingReset = True
  806.   With frmSettings
  807.     If Not bLoadingList Then
  808.       .lstPreferences.Text = strName
  809.     End If
  810.     .hscSettings(0).Value = SCount
  811.     .hscSettings(1).Value = MSpeed
  812.     .hscSettings(2).Value = VertMin
  813.     .hscSettings(3).Value = VertMax
  814.     .hscSettings(4).Value = Spinner
  815.     .hscSettings(5).Value = Motion
  816.     .hscSettings(6).Value = lngFat
  817.     .hscSettings(7).Value = lngCol
  818.     bDoingReset = False ' turn guard off so final reset fires the changes
  819.     .hscSettings(8) = lngTimer
  820.     .chkRndColour.Value = IIf(bRndCol, vbChecked, vbUnchecked)
  821.   End With
  822.  
  823. End Sub
  824.  
  825. Private Function StorageString() As String
  826. 'single source makes recoding easier
  827.   StorageString = SCount & "|" & MSpeed & "|" & VertMax & "|" & VertMin & "|" & Spinner & "|" & lngFat & "|" & lngCol & "|" & bRndCol & "|" & Motion & "|" & lngTimer
  828.  
  829. End Function
  830.  
  831. ':)Roja's VB Code Fixer V1.1.93 (8/03/2004 10:16:13 AM) 42 + 784 = 826 Lines Thanks Ulli for inspiration and lots of code.
  832.  
  833.