PDA

View Full Version : Possible report file bug.


PS-SCUD
03-02-2006, 04:23 AM
There seems to be an inconsistency with what report files are recorded for multiplayer games.

I have several reports from multiplayer games (1 was a Coop which WB hosted, and I dropped from. The other was a HTH Sean hosted.) The rest of my multiplayer reports are missing (3 or 4 games worth).

I believe this may be a bug. I'd be happy to do some experiments with any willing partner to try to discover why reports may not be written at times.

PS-SCUD
03-02-2006, 05:01 AM
After further observation I have found that you only get the report files if you drop from the game or quit before it ends.

Why is this? Shouldn't you be able to get the report file when the game ends normally?

PS-SCUD
03-02-2006, 09:00 PM
So is anyone going to answer my questions?

Bluewings
03-02-2006, 09:15 PM
No . :mrgreen:

Cheers . :3starSK:

PS-SCUD
03-02-2006, 09:30 PM
:mad2:

PS-SCUD
03-02-2006, 09:34 PM
Option Explicit

''''''''''''''''''''''''''''''' _
Browse window declarations
'''''''''''''''''''''''''''''''

Private Const BIF_RETURNONLYFSDIRS = 1
Private Const BIF_DONTGOBELOWDOMAIN = 2
Private Const MAX_PATH = 260

Private Declare Function SHBrowseForFolder Lib _
"shell32" (lpbi As BrowseInfo) As Long

Private Declare Function SHGetPathFromIDList Lib _
"shell32" (ByVal pidList As Long, ByVal lpBuffer _
As String) As Long

Private Declare Function lstrcat Lib "kernel32" _
Alias "lstrcatA" (ByVal lpString1 As String, ByVal _
lpString2 As String) As Long

Private Type BrowseInfo
hWndOwner As Long
pIDLRoot As Long
pszDisplayName As Long
lpszTitle As Long
ulFlags As Long
lpfnCallback As Long
lParam As Long
iImage As Long
End Type


Private Sub CancelButton_Click()
Unload diaCompile
End Sub

'Opens a Browse Folders Dialog Box so the user can easily browse for the
'Report file directory. NOTE: Make the default path the default SB Pro PE
'Install path.
Private Sub cmdBrowse_Click()

Dim lpIDList As Long
Dim sBuffer As String
Dim szTitle As String
Dim tBrowseInfo As BrowseInfo

szTitle = "Select the directory where your SB Pro PE report files are stored." & _
" Then click the OK button."

With tBrowseInfo
.hWndOwner = Me.hWnd
.lpszTitle = lstrcat(szTitle, "")
.ulFlags = BIF_RETURNONLYFSDIRS + BIF_DONTGOBELOWDOMAIN
End With

lpIDList = SHBrowseForFolder(tBrowseInfo)

If (lpIDList) Then
sBuffer = Space(MAX_PATH)
SHGetPathFromIDList lpIDList, sBuffer
sBuffer = Left(sBuffer, InStr(sBuffer, vbNullChar) - 1)
End If


txtInput.Text = sBuffer

End Sub

Private Sub Form_Load()
'Center form
diaCompile.Left = (Screen.Width - diaCompile.Width) / 2
diaCompile.Top = (Screen.Height - diaCompile.Height) / 2
End Sub

Private Sub OKButton_Click()

Dim strReportDir As String
Dim intCompileResult As Integer

'This program requires a directory that ends in a backslash.
'So if the user doesn't input one, this will append it on.

