aboutsummaryrefslogtreecommitdiff
path: root/Northstar.Client/mod/scripts/vscripts/ui/menu_stats_utility.nut
diff options
context:
space:
mode:
authorEmma Miler <27428383+emma-miler@users.noreply.github.com>2022-04-19 23:27:54 +0200
committerGitHub <noreply@github.com>2022-04-19 22:27:54 +0100
commit31cba09fea290cfddde6cc77af836b1cd4756bdd (patch)
treecf58dd85bb8acbdcb002ca89bac5975b2b106b47 /Northstar.Client/mod/scripts/vscripts/ui/menu_stats_utility.nut
parent2da71a5730b65d13049fbbd2635d1fac189f6662 (diff)
downloadNorthstarMods-31cba09fea290cfddde6cc77af836b1cd4756bdd.tar.gz
NorthstarMods-31cba09fea290cfddde6cc77af836b1cd4756bdd.zip
Fix a freeze in stats menu (#307)
Diffstat (limited to 'Northstar.Client/mod/scripts/vscripts/ui/menu_stats_utility.nut')
-rw-r--r--Northstar.Client/mod/scripts/vscripts/ui/menu_stats_utility.nut560
1 files changed, 560 insertions, 0 deletions
diff --git a/Northstar.Client/mod/scripts/vscripts/ui/menu_stats_utility.nut b/Northstar.Client/mod/scripts/vscripts/ui/menu_stats_utility.nut
new file mode 100644
index 000000000..e1d0a8f93
--- /dev/null
+++ b/Northstar.Client/mod/scripts/vscripts/ui/menu_stats_utility.nut
@@ -0,0 +1,560 @@
+untyped
+
+
+global function SetPieChartData
+global function SetStatsBarValues
+global function SetStatsValueInfo
+global function SetStatsLabelValue
+global function GetPercent
+//global function GetChallengeCompleteData
+global function GetItemUnlockCountData
+global function GetOverviewWeaponData
+global function StatToTimeString
+global function HoursToTimeString
+global function StatToDistanceString
+global function ComparePieChartEntryValues
+global function SetStatBoxDisplay
+global function SetMedalStatBoxDisplay
+
+void function SetPieChartData( var menu, string panelName, string titleString, PieChartData data )
+{
+ Assert( data.entries.len() <= 8 )
+
+ // Get nested panel
+ var piePanel = GetElem( menu, panelName )
+
+ // Create background
+ var background = Hud_GetChild( piePanel, "BarBG" )
+ Hud_SetBarProgress( background, 1.0 )
+ Hud_SetColor( background, [190, 190, 190, 255] )
+
+ // Calculate total of all values combined
+ foreach ( entry in data.entries )
+ data.sum += entry.numValue
+
+ // Calculate bar fraction for each value
+ foreach ( entry in data.entries )
+ {
+ if ( data.sum > 0 )
+ entry.fracValue = entry.numValue / data.sum
+ else
+ entry.fracValue = 0.0
+ }
+
+ // Set slice sizes and text data
+ var titleLabel = Hud_GetChild( piePanel, "Title" )
+ Hud_SetText( titleLabel, titleString )
+ Hud_SetColor( titleLabel, data.labelColor )
+
+ var noDataLabel = Hud_GetChild( piePanel, "NoData" )
+
+ for ( int index = 0; index < 8; index++ )
+ {
+ var barColorGuide = Hud_GetChild( piePanel, "BarColorGuide" + index )
+ // Hud_SetColor( barColorGuide, entry.color )
+ Hud_Hide( barColorGuide )
+
+ var barColorGuideFrame = Hud_GetChild( piePanel, "BarColorGuideFrame" + index )
+ Hud_Hide( barColorGuideFrame )
+
+ var barName = Hud_GetChild( piePanel, "BarName" + index )
+ Hud_SetColor( barName, data.labelColor )
+ Hud_SetText( barName, "" )
+
+ var bar = Hud_GetChild( piePanel, "Bar" + index )
+ //Hud_SetBarProgress( bar, combinedFrac )
+ //Hud_SetColor( bar, entry.color )
+ Hud_Hide( bar )
+ }
+
+ if ( data.entries.len() > 0 )
+ {
+ Hud_Hide( noDataLabel )
+
+ float combinedFrac = 0.0
+ int largestTextWidth = 0
+
+ foreach ( index, entry in data.entries )
+ {
+ var barColorGuide = Hud_GetChild( piePanel, "BarColorGuide" + index )
+ Hud_SetColor( barColorGuide, entry.color )
+ Hud_Show( barColorGuide )
+
+ var barColorGuideFrame = Hud_GetChild( piePanel, "BarColorGuideFrame" + index )
+ Hud_Show( barColorGuideFrame )
+
+ string percent = GetPercent( entry.fracValue, 1.0, 0, true )
+ var barName = Hud_GetChild( piePanel, "BarName" + index )
+ Hud_SetColor( barName, data.labelColor )
+
+ if ( data.timeBased )
+ Hud_SetText( barName, PieChartHoursToTimeString( entry.numValue, entry.displayName, percent ) )
+ else
+ Hud_SetText( barName, "#STATS_TEXT_AND_PERCENTAGE", entry.displayName, percent )
+
+ int currentTextWidth = Hud_GetTextWidth( barName )
+ if ( currentTextWidth > largestTextWidth )
+ largestTextWidth = currentTextWidth
+
+ Hud_Show( barName )
+
+ combinedFrac += entry.fracValue
+ var bar = Hud_GetChild( piePanel, "Bar" + index )
+ Hud_SetBarProgress( bar, combinedFrac )
+ Hud_SetColor( bar, entry.color )
+ Hud_Show( bar )
+ }
+
+ // Position the list
+ int xOffset = int( ( largestTextWidth / -2 ) + ContentScaledX( 18 ) )
+ Hud_SetX( Hud_GetChild( piePanel, "BarName0" ), xOffset )
+ }
+ else
+ {
+ Hud_Show( noDataLabel )
+ for ( int index = 0; index < 8; index++ )
+ {
+ var barColorGuide = Hud_GetChild( piePanel, "BarColorGuide" + index )
+// Hud_SetColor( barColorGuide, entry.color )
+ Hud_Hide( barColorGuide )
+
+ var barColorGuideFrame = Hud_GetChild( piePanel, "BarColorGuideFrame" + index )
+ Hud_Hide( barColorGuideFrame )
+
+ var barName = Hud_GetChild( piePanel, "BarName" + index )
+ Hud_SetColor( barName, data.labelColor )
+ Hud_SetText( barName, "" )
+
+ var bar = Hud_GetChild( piePanel, "Bar" + index )
+ //Hud_SetBarProgress( bar, combinedFrac )
+ //Hud_SetColor( bar, entry.color )
+ Hud_Hide( bar )
+ }
+ }
+}
+
+function SetStatsBarValues( menu, panelName, titleString, startValue, endValue, currentValue )
+{
+ Assert( endValue > startValue )
+ Assert( currentValue >= startValue && currentValue <= endValue )
+
+ // Get nested panel
+ var panel = GetElem( menu, panelName )
+
+ // Update titel
+ var title = Hud_GetChild( panel, "Title" )
+ Hud_SetText( title, titleString )
+
+ // Update progress text
+ var progressText = Hud_GetChild( panel, "ProgressText" )
+ Hud_SetText( progressText, "#STATS_PROGRESS_BAR_VALUE", currentValue, endValue )
+
+ // Update bar progress
+ float frac = GraphCapped( currentValue, startValue, endValue, 0.0, 1.0 )
+
+ var barFill = Hud_GetChild( panel, "BarFill" )
+ Hud_SetScaleX( barFill, frac )
+
+ var barFillShadow = Hud_GetChild( panel, "BarFillShadow" )
+ Hud_SetScaleX( barFillShadow, frac )
+}
+
+void function SetStatsValueInfo( var menu, valueID, labelText, textString )
+{
+ var elem = GetElem( menu, "Column0Label" + valueID )
+ Assert( elem != null )
+ Hud_SetText( elem, labelText )
+
+ elem = GetElem( menu, "Column0Value" + valueID )
+ Assert( elem != null )
+ SetStatsLabelValueOnLabel( elem, textString )
+}
+
+void function SetStatsLabelValue( var menu, labelName, textString )
+{
+ var elem = GetElem( menu, labelName )
+ Assert( elem != null)
+ SetStatsLabelValueOnLabel( elem, textString )
+}
+
+void function SetStatsLabelValueOnLabel( elem, textString )
+{
+ if ( type( textString ) == "array" )
+ {
+ if ( textString.len() == 6 )
+ Hud_SetText( elem, string( textString[0] ), textString[1], textString[2], textString[3], textString[4], textString[5] )
+ if ( textString.len() == 5 )
+ Hud_SetText( elem, string( textString[0] ), textString[1], textString[2], textString[3], textString[4] )
+ if ( textString.len() == 4 )
+ Hud_SetText( elem, string( textString[0] ), textString[1], textString[2], textString[3] )
+ if ( textString.len() == 3 )
+ Hud_SetText( elem, string( textString[0] ), textString[1], textString[2] )
+ if ( textString.len() == 2 )
+ Hud_SetText( elem, string( textString[0] ), textString[1] )
+ if ( textString.len() == 1 )
+ Hud_SetText( elem, string( textString[0] ) )
+ }
+ else
+ {
+ Hud_SetText( elem, string( textString ) )
+ }
+}
+
+string function GetPercent( float val, float total, float defaultPercent, bool doClamp = true )
+{
+ float percent = defaultPercent
+ if ( total > 0 )
+ {
+ percent = val / total
+ percent *= 100
+ }
+
+ if ( doClamp )
+ percent = clamp( percent, 0, 100 )
+
+ string formattedPercent
+ if ( int( percent * 10 ) % 10 == 0 )
+ formattedPercent = format( "%.0f", percent )
+ else
+ formattedPercent = format( "%.1f", percent )
+
+ return formattedPercent
+}
+
+//function GetChallengeCompleteData()
+//{
+// local Table = {}
+// Table.total <- 0
+// Table.complete <- 0
+//
+// UI_GetAllChallengesProgress()
+// var allChallenges = GetLocalChallengeTable()
+//
+// foreach( challengeRef, val in allChallenges )
+// {
+// if ( IsDailyChallenge( challengeRef ) )
+// continue
+// local tierCount = GetChallengeTierCount( challengeRef )
+// Table.total += tierCount
+// for ( int i = 0; i < tierCount; i++ )
+// {
+// if ( IsChallengeTierComplete( challengeRef, i ) )
+// Table.complete++
+// }
+// }
+//
+// return Table
+//}
+
+function GetItemUnlockCountData()
+{
+ entity player = GetUIPlayer()
+ if ( player == null )
+ return {}
+
+ local Table = {}
+ Table[ "weapons" ] <- {}
+ Table[ "weapons" ].total <- 0
+ Table[ "weapons" ].unlocked <- 0
+ Table[ "attachments" ] <- {}
+ Table[ "attachments" ].total <- 0
+ Table[ "attachments" ].unlocked <- 0
+ Table[ "mods" ] <- {}
+ Table[ "mods" ].total <- 0
+ Table[ "mods" ].unlocked <- 0
+ Table[ "abilities" ] <- {}
+ Table[ "abilities" ].total <- 0
+ Table[ "abilities" ].unlocked <- 0
+ Table[ "gear" ] <- {}
+ Table[ "gear" ].total <- 0
+ Table[ "gear" ].unlocked <- 0
+/*
+ local tableMapping = {}
+
+ tableMapping[ eItemTypes.PILOT_PRIMARY ] <- "weapons"
+ tableMapping[ eItemTypes.PILOT_SECONDARY ] <- "weapons"
+ tableMapping[ eItemTypes.PILOT_ORDNANCE ] <- "weapons"
+ tableMapping[ eItemTypes.TITAN_PRIMARY ] <- "weapons"
+ tableMapping[ eItemTypes.TITAN_ORDNANCE ] <- "weapons"
+ tableMapping[ eItemTypes.PILOT_PRIMARY_ATTACHMENT ] <- "attachments"
+ tableMapping[ eItemTypes.PILOT_PRIMARY_MOD ] <- "mods"
+ tableMapping[ eItemTypes.PILOT_SECONDARY_MOD ] <- "mods"
+ tableMapping[ eItemTypes.TITAN_PRIMARY_MOD ] <- "mods"
+ tableMapping[ eItemTypes.PILOT_SPECIAL_MOD ] <- "mods"
+ tableMapping[ eItemTypes.TITAN_SPECIAL_MOD ] <- "mods"
+ tableMapping[ eItemTypes.PILOT_SPECIAL ] <- "abilities"
+ tableMapping[ eItemTypes.TITAN_SPECIAL ] <- "abilities"
+
+ local itemRefs = GetAllItemRefs()
+ foreach ( data in itemRefs )
+ {
+ if ( !( data.Type in tableMapping ) )
+ continue
+ Table[ tableMapping[ data.Type ] ].total++
+
+ if ( !IsItemLocked( player, expect string( data.childRef ), expect string( data.ref ) ) )
+ Table[ tableMapping[ data.Type ] ].unlocked++
+ }
+*/
+ return Table
+}
+
+table<string, table> function GetOverviewWeaponData()
+{
+ table<string, table> Table = {}
+ Table[ "most_kills" ] <- {}
+ Table[ "most_kills" ].ref <- ""
+ Table[ "most_kills" ].printName <- ""
+ Table[ "most_kills" ].val <- 0
+ Table[ "most_used" ] <- {}
+ Table[ "most_used" ].ref <- ""
+ Table[ "most_used" ].printName <- ""
+ Table[ "most_used" ].val <- 0
+ Table[ "highest_kpm" ] <- {}
+ Table[ "highest_kpm" ].ref <- ""
+ Table[ "highest_kpm" ].printName <- ""
+ Table[ "highest_kpm" ].val <- 0
+
+ entity player = GetUIPlayer()
+ if ( player == null )
+ return Table
+
+ array<ItemDisplayData> allWeapons = []
+
+ allWeapons.extend( GetVisibleItemsOfType( eItemTypes.PILOT_PRIMARY ) )
+ allWeapons.extend( GetVisibleItemsOfType( eItemTypes.PILOT_SECONDARY ) )
+ //allWeapons.extend( GetVisibleItemsOfType( eItemTypes.PILOT_ORDNANCE ) ) // art looks bad
+ allWeapons.extend( GetVisibleItemsOfType( eItemTypes.TITAN_PRIMARY ) )
+ allWeapons.extend( GetVisibleItemsOfType( eItemTypes.TITAN_ORDNANCE ) )
+ allWeapons.extend( GetVisibleItemsOfType( eItemTypes.TITAN_ANTIRODEO ) )
+ allWeapons.extend( GetVisibleItemsOfType( eItemTypes.TITAN_SPECIAL ) )
+ //allWeapons.extend( GetVisibleItemsOfType( eItemTypes.BURN_METER_REWARD ) ) // script errors
+
+ foreach ( weapon in allWeapons )
+ {
+ string weaponName = weapon.ref
+ string weaponDisplayName = expect string( GetWeaponInfoFileKeyField_Global( weaponName, "printname" ) )
+
+ if ( !PersistenceEnumValueIsValid( "loadoutWeaponsAndAbilities", weaponName ) )
+ continue
+
+ int val = GetPlayerStatInt( player, "weapon_kill_stats", "total", weaponName )
+ if ( val > Table[ "most_kills" ].val )
+ {
+ Table[ "most_kills" ].ref = weaponName
+ Table[ "most_kills" ].printName = weaponDisplayName
+ Table[ "most_kills" ].val = val
+ }
+
+ float fVal = GetPlayerStatFloat( player, "weapon_stats", "hoursUsed", weaponName )
+ if ( fVal > Table[ "most_used" ].val )
+ {
+ Table[ "most_used" ].ref = weaponName
+ Table[ "most_used" ].printName = weaponDisplayName
+ Table[ "most_used" ].val = fVal
+ }
+
+ local killsPerMinute = 0
+ local hoursEquipped = GetPlayerStatFloat( player, "weapon_stats", "hoursEquipped", weaponName )
+ local killCount = GetPlayerStatInt( player, "weapon_kill_stats", "total", weaponName )
+ if ( hoursEquipped > 0 )
+ killsPerMinute = format( "%.2f", ( killCount / ( hoursEquipped * 60.0 ) ).tofloat() )
+ if ( killsPerMinute.tofloat() > Table[ "highest_kpm" ].val.tofloat() )
+ {
+ Table[ "highest_kpm" ].ref = weaponName
+ Table[ "highest_kpm" ].printName = weaponDisplayName
+ Table[ "highest_kpm" ].val = killsPerMinute
+ }
+ }
+
+ return Table
+}
+
+string function StatToTimeString( string category, string alias, string weapon = "" )
+{
+ entity player = GetUIPlayer()
+ if ( player == null )
+ return "0"
+
+ string statString = GetStatVar( category, alias, weapon )
+ float savedHours = expect float( player.GetPersistentVar( statString ) )
+
+ return HoursToTimeString( savedHours )
+}
+
+string function HoursToTimeString( float savedHours )
+{
+ string timeString
+ local minutes = floor( savedHours * 60.0 )
+
+ if ( minutes < 0 )
+ minutes = 0
+
+ int days = 0
+ int hours = 0
+
+ // For archiving code, i would like to keep this code here
+ // It is a testament to Respawn's hubris and determination to writing the absolutely worst fucking code ever
+ // These motherfuckers managed to run an O(1) operation in O(n) time. Genuinely impressive.
+ // while ( minutes >= 1440 )
+ // {
+ // minutes -= 1440
+ // days++
+ // }
+ //
+ // while ( minutes >= 60 )
+ // {
+ // minutes -= 60
+ // hours++
+ // }
+
+ days = int(floor(minutes / 1440))
+ minutes = minutes % 1440
+
+ hours = int(floor(minutes / 60))
+ minutes = minutes % 60
+
+ if ( days > 0 && hours > 0 && minutes > 0 )
+ {
+ timeString = Localize( "#STATS_TIME_STRING_D_H_M", days, hours, minutes )
+ }
+ else if ( days > 0 && hours == 0 && minutes == 0 )
+ {
+ timeString = Localize( "#STATS_TIME_STRING_D", days )
+ }
+ else if ( days == 0 && hours > 0 && minutes == 0 )
+ {
+ timeString = Localize( "#STATS_TIME_STRING_H", hours )
+ }
+ else if ( days == 0 && hours == 0 && minutes >= 0 )
+ {
+ timeString = Localize( "#STATS_TIME_STRING_M", minutes )
+ }
+ else if ( days > 0 && hours > 0 && minutes == 0 )
+ {
+ timeString = Localize( "#STATS_TIME_STRING_D_H", days, hours )
+ }
+ else if ( days == 0 && hours > 0 && minutes > 0 )
+ {
+ timeString = Localize( "#STATS_TIME_STRING_H_M", hours, minutes )
+ }
+ else if ( days > 0 && hours == 0 && minutes > 0 )
+ {
+ timeString = Localize( "#STATS_TIME_STRING_D_M", days, minutes )
+ }
+ else
+ {
+ Assert( 0, "Unhandled time string creation case" )
+ }
+
+ return timeString
+}
+
+string function PieChartHoursToTimeString( float savedHours, string pieChartHeader, string pieChartPercent )
+{
+ string timeString
+ local minutes = floor( savedHours * 60.0 )
+
+ if ( minutes < 0 )
+ minutes = 0
+
+ int days = 0
+ int hours = 0
+
+ while ( minutes >= 1440 )
+ {
+ minutes -= 1440
+ days++
+ }
+
+ while ( minutes >= 60 )
+ {
+ minutes -= 60
+ hours++
+ }
+
+ if ( days > 0 && hours > 0 && minutes > 0 )
+ {
+ timeString = Localize( "#STATS_TIME_STRING_D_H_M_PIECHART", days, hours, minutes, Localize( pieChartHeader ), pieChartPercent )
+ }
+ else if ( days > 0 && hours == 0 && minutes == 0 )
+ {
+ timeString = Localize( "#STATS_TIME_STRING_D_PIECHART", days, Localize( pieChartHeader ), pieChartPercent )
+ }
+ else if ( days == 0 && hours > 0 && minutes == 0 )
+ {
+ timeString = Localize( "#STATS_TIME_STRING_H_PIECHART", hours, Localize( pieChartHeader ), pieChartPercent )
+ }
+ else if ( days == 0 && hours == 0 && minutes >= 0 )
+ {
+ timeString = Localize( "#STATS_TIME_STRING_M_PIECHART", minutes, Localize( pieChartHeader ), pieChartPercent )
+ }
+ else if ( days > 0 && hours > 0 && minutes == 0 )
+ {
+ timeString = Localize( "#STATS_TIME_STRING_D_H_PIECHART", days, hours, Localize( pieChartHeader ), pieChartPercent )
+ }
+ else if ( days == 0 && hours > 0 && minutes > 0 )
+ {
+ timeString = Localize( "#STATS_TIME_STRING_H_M_PIECHART", hours, minutes, Localize( pieChartHeader ), pieChartPercent )
+ }
+ else if ( days > 0 && hours == 0 && minutes > 0 )
+ {
+ timeString = Localize( "#STATS_TIME_STRING_D_M_PIECHART", days, minutes, Localize( pieChartHeader ), pieChartPercent )
+ }
+ else
+ {
+ Assert( 0, "Unhandled time string creation case" )
+ }
+
+ return timeString
+}
+
+string function StatToDistanceString( string category, string alias, string weapon = "" )
+{
+ entity player = GetUIPlayer()
+ if ( player == null )
+ return ""
+
+ string statString = GetStatVar( category, alias, weapon )
+ float kilometers = expect float( player.GetPersistentVar( statString ) )
+
+ string formattedNum
+ if ( kilometers % 1 == 0 )
+ formattedNum = format( "%.0f", kilometers )
+ else
+ formattedNum = format( "%.2f", kilometers )
+
+ string distString = Localize( "#STATS_KILOMETERS_ABBREVIATION", formattedNum )
+
+ return distString
+}
+
+int function ComparePieChartEntryValues( PieChartEntry a, PieChartEntry b )
+{
+ float aVal = a.numValue
+ float bVal = b.numValue
+
+ if ( aVal < bVal )
+ return 1
+ else if ( aVal > bVal )
+ return -1
+
+ return 0
+}
+
+void function SetStatBoxDisplay( var vguiElem, string text, string value )
+{
+ var rui = Hud_GetRui( vguiElem )
+
+ RuiSetString( rui, "statText", text )
+ RuiSetString( rui, "statValue", value )
+}
+
+void function SetMedalStatBoxDisplay( var vguiElem, string text, asset image, int value )
+{
+ var rui = Hud_GetRui( vguiElem )
+
+ RuiSetString( rui, "statText", text )
+ RuiSetString( rui, "statValue", string( value ) )
+ RuiSetImage( rui, "statImage", image )
+} \ No newline at end of file