From 9a96d0bff56f1969c68bb52a2f33296095bdc67d Mon Sep 17 00:00:00 2001 From: BobTheBob <32057864+BobTheBob9@users.noreply.github.com> Date: Tue, 31 Aug 2021 23:14:58 +0100 Subject: move to new mod format --- .../scripts/vscripts/ui/menu_match_settings.nut | 468 +++++++++++++++++++++ 1 file changed, 468 insertions(+) create mode 100644 Northstar.Client/mod/scripts/vscripts/ui/menu_match_settings.nut (limited to 'Northstar.Client/mod/scripts/vscripts/ui/menu_match_settings.nut') diff --git a/Northstar.Client/mod/scripts/vscripts/ui/menu_match_settings.nut b/Northstar.Client/mod/scripts/vscripts/ui/menu_match_settings.nut new file mode 100644 index 000000000..fb6cde1a9 --- /dev/null +++ b/Northstar.Client/mod/scripts/vscripts/ui/menu_match_settings.nut @@ -0,0 +1,468 @@ +untyped + +global function InitMatchSettingsMenu + +global function UpdateMatchSettingsForGamemode +global function MatchSettings_FormatPlaylistVarValue + +global const table< string, string > MatchSettings_PlaylistVarLabels = { + match_visibility = "#PM_MATCH_VISIBILITY", + roundscorelimit = "#PM_SCORE_LIMIT", + scorelimit = "#PM_SCORE_LIMIT", + roundtimelimit = "#PM_TIME_LIMIT", + timelimit = "#PM_TIME_LIMIT", + boosts_enabled = "#PM_PILOT_BOOSTS", + earn_meter_pilot_overdrive = "#PM_PILOT_OVERDRIVE", + earn_meter_pilot_multiplier = "#PM_PILOT_EARN", + pilot_health_multiplier = "#PM_PILOT_HEALTH", + respawn_delay = "#PM_PILOT_RESPAWN_DELAY", + riff_titan_availability = "#PM_TITAN_AVAILABILITY", + earn_meter_titan_multiplier = "#PM_TITAN_EARN", +} + +struct PlaylistVarValueFormat +{ + string localizeStr + string formatStr + table< int, string > enumStrs +} + +const string FORMAT_PERCENTAGE = "%d%%" + +struct { + var menu = null + var matchVisibilityButton = null + var scoreLimitButton = null + var scoreLimitLabel = null + var timeLimitButton = null + var timeLimitLabel = null + var pilotBoostsButton = null + var pilotOverdriveButton = null + var pilotEarnButton = null + var pilotEarnLabel = null + var pilotHealthButton = null + var pilotHealthLabel = null + var pilotRespawnDelayButton = null + var pilotRespawnDelayLabel = null + var titanAvailabilityButton = null + var titanEarnButton = null + var titanEarnLabel = null + var gameModeLabel = null + var matchSettingDescLabel = null + string modeSettingsName + bool isModeRoundBased + table< string, PlaylistVarValueFormat > playlistVarValueFormats +} file + +struct +{ + table< string, float > timelimit = { + min = 1.0, + max = 40.0, + step = 1.0, + } + + // pilot + table< string, float > pilot_health_multiplier = { + min = 0.25, + max = 5.0, + step = 0.25, + } + + table< string, float > respawn_delay = { + min = 0.0, + max = 40.0, + step = 0.5, + } + + table< string, float > earn_meter_pilot_multiplier = { + min = 0.25, + max = 5.0, + step = 0.25, + } + + // titan + table< string, float > earn_meter_titan_multiplier = { + min = 0.25, + max = 5.0, + step = 0.25, + } + + // gamemode + table< string, table< string, float > > scorelimit = { + at = { + min = 4000.0, + max = 6000.0, + step = 200.0, + } + ctf = { + min = 2.0, + max = 10.0, + step = 1.0, + }, + lts = { + min = 2.0, + max = 9.0, + step = 1.0, + }, + cp = { + min = 150.0, + max = 750.0, + step = 50.0, + }, + mfd = { + min = 1.0, + max = 25.0, + step = 2.0, + }, + } +} customMatchSettings + +void function InitMatchSettingsMenu() +{ + RegisterUIVarChangeCallback( "privatematch_starting", Privatematch_starting_Changed ) + + var menu = GetMenu( "MatchSettingsMenu" ) + file.menu = menu + + AddMenuEventHandler( menu, eUIEvent.MENU_OPEN, OnOpenMatchSettingsMenu ) + AddMenuEventHandler( menu, eUIEvent.MENU_NAVIGATE_BACK, OnMatchSettingsMenu_NavigateBack ) + + file.matchVisibilityButton = Hud_GetChild( menu, "BtnMatchVisibility" ) + SetButtonRuiText( file.matchVisibilityButton, MatchSettings_PlaylistVarLabels["match_visibility"] ) + PlaylistVarValueFormat matchVisibilityFormat = { + enumStrs = { + [MATCHVISIBILITY_PRIVATE] = "#MATCH_VISIBILITY_PRIVATE", + [MATCHVISIBILITY_LOCKED] = "#MATCH_VISIBILITY_LOCKED", + }, + ... + } + file.playlistVarValueFormats["match_visibility"] <- matchVisibilityFormat + foreach ( int enum_, string val in matchVisibilityFormat.enumStrs ) + Hud_DialogList_AddListItem( file.matchVisibilityButton, val, string( enum_ ) ) + + file.scoreLimitButton = Hud_GetChild( menu, "BtnScoreLimit" ) + Hud_AddEventHandler( file.scoreLimitButton, UIE_CHANGE, SetScoreLimitText ) + SetButtonRuiText( Hud_GetChild( file.scoreLimitButton, "BtnDropButton" ), MatchSettings_PlaylistVarLabels["scorelimit"] ) + file.scoreLimitLabel = Hud_GetChild( menu, "LblScoreLimit" ) + PlaylistVarValueFormat roundScoreLimitFormat = { + localizeStr = "#N_ROUND_WINS", + ... + } + file.playlistVarValueFormats["roundscorelimit"] <- roundScoreLimitFormat + PlaylistVarValueFormat scoreLimitFormat = { + localizeStr = "#N_POINTS", + ... + } + file.playlistVarValueFormats["scorelimit"] <- scoreLimitFormat + + file.timeLimitButton = Hud_GetChild( menu, "BtnTimeLimit" ) + Hud_AddEventHandler( file.timeLimitButton, UIE_CHANGE, SetTimeLimitText ) + SetButtonRuiText( Hud_GetChild( file.timeLimitButton, "BtnDropButton" ), MatchSettings_PlaylistVarLabels["timelimit"] ) + file.timeLimitLabel = Hud_GetChild( menu, "LblTimeLimit" ) + PlaylistVarValueFormat roundTimeLimitFormat = { + localizeStr = "#N_MINUTE_ROUNDS", + ... + } + file.playlistVarValueFormats["roundtimelimit"] <- roundTimeLimitFormat + PlaylistVarValueFormat timeLimitFormat = { + localizeStr = "#N_MINUTES", + ... + } + file.playlistVarValueFormats["timelimit"] <- timeLimitFormat + + // pilot + + file.pilotBoostsButton = Hud_GetChild( menu, "BtnPilotBoosts" ) + SetButtonRuiText( file.pilotBoostsButton, MatchSettings_PlaylistVarLabels["boosts_enabled"] ) + PlaylistVarValueFormat pilotBoostsFormat = { + enumStrs = { + [eBoostAvailability.Default] = "#PILOT_BOOSTS_DEFAULT", + [eBoostAvailability.Disabled] = "#PILOT_BOOSTS_DISABLED", + }, + ... + } + file.playlistVarValueFormats["boosts_enabled"] <- pilotBoostsFormat + foreach ( int enum_, string val in pilotBoostsFormat.enumStrs ) + Hud_DialogList_AddListItem( file.pilotBoostsButton, val, string( enum_ ) ) + + file.pilotOverdriveButton = Hud_GetChild( menu, "BtnPilotOverdrive" ) + SetButtonRuiText( file.pilotOverdriveButton, MatchSettings_PlaylistVarLabels["earn_meter_pilot_overdrive"] ) + PlaylistVarValueFormat pilotOverdriveFormat = { + enumStrs = { + [ePilotOverdrive.Enabled] = "#PILOT_OVERDRIVE_ON", + [ePilotOverdrive.Disabled] = "#PILOT_OVERDRIVE_OFF", + [ePilotOverdrive.Only] = "#PILOT_OVERDRIVE_ONLY", + }, + ... + } + file.playlistVarValueFormats["earn_meter_pilot_overdrive"] <- pilotOverdriveFormat + foreach ( int enum_, string val in pilotOverdriveFormat.enumStrs ) + Hud_DialogList_AddListItem( file.pilotOverdriveButton, val, string( enum_ ) ) + + file.pilotEarnButton = Hud_GetChild( menu, "BtnPilotEarn" ) + Hud_AddEventHandler( file.pilotEarnButton, UIE_CHANGE, SetPilotEarnText ) + SetButtonRuiText( Hud_GetChild( file.pilotEarnButton, "BtnDropButton" ), MatchSettings_PlaylistVarLabels["earn_meter_pilot_multiplier"] ) + file.pilotEarnLabel = Hud_GetChild( menu, "LblPilotEarn" ) + PlaylistVarValueFormat pilotEarnFormat = { + formatStr = FORMAT_PERCENTAGE, + ... + } + file.playlistVarValueFormats["earn_meter_pilot_multiplier"] <- pilotEarnFormat + + file.pilotHealthButton = Hud_GetChild( menu, "BtnPilotHealth" ) + Hud_AddEventHandler( file.pilotHealthButton, UIE_CHANGE, SetPilotHealthText ) + SetButtonRuiText( Hud_GetChild( file.pilotHealthButton, "BtnDropButton" ), MatchSettings_PlaylistVarLabels["pilot_health_multiplier"] ) + file.pilotHealthLabel = Hud_GetChild( menu, "LblPilotHealth" ) + PlaylistVarValueFormat pilotHealthFormat = { + formatStr = FORMAT_PERCENTAGE, + ... + } + file.playlistVarValueFormats["pilot_health_multiplier"] <- pilotHealthFormat + + file.pilotRespawnDelayButton = Hud_GetChild( menu, "BtnPilotRespawnDelay" ) + Hud_AddEventHandler( file.pilotRespawnDelayButton, UIE_CHANGE, SetPilotRespawnDelayText ) + SetButtonRuiText( Hud_GetChild( file.pilotRespawnDelayButton, "BtnDropButton" ), MatchSettings_PlaylistVarLabels["respawn_delay"] ) + file.pilotRespawnDelayLabel = Hud_GetChild( menu, "LblPilotRespawnDelay" ) + PlaylistVarValueFormat pilotRespawnDelayFormat = { + localizeStr = "#N_SECONDS", + formatStr = "%2.1f", + ... + } + file.playlistVarValueFormats["respawn_delay"] <- pilotRespawnDelayFormat + + // titan + + file.titanAvailabilityButton = Hud_GetChild( menu, "BtnTitanAvailability" ) + SetButtonRuiText( file.titanAvailabilityButton, MatchSettings_PlaylistVarLabels["riff_titan_availability"] ) + PlaylistVarValueFormat titanAvailabilityFormat = { + enumStrs = { + [eTitanAvailability.Default] = "#TITAN_AVAILABILITY_DEFAULT", + [eTitanAvailability.Never] = "#TITAN_AVAILABILITY_NEVER", + }, + ... + } + file.playlistVarValueFormats["riff_titan_availability"] <- titanAvailabilityFormat + foreach ( int enum_, string val in titanAvailabilityFormat.enumStrs ) + Hud_DialogList_AddListItem( file.titanAvailabilityButton, val, string( enum_ ) ) + + file.titanEarnButton = Hud_GetChild( menu, "BtnTitanEarn" ) + Hud_AddEventHandler( file.titanEarnButton, UIE_CHANGE, SetTitanEarnText ) + SetButtonRuiText( Hud_GetChild( file.titanEarnButton, "BtnDropButton" ), MatchSettings_PlaylistVarLabels["earn_meter_titan_multiplier"] ) + file.titanEarnLabel = Hud_GetChild( menu, "LblTitanEarn" ) + PlaylistVarValueFormat titanEarnFormat = { + formatStr = FORMAT_PERCENTAGE, + ... + } + file.playlistVarValueFormats["earn_meter_titan_multiplier"] <- titanEarnFormat + + file.gameModeLabel = Hud_GetChild( menu, "LblModeSubheaderText" ) + + file.matchSettingDescLabel = Hud_GetChild( menu, "LblMenuItemDescription" ) + + AddDescFocusHandler( file.matchVisibilityButton, "#PM_DESC_MATCH_VISIBILITY" ) + AddDescFocusHandler( file.scoreLimitButton, "#PM_DESC_SCORE_LIMIT" ) + AddDescFocusHandler( file.timeLimitButton, "#PM_DESC_TIME_LIMIT" ) + AddDescFocusHandler( file.pilotBoostsButton, "#PM_DESC_PILOT_BOOSTS" ) + AddDescFocusHandler( file.pilotOverdriveButton, "#PM_DESC_PILOT_OVERDRIVE" ) + AddDescFocusHandler( file.pilotEarnButton, "#PM_DESC_PILOT_EARN" ) + AddDescFocusHandler( file.pilotHealthButton, "#PM_DESC_PILOT_HEALTH" ) + AddDescFocusHandler( file.pilotRespawnDelayButton, "#PM_DESC_PILOT_RESPAWN_DELAY" ) + AddDescFocusHandler( file.titanAvailabilityButton, "#PM_DESC_TITAN_AVAILABILITY" ) + AddDescFocusHandler( file.titanEarnButton, "#PM_DESC_TITAN_EARN" ) + + AddMenuFooterOption( menu, BUTTON_B, "#B_BUTTON_BACK", "#BACK" ) + AddMenuFooterOption( menu, BUTTON_Y, "#Y_BUTTON_RESTORE_DEFAULTS", "#RESTORE_DEFAULTS", ResetMatchSettingsToDefaultDialog ) +} + +void function SetControlGamemodeAndPlaylistVar( var button, int gamemodeIdx, string playlistVar ) +{ + Hud_SetGamemodeIdx( button, gamemodeIdx ) + Hud_SetPlaylistVarName( button, playlistVar ) +} + +void function UpdateMatchSettingsForGamemode() +{ + file.modeSettingsName = PrivateMatch_GetSelectedMode() + Hud_SetText( file.gameModeLabel, GetGameModeDisplayName( file.modeSettingsName ) ) + + Hud_SetPlaylistVarName( file.matchVisibilityButton, "match_visibility" ) + SetGameModeSettings() + + int gamemodeIdx = expect int( level.ui.privatematch_mode ) + + // pilot + + SetControlGamemodeAndPlaylistVar( file.pilotBoostsButton, gamemodeIdx, "boosts_enabled" ) + SetControlGamemodeAndPlaylistVar( file.pilotOverdriveButton, gamemodeIdx, "earn_meter_pilot_overdrive" ) + SetSliderSettings( file.pilotHealthButton, customMatchSettings.pilot_health_multiplier, gamemodeIdx, "pilot_health_multiplier" ) + SetSliderSettings( file.pilotRespawnDelayButton, customMatchSettings.respawn_delay, gamemodeIdx, "respawn_delay" ) + SetSliderSettings( file.pilotEarnButton, customMatchSettings.earn_meter_pilot_multiplier, gamemodeIdx, "earn_meter_pilot_multiplier" ) + + // titan + + SetControlGamemodeAndPlaylistVar( file.titanAvailabilityButton, gamemodeIdx, "riff_titan_availability" ) + SetSliderSettings( file.titanEarnButton, customMatchSettings.earn_meter_titan_multiplier, gamemodeIdx, "earn_meter_titan_multiplier" ) +} + +void function OnOpenMatchSettingsMenu() +{ + UpdateMatchSettingsForGamemode() + Hud_SetFocused( file.matchVisibilityButton ) +} + +void function OnMatchSettingsMenu_NavigateBack() +{ + CloseActiveMenu() +} + +function Privatematch_starting_Changed() +{ + if ( GetActiveMenu() == file.menu ) + CloseActiveMenu() +} + +void function SetSliderSettings( var button, table< string, float > settings, int gamemodeIdx, string playlistVar ) +{ + Hud_SliderControl_SetStepSize( button, settings.step ) + Hud_SliderControl_SetMin( button, settings.min ) + Hud_SliderControl_SetMax( button, settings.max ) + Hud_SetGamemodeIdx( button, gamemodeIdx ) + Hud_SetPlaylistVarName( button, playlistVar ) + // TODO: the label should be part of the SliderControl, so there is a direct + // reference between the elements that make up the control. See the callbacks + // listening for this event and find that they have to specify their elements + // explicity as opposed to generically referencing releative child element(s). + // XXX: fire the change event to update a label with the current value + Hud_HandleEvent( button, UIE_CHANGE ) +} + +void function SetGameModeSettings() +{ + table< string, float > scoreSettings = { + min = -1.0, + max = -1.0, + step = -1.0, + } + if ( file.modeSettingsName in customMatchSettings.scorelimit ) + scoreSettings = customMatchSettings.scorelimit[file.modeSettingsName] + + int gamemodeIdx = expect int( level.ui.privatematch_mode ) + string scoreLimitVar = "roundscorelimit" + string scoreLimitStr = GetCurrentPlaylistGamemodeByIndexVar( gamemodeIdx, scoreLimitVar, false ) + string timeLimitVar = "roundtimelimit" + if ( scoreLimitStr.len() ) + { + file.isModeRoundBased = true + } + else + { + file.isModeRoundBased = false + scoreLimitVar = "scorelimit" + scoreLimitStr = GetCurrentPlaylistGamemodeByIndexVar( gamemodeIdx, scoreLimitVar, false ) + timeLimitVar = "timelimit" + } + + int scoreLimit = scoreLimitStr.len() ? int( scoreLimitStr ) : 100; + if ( scoreSettings.min <= 0 ) + { + scoreSettings.min = max( scoreLimit / 5.0, 1.0 ) + scoreSettings.max = max( scoreLimit + (scoreLimit - scoreSettings.min), 1.0 ) + scoreSettings.step = scoreSettings.min + } + + SetSliderSettings( file.scoreLimitButton, scoreSettings, gamemodeIdx, scoreLimitVar ) + + table< string, float > timeSettings = customMatchSettings.timelimit + SetSliderSettings( file.timeLimitButton, timeSettings, gamemodeIdx, timeLimitVar ) +} + +string function MatchSettings_FormatPlaylistVarValue( string playlistVar, float value ) +{ + if ( !(playlistVar in file.playlistVarValueFormats) ) + return "#" + playlistVar + " unknown" + + PlaylistVarValueFormat fmt = file.playlistVarValueFormats[playlistVar] + if ( fmt.formatStr.len() ) + { + if ( fmt.formatStr == FORMAT_PERCENTAGE ) + return format( fmt.formatStr, int( value * 100 ) ) + else + return Localize( fmt.localizeStr, format( fmt.formatStr, value ) ) + } + + if ( fmt.enumStrs.len() ) + return Localize( fmt.enumStrs[int( value )] ) + + return Localize( fmt.localizeStr, int( value ) ) +} + +void function SetScoreLimitText( var button ) +{ + string playlistVar = file.isModeRoundBased ? "roundscorelimit" : "scorelimit" + float scoreLimit = Hud_SliderControl_GetCurrentValue( button ) + string labelText = MatchSettings_FormatPlaylistVarValue( playlistVar, scoreLimit ) + Hud_SetText( file.scoreLimitLabel, labelText ) +} + +void function SetTimeLimitText( var button ) +{ + string playlistVar = file.isModeRoundBased ? "roundtimelimit" : "timelimit" + float timeLimit = Hud_SliderControl_GetCurrentValue( button ) + string labelText = MatchSettings_FormatPlaylistVarValue( playlistVar, timeLimit ) + Hud_SetText( file.timeLimitLabel, labelText ) +} + +void function SetPilotHealthText( var button ) +{ + float healthMultiplier = Hud_SliderControl_GetCurrentValue( button ) + string labelText = MatchSettings_FormatPlaylistVarValue( "pilot_health_multiplier", healthMultiplier ) + Hud_SetText( file.pilotHealthLabel, labelText ) +} + +void function SetPilotRespawnDelayText( var button ) +{ + float respawnDelay = Hud_SliderControl_GetCurrentValue( button ) + string labelText = MatchSettings_FormatPlaylistVarValue( "respawn_delay", respawnDelay ) + Hud_SetText( file.pilotRespawnDelayLabel, labelText ) +} + +void function SetPilotEarnText( var button ) +{ + float earnMultiplier = Hud_SliderControl_GetCurrentValue( button ) + string labelText = MatchSettings_FormatPlaylistVarValue( "earn_meter_pilot_multiplier", earnMultiplier ) + Hud_SetText( file.pilotEarnLabel, labelText ) +} + +void function SetTitanEarnText( var button ) +{ + float earnMultiplier = Hud_SliderControl_GetCurrentValue( button ) + string labelText = MatchSettings_FormatPlaylistVarValue( "earn_meter_titan_multiplier", earnMultiplier ) + Hud_SetText( file.titanEarnLabel, labelText ) +} + +void function AddDescFocusHandler( var button, string descText ) +{ + button.s.descText <- descText + Hud_AddEventHandler( button, UIE_GET_FOCUS, MatchSettingsFocusUpdate ) + if ( !Hud_HasChild( button, "BtnDropButton" ) ) + return + + var child = Hud_GetChild( button, "BtnDropButton" ) + child.s.descText <- descText + Hud_AddEventHandler( child, UIE_GET_FOCUS, MatchSettingsFocusUpdate ) + + child = Hud_GetChild( button, "PnlDefaultMark" ) + child.SetColor( [0,0,0,0] ) + Hud_Hide( child ) +} + +void function MatchSettingsFocusUpdate( var button ) +{ + RuiSetString( Hud_GetRui( file.matchSettingDescLabel ), "description", button.s.descText ) +} + +void function ResetMatchSettingsToDefaultDialog( var button ) +{ + ClientCommand( "ResetMatchSettingsToDefault" ) +} -- cgit v1.2.3