If (txtInput.Text <> "") Then
If (Mid(txtInput.Text, (Len(txtInput.Text)), 1) <> "\") Then
strReportDir = (txtInput.Text & "\")
Else
strReportDir = txtInput.Text
End If

Else
MsgBox ("Error: You must select a directory first.")
End If

If ((strReportDir <> "\") And (strReportDir <> "")) Then

'Show hourglass
diaCompile.MousePointer = 11

'Compile the files found in the directory that the user selected.
intCompileResult = compileReportFiles(strReportDir)

diaCompile.MousePointer = 0
'Reset curser
If (intCompileResult = 1) Then

With diaCompileSuccess
.passDirectory = strReportDir
.Show
End With
Unload diaCompile
End If

If (intCompileResult = 3) Then
MsgBox "Error: No valid SB Report files were found at this location.", vbExclamation
End If

If (intCompileResult = 4) Then
MsgBox "No files were written to the database, because only outdated files were found." _
& vbNewLine & "If you want to include these files in the database check the 'Write old files' option in the options menu."
End If

End If

End Sub


Option Explicit

Private strReportDir

Public Property Let passDirectory(ByVal strDirectory As String)
strReportDir = strDirectory
End Property


Private Sub lblMessage_Click()

End Sub


Private Sub cmdNo_Click()
Unload diaCompileSuccess
End Sub

Private Sub cmdYes_Click()

Dim loadReturn As Integer

'Show hourglass
diaCompileSuccess.MousePointer = 11

'Load the report database file.
loadReturn = loadDatabase(strReportDir)

diaCompileSuccess.MousePointer = 0
'Reset curser

If (loadReturn = 1) Then
MsgBox ("Database successfully loaded.")
frmMainMenu.loadedSign = True
Unload diaCompileSuccess
End If

End Sub

Private Sub Form_Load()

' Center
diaCompileSuccess.Left = (Screen.Width - diaCompileSuccess.Width) / 2
diaCompileSuccess.Top = (Screen.Height - diaCompileSuccess.Height) / 2

End Sub



Option Explicit

''''''''''''''''''''''''''''''' _
Browse window declarations
'''''''''''''''''''''''''''''''

Private Const BIF_RETURNONLYFSDIRS = 1
Private Const BIF_DONTGOBELOWDOMAIN = 2
Private Const MAX_PATH = 260

Private Declare Function SHBrowseForFolder Lib _
"shell32" (lpbi As BrowseInfo) As Long

Private Declare Function SHGetPathFromIDList Lib _
"shell32" (ByVal pidList As Long, ByVal lpBuffer _
As String) As Long

Private Declare Function lstrcat Lib "kernel32" _
Alias "lstrcatA" (ByVal lpString1 As String, ByVal _
lpString2 As String) As Long

Private Type BrowseInfo
hWndOwner As Long
pIDLRoot As Long
pszDisplayName As Long
lpszTitle As Long
ulFlags As Long
lpfnCallback As Long
lParam As Long
iImage As Long
End Type

Private Sub CancelButton_Click()
Unload diaLoad
End Sub


Private Sub cmdBrowse_Click()

Dim lpIDList As Long
Dim sBuffer As String
Dim szTitle As String
Dim tBrowseInfo As BrowseInfo

szTitle = "Select the directory where your SB Pro PE report files are stored." & _
" Then click the OK button."

With tBrowseInfo
.hWndOwner = Me.hWnd
.lpszTitle = lstrcat(szTitle, "")
.ulFlags = BIF_RETURNONLYFSDIRS + BIF_DONTGOBELOWDOMAIN
End With

lpIDList = SHBrowseForFolder(tBrowseInfo)

If (lpIDList) Then
sBuffer = Space(MAX_PATH)
SHGetPathFromIDList lpIDList, sBuffer
sBuffer = Left(sBuffer, InStr(sBuffer, vbNullChar) - 1)
End If


txtInput.Text = sBuffer

End Sub

Private Sub Form_Load()
'Center form
diaLoad.Left = (Screen.Width - diaLoad.Width) / 2
diaLoad.Top = (Screen.Height - diaLoad.Height) / 2

End Sub

Private Sub OKButton_Click()
Dim strReportDir As String
Dim loadReturn As Integer

'This program requires a directory that ends in a backslash.
'So if the user doesn't input one, this will append it on.
If (txtInput.Text <> "") Then
If (Mid(txtInput.Text, (Len(txtInput.Text)), 1) <> "\") Then
strReportDir = (txtInput.Text & "\")
Else
strReportDir = txtInput.Text
End If

Else
MsgBox ("Error: You must select a directory first.")
End If


If ((strReportDir <> "\") And (strReportDir <> "")) Then

'Show hourglass
diaLoad.MousePointer = 11

'Load the report database file.
loadReturn = loadDatabase(strReportDir)

diaLoad.MousePointer = 99
'Reset curser

If (loadReturn = 1) Then
frmMainMenu.loadedSign = True
Unload diaLoad
Else
MsgBox ("Error loading stat database.")
End If

End If

End Sub


Option Explicit
Public Property Let loadedSign(ByVal blnLoadedSign As Boolean)
lblStatLoaded.Visible = blnLoadedSign
End Property

Private Sub cmdCompile_Click()
diaCompile.Show
End Sub

Private Sub cmdExit_Click()
End
End Sub

Private Sub cmdLoadStats_Click()
cmdView.SetFocus
diaLoad.Show
End Sub

Private Sub cmdOptions_Click()
frmOptions.Show
End Sub

Private Sub cmdView_Click()

If (lblStatLoaded.Visible = False) Then
MsgBox ("Error: You must load a stat database first.")
Else
frmStats.Show
End If

End Sub

Private Sub Form_Load()
setConstants

'Center form
frmMainMenu.Left = (Screen.Width - frmMainMenu.Width) / 2
frmMainMenu.Top = (Screen.Height - frmMainMenu.Height) / 2

End Sub


Option Explicit

Private Sub cmdCancel_Click()
Unload frmOptions
End Sub


Private Sub chkBackupData_Click()
If (chkBackupData = 1) Then
blnBackupData = True
Else
blnBackupData = False
End If
End Sub

Private Sub chkDelScanned_Click()
If (chkDelScanned = 1) Then
blnDeleteReports = True
Else
blnDeleteReports = False
End If

End Sub

Private Sub chkWriteOld_Click()
If (chkWriteOld = 1) Then
blnWriteOldFiles = True
Else
blnWriteOldFiles = False
End If

End Sub

Private Sub cmdOk_Click()
frmOptions.Hide
End Sub


Option Explicit

Private strUserName As String
Private intFirstEntry As Integer
Private intTotalEntries As Integer
Private intUserIndex As Integer
Private gameType As e_gameType
Private playerSide As e_side
Private blnSelectedUser As Boolean
Private dblStartDate As Double
Private dblEndDate As Double


Private Function getUserList()

Dim intScenario As Integer
Dim intUser As Integer
Dim intListItem As Integer
Dim blnAddToList As Boolean
Dim blnFirstRun As Boolean
Dim strUserName As String
Dim intListedUser As Integer


'''''''''''''''''''''''''''''''''''''' _
Get a list of User names and add them _
to the combo box. If a name is already in _
the combo list, don't add it.
'''''''''''''''''''''''''''''''''''''

'Scan every user in every scenario.
For intScenario = 0 To UBound(theDatabase())
For intUser = 0 To ((theDatabase(intScenario).BluePlayers + _
theDatabase(intScenario).RedPlayers) - 1)

'If it is the first time through the loop, we want to automatically assign
' the user to the first index value.
blnFirstRun = False
If (cboPlayers.ListCount = 0) Then
cboPlayers.AddItem (theDatabase(intScenario).UserData(intUser).Nam e)
blnFirstRun = True
End If


If (blnFirstRun = False) Then
blnAddToList = True

'Don't add duplicate users to the list. Scan each member in the list, and make
'sure that the current user doesn't match.
For intListItem = 0 To (cboPlayers.ListCount - 1)

'If the current user does match, we still want to increment the number of
'Scenarios he has played in.
If (cboPlayers.List(intListItem) = theDatabase(intScenario).UserData(intUser).Name) Then
blnAddToList = False
End If

Next intListItem

'If the user isn't already on the list, add him.
If (blnAddToList = True) Then
cboPlayers.AddItem (theDatabase(intScenario).UserData(intUser).Nam e)
End If
End If

Next intUser
intUser = 0

Next intScenario

End Function


Private Sub cboDate_Click()

Dim endDate, startDate As Date
Dim strStartDay, strStartMonth, strStartYear As String
Dim strEndDay, strEndMonth, strEndYear As String
Dim intRollback As Integer
Dim intStartPos, intEndPos As Integer

Select Case cboDate.Text
Case "Last 7 Days"
intRollback = 7
Case "Last 30 Days"
intRollback = 30
Case "Last 60 Days"
intRollback = 60
Case "Last 365 Days"
intRollback = 365
End Select


endDate = Date
startDate = DateAdd("d", -intRollback, endDate)

intEndPos = InStr(1, startDate, "/", vbTextCompare)
strStartMonth = Mid(startDate, 1, (intEndPos - 1))
intStartPos = (intEndPos + 1)
intEndPos = InStr(intStartPos, startDate, "/", vbTextCompare)

strStartDay = Mid(startDate, intStartPos, (intEndPos - intStartPos))
intStartPos = (intEndPos + 1)
strStartYear = Mid(startDate, intStartPos, (intEndPos + 4))

intEndPos = InStr(1, endDate, "/", vbTextCompare)
strEndMonth = Mid(endDate, 1, (intEndPos - 1))
intStartPos = (intEndPos + 1)
intEndPos = InStr(intStartPos, endDate, "/", vbTextCompare)

strEndDay = Mid(endDate, intStartPos, (intEndPos - intStartPos))
intStartPos = (intEndPos + 1)
strEndYear = Mid(endDate, intStartPos, (intEndPos + 4))

txtStartDay.Text = strStartDay
txtStartMonth.Text = strStartMonth
txtStartYear.Text = strStartYear

txtEndDay.Text = strEndDay
txtEndMonth.Text = strEndMonth
txtEndYear.Text = strEndYear

dblStartDate = DateSerial(Val(strStartYear), Val(strStartMonth), Val(strStartDay))
dblEndDate = DateSerial(Val(strEndYear), Val(strEndMonth), Val(strEndDay))

End Sub

Private Sub cboPlayers_DblClick()

Dim intScenario As Integer
Dim intUser As Integer
Dim intScenarioIndex As Integer
Dim blnFoundUser As Boolean
Dim intTotalEntries As Integer

strUserName = cboPlayers.Text
blnSelectedUser = True
intFirstEntry = 0
intUserIndex = 0

'Find the location of the first scenario the user played in.
'And count the total number of scenarios he played in.
For intScenario = 0 To (UBound(theDatabase()))
For intUser = 0 To (theDatabase(intScenario).RedPlayers + _
theDatabase(intScenario).BluePlayers - 1)

If ((theDatabase(intScenario).UserData(intUser).Na me = strUserName) _
And blnFoundUser = False) Then
intUserIndex = intUser
intFirstEntry = intScenario
blnFoundUser = True
End If

If (theDatabase(intScenario).UserData(intUser).Nam e = strUserName) Then
intTotalEntries = (intTotalEntries + 1)
End If


Next intUser
intUser = 0
Next intScenario


'The first instance of the user will record the location of all the other instances
ReDim theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(0 To intTotalEntries, 0 To 1)

intScenarioIndex = 0
For intScenario = 0 To (UBound(theDatabase()))
For intUser = 0 To (theDatabase(intScenario).RedPlayers + _
theDatabase(intScenario).BluePlayers - 1)
If (theDatabase(intScenario).UserData(intUser).Nam e = strUserName) Then
theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenarioIndex, 0) = _
intScenario
theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenarioIndex, 1) = _
intUser
intScenarioIndex = (intScenarioIndex + 1)
End If
Next intUser
intUser = 0
Next intScenario

End Sub

PS-SCUD
03-02-2006, 09:35 PM
Private Sub cmdClearDates_Click()
txtStartDay.Text = ""
txtStartMonth.Text = ""
txtStartYear.Text = ""
txtEndDay.Text = ""
txtEndMonth.Text = ""
txtEndYear.Text = ""
dblStartDate = 0
dblEndDate = 0
End Sub

Private Sub cmdGetStats_Click()
Dim intTotalGames As Integer

If (blnSelectedUser = False) Then
MsgBox "Select a player first."
Exit Sub
End If

lblPlayer1Name.Caption = strUserName
lblTotals.Visible = True
lblPersonalKills.Visible = True
lblPersonalLosses.Visible = True
lblPMRating.Visible = True
lblTotalKills.Visible = True
lblFrats.Visible = True
lblTanksLost.Visible = True
lblTanksCommanded.Visible = True
lblPCsLost.Visible = True
lblPCsCommanded.Visible = True
lblTroopsLost.Visible = True
lblTroopsCommanded.Visible = True
lblOthersLost.Visible = True
lblOthersCommanded.Visible = True
lblShots.Visible = True
lblHits.Visible = True
lblGamesPlayed.Visible = True
lblHoursPlayed.Visible = True


lblPKillsStat.Caption = getUserTotal(intFirstEntry, intUserIndex, Kills, gameType, _
dblStartDate, dblEndDate, , playerSide)

lblPLossesStat.Caption = getUserTotal(intFirstEntry, intUserIndex, Losses, gameType, _
dblStartDate, dblEndDate, , playerSide)

lblPMRatingStat.Caption = getUserTotal(intFirstEntry, intUserIndex, PMRating, gameType, _
dblStartDate, dblEndDate, , playerSide)

If (Val(lblPMRatingStat.Caption) > 0) Then
lblPMRatingSign.Caption = "+"
Else
lblPMRatingStat.Caption = Abs(Val(lblPMRatingStat.Caption))
lblPMRatingSign.Caption = "-"

End If

lblTotalKStat.Caption = getUserTotal(intFirstEntry, intUserIndex, Tkills, gameType, _
dblStartDate, dblEndDate, , playerSide)

lblTanksLostStat.Caption = getUserTotal(intFirstEntry, intUserIndex, TanksLost, gameType, _
dblStartDate, dblEndDate, , playerSide)

lblFratStat.Caption = getUserTotal(intFirstEntry, intUserIndex, Frats, gameType, _
dblStartDate, dblEndDate, , playerSide)

lblTanksLostStat.Caption = getUserTotal(intFirstEntry, intUserIndex, TanksLost, gameType, _
dblStartDate, dblEndDate, , playerSide)

lblTanksCmdStat.Caption = getUserTotal(intFirstEntry, intUserIndex, TotalTanks, gameType, _
dblStartDate, dblEndDate, , playerSide)

lblPCsLostStat.Caption = getUserTotal(intFirstEntry, intUserIndex, PCsLost, gameType, _
dblStartDate, dblEndDate, , playerSide)

lblPCsCommandedStat.Caption = getUserTotal(intFirstEntry, intUserIndex, TotalPCs, gameType, _
dblStartDate, dblEndDate, , playerSide)

lblTroopsLostStat.Caption = getUserTotal(intFirstEntry, intUserIndex, TroopsLost, gameType, _
dblStartDate, dblEndDate, , playerSide)

lblTroopsCmdStat.Caption = getUserTotal(intFirstEntry, intUserIndex, TotalTroops, gameType, _
dblStartDate, dblEndDate, , playerSide)

lblOthersLostStat.Caption = getUserTotal(intFirstEntry, intUserIndex, OthersLost, gameType, _
dblStartDate, dblEndDate, , playerSide)

lblOthersCmdStat.Caption = getUserTotal(intFirstEntry, intUserIndex, TotalOthers, gameType, _
dblStartDate, dblEndDate, , playerSide)

lblShotsStat.Caption = getUserTotal(intFirstEntry, intUserIndex, TotalShots, gameType, _
dblStartDate, dblEndDate, , playerSide)

lblHitsStat.Caption = getUserTotal(intFirstEntry, intUserIndex, TotalHits, gameType, _
dblStartDate, dblEndDate, , playerSide)

lblGamesPlayedStat.Caption = getUserTotal(intFirstEntry, intUserIndex, GamesPlayed, gameType, _
dblStartDate, dblEndDate, , playerSide)

intTotalGames = Val(lblGamesPlayedStat.Caption)

lblHoursPlayedStat.Caption = getUserTotal(intFirstEntry, intUserIndex, HoursPlayed, gameType, _
dblStartDate, dblEndDate, , playerSide)

lblAverages.Visible = True
lblAvgPKills.Visible = True
lblAvgPLosses.Visible = True
lblAvgPMRating.Visible = True
lblAvgTotalKills.Visible = True
lblAvgFrats.Visible = True
lblTankMortality.Visible = True
lblPCMortality.Visible = True
lblTroopMortality.Visible = True
lblOtherMortality.Visible = True
lblAccuracy.Visible = True
lblAvgHoursPlayed.Visible = True


lblAvgPKillsStat.Caption = Round((Val(lblPKillsStat.Caption) / intTotalGames), 2)

lblAvgPLossesStat.Caption = Round((Val(lblPLossesStat.Caption) / intTotalGames), 2)

lblAvgPMRatingStat.Caption = Round((Val(lblPMRatingStat.Caption) / intTotalGames), 2)

If (Val(lblAvgPMRatingStat.Caption) > 0) Then
lblAvgPMRatingSign.Caption = "+"
Else
lblAvgPMRatingStat.Caption = Abs(Val(lblAvgPMRatingStat.Caption))
lblAvgPMRatingSign.Caption = "-"

End If

lblAvgTotalKStat.Caption = Round((Val(lblTotalKStat.Caption) / intTotalGames), 2)

lblAvgFratStat.Caption = Round((Val(lblFratStat.Caption) / intTotalGames), 2)

lblTankMortalityStat.Caption = getUserAverage(intFirstEntry, intUserIndex, TankMortality, gameType _
, dblStartDate, dblEndDate, , playerSide) & "%"

lblPCMortalityStat.Caption = getUserAverage(intFirstEntry, intUserIndex, PCMortality, gameType _
, dblStartDate, dblEndDate, , playerSide) & "%"

lblTroopMortalityStat.Caption = getUserAverage(intFirstEntry, intUserIndex, TroopMortality, gameType _
, dblStartDate, dblEndDate, , playerSide) & "%"

lblOtherMortalityStat.Caption = getUserAverage(intFirstEntry, intUserIndex, OtherMortality, gameType _
, dblStartDate, dblEndDate, , playerSide) & "%"

lblAccuracyStat.Caption = getUserAverage(intFirstEntry, intUserIndex, Accuracy, gameType _
, dblStartDate, dblEndDate, , playerSide) & "%"

lblAvgHoursPlayedStat.Caption = Round((Val(lblHoursPlayedStat.Caption) / _
Val(lblGamesPlayedStat.Caption)), 2)


End Sub

Private Sub cmdMainMenu_Click()

End Sub

Private Sub cmdOKDates_Click()
dblStartDate = DateSerial(Val(txtStartYear.Text), Val(txtStartMonth.Text), Val(txtStartDay.Text))
dblEndDate = DateSerial(Val(txtEndYear.Text), Val(txtEndMonth.Text), Val(txtEndDay.Text))

If ((dblEndDate - dblStartDate) <= 0) Then
MsgBox "Error! Start date does not precede end date."
cmdClearDates.SetFocus
Exit Sub
End If
End Sub

Private Sub Combo1_Change()

End Sub

Private Sub Form_Load()

frmStats.Left = (Screen.Width - frmStats.Width) / 2
frmStats.Top = (Screen.Height - frmStats.Height) / 2

optAllGames.Value = True
optAnySide.Value = True
OptPlayerStat.Value = True

getUserList

End Sub


Private Sub Form_Resize()



'Adjust the scrollbars and form position.
VScroll1.Move Me.ScaleWidth - VScroll1.Width, 0, VScroll1.Width, Me.ScaleHeight
HScroll1.Move 0, Me.ScaleHeight - HScroll1.Height, Me.ScaleWidth - VScroll1.Width, _
HScroll1.Height
pbOuter.Move 0, 0, Me.ScaleWidth - VScroll1.Width, Me.ScaleHeight - HScroll1.Height

'Hide scrollbars if they are unecessary
If pbInner.Height <= pbOuter.Height Then
VScroll1.Visible = False
Else
VScroll1.Visible = True
VScroll1.Max = pbInner.Height - pbOuter.Height
VScroll1.LargeChange = 2500
VScroll1.SmallChange = 500
End If

If pbInner.Width <= pbOuter.Width Then
HScroll1.Visible = False
Else
HScroll1.Visible = True
HScroll1.Max = pbInner.Width - pbOuter.Width
HScroll1.LargeChange = 2500
HScroll1.SmallChange = 250
End If


End Sub

Private Sub HScroll1_Change()
pbInner.Left = -HScroll1.Value
End Sub

Private Sub lblPLosses_Click()

End Sub

Private Sub lblTotalHits_Click()

End Sub

Private Sub lblTotalShots_Click()

End Sub

Private Sub optAllGames_Click()
gameType = AllGames
End Sub

Private Sub optAnySide_Click()
playerSide = AnySide
End Sub

Private Sub optBlueSide_Click()
playerSide = Blue
End Sub

Private Sub optCoop_Click()
gameType = Coop
End Sub

Private Sub optHTH_Click()
gameType = HeadToHead
End Sub

Private Sub optRedSide_Click()
playerSide = Red
End Sub

Private Sub optSP_Click()
gameType = SinglePlayer
End Sub

Private Sub txtEndDay_Change()
Dim numCheck As Integer
numCheck = ValidateNumber(txtEndDay.Text, True, , False)

If (numCheck <> 0) Then
MsgBox ("Incorrect date")
txtEndDay.SelStart = 0
txtEndDay.SelLength = Len(txtEndDay.Text)
End If

If (Len(txtEndDay.Text) = 2 And (numCheck = 0)) Then
txtEndMonth.SetFocus
End If
End Sub

Private Sub txtEndMonth_Change()
Dim numCheck As Integer

numCheck = ValidateNumber(txtEndMonth.Text, True, , False)

If (numCheck <> 0) Then
MsgBox ("Incorrect date")
txtEndMonth.SelStart = 0
txtEndMonth.SelLength = Len(txtEndMonth.Text)
End If

If ((Len(txtEndMonth.Text) = 2) And (numCheck = 0)) Then
txtEndYear.SetFocus
End If
End Sub

Private Sub txtEndYear_Change()
Dim strEndDate As String
Dim numCheck As Integer

numCheck = ValidateNumber(txtEndYear.Text, True, , False)


If (numCheck <> 0) Then
MsgBox ("Incorrect date")
txtEndYear.SelStart = 0
txtEndYear.SelLength = Len(txtEndYear.Text)
End If


If ((Len(txtEndYear.Text) = 4) And (numCheck = 0)) Then
strEndDate = txtEndMonth.Text & "/" & txtEndDay.Text & "/" & txtEndYear.Text

If (IsDate(strEndDate) = False) Then
MsgBox "Invalid date."
cmdClearDates.SetFocus
Exit Sub
End If

cmdOKDates.SetFocus
End If


End Sub

Private Sub txtStartDay_Change()

Dim numCheck As Integer
numCheck = ValidateNumber(txtStartDay.Text, True, , False)

If (numCheck <> 0) Then
MsgBox ("Incorrect date")
txtStartDay.SelStart = 0
txtStartDay.SelLength = Len(txtStartDay.Text)
End If

If (Len(txtStartDay.Text) = 2 And (numCheck = 0)) Then
txtStartMonth.SetFocus
End If
End Sub

Private Sub txtStartMonth_Change()
Dim numCheck As Integer

numCheck = ValidateNumber(txtStartMonth.Text, True, , False)

If (numCheck <> 0) Then
MsgBox ("Incorrect date")
txtStartMonth.SelStart = 0
txtStartMonth.SelLength = Len(txtStartMonth.Text)
End If

If ((Len(txtStartMonth.Text) = 2) And (numCheck = 0)) Then
txtStartYear.SetFocus
End If
End Sub

Private Sub txtStartYear_Change()

Dim strStartDate As String
Dim numCheck As Integer


numCheck = ValidateNumber(txtStartYear.Text, True, , False)


If (numCheck <> 0) Then
MsgBox ("Incorrect date")
txtStartYear.SelStart = 0
txtStartYear.SelLength = Len(txtStartYear.Text)
End If


If ((Len(txtStartYear.Text) = 4) And (numCheck = 0)) Then
strStartDate = txtStartMonth.Text & "/" & txtStartDay.Text & "/" & txtStartYear.Text

If (IsDate(strStartDate) = False) Then
MsgBox "Invalid date."
cmdClearDates.SetFocus
Exit Sub
Else
txtEndDay.SetFocus

End If
End If


End Sub

Private Sub VScroll1_Change()
pbInner.Top = -VScroll1.Value
End Sub


Option Explicit

Private intDatabasePos As Integer

Private strInputFile() As String
Private lngInputFile As Long

Private Const SEGMENTSZ = 4096& 'How many bytes should each segment be broken into
'When loading the database file. 4096 is the minimum recommended size (any smaller _
and you risk corrupting data.) Larger sizes have slower loading times.





' This function will read the sceDatabase file and load it into memory
' Using an array of scenarioStat objects
Public Function loadDatabase(ByVal strReportDir As String) As Integer

'Reset the database position and array.
intDatabasePos = 0
ReDim theDatabase(0 To 0)

Dim strDatabaseFilePath As String
Dim intLoadResult As Integer
Dim intSegmentResult As Integer

strDatabaseFilePath = (strReportDir & "sceDatabase.sst")

intSegmentResult = segmentData(strDatabaseFilePath, strReportDir)

If (intSegmentResult > 1) Then
intLoadResult = loadAllSegments()
End If

If (intSegmentResult = 1) Then
intLoadResult = loadSegment()
End If

If (intSegmentResult < 1) Then
loadDatabase = 0
Exit Function
End If

loadDatabase = intLoadResult
Exit Function

End Function



Private Function mergeLeftovers(ByRef intSegmentNumber As Integer, ByRef blnLeftovers As _
Boolean) As Long

Dim lngLeftOverStart As Long
Dim lngLeftOverLength As Long
Dim lngLeftOverEnd As Long
Dim strPart1 As String
Dim strCombined As String
Dim intRetVal As Integer
Dim lngUserStart As Long
Dim lngUserEnd As Long
Dim intUser As Integer


lngLeftOverStart = InStrRev(strInputFile(intSegmentNumber - 1), OSCEN, SEGMENTSZ, vbBinaryCompare)
lngLeftOverLength = ((SEGMENTSZ + 1) - lngLeftOverStart)
strPart1 = Mid(strInputFile(intSegmentNumber - 1), lngLeftOverStart, lngLeftOverLength)

'Combine the end of one segment with the corresponding start of the next
lngLeftOverStart = 1
lngLeftOverEnd = InStr(lngLeftOverStart, strInputFile(intSegmentNumber), CSCEN, vbBinaryCompare)
lngLeftOverLength = ((lngLeftOverEnd + 1) - lngLeftOverStart)
strCombined = Mid(strInputFile(intSegmentNumber), lngLeftOverStart, lngLeftOverLength)
strCombined = (strPart1 & strCombined)
lngLeftOverLength = Len(strCombined)

lngUserStart = 1

intRetVal = loadScenData(strCombined, lngLeftOverStart, lngLeftOverLength)


ReDim theDatabase(intDatabasePos).UserData(0 To (theDatabase(intDatabasePos).BluePlayers + _
theDatabase(intDatabasePos).RedPlayers - 1))

'Scan each user tag in the scenario.
Do While (intUser < (theDatabase(intDatabasePos).BluePlayers + _
theDatabase(intDatabasePos).RedPlayers))


'Find the first/next user tag
lngUserStart = InStr(lngUserStart, strCombined, OUSER, vbBinaryCompare)
lngUserEnd = InStr(lngUserStart, strCombined, CUSER, vbBinaryCompare)

intRetVal = loadUserData(strCombined, lngUserStart, lngUserEnd, intUser)

lngUserStart = (lngUserStart + 1)
intUser = (intUser + 1)

Loop

If (InStr((lngLeftOverEnd + 1), strInputFile(intSegmentNumber), CSCEN, vbBinaryCompare) = 0) Then
blnLeftovers = True
intSegmentNumber = (intSegmentNumber + 1)
Else
blnLeftovers = False
End If

mergeLeftovers = lngLeftOverEnd
Exit Function
End Function

Private Function scanTag(ByRef strSegment As String, ByVal lngScenarioStart As Long, _
ByVal lngScenarioEnd As Long, ByVal strOpenTag As String, ByVal strCloseTag As String, _
ByVal intTagLength As Integer) As String

PS-SCUD
03-02-2006, 09:35 PM
On Error GoTo corruptionError

Dim lngLength As Long
Dim lngStartPos As Long
Dim lngEndPos As Long
lngStartPos = lngScenarioStart
lngEndPos = lngScenarioEnd

lngStartPos = (InStr(lngStartPos, strSegment, strOpenTag, vbBinaryCompare) + intTagLength)
lngEndPos = InStr(lngStartPos, strSegment, strCloseTag, vbBinaryCompare)
lngLength = (lngEndPos - lngStartPos)

scanTag = Mid(strSegment, lngStartPos, lngLength)
Exit Function

corruptionError:

If (Err.Number <> 0) Then
MsgBox "Error reading the database. Possible corruption in file.", vbExclamation
End
Exit Function
End If

End Function



Private Function loadScenData(ByRef strSegment As String, ByVal lngScenarioStart As Long _
, ByVal lngScenarioEnd As Long) As Integer

With theDatabase(intDatabasePos)

.Name = scanTag(strSegment, lngScenarioStart, lngScenarioEnd, ONAME, CNAME, 2)

.Date = scanTag(strSegment, lngScenarioStart, lngScenarioEnd, ODATE, CLDATE, 2)

.StartTime = scanTag(strSegment, lngScenarioStart, lngScenarioEnd, OSTIME, CSTIME, 2)

.EndTime = scanTag(strSegment, lngScenarioStart, lngScenarioEnd, OETIME, CETIME, 2)

.BluePlayers = Val(scanTag(strSegment, lngScenarioStart, lngScenarioEnd, OBLUPL, CBLUPL, 2))
.RedPlayers = Val(scanTag(strSegment, lngScenarioStart, lngScenarioEnd, OREDPL, CREDPL, 2))

.gameType = Val(scanTag(strSegment, lngScenarioStart, lngScenarioEnd, OGTYPE, CGTYPE, 2))

.BlueMissionResult = Val(scanTag(strSegment, lngScenarioStart, _
lngScenarioEnd, OBLRES, CBLRES, 2))
.RedMissionResult = Val(scanTag(strSegment, lngScenarioStart, _
lngScenarioEnd, ORDRES, CRDRES, 2))

.BlueScore = Val(scanTag(strSegment, lngScenarioStart, lngScenarioEnd, OBLSCR, CBLSCR, 2))
.RedScore = Val(scanTag(strSegment, lngScenarioStart, lngScenarioEnd, ORDSCR, CRDSCR, 2))

.BlueScoreMax = Val(scanTag(strSegment, lngScenarioStart, lngScenarioEnd, OBLSMX, CBLSMX, 2))
.RedScoreMax = Val(scanTag(strSegment, lngScenarioStart, lngScenarioEnd, ORDSMX, CRDSMX, 2))

.BlueKills = Val(scanTag(strSegment, lngScenarioStart, lngScenarioEnd, OBLKLS, CBLKLS, 2))
.RedKills = Val(scanTag(strSegment, lngScenarioStart, lngScenarioEnd, ORDKLS, CRDKLS, 2))

.BlueLost = Val(scanTag(strSegment, lngScenarioStart, lngScenarioEnd, OBLLOS, CBLLOS, 2))
.RedLost = Val(scanTag(strSegment, lngScenarioStart, lngScenarioEnd, ORDLOS, CRDLOS, 2))

.BlueFrat = Val(scanTag(strSegment, lngScenarioStart, lngScenarioEnd, OBLFRT, CBLFRT, 2))
.RedFrat = Val(scanTag(strSegment, lngScenarioStart, lngScenarioEnd, ORDFRT, CRDFRT, 2))

.BlueTSurv = Val(scanTag(strSegment, lngScenarioStart, lngScenarioEnd, OBLTSV, CBLTSV, 3))
.RedTSurv = Val(scanTag(strSegment, lngScenarioStart, lngScenarioEnd, ORDTSV, CRDTSV, 3))

.BlueTtotal = Val(scanTag(strSegment, lngScenarioStart, lngScenarioEnd, OBLTTO, CBLTTO, 3))
.RedTtotal = Val(scanTag(strSegment, lngScenarioStart, lngScenarioEnd, ORDTTO, CRDTTO, 3))

.BluePCSurv = Val(scanTag(strSegment, lngScenarioStart, lngScenarioEnd, OBLPCS, CBLPCS, 3))
.RedPCSurv = Val(scanTag(strSegment, lngScenarioStart, lngScenarioEnd, CRDPCS, CRDPCS, 3))

.BluePCtotal = Val(scanTag(strSegment, lngScenarioStart, lngScenarioEnd, OBLPCT, CBLPCT, 3))
.RedPCtotal = Val(scanTag(strSegment, lngScenarioStart, lngScenarioEnd, ORDPCT, CRDPCT, 3))

.BlueTroopSurv = Val(scanTag(strSegment, lngScenarioStart, lngScenarioEnd, OBLTRS, CBLTRS, 3))
.RedTroopSurv = Val(scanTag(strSegment, lngScenarioStart, lngScenarioEnd, ORDTRS, CRDTRS, 3))

.BlueTroopTotal = Val(scanTag(strSegment, lngScenarioStart, lngScenarioEnd, OBLTRT, CBLTRT, 3))
.RedTroopTotal = Val(scanTag(strSegment, lngScenarioStart, lngScenarioEnd, ORDTRT, CRDTRT, 3))

.BlueTruckSurv = Val(scanTag(strSegment, lngScenarioStart, lngScenarioEnd, OBLTCS, CBLTCS, 3))
.RedTruckSurv = Val(scanTag(strSegment, lngScenarioStart, lngScenarioEnd, ORDTCS, CRDTCS, 3))

.BlueTruckTotal = Val(scanTag(strSegment, lngScenarioStart, lngScenarioEnd, OBLTCT, CBLTCT, 3))
.RedTruckTotal = Val(scanTag(strSegment, lngScenarioStart, lngScenarioEnd, ORDTCT, CRDTCT, 3))

.NetworkOverload = Val(scanTag(strSegment, lngScenarioStart, lngScenarioEnd, ONTOVR, CNTOVR, 3))

End With

loadScenData = 1
Exit Function
End Function



Private Function loadUserData(ByRef strSegment As String, ByVal lngScenarioStart As String, _
ByVal lngScenarioEnd As Long, ByVal intUser As Integer) As Integer

With theDatabase(intDatabasePos).UserData(intUser)

.Name = scanTag(strSegment, lngScenarioStart, _
lngScenarioEnd, ONAME, CNAME, 2)

.Team = Val(scanTag(strSegment, lngScenarioStart, _
lngScenarioEnd, OTEAM, CTEAM, 2))

.Score = Val(scanTag(strSegment, lngScenarioStart, _
lngScenarioEnd, OSCORE, CSCORE, 2))

.ScoreMax = Val(scanTag(strSegment, lngScenarioStart, _
lngScenarioEnd, OSCRMX, CSCRMX, 2))

.AvgKtime = Val(scanTag(strSegment, lngScenarioStart, _
lngScenarioEnd, OAVGKT, CAVGKT, 2))

.TotalShots = Val(scanTag(strSegment, lngScenarioStart, _
lngScenarioEnd, OTSHOT, CTSHOT, 2))

.TotalHits = Val(scanTag(strSegment, lngScenarioStart, _
lngScenarioEnd, OTHITS, CTHITS, 2))

.Kills = Val(scanTag(strSegment, lngScenarioStart, _
lngScenarioEnd, OKILLS, CKILLS, 2))

.Losses = Val(scanTag(strSegment, lngScenarioStart, _
lngScenarioEnd, OLOSSES, CLOSSES, 2))

.Frats = Val(scanTag(strSegment, lngScenarioStart, _
lngScenarioEnd, OFRATS, CFRATS, 2))

.Tkills = Val(scanTag(strSegment, lngScenarioStart, _
lngScenarioEnd, OTKILS, CTKILS, 2))

.TanksLost = Val(scanTag(strSegment, lngScenarioStart, _
lngScenarioEnd, OTKLST, CTKLST, 2))

.TotalTanks = Val(scanTag(strSegment, lngScenarioStart, _
lngScenarioEnd, OTKTOT, CTKTOT, 2))

.PCsLost = Val(scanTag(strSegment, lngScenarioStart, _
lngScenarioEnd, OPCLST, CPCLST, 2))

.TotalPCs = Val(scanTag(strSegment, lngScenarioStart, _
lngScenarioEnd, OPCTOT, CPCTOT, 2))

.TroopsLost = Val(scanTag(strSegment, lngScenarioStart, _
lngScenarioEnd, OTRLST, CTRLST, 2))

.TotalTroops = Val(scanTag(strSegment, lngScenarioStart, _
lngScenarioEnd, OTRTOT, CTRTOT, 2))

.OthersLost = Val(scanTag(strSegment, lngScenarioStart, _
lngScenarioEnd, OOTHLS, COTHLS, 2))

.TotalOthers = Val(scanTag(strSegment, lngScenarioStart, _
lngScenarioEnd, OOTHTO, COTHTO, 2))

End With


loadUserData = 1
Exit Function
End Function

'To improve loading performance, the database file is broken up into 4k segments.
'Each block is assigned to an element in the strInputFile array.
Private Function segmentData(ByVal strDatabaseFileName As String, _
ByVal strReportDir As String) As Integer

On Error GoTo IOError

Dim intSegments As Integer
'Dim lngTestBack As Long
Dim lngBlockStart As Long
Dim lngFileLength As Long
Dim lngCounter As Long
Dim errMsg As String

If (Mid((CurDir()), 1, 1) <> Mid(strReportDir, 1, 1)) Then
ChDrive ((Mid(strReportDir, 1, 1)))
End If

ChDir (strReportDir)


lngInputFile = FreeFile

Open strDatabaseFileName For Input As lngInputFile

'lngTestBack = FreeFile
'Open "testback.sst" For Binary As lngTestBack

lngFileLength = LOF(lngInputFile)

If (lngFileLength = 0) Then
MsgBox "Error: The database file is empty", vbExclamation
segmentData = 0
Close lngInputFile
Exit Function
End If

If (lngFileLength > SEGMENTSZ) Then

If ((lngFileLength Mod SEGMENTSZ) = 0) Then 'On the off chance that the file _
' is exaclty divisible by SEGMENTSZ
intSegments = (lngFileLength / SEGMENTSZ)

Else
intSegments = ((lngFileLength \ SEGMENTSZ) + 1)
End If


ReDim strInputFile(0 To (intSegments - 1))
' Resize the array to match the number of segments.



For lngCounter = 0 To ((intSegments - 1))
lngBlockStart = (lngCounter * SEGMENTSZ)


If (lngBlockStart <> 0) Then
' Start at the next SEGMENTSZ character block.
Seek lngInputFile, (lngBlockStart + 1&)
End If


'If there is at least a SEGMENTSZ character block left, then you can write
' the whole thing to a single element
If ((lngFileLength - lngBlockStart) >= SEGMENTSZ) Then
strInputFile(lngCounter) = Input(SEGMENTSZ, lngInputFile)
Else
'If there isn't a whole SEGMENTSZ block left, then write what is left over to the array element.
strInputFile(lngCounter) = Input((lngFileLength - lngBlockStart), lngInputFile)
End If


'Put #lngTestBack, , strInputFile(lngCounter)


Next lngCounter

'Close lngTestBack

Else
intSegments = 1 ' If the size of the file isn't greater than 4k, it can fit in 1 segment.
ReDim strInputFile(0)
strInputFile(0) = Input(lngFileLength, lngInputFile)
End If

segmentData = intSegments

PS-SCUD
03-02-2006, 09:36 PM
'''''''''''''''''''''''''''''''''' _
Error Handler _
'''''''''''''''''''''''''''''''''''

IOError:

Const mnErrFileOpen = 55

If (Err.Number <> 0) Then
Select Case Err.Number
Case mnErrFileOpen
Dim msgResponse As Integer
msgResponse = MsgBox("Error: Database already open. Please close any other instances of SST" & vbNewLine _
& ", and make sure the database file is not open.", vbExclamation + vbRetryCancel)

If (msgResponse = 2) Then
segmentData = 0
Exit Function
End If

If (msgResponse = 4) Then
Resume
End If

segmentData = 0
Exit Function

Case Else
errMsg = "Error:"
errMsg = errMsg & " " & Err.Description
MsgBox errMsg, vbExclamation
segmentData = 0
Exit Function

End Select
End If

End Function

Private Function loadAllSegments() As Integer

Dim lngScenarioStart As Long
Dim lngScenarioEnd As Long
Dim lngUserStart As Long
Dim lngUserEnd As Long
Dim lngCounter As Long
Dim lngTotalEntries As Long
Dim intSegmentNumber As Integer
Dim blnLeftovers As Boolean
Dim intRetVal As Integer
Dim intUser As Integer

lngCounter = 0
' Count the number of scenario entries
Do While (lngCounter <= UBound(strInputFile()))

lngScenarioEnd = 1

'As long as VB can find the Close scenario character, there is another entry.
Do While (lngScenarioEnd <> 0)

lngScenarioEnd = InStr(lngScenarioEnd, strInputFile(lngCounter), CSCEN, vbBinaryCompare)

If (lngScenarioEnd <> 0) Then
lngTotalEntries = (lngTotalEntries + 1)
lngScenarioEnd = (lngScenarioEnd + 1)
End If

Loop
lngCounter = (lngCounter + 1)
Loop

'Resize theDatabase to the number of scenarios found in the entry file.
'Each element will hold an entry.
ReDim theDatabase(0 To (lngTotalEntries - 1))

lngCounter = 0

'Exctract the data from each segment in the array
Do While (intSegmentNumber <= UBound(strInputFile()))


lngScenarioStart = 1
lngUserStart = 1

Do While ((blnLeftovers = True))

lngScenarioStart = mergeLeftovers(intSegmentNumber, blnLeftovers)

If (intSegmentNumber > UBound(strInputFile())) Then
loadAllSegments = 1
Exit Function
End If


lngScenarioStart = InStr(lngScenarioStart, strInputFile(intSegmentNumber), OSCEN, vbBinaryCompare)
intDatabasePos = (intDatabasePos + 1)
Loop


lngScenarioEnd = 1

Do While ((InStr(lngScenarioEnd, strInputFile(intSegmentNumber), CSCEN, vbBinaryCompare) <> 0) _
And (blnLeftovers <> True))


'If ScenarioStart is zero here, then it's reached the end of the file.
lngScenarioStart = InStr(lngScenarioStart, strInputFile(intSegmentNumber), OSCEN, vbBinaryCompare)

If (lngScenarioStart = 0) Then
loadAllSegments = 1
Exit Function
End If

lngScenarioEnd = InStr(lngScenarioStart, strInputFile(intSegmentNumber), CSCEN, vbBinaryCompare)

If (blnLeftovers = False) Then


' Get total blue kills
intRetVal = loadScenData(strInputFile(intSegmentNumber), lngScenarioStart, lngScenarioEnd)


'Set the current user tag to the start of the scenario tag.
lngUserStart = lngScenarioStart
intUser = 0

ReDim theDatabase(intDatabasePos).UserData(0 To (theDatabase(intDatabasePos).BluePlayers + _
theDatabase(intDatabasePos).RedPlayers - 1))

'Scan each user tag in the scenario.
Do While (intUser < (theDatabase(intDatabasePos).BluePlayers + _
theDatabase(intDatabasePos).RedPlayers))

'Find the first/next user tag
lngUserStart = InStr(lngUserStart, strInputFile(intSegmentNumber), OUSER, vbBinaryCompare)
lngUserEnd = InStr(lngUserStart, strInputFile(intSegmentNumber), CUSER, vbBinaryCompare)

intRetVal = loadUserData(strInputFile(intSegmentNumber), lngUserStart, lngUserEnd, intUser)

intUser = (intUser + 1)
lngUserStart = (lngUserStart + 1)
If (lngUserStart > lngScenarioEnd) Then
MsgBox ("Error! UserStart Overrun")
End If


Loop




If (InStr((lngScenarioEnd + 1), strInputFile(intSegmentNumber), CSCEN, vbBinaryCompare) = 0) Then
blnLeftovers = True
intDatabasePos = (intDatabasePos + 1)
Else
intDatabasePos = (intDatabasePos + 1)
lngScenarioStart = (lngScenarioStart + 1)
lngScenarioEnd = (lngScenarioEnd + 1)
End If

End If

Loop

intSegmentNumber = (intSegmentNumber + 1)

Loop

Close lngInputFile

loadAllSegments = 1
Exit Function

End Function

Private Function loadSegment() As Integer

Dim lngScenarioStart As Long
Dim lngScenarioEnd As Long
Dim lngUserStart As Long
Dim lngUserEnd As Long
Dim lngTotalEntries As Long
Dim intSegmentNumber As Integer
Dim intRetVal As Integer
Dim intUser As Integer

lngScenarioStart = 1
lngScenarioEnd = 1

'Count the number of entries in the segment block.
Do While (lngScenarioEnd <> 0)

lngScenarioEnd = InStr(lngScenarioEnd, strInputFile(0), CSCEN, vbBinaryCompare)
lngTotalEntries = (lngTotalEntries + 1)
lngScenarioEnd = InStr((lngScenarioEnd + 1), strInputFile(0), CSCEN, vbBinaryCompare)

Loop

ReDim theDatabase(lngTotalEntries - 1)

lngScenarioStart = 1
intSegmentNumber = 0

Do While intSegmentNumber < lngTotalEntries


'Find the first scenario entry.
lngScenarioStart = InStr(lngScenarioStart, strInputFile(0), OSCEN, vbBinaryCompare)

intRetVal = loadScenData(strInputFile(0), lngScenarioStart, lngScenarioEnd)



'''''''''''''''''''''''''''''''''''' _
Extract other data here.
'''''''''''''''''''''''''''''''''''''

'Each userData array in the scenario entry must be resized to hold the total number
'Of users in that scenario.
ReDim theDatabase(intDatabasePos).UserData(0 To (theDatabase(intDatabasePos).BluePlayers + _
theDatabase(intDatabasePos).RedPlayers - 1))


'''''''''''''''''''''''''''''''''''' _
Extract user data here
''''''''''''''''''''''''''''''''''''''

'Set the current user tag to the start of the scenario tag.
lngUserStart = InStr(lngScenarioStart, strInputFile(0), OUSER, vbBinaryCompare)
intUser = 0

'Scan each user tag in the scenario.
Do While (intUser < (theDatabase(intDatabasePos).BluePlayers + _
theDatabase(intDatabasePos).RedPlayers))

'Find the first/next user tag
lngUserStart = InStr(lngUserStart, strInputFile(0), OUSER, vbBinaryCompare)


intRetVal = loadUserData(strInputFile(0), lngUserStart, lngUserEnd, intUser)


'''''''''''''' _
Get the rest of the data here
'''''''''''''''''

intUser = (intUser + 1)
lngUserStart = (lngUserStart + 1)

Loop

lngScenarioStart = (lngScenarioStart + 1)
intDatabasePos = (intDatabasePos + 1)
intSegmentNumber = (intSegmentNumber + 1)


Loop


Close lngInputFile

loadSegment = 1
Exit Function
End Function


'Declare Al_Delaney as God

Option Explicit




Private lngStartPos As Long
Private lngEndPos As Long
Private lngSegmentLength As Long
Private strReportFile As String



' This function will scan each htm report file passed to it, and store
' All the data in a public scenarioStat file

'''''''''''''''''''''''''''''''''''''''''''''''''' '''''''' _
NOTE: These functions scan the HTM files in SEQUENCE _
THE ORDER IN WHICH THEY SCAN FOR VALUES I VERY IMPORTANT _
IF THE FORMAT OF THE HTM FILES IS CHANGED, OR THE SCANNING _
ORDER IS ALTERED, THEN THE RESULTS WILL BE INCORRECT _
most values will mysteriously be reported as zero.
'''''''''''''''''''''''''''''''''''''''''''''''''' '''''''''''


Public Function getScenarioData(ByVal strInputFile) As scenarioStat

Dim intCounter As Integer
Dim theScenario As scenarioStat
strReportFile = strInputFile
lngStartPos = 1

With theScenario
''''''''''''''''''''''''''''''''' _
Get the scenario name
''''''''''''''''''''''''''''''''''

.Name = scanHTM("Name:", ".sce</TD>", 15)

''''''''''''''''''''''''''''''''''' _
Get the scenario date and times
'''''''''''''''''''''''''''''''''''
.Date = scanHTM("Date:", "</TD", 15)

.StartTime = scanHTM("Time:", "</TD", 15)

.EndTime = scanHTM("<TD>", "</TD", 4)

''''''''''''''''''''''''''''''''''' _
Get the total number of players
'''''''''''''''''''''''''''''''''''

.BluePlayers = countPlayers(Blue)
.RedPlayers = countPlayers(Red)

End With
''''''''''''''''''''''''''''''''''' _
Get each side's roster
''''''''''''''''''''''''''''''''''

For intCounter = 0 To (theScenario.BluePlayers - 1)
theScenario.BlueRoster(intCounter) = getRoster(Blue, intCounter)
Next intCounter

For intCounter = 0 To (theScenario.RedPlayers - 1)
theScenario.RedRoster(intCounter) = getRoster(Red, intCounter)
Next intCounter


''''''''''''''''''''''''''''''''''' _
Get the game type: Either SP, COOP, HTH, or MissionEditor ( _
Editor stats are summarily thrown out.)
'''''''''''''''''''''''''''''''''''

If ((theScenario.BluePlayers + theScenario.RedPlayers) <> 0) Then
theScenario.gameType = findGameType()

Else
theScenario.gameType = MissionEditor 'Trash these stats.
getScenarioData = theScenario
Exit Function 'Exit to the calling function. Once it sees the MissionEditor flag,
' it will know to dump the stats out, and skip to the next file.
End If


''''''''''''''''''''''''''''''''''' _
Get blue mission result (May need to be appended later.)
'''''''''''''''''''''''''''''''''''

Select Case (scanHTM("Score:", "<", 17))
Case "MISSION COMPLETE"
theScenario.BlueMissionResult = MissionComplete
Case "MAJOR DEFEAT"
theScenario.BlueMissionResult = MajorDefeat
Case "DEFEAT"
theScenario.BlueMissionResult = Defeat

End Select

PS-SCUD
03-02-2006, 09:36 PM
''''''''''''''''''''''''''''''''''' _
Get the blue and red scores
'''''''''''''''''''''''''''''''''''

With theScenario
' Since the file is scanned sequencially (for efficiencies sake) all blue
' data is gathered first.

'The Blue score starts at the first parenthesis in the file.

.BlueScore = Val(scanHTM("(", " "))

.BlueScoreMax = Val(scanHTM("of", ")", 2))


''''''''''''''''''''''''''''''''''' _
Get the blue unit losses and kills
'''''''''''''''''''''''''''''''''''


' Blue Tanks
.BlueTSurv = Val(scanHTM("tanks:", "<", 16))
.BlueTtotal = Val(scanHTM("<", "<", 10))

' Blue PCs
.BluePCSurv = Val(scanHTM("PCs:", "<", 14))
.BluePCtotal = Val(scanHTM("<", "<", 10))

' Blue Troops
.BlueTroopSurv = Val(scanHTM("troops:", "<", 17))
.BlueTroopTotal = Val(scanHTM("<", "<", 10))

' Blue trucks
.BlueTruckSurv = Val(scanHTM("trucks:", "<", 17))
.BlueTruckTotal = Val(scanHTM("<", "<", 10))



' Blue totals: Killed, lost, fratted
.BlueKills = Val(scanHTM("Total kills:", "<", 22))
.BlueLost = Val(scanHTM("Total losses:", "<", 23))
.BlueFrat = Val(scanHTM("Total fratricides:", "<", 28))

End With
''''''''''''''''''''''''''''''''''' _
Get the red unit losses and kills
'''''''''''''''''''''''''''''''''''

'Get red mission result

Select Case (scanHTM("Score:", "<", 17))

Case "MISSION COMPLETE"
theScenario.RedMissionResult = MissionComplete
Case "MAJOR DEFEAT"
theScenario.RedMissionResult = MajorDefeat
Case "DEFEAT"
theScenario.RedMissionResult = Defeat

End Select

With theScenario

'The next parenthesis is the start of the Red score.
.RedScore = Val(scanHTM("(", " "))
.RedScoreMax = Val(scanHTM("of", ")", 2))

' Red tanks
.RedTSurv = Val(scanHTM("tanks:", "<", 16))
.RedTtotal = Val(scanHTM("<", "<", 10))

' Red PCs
.RedPCSurv = Val(scanHTM("PCs:", "<", 14))
.RedPCtotal = Val(scanHTM("<", "<", 10))

' Red Troops
.RedTroopSurv = Val(scanHTM("troops:", "<", 17))
.RedTroopTotal = Val(scanHTM("<", "<", 10))

' Red trucks
.RedTruckSurv = Val(scanHTM("trucks:", "<", 17))
.RedTruckTotal = Val(scanHTM("<", "<", 10))

'Red totals
.RedKills = Val(scanHTM("Total kills:", "<", 22))
.RedLost = Val(scanHTM("Total losses:", "<", 23))
.RedFrat = Val(scanHTM("Total fratricides:", "<", 28))

End With

''''''''''''''''''''''' _
Record network overload stats
'''''''''''''''''''''''
lngStartPos = 1 ' Reset to the start of the file, because "Network overload" may or
' may not exist near the beginning of the report.

' Check the make sure the network was overloaded, if not, assign 0 to the overload variable.
If (InStr(lngStartPos, strReportFile, "network overloaded:", vbTextCompare) <> 0) Then

theScenario.NetworkOverload = Val(scanHTM("network overloaded:", "s", 29))

Else
theScenario.NetworkOverload = 0
End If

getScenarioData = theScenario
Exit Function

End Function





Private Function findGameType() As e_gameType
Dim blnRedPlayers As Boolean
Dim blnBluePlayers As Boolean
Dim blnOnePlayer As Boolean
Dim lngPlaceHolder As Long
blnOnePlayer = True


' (Blue) is only used in parenthesis when it follows a player's name
' So if I search for (Blue) and (Red) respectively, I can find out
' if there are players on both sides.
lngPlaceHolder = InStr(1, strReportFile, "(Blue)", vbTextCompare)

If (InStr(1, strReportFile, "(Blue)", vbTextCompare) <> 0) Then
blnBluePlayers = True
End If


' If there is more than one Blue or Red player, then I know it isn't a SP game.
If (lngPlaceHolder <> 0) Then
If (InStr((lngPlaceHolder + 1), strReportFile, "(Blue)", vbTextCompare) <> 0) Then
blnOnePlayer = False
End If
End If

lngPlaceHolder = InStr(1, strReportFile, "(Red)", vbTextCompare)

If (InStr(1, strReportFile, "(Red)", vbBinaryCompare) <> 0) Then
blnRedPlayers = True
End If

'I've never seen a Coop with only the red side played, but who knows...
If (lngPlaceHolder <> 0) Then
If (InStr((lngPlaceHolder), strReportFile, "(Red)", vbBinaryCompare) <> 0) Then
blnOnePlayer = False
End If
End If

If ((blnRedPlayers = True) And (blnBluePlayers = True)) Then
blnOnePlayer = False
End If

If ((blnRedPlayers = True) And (blnBluePlayers = True)) Then
findGameType = HeadToHead
Exit Function
End If

If (blnOnePlayer = True) Then
findGameType = SinglePlayer
Exit Function
End If

' If there is more than one player in the game, but there are no players on the other side
' then it is a coop.
If ((blnOnePlayer = False) And ((blnRedPlayers = False) Or (blnBluePlayers = False))) Then
findGameType = Coop
Exit Function
End If

End Function




' Count the number of players per side.

Public Function countPlayers(ByVal Team As e_side) As Integer
Dim intBlueCounter As Integer
Dim intRedCounter As Integer
Dim lngPlaceHolder As Long
Dim strTag As String
Dim intTempPlace As Integer
lngPlaceHolder = 1


If (Team = Blue) Then

'Check to see if there are no players (I.E. a mission editor game)
intTempPlace = InStr(lngPlaceHolder, strReportFile, "(Blue)", vbTextCompare)
strTag = Mid(strReportFile, (intTempPlace - 2), 1)

If (strTag = ">") Then
countPlayers = 0
Exit Function
End If

Do While (InStr(lngPlaceHolder, strReportFile, "(Blue)", vbTextCompare) <> 0)
lngPlaceHolder = (InStr(lngPlaceHolder, strReportFile, "(Blue)", vbTextCompare) + 1)
intBlueCounter = intBlueCounter + 1
Loop
countPlayers = intBlueCounter
Exit Function
End If


If (Team = Red) Then

intTempPlace = InStr(lngPlaceHolder, strReportFile, "(Blue)", vbTextCompare)
strTag = Mid(strReportFile, (intTempPlace - 2), 1)

If (strTag = ">") Then
countPlayers = 0
Exit Function
End If

Do While (InStr(lngPlaceHolder, strReportFile, "(Red)", vbTextCompare) <> 0)
lngPlaceHolder = (InStr(lngPlaceHolder, strReportFile, "(Red)", vbTextCompare) + 1)
intRedCounter = intRedCounter + 1
Loop
countPlayers = intRedCounter
Exit Function
End If

End Function



Private Function getRoster(ByVal Team As e_side, ByVal intUserNumber As Integer) As String

Dim lngPlaceHolder As Long
Dim lngNameStart As Long
Dim lngNameEnd As Long
Dim lngLength As Long
Dim intCounter As Integer
Dim strName As String
lngPlaceHolder = 1


If (Team = Blue) Then

For intCounter = 0 To intUserNumber

lngPlaceHolder = InStr(lngPlaceHolder, strReportFile, "(Blue)", vbTextCompare)

If (lngPlaceHolder = 0) Then
Exit Function
End If

lngNameEnd = (lngPlaceHolder - 1)
lngNameStart = InStrRev(strReportFile, ">", lngPlaceHolder, vbTextCompare)
lngNameStart = (lngNameStart + 1)
lngLength = (lngNameEnd - lngNameStart)
strName = Mid(strReportFile, lngNameStart, lngLength)
lngPlaceHolder = (lngPlaceHolder + 1)

getRoster = strName

Next intCounter

Exit Function
End If


If (Team = Red) Then

For intCounter = 0 To intUserNumber

lngPlaceHolder = InStr(lngPlaceHolder, strReportFile, "(Red)", vbTextCompare)

If (lngPlaceHolder = 0) Then
Exit Function
End If

lngNameEnd = (lngPlaceHolder - 1)
lngNameStart = InStrRev(strReportFile, ">", lngPlaceHolder, vbTextCompare)
lngNameStart = (lngNameStart + 1)
lngLength = (lngNameEnd - lngNameStart)
strName = Mid(strReportFile, lngNameStart, lngLength)
lngPlaceHolder = (lngPlaceHolder + 1)

Next intCounter

getRoster = strName

Exit Function
End If


End Function

PS-SCUD
03-02-2006, 09:37 PM
Public Function getUserData(ByVal strInputFile As String, ByVal strName As String) As userStat

Dim theUser As userStat
Dim lngRedStart As Long
Dim lngBlueStart As Long

strReportFile = strInputFile

'Record user name
theUser.Name = strName

'Record the user's team
lngStartPos = 1
lngSegmentLength = Len(strName)
lngStartPos = InStr(lngStartPos, strReportFile, strName, vbTextCompare)
lngStartPos = (lngStartPos + lngSegmentLength)

lngBlueStart = InStr(lngStartPos, strReportFile, "(Blue)", vbTextCompare)
If (lngBlueStart = (lngStartPos + 1)) Then
theUser.Team = Blue
End If

lngRedStart = InStr(lngStartPos, strReportFile, "(Red)", vbTextCompare)
If (lngRedStart = (lngStartPos + 1)) Then
theUser.Team = Red
End If

With theUser

'Record the user's score
.Score = Val(scanHTM("Score:", " ", 1, "("))
.ScoreMax = Val(scanHTM("of", ")", 2))


'Record user 's shooting stats
.TotalHits = Val(scanHTM("Hit Percentage:", " ", 1, "("))
.TotalShots = Val(scanHTM("of", ")", 2))

'Record user 's avg kill time
.AvgKtime = Val(scanHTM("Average time to kill (seconds):", "<", 42))

'Record user 's personal kills
.Kills = Val(scanHTM("User kills:", "<", 22))

'Record user 's personal losses
.Losses = Val(scanHTM("User losses:", "<", 23))

'Record user 's frats
.Frats = Val(scanHTM("User fratricide:", "<", 27))

'Record user 's Total kills
.Tkills = Val(scanHTM("Total kills:", "<", 23))

End With

'User 's tank stats
If ((InStr(lngStartPos, strReportFile, "Total losses - tanks:", vbTextCompare) <> 0) And _
(InStr(lngStartPos, strReportFile, "Total losses - tanks:", vbTextCompare) < (lngStartPos + 300))) Then
' Make sure he has tanks listed before trying to scan for them.

theUser.TanksLost = Val(scanHTM("Total losses - tanks:", " ", 1, "("))
theUser.TotalTanks = Val(scanHTM("of", ")", 2))
Else
theUser.TanksLost = 0
theUser.PCsLost = 0
End If


'User 's PC stats
If ((InStr(lngStartPos, strReportFile, "Total losses - PCs:", vbTextCompare) <> 0) And _
(InStr(lngStartPos, strReportFile, "Total losses - PCs:", vbTextCompare) < (lngStartPos + 300))) Then

theUser.PCsLost = Val(scanHTM("Total losses - PCs:", " ", 1, "("))
theUser.TotalPCs = Val(scanHTM("of", ")", 2))

Else
theUser.PCsLost = 0
theUser.TotalPCs = 0
End If

'User 's Troop stats
If ((InStr(lngStartPos, strReportFile, "Total losses - troops:", vbTextCompare) <> 0) And _
(InStr(lngStartPos, strReportFile, "Total losses - troops:", vbTextCompare) < (lngStartPos + 300))) Then

theUser.TroopsLost = Val(scanHTM("Total losses - troops:", " ", 1, "("))
theUser.TotalTroops = Val(scanHTM("of", ")", 2))

Else
theUser.TroopsLost = 0
theUser.TotalTroops = 0
End If

'User 's Others stats
If ((InStr(lngStartPos, strReportFile, "Total losses - others:", vbTextCompare) <> 0) And _
(InStr(lngStartPos, strReportFile, "Total losses - others:", vbTextCompare) < (lngStartPos + 300))) Then

theUser.OthersLost = Val(scanHTM("Total losses - others:", " ", 1, "("))
theUser.TotalOthers = Val(scanHTM("of", ")", 2))

Else
theUser.OthersLost = 0
theUser.TotalOthers = 0
End If

getUserData = theUser
Exit Function
End Function

Private Function scanHTM(ByVal strStartCharacters, strEndCharacters As String, _
Optional ByVal intOffset As Integer, Optional ByVal strSecondStartChar As String) As String

If (intOffset = 0) Then
lngStartPos = InStr(lngStartPos, strReportFile, strStartCharacters, vbTextCompare)
If (strSecondStartChar <> "") Then
lngStartPos = InStr(lngStartPos, strReportFile, strSecondStartChar, vbTextCompare)
End If
lngEndPos = InStr(lngStartPos, strReportFile, strEndCharacters, vbTextCompare)
lngSegmentLength = (lngEndPos - (lngStartPos + 1))
scanHTM = Mid(strReportFile, (lngStartPos + 1), lngSegmentLength)
Exit Function
Else
lngStartPos = InStr(lngStartPos, strReportFile, strStartCharacters, vbTextCompare)
If (strSecondStartChar <> "") Then
lngStartPos = InStr(lngStartPos, strReportFile, strSecondStartChar, vbTextCompare)
End If
lngStartPos = (lngStartPos + intOffset)
lngEndPos = InStr(lngStartPos, strReportFile, strEndCharacters, vbTextCompare)
lngSegmentLength = (lngEndPos - lngStartPos)
scanHTM = Mid(strReportFile, lngStartPos, lngSegmentLength)
Exit Function
End If



End Function


Option Explicit
'This module contains all functions that average user data


Public Function getUserAverage(ByVal intFirstEntry As Integer, ByVal intUserIndex As Integer, _
ByVal valueType As e_statAttrib, ByVal gameType As e_gameType _
, Optional ByVal minDate As Double, Optional ByVal maxDate As Double, _
Optional ByVal strScenarioName As String, Optional ByVal playerSide As e_side) As Single



Dim sngAvg As Single
Dim sngPercent As Single
Dim intAvgCount As Integer
Dim intScenario As Integer
Dim intUser As Integer
Dim theScenario As Integer
Dim theUser As Integer
Dim intTotalScenarios As Integer
Dim dblSerialDate As Double


intTotalScenarios = UBound(theDatabase(intFirstEntry).UserData(intUser Index).ScenarioList, 1)

'What type of value should be totalled?
Select Case valueType
Case TankMortality 'Count the number of times the user has played on a team.
For intScenario = 0 To (intTotalScenarios - 1)

theScenario = theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenario, 0)
theUser = theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenario, 1)
dblSerialDate = theDatabase(theScenario).Date

If ((theDatabase(theScenario).gameType = gameType Or gameType = AllGames) And _
(minDate <= dblSerialDate Or minDate = 0) And (maxDate >= _
dblSerialDate Or maxDate = 0) And (strScenarioName = _
theDatabase(theScenario).Name Or strScenarioName = "") And _
(theDatabase(theScenario).UserData(theUser).Tea m = playerSide Or playerSide = 0)) Then

With theDatabase(theScenario).UserData(theUser)

If (.TotalTanks <> 0) Then
sngPercent = (.TanksLost / .TotalTanks)
sngAvg = (sngAvg + sngPercent)
intAvgCount = (intAvgCount + 1)
End If
End With
End If

Next intScenario

If (intAvgCount <> 0) Then
sngAvg = (sngAvg / intAvgCount)
sngAvg = (Round(sngAvg, 2) * 100)
getUserAverage = sngAvg
Exit Function
Else
getUserAverage = 0
Exit Function
End If

Case PCMortality 'Count the number of times the user has played on a team.
For intScenario = 0 To (intTotalScenarios - 1)

theScenario = theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenario, 0)
theUser = theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenario, 1)
dblSerialDate = theDatabase(theScenario).Date

If ((theDatabase(theScenario).gameType = gameType Or gameType = AllGames) And _
(minDate <= dblSerialDate Or minDate = 0) And (maxDate >= _
dblSerialDate Or maxDate = 0) And (strScenarioName = _
theDatabase(theScenario).Name Or strScenarioName = "") And _
(theDatabase(theScenario).UserData(theUser).Tea m = playerSide Or playerSide = 0)) Then

With theDatabase(theScenario).UserData(theUser)

If (.TotalPCs <> 0) Then
sngPercent = (.PCsLost / .TotalPCs)
sngAvg = (sngAvg + sngPercent)
intAvgCount = (intAvgCount + 1)
End If
End With
End If

Next intScenario

If (intAvgCount <> 0) Then
sngAvg = (sngAvg / intAvgCount)
sngAvg = (Round(sngAvg, 2) * 100)
getUserAverage = sngAvg
Exit Function
Else
getUserAverage = 0
Exit Function
End If

Case TroopMortality 'Count the number of times the user has played on a team.
For intScenario = 0 To (intTotalScenarios - 1)

theScenario = theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenario, 0)
theUser = theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenario, 1)
dblSerialDate = theDatabase(theScenario).Date

