Adds freebie point spending. Adds cancel as an option to MenuStyle to allow cancelling. Adds includeInRandom to MenuItem to hide specific MenuItems from GetRandomMenuItemId.
This commit is contained in:
337
dos/sbf/menus.bm
337
dos/sbf/menus.bm
@@ -1,158 +1,179 @@
|
||||
Function GetRandomMenuItemId (items() As MenuItem, count As Integer)
|
||||
numVisibleItems = 0
|
||||
Dim visibleItems(count) As Integer
|
||||
For i = 1 To count
|
||||
If items(i).isVisible Then
|
||||
visibleItems(numVisibleItems) = i
|
||||
numVisibleItems = numVisibleItems + 1
|
||||
End If
|
||||
Next
|
||||
i = GetRandomInt(0, numVisibleItems - 1)
|
||||
GetRandomMenuItemId = visibleItems(i)
|
||||
End Function
|
||||
|
||||
Sub BuildMenu (items() As MenuItem, labels() As String, count As Integer)
|
||||
For i = 1 To count
|
||||
Dim mi As MenuItem
|
||||
Call NewMenuItem(mi, labels(i), i)
|
||||
items(i) = mi
|
||||
Next
|
||||
End Sub
|
||||
|
||||
Sub BuildMenuWithValues (items() As MenuItem, labels() As String, values() As Integer, count As Integer)
|
||||
For i = 1 To count
|
||||
Dim mi As MenuItem
|
||||
Call NewMenuItemWithValue(mi, labels(i), i, values(i))
|
||||
items(i) = mi
|
||||
Next
|
||||
End Sub
|
||||
|
||||
Sub BuildMenuWithColors (items() As MenuItem, labels() As String, colors() As Integer)
|
||||
' Check array bounds
|
||||
If LBound(items) <> 1 Or LBound(colors) <> 1 Or UBound(items) <> UBound(colors) Then End
|
||||
|
||||
count = UBound(items)
|
||||
For i = 1 To count
|
||||
Dim mi As MenuItem
|
||||
Call NewMenuItemWithColor(mi, labels(i), colors(i), i)
|
||||
items(i) = mi
|
||||
Next
|
||||
End Sub
|
||||
|
||||
Sub AdjustMenuStyle (style As MenuStyle, items() As MenuItem, count As Integer, ignoreValue As Integer)
|
||||
maxIdWidth = 0
|
||||
maxItemWidth = 0
|
||||
maxValueWidth = 0
|
||||
|
||||
For i = 1 To count
|
||||
If items(i).isVisible Then
|
||||
maxIdWidth = MaxI(maxIdWidth, Len(itos$(items(i).id)))
|
||||
maxItemWidth = MaxI(maxItemWidth, Len(items(i).label + style.labelValueSeparator))
|
||||
maxValueWidth = MaxI(maxValueWidth, Len(itos$(items(i).value)))
|
||||
End If
|
||||
Next
|
||||
If style.showRandom Then
|
||||
maxIdWidth = MaxI(maxIdWidth, Len("0"))
|
||||
maxItemWidth = MaxI(maxItemWidth, Len(style.randomItemName))
|
||||
End If
|
||||
style.idWidth = maxIdWidth
|
||||
style.labelWidth = maxItemWidth
|
||||
If Not ignoreValue Then style.valueWidth = maxValueWidth Else style.valueWidth = 0
|
||||
End Sub
|
||||
|
||||
Sub PrintMenu (items() As MenuItem, count As Integer, style As MenuStyle)
|
||||
Dim randomItem As MenuItem
|
||||
Call NewMenuItem(randomItem, style.randomItemName, style.randomItemId)
|
||||
If count <= 10 Then
|
||||
For i = 1 To count
|
||||
If items(i).isVisible Then
|
||||
If style.useColors Then
|
||||
oldColor = GetColor
|
||||
SetColor (items(i).color)
|
||||
End If
|
||||
Print GetTitle$(items(i), style)
|
||||
If style.useColors Then
|
||||
Call SetColor(oldColor)
|
||||
End If
|
||||
End If
|
||||
Next
|
||||
If style.showRandom Then
|
||||
Print GetTitleWithoutValue$(randomItem, style)
|
||||
End If
|
||||
Else
|
||||
Dim emptyItem As MenuItem
|
||||
Call NewMenuItem(emptyItem, "", 0)
|
||||
itemWidth = Len(GetTitle$(emptyItem, style))
|
||||
itemsPerRow = style.screenWidth \ (itemWidth + Len(style.menuItemSpacer))
|
||||
columnWidth = style.screenWidth \ itemsPerRow
|
||||
|
||||
column = 0
|
||||
For i = 1 To count
|
||||
If items(i).isVisible Then
|
||||
itemText$ = GetTitle$(items(i), style)
|
||||
If column <> (itemsPerRow - 1) Then
|
||||
If i <> count Or style.showRandom Then
|
||||
textLength = Len(itemText$)
|
||||
itemText$ = MakeFitL$(RTrim$(itemText$) + style.menuItemSpacer, textLength + Len(style.menuItemSpacer), " ")
|
||||
End If
|
||||
End If
|
||||
Print MakeFitC$(itemText$, columnWidth, " ");
|
||||
End If
|
||||
column = (column + 1) Mod itemsPerRow
|
||||
If column = 0 Then Print ""
|
||||
Next
|
||||
If style.showRandom Then
|
||||
Print MakeFitC$(GetTitleWithoutValue$(randomItem, style), columnWidth, " ")
|
||||
End If
|
||||
End If
|
||||
End Sub
|
||||
|
||||
Function GetTitle$ (mi As MenuItem, ms As MenuStyle)
|
||||
id$ = itos$(mi.id)
|
||||
label$ = mi.label
|
||||
If ms.valueWidth > 0 Then label$ = label$ + ms.labelValueSeparator
|
||||
value$ = itos$(mi.value)
|
||||
GetTitle$ = MakeFitR$(id$, ms.idWidth, " ") + ms.idLabelSeparator + MakeFitL$(label$, ms.labelWidth, " ") + MakeFitR$(value$, ms.valueWidth, " ")
|
||||
End Function
|
||||
|
||||
Function GetTitleWithoutValue$ (mi As MenuItem, ms As MenuStyle)
|
||||
GetTitleWithoutValue$ = MakeFitR$(itos(mi.id), ms.idWidth, " ") + ms.idLabelSeparator + MakeFitL$(mi.label, ms.labelWidth + ms.valueWidth + Len(ms.labelValueSeparator), " ")
|
||||
End Function
|
||||
|
||||
Sub NewMenuStyle (ms As MenuStyle)
|
||||
ms.idWidth = 0
|
||||
ms.labelWidth = 0
|
||||
ms.valueWidth = 0
|
||||
ms.screenWidth = 80
|
||||
ms.randomItemName = "Random"
|
||||
ms.randomItemId = 0
|
||||
ms.idLabelSeparator = " = "
|
||||
ms.labelValueSeparator = ": "
|
||||
ms.menuItemSpacer = ", "
|
||||
ms.showRandom = TRUE
|
||||
ms.useColors = FALSE
|
||||
End Sub
|
||||
|
||||
Sub NewMenuItem (mi As MenuItem, label As String, id As Integer)
|
||||
mi.id = id
|
||||
mi.label = label
|
||||
mi.value = 0
|
||||
mi.color = COLOR_DEFAULT
|
||||
mi.isVisible = TRUE
|
||||
End Sub
|
||||
|
||||
Sub NewMenuItemWithValue (mi As MenuItem, label As String, id As Integer, value As Integer)
|
||||
mi.id = id
|
||||
mi.label = label
|
||||
mi.value = value
|
||||
mi.color = COLOR_DEFAULT
|
||||
mi.isVisible = TRUE
|
||||
End Sub
|
||||
|
||||
Sub NewMenuItemWithColor (mi As MenuItem, label As String, textColor As Integer, id As Integer)
|
||||
mi.id = id
|
||||
mi.label = label
|
||||
mi.value = 0
|
||||
mi.color = textColor
|
||||
mi.isVisible = TRUE
|
||||
End Sub
|
||||
Function GetRandomMenuItemId (items() As MenuItem, count As Integer)
|
||||
numVisibleItems = 0
|
||||
Dim visibleItems(count) As Integer
|
||||
For i = 1 To count
|
||||
If items(i).isVisible and items(i).includeinrandom Then
|
||||
visibleItems(numVisibleItems) = i
|
||||
numVisibleItems = numVisibleItems + 1
|
||||
End If
|
||||
Next
|
||||
i = GetRandomInt(0, numVisibleItems - 1)
|
||||
GetRandomMenuItemId = visibleItems(i)
|
||||
End Function
|
||||
|
||||
Sub BuildMenu (items() As MenuItem, labels() As String, count As Integer)
|
||||
For i = 1 To count
|
||||
Dim mi As MenuItem
|
||||
Call NewMenuItem(mi, labels(i), i)
|
||||
items(i) = mi
|
||||
Next
|
||||
End Sub
|
||||
|
||||
Sub BuildMenuWithValues (items() As MenuItem, labels() As String, values() As Integer, count As Integer)
|
||||
For i = 1 To count
|
||||
Dim mi As MenuItem
|
||||
Call NewMenuItemWithValue(mi, labels(i), i, values(i))
|
||||
items(i) = mi
|
||||
Next
|
||||
End Sub
|
||||
|
||||
Sub BuildMenuWithColors (items() As MenuItem, labels() As String, colors() As Integer)
|
||||
' Check array bounds
|
||||
If LBound(items) <> 1 Or LBound(colors) <> 1 Or UBound(items) <> UBound(colors) Then End
|
||||
|
||||
count = UBound(items)
|
||||
For i = 1 To count
|
||||
Dim mi As MenuItem
|
||||
Call NewMenuItemWithColor(mi, labels(i), colors(i), i)
|
||||
items(i) = mi
|
||||
Next
|
||||
End Sub
|
||||
|
||||
Sub AdjustMenuStyle (style As MenuStyle, items() As MenuItem, count As Integer, ignoreValue As Integer)
|
||||
maxIdWidth = 0
|
||||
maxItemWidth = 0
|
||||
maxValueWidth = 0
|
||||
|
||||
For i = 1 To count
|
||||
If items(i).isVisible Then
|
||||
maxIdWidth = MaxI(maxIdWidth, Len(itos$(items(i).id)))
|
||||
maxItemWidth = MaxI(maxItemWidth, Len(items(i).label + style.labelValueSeparator))
|
||||
maxValueWidth = MaxI(maxValueWidth, Len(itos$(items(i).value)))
|
||||
End If
|
||||
Next
|
||||
If style.showRandom Then
|
||||
maxIdWidth = MaxI(maxIdWidth, Len(itos$(style.randomItemId)))
|
||||
maxItemWidth = MaxI(maxItemWidth, Len(style.randomItemName))
|
||||
End If
|
||||
If style.showCancel Then
|
||||
maxIdWidth = MaxI(maxIdWidth, Len(itos$(style.cancelItemId)))
|
||||
maxItemWidth = MaxI(maxItemWidth, Len(style.cancelItemName))
|
||||
End If
|
||||
style.idWidth = maxIdWidth
|
||||
style.labelWidth = maxItemWidth
|
||||
If Not ignoreValue Then style.valueWidth = maxValueWidth Else style.valueWidth = 0
|
||||
End Sub
|
||||
|
||||
Sub PrintMenu (items() As MenuItem, count As Integer, style As MenuStyle)
|
||||
Dim randomItem As MenuItem
|
||||
Call NewMenuItemWithColor(randomItem, style.randomItemName, style.randomItemColor, style.randomItemId)
|
||||
Dim cancelItem As MenuItem
|
||||
Call NewMenuItemWithColor(cancelItem, style.cancelItemName, style.cancelItemColor, style.cancelItemId)
|
||||
actualCount = count
|
||||
If style.showCancel = TRUE Then actualCount = actualCount + 1
|
||||
If style.showRandom = TRUE Then actualCount = actualCount + 1
|
||||
If actualCount <= 10 Then
|
||||
For i = 1 To count
|
||||
If items(i).isVisible Then
|
||||
title$ = GetTitle$(items(i), style)
|
||||
Call PrintWithMaybeColor(title$, items(i).color, style.useColors)
|
||||
End If
|
||||
Next
|
||||
If style.showCancel Then
|
||||
cancelLabel$ = GetTitleWithoutValue$(cancelItem, style)
|
||||
Call PrintWithMaybeColor(cancelLabel$, cancelItem.color, style.useColors)
|
||||
End If
|
||||
If style.showRandom Then
|
||||
randomLabel$ = GetTitleWithoutValue$(randomItem, style)
|
||||
Call PrintWithMaybeColor(randomLabel$, randomItem.color, style.useColors)
|
||||
End If
|
||||
Else
|
||||
Dim emptyItem As MenuItem
|
||||
Call NewMenuItem(emptyItem, "", 0)
|
||||
itemWidth = Len(GetTitle$(emptyItem, style))
|
||||
itemsPerRow = style.screenWidth \ (itemWidth + Len(style.menuItemSpacer))
|
||||
columnWidth = style.screenWidth \ itemsPerRow
|
||||
|
||||
column = 0
|
||||
For i = 1 To count
|
||||
If items(i).isVisible Then
|
||||
itemText$ = GetTitle$(items(i), style)
|
||||
If column <> (itemsPerRow - 1) Then
|
||||
If i <> count Or style.showRandom Then
|
||||
textLength = Len(itemText$)
|
||||
itemText$ = MakeFitL$(RTrim$(itemText$) + style.menuItemSpacer, textLength + Len(style.menuItemSpacer), " ")
|
||||
End If
|
||||
End If
|
||||
label$ = MakeFitC$(itemText$, columnWidth, " ")
|
||||
Call PrintWithMaybeColor(label$, items(i).color, style.useColors)
|
||||
End If
|
||||
column = (column + 1) Mod itemsPerRow
|
||||
If column = 0 Then Print ""
|
||||
Next
|
||||
If style.showCancel Then
|
||||
cancelLabel$ = MakeFitC$(GetTitleWithoutValue$(cancelItem, style), columnWidth, " ")
|
||||
Call PrintWithMaybeColor(cancelLabel$, cancelItem.color, style.useColors)
|
||||
End If
|
||||
If style.showRandom Then
|
||||
randomLabel$ = MakeFitC$(GetTitleWithoutValue$(randomItem, style), columnWidth, " ")
|
||||
Call PrintWithMaybeColor(randomLabel$, randomItem.color, style.useColors)
|
||||
End If
|
||||
End If
|
||||
End Sub
|
||||
|
||||
Function GetTitle$ (mi As MenuItem, ms As MenuStyle)
|
||||
id$ = itos$(mi.id)
|
||||
label$ = mi.label
|
||||
If ms.valueWidth > 0 Then label$ = label$ + ms.labelValueSeparator
|
||||
value$ = itos$(mi.value)
|
||||
GetTitle$ = MakeFitR$(id$, ms.idWidth, " ") + ms.idLabelSeparator + MakeFitL$(label$, ms.labelWidth, " ") + MakeFitR$(value$, ms.valueWidth, " ")
|
||||
End Function
|
||||
|
||||
Function GetTitleWithoutValue$ (mi As MenuItem, ms As MenuStyle)
|
||||
GetTitleWithoutValue$ = MakeFitR$(itos$(mi.id), ms.idWidth, " ") + ms.idLabelSeparator + MakeFitL$(mi.label, ms.labelWidth + ms.valueWidth + Len(ms.labelValueSeparator), " ")
|
||||
End Function
|
||||
|
||||
Sub NewMenuStyle (ms As MenuStyle)
|
||||
ms.idWidth = 0
|
||||
ms.labelWidth = 0
|
||||
ms.valueWidth = 0
|
||||
ms.screenWidth = 80
|
||||
ms.randomItemName = "Random"
|
||||
ms.randomItemId = 0
|
||||
ms.randomItemColor = COLOR_FOREGROUND_DEFAULT
|
||||
ms.cancelItemName = "Cancel"
|
||||
ms.cancelItemId = -1
|
||||
ms.cancelItemColor = COLOR_FOREGROUND_DEFAULT
|
||||
ms.idLabelSeparator = " = "
|
||||
ms.labelValueSeparator = ": "
|
||||
ms.menuItemSpacer = ", "
|
||||
ms.showRandom = TRUE
|
||||
ms.showCancel = false
|
||||
ms.useColors = FALSE
|
||||
End Sub
|
||||
|
||||
Sub NewMenuItem (mi As MenuItem, label As String, id As Integer)
|
||||
mi.id = id
|
||||
mi.label = label
|
||||
mi.value = 0
|
||||
mi.color = COLOR_DEFAULT
|
||||
mi.isVisible = TRUE
|
||||
mi.includeInRandom = true
|
||||
End Sub
|
||||
|
||||
Sub NewMenuItemWithValue (mi As MenuItem, label As String, id As Integer, value As Integer)
|
||||
mi.id = id
|
||||
mi.label = label
|
||||
mi.value = value
|
||||
mi.color = COLOR_DEFAULT
|
||||
mi.isVisible = TRUE
|
||||
mi.includeInRandom = true
|
||||
End Sub
|
||||
|
||||
Sub NewMenuItemWithColor (mi As MenuItem, label As String, textColor As Integer, id As Integer)
|
||||
mi.id = id
|
||||
mi.label = label
|
||||
mi.value = 0
|
||||
mi.color = textColor
|
||||
mi.isVisible = TRUE
|
||||
End Sub
|
||||
|
||||
Reference in New Issue
Block a user