If ((theDatabase(theScenario).gameType = gameType Or gameType = AllGames) And _
(minDate <= dblSerialDate Or minDate = 0) And (maxDate >= _
dblSerialDate Or maxDate = 0) And (strScenarioName = _
theDatabase(theScenario).Name Or strScenarioName = "") And _
(theDatabase(theScenario).UserData(theUser).Tea m = playerSide Or playerSide = 0)) Then

With theDatabase(theScenario).UserData(theUser)

If (.TotalTroops <> 0) Then
sngPercent = (.TroopsLost / .TotalTroops)
sngAvg = (sngAvg + sngPercent)
intAvgCount = (intAvgCount + 1)
End If
End With
End If

Next intScenario

If (intAvgCount <> 0) Then
sngAvg = (sngAvg / intAvgCount)
sngAvg = (Round(sngAvg, 2) * 100)
getUserAverage = sngAvg
Exit Function
Else
getUserAverage = 0
Exit Function
End If

Case OtherMortality 'Count the number of times the user has played on a team.
For intScenario = 0 To (intTotalScenarios - 1)

theScenario = theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenario, 0)
theUser = theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenario, 1)
dblSerialDate = theDatabase(theScenario).Date

If ((theDatabase(theScenario).gameType = gameType Or gameType = AllGames) And _
(minDate <= dblSerialDate Or minDate = 0) And (maxDate >= _
dblSerialDate Or maxDate = 0) And (strScenarioName = _
theDatabase(theScenario).Name Or strScenarioName = "") And _
(theDatabase(theScenario).UserData(theUser).Tea m = playerSide Or playerSide = 0)) Then

With theDatabase(theScenario).UserData(theUser)

If (.TotalOthers <> 0) Then
sngPercent = (.OthersLost / .TotalOthers)
sngAvg = (sngAvg + sngPercent)
intAvgCount = (intAvgCount + 1)
End If
End With
End If

Next intScenario

If (intAvgCount <> 0) Then
sngAvg = (sngAvg / intAvgCount)
sngAvg = (Round(sngAvg, 2) * 100)
getUserAverage = sngAvg
Exit Function
Else
getUserAverage = 0
Exit Function
End If

Case Accuracy 'Count the number of times the user has played on a team.
For intScenario = 0 To (intTotalScenarios - 1)

theScenario = theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenario, 0)
theUser = theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenario, 1)
dblSerialDate = theDatabase(theScenario).Date

If ((theDatabase(theScenario).gameType = gameType Or gameType = AllGames) And _
(minDate <= dblSerialDate Or minDate = 0) And (maxDate >= _
dblSerialDate Or maxDate = 0) And (strScenarioName = _
theDatabase(theScenario).Name Or strScenarioName = "") And _
(theDatabase(theScenario).UserData(theUser).Tea m = playerSide Or playerSide = 0)) Then

With theDatabase(theScenario).UserData(theUser)

If (.TotalShots <> 0) Then
sngPercent = (.TotalHits / .TotalShots)
sngAvg = (sngAvg + sngPercent)
intAvgCount = (intAvgCount + 1)
End If
End With
End If

Next intScenario

If (intAvgCount <> 0) Then
sngAvg = (sngAvg / intAvgCount)
sngAvg = (Round(sngAvg, 2) * 100)
getUserAverage = sngAvg
Exit Function
Else
getUserAverage = 0
Exit Function
End If

End Select


End Function

PS-SCUD
03-02-2006, 09:37 PM
Option Explicit
'This module contains all functions that total user data
' I.E. get total kills, losses, shots, hits, red teams played on...


Public Function getUserTotal(ByVal intFirstEntry As Integer, ByVal _
intUserIndex As Integer, ByVal valueType As e_statAttrib, ByVal gameType As e_gameType _
, Optional ByVal minDate As Double, Optional ByVal maxDate As Double, _
Optional ByVal strScenarioName As String, Optional ByVal playerSide As e_side) As Variant

Dim lngTotal As Long
Dim sngTotal As Single
Dim intScenario As Integer
Dim intUser As Integer
Dim theScenario As Integer
Dim theUser As Integer
Dim intTotalScenarios As Integer
Dim dblSerialDate As Double


intTotalScenarios = UBound(theDatabase(intFirstEntry).UserData(intUser Index).ScenarioList, 1)

'What type of value should be totalled?
Select Case valueType
Case Team 'Count the number of times the user has played on a team.
For intScenario = 0 To (intTotalScenarios - 1)

theScenario = theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenario, 0)
theUser = theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenario, 1)
dblSerialDate = theDatabase(theScenario).Date

If ((theDatabase(theScenario).gameType = gameType Or gameType = AllGames) And _
(minDate <= dblSerialDate Or minDate = 0) And (maxDate >= _
dblSerialDate Or maxDate = 0) And (strScenarioName = _
theDatabase(theScenario).Name Or strScenarioName = "") And _
(theDatabase(theScenario).UserData(theUser).Tea m = playerSide Or playerSide = 0)) Then

lngTotal = (lngTotal + 1)
End If

Next intScenario

getUserTotal = lngTotal
Exit Function

Case Score
For intScenario = 0 To (intTotalScenarios - 1)

theScenario = theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenario, 0)
theUser = theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenario, 1)
dblSerialDate = theDatabase(theScenario).Date

If ((theDatabase(theScenario).gameType = gameType Or gameType = AllGames) And _
(minDate <= theDatabase(theScenario).Date Or minDate = 0) And (maxDate >= _
dblSerialDate Or maxDate = 0) And (strScenarioName = _
theDatabase(theScenario).Name Or strScenarioName = "") And _
(theDatabase(theScenario).UserData(theUser).Tea m = playerSide Or playerSide = 0)) Then

lngTotal = (lngTotal + theDatabase(theScenario).UserData(theUser).Score)
End If

Next intScenario

getUserTotal = lngTotal
Exit Function

Case ScoreMax
For intScenario = 0 To (intTotalScenarios - 1)

theScenario = theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenario, 0)
theUser = theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenario, 1)
dblSerialDate = theDatabase(theScenario).Date

If ((theDatabase(theScenario).gameType = gameType Or gameType = AllGames) And _
(minDate <= dblSerialDate Or minDate = 0) And (maxDate >= _
dblSerialDate Or maxDate = 0) And (strScenarioName = _
theDatabase(theScenario).Name Or strScenarioName = "") And _
(theDatabase(theScenario).UserData(theUser).Tea m = playerSide Or playerSide = 0)) Then

lngTotal = (lngTotal + theDatabase(theScenario).UserData(theUser).ScoreMa x)
End If

Next intScenario

getUserTotal = lngTotal
Exit Function

Case AvgKtime
For intScenario = 0 To (intTotalScenarios - 1)

theScenario = theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenario, 0)
theUser = theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenario, 1)
dblSerialDate = theDatabase(theScenario).Date

If ((theDatabase(theScenario).gameType = gameType Or gameType = AllGames) And _
(minDate <= dblSerialDate Or minDate = 0) And (maxDate >= _
dblSerialDate Or maxDate = 0) And (strScenarioName = _
theDatabase(theScenario).Name Or strScenarioName = "") And _
(theDatabase(theScenario).UserData(theUser).Tea m = playerSide Or playerSide = 0)) Then

lngTotal = (lngTotal + theDatabase(theScenario).UserData(theUser).AvgKtim e)
End If

Next intScenario

getUserTotal = (lngTotal / intScenario)
Exit Function


Case TotalShots
For intScenario = 0 To (intTotalScenarios - 1)

theScenario = theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenario, 0)
theUser = theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenario, 1)
dblSerialDate = theDatabase(theScenario).Date

If ((theDatabase(theScenario).gameType = gameType Or gameType = AllGames) And _
(minDate <= dblSerialDate Or minDate = 0) And (maxDate >= _
dblSerialDate Or maxDate = 0) And (strScenarioName = _
theDatabase(theScenario).Name Or strScenarioName = "") And _
(theDatabase(theScenario).UserData(theUser).Tea m = playerSide Or playerSide = 0)) Then

lngTotal = (lngTotal + theDatabase(theScenario).UserData(theUser).TotalSh ots)
End If

Next intScenario

getUserTotal = lngTotal
Exit Function

Case TotalHits
For intScenario = 0 To (intTotalScenarios - 1)

theScenario = theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenario, 0)
theUser = theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenario, 1)
dblSerialDate = theDatabase(theScenario).Date

If ((theDatabase(theScenario).gameType = gameType Or gameType = AllGames) And _
(minDate <= dblSerialDate Or minDate = 0) And (maxDate >= _
dblSerialDate Or maxDate = 0) And (strScenarioName = _
theDatabase(theScenario).Name Or strScenarioName = "") And _
(theDatabase(theScenario).UserData(theUser).Tea m = playerSide Or playerSide = 0)) Then

lngTotal = (lngTotal + theDatabase(theScenario).UserData(theUser).TotalHi ts)
End If

Next intScenario

getUserTotal = lngTotal
Exit Function

Case Kills
For intScenario = 0 To (intTotalScenarios - 1)

theScenario = theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenario, 0)
theUser = theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenario, 1)
dblSerialDate = theDatabase(theScenario).Date

If ((theDatabase(theScenario).gameType = gameType Or gameType = AllGames) And _
(minDate <= dblSerialDate Or minDate = 0) And (maxDate >= _
dblSerialDate Or maxDate = 0) And (strScenarioName = _
theDatabase(theScenario).Name Or strScenarioName = "") And _
(theDatabase(theScenario).UserData(theUser).Tea m = playerSide Or playerSide = 0)) Then

lngTotal = (lngTotal + theDatabase(theScenario).UserData(theUser).Kills)
End If

Next intScenario

getUserTotal = lngTotal
Exit Function

Case Losses
For intScenario = 0 To (intTotalScenarios - 1)

theScenario = theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenario, 0)
theUser = theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenario, 1)
dblSerialDate = theDatabase(theScenario).Date

If ((theDatabase(theScenario).gameType = gameType Or gameType = AllGames) And _
(minDate <= dblSerialDate Or minDate = 0) And (maxDate >= _
dblSerialDate Or maxDate = 0) And (strScenarioName = _
theDatabase(theScenario).Name Or strScenarioName = "") And _
(theDatabase(theScenario).UserData(theUser).Tea m = playerSide Or playerSide = 0)) Then

lngTotal = (lngTotal + theDatabase(theScenario).UserData(theUser).Losses)
End If

Next intScenario

getUserTotal = lngTotal
Exit Function

Case Frats
For intScenario = 0 To (intTotalScenarios - 1)

theScenario = theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenario, 0)
theUser = theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenario, 1)
dblSerialDate = theDatabase(theScenario).Date

If ((theDatabase(theScenario).gameType = gameType Or gameType = AllGames) And _
(minDate <= dblSerialDate Or minDate = 0) And (maxDate >= _
dblSerialDate Or maxDate = 0) And (strScenarioName = _
theDatabase(theScenario).Name Or strScenarioName = "") And _
(theDatabase(theScenario).UserData(theUser).Tea m = playerSide Or playerSide = 0)) Then

lngTotal = (lngTotal + theDatabase(theScenario).UserData(theUser).Frats)
End If

Next intScenario

getUserTotal = lngTotal
Exit Function

Case Tkills
For intScenario = 0 To (intTotalScenarios - 1)

theScenario = theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenario, 0)
theUser = theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenario, 1)
dblSerialDate = theDatabase(theScenario).Date

If ((theDatabase(theScenario).gameType = gameType Or gameType = AllGames) And _
(minDate <= dblSerialDate Or minDate = 0) And (maxDate >= _
dblSerialDate Or maxDate = 0) And (strScenarioName = _
theDatabase(theScenario).Name Or strScenarioName = "") And _
(theDatabase(theScenario).UserData(theUser).Tea m = playerSide Or playerSide = 0)) Then

lngTotal = (lngTotal + theDatabase(theScenario).UserData(theUser).Tkills)
End If

Next intScenario

getUserTotal = lngTotal
Exit Function

Case TanksLost
For intScenario = 0 To (intTotalScenarios - 1)

theScenario = theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenario, 0)
theUser = theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenario, 1)
dblSerialDate = theDatabase(theScenario).Date

If ((theDatabase(theScenario).gameType = gameType Or gameType = AllGames) And _
(minDate <= dblSerialDate Or minDate = 0) And (maxDate >= _
dblSerialDate Or maxDate = 0) And (strScenarioName = _
theDatabase(theScenario).Name Or strScenarioName = "") And _
(theDatabase(theScenario).UserData(theUser).Tea m = playerSide Or playerSide = 0)) Then

lngTotal = (lngTotal + theDatabase(theScenario).UserData(theUser).TanksLo st)
End If

Next intScenario

getUserTotal = lngTotal
Exit Function

Case TotalTanks
For intScenario = 0 To (intTotalScenarios - 1)

theScenario = theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenario, 0)
theUser = theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenario, 1)
dblSerialDate = theDatabase(theScenario).Date

If ((theDatabase(theScenario).gameType = gameType Or gameType = AllGames) And _
(minDate <= dblSerialDate Or minDate = 0) And (maxDate >= _
dblSerialDate Or maxDate = 0) And (strScenarioName = _
theDatabase(theScenario).Name Or strScenarioName = "") And _
(theDatabase(theScenario).UserData(theUser).Tea m = playerSide Or playerSide = 0)) Then

lngTotal = (lngTotal + theDatabase(theScenario).UserData(theUser).TotalTa nks)
End If

Next intScenario

getUserTotal = lngTotal

Exit Function

Case PCsLost
For intScenario = 0 To (intTotalScenarios - 1)

theScenario = theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenario, 0)
theUser = theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenario, 1)
dblSerialDate = theDatabase(theScenario).Date

If ((theDatabase(theScenario).gameType = gameType Or gameType = AllGames) And _
(minDate <= dblSerialDate Or minDate = 0) And (maxDate >= _
dblSerialDate Or maxDate = 0) And (strScenarioName = _
theDatabase(theScenario).Name Or strScenarioName = "") And _
(theDatabase(theScenario).UserData(theUser).Tea m = playerSide Or playerSide = 0)) Then

lngTotal = (lngTotal + theDatabase(theScenario).UserData(theUser).PCsLost )
End If

Next intScenario

getUserTotal = lngTotal
Exit Function

Case TotalPCs
For intScenario = 0 To (intTotalScenarios - 1)

theScenario = theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenario, 0)
theUser = theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenario, 1)
dblSerialDate = theDatabase(theScenario).Date

If ((theDatabase(theScenario).gameType = gameType Or gameType = AllGames) And _
(minDate <= dblSerialDate Or minDate = 0) And (maxDate >= _
dblSerialDate Or maxDate = 0) And (strScenarioName = _
theDatabase(theScenario).Name Or strScenarioName = "") And _
(theDatabase(theScenario).UserData(theUser).Tea m = playerSide Or playerSide = 0)) Then

lngTotal = (lngTotal + theDatabase(theScenario).UserData(theUser).TotalPC s)
End If

Next intScenario

getUserTotal = lngTotal
Exit Function

Case TroopsLost
For intScenario = 0 To (intTotalScenarios - 1)

theScenario = theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenario, 0)
theUser = theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenario, 1)
dblSerialDate = theDatabase(theScenario).Date

If ((theDatabase(theScenario).gameType = gameType Or gameType = AllGames) And _
(minDate <= dblSerialDate Or minDate = 0) And (maxDate >= _
dblSerialDate Or maxDate = 0) And (strScenarioName = _
theDatabase(theScenario).Name Or strScenarioName = "") And _
(theDatabase(theScenario).UserData(theUser).Tea m = playerSide Or playerSide = 0)) Then

lngTotal = (lngTotal + theDatabase(theScenario).UserData(theUser).TroopsL ost)
End If

Next intScenario

getUserTotal = lngTotal
Exit Function

Case TotalTroops

For intScenario = 0 To (intTotalScenarios - 1)

theScenario = theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenario, 0)
theUser = theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenario, 1)
dblSerialDate = theDatabase(theScenario).Date

If ((theDatabase(theScenario).gameType = gameType Or gameType = AllGames) And _
(minDate <= dblSerialDate Or minDate = 0) And (maxDate >= _
dblSerialDate Or maxDate = 0) And (strScenarioName = _
theDatabase(theScenario).Name Or strScenarioName = "") And _
(theDatabase(theScenario).UserData(theUser).Tea m = playerSide Or playerSide = 0)) Then

lngTotal = (lngTotal + theDatabase(theScenario).UserData(theUser).TotalTr oops)
End If

Next intScenario

getUserTotal = lngTotal
Exit Function

Case OthersLost
For intScenario = 0 To (intTotalScenarios - 1)

theScenario = theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenario, 0)
theUser = theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenario, 1)
dblSerialDate = theDatabase(theScenario).Date

If ((theDatabase(theScenario).gameType = gameType Or gameType = AllGames) And _
(minDate <= dblSerialDate Or minDate = 0) And (maxDate >= _
dblSerialDate Or maxDate = 0) And (strScenarioName = _
theDatabase(theScenario).Name Or strScenarioName = "") And _
(theDatabase(theScenario).UserData(theUser).Tea m = playerSide Or playerSide = 0)) Then

lngTotal = (lngTotal + theDatabase(theScenario).UserData(theUser).OthersL ost)
End If

Next intScenario

getUserTotal = lngTotal
Exit Function

Case TotalOthers
For intScenario = 0 To (intTotalScenarios - 1)

theScenario = theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenario, 0)
theUser = theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenario, 1)
dblSerialDate = theDatabase(theScenario).Date

If ((theDatabase(theScenario).gameType = gameType Or gameType = AllGames) And _
(minDate <= dblSerialDate Or minDate = 0) And (maxDate >= _
dblSerialDate Or maxDate = 0) And (strScenarioName = _
theDatabase(theScenario).Name Or strScenarioName = "") And _
(theDatabase(theScenario).UserData(theUser).Tea m = playerSide Or playerSide = 0)) Then

lngTotal = (lngTotal + theDatabase(theScenario).UserData(theUser).TotalOt hers)
End If

Next intScenario

getUserTotal = lngTotal
Exit Function

Case PMRating
For intScenario = 0 To (intTotalScenarios - 1)

theScenario = theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenario, 0)
theUser = theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenario, 1)
dblSerialDate = theDatabase(theScenario).Date

If ((theDatabase(theScenario).gameType = gameType Or gameType = AllGames) And _
(minDate <= dblSerialDate Or minDate = 0) And (maxDate >= _
dblSerialDate Or maxDate = 0) And (strScenarioName = _
theDatabase(theScenario).Name Or strScenarioName = "") And _
(theDatabase(theScenario).UserData(theUser).Tea m = playerSide Or playerSide = 0)) Then

sngTotal = (sngTotal + getPM(theScenario, theUser))
End If

Next intScenario

getUserTotal = sngTotal
Exit Function

Case GamesPlayed
For intScenario = 0 To (intTotalScenarios - 1)

theScenario = theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenario, 0)
theUser = theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenario, 1)
dblSerialDate = theDatabase(theScenario).Date

If ((theDatabase(theScenario).gameType = gameType Or gameType = AllGames) And _
(minDate <= dblSerialDate Or minDate = 0) And (maxDate >= _
dblSerialDate Or maxDate = 0) And (strScenarioName = _
theDatabase(theScenario).Name Or strScenarioName = "") And _
(theDatabase(theScenario).UserData(theUser).Tea m = playerSide Or playerSide = 0)) Then

lngTotal = (lngTotal + 1)
End If

Next intScenario

getUserTotal = lngTotal
Exit Function

Case HoursPlayed
For intScenario = 0 To (intTotalScenarios - 1)

theScenario = theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenario, 0)
theUser = theDatabase(intFirstEntry).UserData(intUserIndex). ScenarioList(intScenario, 1)
dblSerialDate = theDatabase(theScenario).Date

If ((theDatabase(theScenario).gameType = gameType Or gameType = AllGames) And _
(minDate <= dblSerialDate Or minDate = 0) And (maxDate >= _
dblSerialDate Or maxDate = 0) And (strScenarioName = _
theDatabase(theScenario).Name Or strScenarioName = "") And _
(theDatabase(theScenario).UserData(theUser).Tea m = playerSide Or playerSide = 0)) Then

sngTotal = (sngTotal + getHours(theScenario))
End If

Next intScenario

getUserTotal = sngTotal
Exit Function


End Select

'Error, invalid attribute chosen.
getUserTotal = -1
MsgBox ("Error: Invalid attribute")

End Function

PS-SCUD
03-02-2006, 09:38 PM
Private Function getPM(ByVal theScenario As Integer, ByVal theUser As Integer) As Single

With theDatabase(theScenario).UserData(theUser)

If (.TotalPCs = 0 And .TotalTroops = 0 And .TotalOthers = 0) Then
If (.Tkills > (1.25 * .Kills))