aboutsummaryrefslogtreecommitdiff
path: root/Northstar.Custom/scripts/vscripts/client/cl_gamestate.gnut
diff options
context:
space:
mode:
authorBobTheBob <32057864+BobTheBob9@users.noreply.github.com>2021-08-31 23:14:58 +0100
committerBobTheBob <32057864+BobTheBob9@users.noreply.github.com>2021-08-31 23:14:58 +0100
commit9a96d0bff56f1969c68bb52a2f33296095bdc67d (patch)
tree4175928e488632705692e3cccafa1a38dd854615 /Northstar.Custom/scripts/vscripts/client/cl_gamestate.gnut
parent27bd240871b7c0f2f49fef137718b2e3c208e3b4 (diff)
downloadNorthstarMods-9a96d0bff56f1969c68bb52a2f33296095bdc67d.tar.gz
NorthstarMods-9a96d0bff56f1969c68bb52a2f33296095bdc67d.zip
move to new mod format
Diffstat (limited to 'Northstar.Custom/scripts/vscripts/client/cl_gamestate.gnut')
-rw-r--r--Northstar.Custom/scripts/vscripts/client/cl_gamestate.gnut1119
1 files changed, 0 insertions, 1119 deletions
diff --git a/Northstar.Custom/scripts/vscripts/client/cl_gamestate.gnut b/Northstar.Custom/scripts/vscripts/client/cl_gamestate.gnut
deleted file mode 100644
index 93be01ea..00000000
--- a/Northstar.Custom/scripts/vscripts/client/cl_gamestate.gnut
+++ /dev/null
@@ -1,1119 +0,0 @@
-untyped
-
-global function ClGameState_Init
-global function ClGameState_Think
-global function ClGameState_GetRui
-global function ClGameState_RegisterNetworkFunctions
-global function ClGameState_SetInfoStatusText
-
-global function ServerCallback_AnnounceWinner
-global function ServerCallback_AnnounceRoundWinner
-
-global function ShowRoundScoresInAnnouncement
-
-global function PlayRoundWonConversationWithAnnouncementDelay
-
-global function UpdatePilotTitanStatusDisplay
-global function UpdatePilotTitanStatusDisplayWithCount
-
-global function SetGameModeScoreBarUpdateRules
-global function SetGameModeScoreBarUpdateRulesWithFlags
-
-global function DisplayPostMatchTop3
-
-global function GetGameStartTime
-
-global function ClGameState_RegisterGameStateAsset
-
-global function ClGameState_SetPilotTitanStatusCallback
-global function GetPilotTitanStatusForPlayer
-
-global enum ePlayerStatusType
-{
- PTS_TYPE_NONE,
- PTS_TYPE_DEAD,
- PTS_TYPE_DEAD_PILOT_TITAN,
- PTS_TYPE_DEAD_READY,
- PTS_TYPE_PILOT,
- PTS_TYPE_READY,
- PTS_TYPE_PILOT_TITAN,
- PTS_TYPE_EVAC,
- PTS_TYPE_ION,
- PTS_TYPE_SCORCH,
- PTS_TYPE_RONIN,
- PTS_TYPE_TONE,
- PTS_TYPE_LEGION,
- PTS_TYPE_NORTHSTAR,
- PTS_TYPE_VANGUARD,
- PTS_TYPE_WAVE_READY,
- PTS_TYPE_WAVE_NOT_READY,
- PTS_TYPE_COUNT,
-}
-
-struct PilotTitanStatus
-{
- int playerCount
- int[8] slotTypes
-}
-
-global enum sbflag
-{
- SKIP_STANDARD_UPDATE = (1<<0),
- _count = 1
-}
-
-struct
-{
- var gamestate_info
- var letterBoxRui = null
- bool thirtySecondWarningDone = false
-
- void functionref( var ) gameModeScoreBarUpdateRules
- int gameModeScoreBarUpdateFlags = 0
-
- table< int, PilotTitanStatus> pilotTitanStatus
- int functionref( entity,int ) pilotTitanStatusCallback
-
- asset gameStateRuiAsset = $""
-} file
-
-
-const DEV_COUNTDOWNTIMER = 0//turn on to see the countdown timer to match starts - helps with lining up intros
-
-function ClGameState_Init()
-{
- RegisterSignal( "GameStateChanged" )
- RegisterServerVarChangeCallback( "gameState", ClGameState_Changed )
- RegisterServerVarChangeCallback( "badRepPresent", UpdateScoreboardBadRepPresentMessage )
-
- AddCallback_OnClientScriptInit( ClGameState_AddClient )
-
- var rui = CreatePermanentCockpitRui( GetGameStateAsset(), MINIMAP_Z_BASE - 1 )
- file.gamestate_info = rui
-
- if ( file.gameModeScoreBarUpdateRules == null )
- SetGameModeScoreBarUpdateRules( GameModeScoreBarUpdateRules_Default )
-}
-
-void function GameModeScoreBarUpdateRules_Default( var rui )
-{
-}
-
-void function SetGameModeScoreBarUpdateRulesWithFlags( void functionref( var ) rules, int sbflags )
-{
- file.gameModeScoreBarUpdateRules = rules
- file.gameModeScoreBarUpdateFlags = sbflags
-}
-
-void function SetGameModeScoreBarUpdateRules( void functionref( var ) rules )
-{
- SetGameModeScoreBarUpdateRulesWithFlags( rules, 0 )
-}
-
-void function ClGameState_RegisterNetworkFunctions()
-{
- RegisterNetworkedVariableChangeCallback_int( "gameInfoStatusText", ClGameState_UpdateInfoStatusText )
-}
-
-void function ClGameState_UpdateInfoStatusText( entity player, int oldValue, int newValue, bool actuallyChanged )
-{
- printt( "UPDATE", player, oldValue, newValue )
-
- if ( newValue == -1 )
- {
- RuiSetString( file.gamestate_info, "statusText", "" )
- return
- }
-
- string statusText = GetStringFromNetworkableID( newValue )
- printt( "SET", player, statusText, Localize( statusText ) )
- RuiSetString( file.gamestate_info, "statusText", Localize( statusText ) )
-}
-
-
-void function ClGameState_SetInfoStatusText( string statusText )
-{
- RuiSetString( file.gamestate_info, "statusText", Localize( statusText ) )
-}
-
-
-asset function GetGameStateAsset()
-{
- if ( GAMETYPE == ATTRITION )
- return $"ui/gamestate_info_at.rpak"
-
- if ( GAMETYPE == FREE_AGENCY )
- return $"ui/gamestate_info_fra.rpak"
-
- if ( GAMETYPE == FFA )
- return $"ui/gamestate_info_ffa.rpak"
-
- if ( GAMETYPE == FORT_WAR )
- return $"ui/gamestate_info_fw.rpak"
-
- if ( GAMETYPE == LAST_TITAN_STANDING )
- return $"ui/gamestate_info_lts.rpak"
-
- if ( GAMETYPE == LTS_BOMB )
- return $"ui/gamestate_info_lts_bomb.rpak"
-
- if ( GAMETYPE == CAPTURE_POINT )
- return $"ui/gamestate_info_cp.rpak"
-
- if ( GAMETYPE == PILOT_SKIRMISH )
- return $"ui/gamestate_info_ps.rpak"
-
- if ( GAMETYPE == COLISEUM )
- return $"ui/gamestate_info_coliseum.rpak"
-
- if ( GAMETYPE == SPEEDBALL )
- return $"ui/gamestate_info_speedball.rpak"
-
- if ( GAMETYPE == MARKED_FOR_DEATH )
- return $"ui/gamestate_info_mfd.rpak"
-
- if ( file.gameStateRuiAsset != $"" )
- return file.gameStateRuiAsset
-
- return $"ui/gamestate_info.rpak"
-}
-
-void function ClGameState_RegisterGameStateAsset( asset gameStateAsset )
-{
- file.gameStateRuiAsset = gameStateAsset
-}
-
-void function ClGameState_AddClient( entity player )
-{
- player.cv.scoreboardBadRepPresentMessage <- HudElement( "ScoreboardBadRepPresentMessage", HudElement( "Scoreboard" ) )
-
- #if PC_PROG
- player.cv.scoreboardBadRepPresentMessage.SetText( "#ASTERISK_FAIRFIGHT_CHEATER" )
- #else
- player.cv.scoreboardBadRepPresentMessage.SetText( "#ASTERISK_BAD_REPUTATION" )
- #endif
-
- player.cv.hudCheaterMessage <- HudElement( "HudCheaterMessage" )
- if ( !Durango_IsDurango() && !IsLobby() && player.HasBadReputation() )
- player.cv.hudCheaterMessage.Show()
- else
- player.cv.hudCheaterMessage.Hide()
-}
-
-
-var function ClGameState_GetRui()
-{
- return file.gamestate_info
-}
-
-
-void function ClGameState_Think()
-{
- entity player = GetLocalClientPlayer()
-
- TEMP_UpdateRuiScores( player )
- switch( GetGameState() )
- {
- case eGameState.WaitingForPlayers:
- ClGameStateThink_WaitingForPlayers( player )
- break
-
- case eGameState.PickLoadout:
- ClGameStateThink_PickLoadOut( player )
- break
-
- case eGameState.Prematch:
- ClGameStateThink_Prematch( player )
- break
-
- case eGameState.Playing:
- ClGameStateThink_Playing( player )
- break
-
- case eGameState.SwitchingSides:
- ClGameStateThink_SwitchingSides( player )
- break
-
- case eGameState.Postmatch:
- ClGameStateThink_Postmatch( player )
- break
- }
-}
-
-
-void function ClGameStateThink_Prematch( entity player )
-{
- string factionChoice = GetFactionChoice( player )
- ItemDisplayData displayData = GetItemDisplayData( factionChoice )
- asset factionLogo = displayData.image
- string factionTitle = displayData.name
-
- RuiSetImage( ClGameState_GetRui(), "factionImage", factionLogo )
-
- //removing countdown timer all together
- if ( !DEV_COUNTDOWNTIMER )
- return
-
- local timeRemaining = ceil( level.nv.gameStartTime - Time() )
-
- player.cv.prematchTimer.Show()
- player.cv.prematchTimerGlow.Show()
- player.cv.prematchDesc.Show()
-
- player.cv.prematchTimer.SetText( string( timeRemaining ) )
- player.cv.prematchTimerGlow.SetText( string( timeRemaining ) )
-}
-
-void function ClGameStateThink_WaitingForPlayers( player )
-{
- int reservedCount
- int connectingCount
- int loadingCount
- if ( IsFFAGame() )
- {
- reservedCount = GetTotalPendingPlayersReserved()
- connectingCount = GetTotalPendingPlayersConnecting()
- loadingCount = GetTotalPendingPlayersLoading()
- }
- else
- {
- reservedCount = GetTeamPendingPlayersReserved( TEAM_MILITIA ) + GetTeamPendingPlayersReserved( TEAM_IMC )
- connectingCount = GetTeamPendingPlayersConnecting( TEAM_MILITIA ) + GetTeamPendingPlayersConnecting( TEAM_IMC )
- loadingCount = GetTeamPendingPlayersLoading( TEAM_MILITIA ) + GetTeamPendingPlayersLoading( TEAM_IMC )
- }
-
- int connectedCount = GetPlayerArray().len()
- int allKnownPlayersCount = reservedCount + connectingCount + loadingCount + connectedCount
- int minPlayers = GetCurrentPlaylistVarInt( "min_players", 0 )
- int expectedPlayers = maxint( minPlayers, allKnownPlayersCount )
-
- if ( !("lastTimeRemaining" in player.cv) )
- player.cv.lastTimeRemaining <- null
-
- if ( Time() <= level.nv.connectionTimeout )
- {
- local timeRemainingFloat = level.nv.connectionTimeout - Time()
- local timeRemaining = ceil( timeRemainingFloat )
-
- //player.cv.waitingForPlayersDesc.SetText( "#HUD_WAITING_FOR_PLAYERS", connectedCount, expectedPlayers, timeRemaining )
- //player.cv.waitingForPlayersDesc.Show()
-
- if ( player.cv.lastTimeRemaining && timeRemaining != player.cv.lastTimeRemaining )
- EmitSoundOnEntity( player, WAITING_FOR_PLAYERS_COUNTDOWN_SOUND )
-
- player.cv.lastTimeRemaining = timeRemaining
- }
- else
- {
- //player.cv.waitingForPlayersDesc.SetText( "#HUD_WAITING_FOR_PLAYERS", connectedCount, expectedPlayers, "" )
- //player.cv.waitingForPlayersDesc.Show()
- }
-}
-
-void function ClGameStateThink_PickLoadOut( entity player )
-{
- if ( IsMultiplayerPlaylist() && ClassicMP_Client_GetGameStateThinkFunc_PickLoadOut() != null )
- ClassicMP_Client_GetGameStateThinkFunc_PickLoadOut()( player )
-}
-
-entity function GetTopCompetitor( int team )
-{
- array<entity> players = GetPlayerArrayOfEnemies( team )
-
- entity topCompetitor
- foreach ( player in players )
- {
- if ( !topCompetitor || (GameRules_GetTeamScore( player.GetTeam()) ) > GameRules_GetTeamScore( topCompetitor.GetTeam()) )
- topCompetitor = player
- }
-
- return topCompetitor
-}
-
-
-string function GetTopCompetitorName( int team )
-{
- entity topCompetitor = GetTopCompetitor( team )
- return topCompetitor != null ? topCompetitor.GetPlayerName() : "None"
-}
-
-
-int function GetTopCompetitorTeam( int team )
-{
- entity topCompetitor = GetTopCompetitor( team )
- return topCompetitor != null ? topCompetitor.GetTeam() : 0
-}
-
-
-void function TEMP_UpdateRuiScores( entity player )
-{
- float endTime
- if ( IsRoundBased() )
- {
- endTime = expect float( level.nv.roundEndTime )
- if (
- GetGameState() == eGameState.Prematch ||
- GetGameState() == eGameState.Playing
- )
- RuiSetString( file.gamestate_info, "roundText", Localize( "#GAMESTATE_ROUND_N", GetRoundsPlayed() + 1 ) )
- }
- else
- {
- endTime = expect float( level.nv.gameEndTime )
- }
-
- RuiSetInt( file.gamestate_info, "maxTeamScore", GetScoreLimit_FromPlaylist() )
- int maxPlayers = GetCurrentPlaylistVarInt( "max_players", 12 )
- RuiSetInt( file.gamestate_info, "maxTeamPlayers", maxPlayers / 2 )
-
- int friendlyTeam = player.GetTeam()
- RuiSetFloat( file.gamestate_info, "leftTeamScore", float( GameRules_GetTeamScore( friendlyTeam ) ) )
-
- UpdatePilotTitanStatusDisplay( friendlyTeam )
-
- int enemyTeam
- if ( IsFFAGame() )
- {
- enemyTeam = GetTopCompetitorTeam( player.GetTeam() )
- RuiSetImage( file.gamestate_info, "friendlyPlayerCardImage", CallsignIcon_GetImage( PlayerCallsignIcon_GetActive( player ) ) )
- array<entity> enemyPlayers = GetPlayerArrayOfTeam( enemyTeam )
- if ( enemyPlayers.len() > 0 )
- RuiSetImage( file.gamestate_info, "enemyPlayerCardImage", CallsignIcon_GetImage( PlayerCallsignIcon_GetActive( enemyPlayers[0] ) ) )
- }
- else
- {
- enemyTeam = friendlyTeam == TEAM_IMC ? TEAM_MILITIA : TEAM_IMC
- }
-
- RuiSetFloat( file.gamestate_info, "rightTeamScore", float( GameRules_GetTeamScore( enemyTeam ) ) )
-
- //Run any gamemode specific score bar logic (e.g. the bonus segment on the scorebar in bounty hunt ). No special logic is run by default.
- file.gameModeScoreBarUpdateRules( file.gamestate_info )
-
- if ( !endTime )
- return
-
- if ( Time() > endTime )
- {
- RuiSetGameTime( file.gamestate_info, "endTime", RUI_BADGAMETIME )
- return
- }
-
- RuiSetGameTime( file.gamestate_info, "endTime", endTime )
-}
-
-
-void function ClGameStateThink_Playing( entity player )
-{
- //TEMP_UpdateRuiScores( player )
-
- local endTime
- if ( IsRoundBased() )
- endTime = level.nv.roundEndTime
- else
- endTime = level.nv.gameEndTime
-
- if ( !endTime )
- return
-
- if ( Time() > endTime )
- return
-
- if ( endTime - Time() > 30.0 )
- return
-
- if ( file.thirtySecondWarningDone )
- return
-
- thread ThirtySecondWarning()
- file.thirtySecondWarningDone = true
-}
-
-
-void function ThirtySecondWarning()
-{
- string conversation = GameMode_GetGameEndingConversation( GameRules_GetGameMode() )
- if ( conversation != "" )
- PlayConversationToLocalClient( conversation )
-
- int lastSecond = -1
- while ( Time() < level.nv.gameEndTime && GetGameState() == eGameState.Playing )
- {
- int second = int( floor( level.nv.gameEndTime - Time() ) )
- if ( lastSecond == -1 )
- {
- lastSecond = second
- }
- else if ( second != lastSecond && second < 30 )
- {
- if ( second > 5 )
- {
- EmitSoundOnEntity( GetLocalClientPlayer(), "HUD_match_start_timer_tick_1P" )
- }
- else if ( second >= 0 )
- {
- EmitSoundOnEntity( GetLocalClientPlayer(), "HUD_match_start_timer_5_seconds_1P" )
- }
- }
-
- lastSecond = second
-
- WaitFrame()
- }
-
- EmitSoundOnEntity( GetLocalClientPlayer(), "HUD_match_start_timer_0_seconds_1P" )
-
-}
-
-
-string function GetTitanClass( entity titan )
-{
- entity soul = titan.GetTitanSoul()
- string settingsName = PlayerSettingsIndexToName( soul.GetPlayerSettingsNum() )
-
- return expect string( Dev_GetPlayerSettingByKeyField_Global( settingsName, "titanCharacterName" ) )
-}
-
-
-array<int> function GetPilotTitanStatusForTeam( int team )
-{
- array<int> statusTypes = [ ePlayerStatusType.PTS_TYPE_NONE, ePlayerStatusType.PTS_TYPE_NONE, ePlayerStatusType.PTS_TYPE_NONE, ePlayerStatusType.PTS_TYPE_NONE, ePlayerStatusType.PTS_TYPE_NONE, ePlayerStatusType.PTS_TYPE_NONE, ePlayerStatusType.PTS_TYPE_NONE, ePlayerStatusType.PTS_TYPE_NONE ]
-
- int playerIndex = 0
- foreach ( teamPlayer in GetPlayerArrayOfTeam( team ) )
- {
- // fix for situations where number of players > 8, which happens in infection
- // could be good to move this to northstar.client at some point, unsure
- if ( playerIndex == statusTypes.len() )
- break
-
- statusTypes[playerIndex] = GetPilotTitanStatusForPlayer( teamPlayer )
- playerIndex++
- }
-
- statusTypes.sort( PilotTitanStatusSort )
-
- return statusTypes
-}
-
-int function GetPilotTitanStatusForPlayer( entity teamPlayer )
-{
- int statusIndex = ePlayerStatusType.PTS_TYPE_NONE
- entity titan
- if ( teamPlayer.GetPetTitan() )
- titan = teamPlayer.GetPetTitan()
- else if ( teamPlayer.IsTitan() )
- titan = teamPlayer
-
- entity playerParent = teamPlayer.GetParent()
- bool playerIsInDropship = playerParent != null && IsDropship( playerParent )
-
- if ( playerIsInDropship && ( GetWaveSpawnType() == eWaveSpawnType.DROPSHIP || GetGameState() == eGameState.Epilogue ) )
- {
- statusIndex = ePlayerStatusType.PTS_TYPE_EVAC
- }
- else if ( titan && titan.GetTitanSoul() )
- {
- if ( !teamPlayer.IsTitan() )
- {
- if ( IsAlive( teamPlayer ) )
- statusIndex = ePlayerStatusType.PTS_TYPE_PILOT_TITAN
- else
- statusIndex = ePlayerStatusType.PTS_TYPE_DEAD_PILOT_TITAN
- }
- else
- {
- if ( !IsAlive( teamPlayer ) )
- {
- statusIndex = ePlayerStatusType.PTS_TYPE_DEAD
- }
- else
- {
- switch ( GetTitanClass( titan ) )
- {
- case "ion":
- statusIndex = ePlayerStatusType.PTS_TYPE_ION
- break
- case "scorch":
- statusIndex = ePlayerStatusType.PTS_TYPE_SCORCH
- break
- case "ronin":
- statusIndex = ePlayerStatusType.PTS_TYPE_RONIN
- break
- case "tone":
- statusIndex = ePlayerStatusType.PTS_TYPE_TONE
- break
- case "legion":
- statusIndex = ePlayerStatusType.PTS_TYPE_LEGION
- break
- case "northstar":
- statusIndex = ePlayerStatusType.PTS_TYPE_NORTHSTAR
- break
- case "vanguard":
- statusIndex = ePlayerStatusType.PTS_TYPE_VANGUARD
- break
- }
- }
- }
- }
- else
- {
- if ( IsAlive( teamPlayer ) )
- statusIndex = IsTitanAvailable( teamPlayer ) ? ePlayerStatusType.PTS_TYPE_READY : ePlayerStatusType.PTS_TYPE_PILOT
- else
- statusIndex = IsTitanAvailable( teamPlayer ) ? ePlayerStatusType.PTS_TYPE_DEAD_READY : ePlayerStatusType.PTS_TYPE_DEAD
- }
-
- if ( file.pilotTitanStatusCallback != null )
- statusIndex = file.pilotTitanStatusCallback( teamPlayer, statusIndex )
-
- return statusIndex
-}
-
-int function PilotTitanStatusSort( int a, int b )
-{
- if ( a > b )
- return -1
- else if ( a < b )
- return 1
-
- return 0
-}
-
-
-void function UpdatePilotTitanStatusDisplayWithCount( int team, int friendlyCount, int enemyCount )
-{
- if ( IsFFAGame() )
- return
- var statusRui = ClGameState_GetRui()
-
- array<int> playerStatus = GetPilotTitanStatusForTeam( team )
- for ( int index = 0; index < friendlyCount; index++ )
- RuiSetInt( statusRui, "friendlyPlayerStatusType" + (index + 1), playerStatus[index] )
-
- array<int> enemyPlayerStatus = GetPilotTitanStatusForTeam( GetOtherTeam( team ) )
- for ( int index = 0; index < enemyCount; index++ )
- RuiSetInt( statusRui, "enemyPlayerStatusType" + (index + 1), enemyPlayerStatus[index] )
-}
-
-void function UpdatePilotTitanStatusDisplay( int team )
-{
- if ( GAMETYPE == "fd" )
- UpdatePilotTitanStatusDisplayWithCount( team, 4, 0 )
- else
- UpdatePilotTitanStatusDisplayWithCount( team, 8, 8 )
-}
-
-void function ClGameStateThink_Postmatch( player )
-{
-}
-
-void function ClGameStateThink_SwitchingSides( player )
-{
- //player.cv.vignette.SetColor( 0, 0, 0, 255 )
- //player.cv.vignette.Show()
-}
-
-
-void function ClGameState_Changed()
-{
- entity player = GetLocalClientPlayer()
- player.Signal( "GameStateChanged" )
-
- foreach ( callbackFunc in clGlobal.gameStateEnterCallbacks[ GetGameState() ] )
- {
- callbackFunc()
- }
-
- switch ( GetGameState() )
- {
- case eGameState.WaitingForCustomStart:
- //player.cv.gamescomWaitTillReady.Show()
- break
-
- case eGameState.WaitingForPlayers:
- if ( IsMultiplayerPlaylist() && ClassicMP_Client_GetGameStateEnterFunc_WaitingForPlayers() != null )
- ClassicMP_Client_GetGameStateEnterFunc_WaitingForPlayers()( player )
- //player.cv.gamescomWaitTillReady.Hide()
-
- //player.cv.waitingForPlayersDesc.SetText( "#HUD_WAITING_FOR_PLAYERS_BASIC" )
- //player.cv.waitingForPlayersDesc.Show()
- //player.cv.waitingForPlayersLine.Show()
- //player.cv.waitingForPlayersTimer.Show()
- break
-
- case eGameState.PickLoadout:
- if ( IsMultiplayerPlaylist() && ClassicMP_Client_GetGameStateEnterFunc_PickLoadOut() != null )
- ClassicMP_Client_GetGameStateEnterFunc_PickLoadOut()( player )
-
- break
-
- case eGameState.Prematch:
- RemoveAllRagdolls()
- HideEventNotification()
-
- SetCrosshairPriorityState( crosshairPriorityLevel.PREMATCH, CROSSHAIR_STATE_HIDE_ALL )
-
- //player.cv.waitingForPlayersDesc.HideOverTime( 0.25 )
- //player.cv.waitingForPlayersLine.HideOverTime( 0.25 )
- //player.cv.waitingForPlayersTimer.HideOverTime( 0.25 )
-
- file.letterBoxRui = RuiCreate( $"ui/letter_box.rpak", clGlobal.topoFullScreen, RUI_DRAW_HUD, 0 )
-
- //player.cv.prematchTimer.SetAlpha( 255 )
- //player.cv.prematchTimerGlow.SetAlpha( 255 )
- //player.cv.prematchDesc.SetAlpha( 255 )
-
- file.thirtySecondWarningDone = false
-
- StopPlayerDeathSound( player ) //If you were watching your own kill replay, don't want this playing through till next round
-
- clGlobal.levelEnt.Signal( "AnnoucementPurge" )
-
- break
-
- case eGameState.Playing:
- ClearCrosshairPriority( crosshairPriorityLevel.PREMATCH )
- //player.cv.vignette.HideOverTime( 0.25 )
- if ( file.letterBoxRui != null )
- RuiSetGameTime( file.letterBoxRui, "hideStartTime", Time() )
- //player.cv.prematchTimer.HideOverTime( 0.25 )
- //player.cv.prematchTimerGlow.HideOverTime( 0.25 )
- //player.cv.prematchDesc.HideOverTime( 0.25 )
-
- ShowScriptHUD( player )
- break
-
- case eGameState.SuddenDeath:
- AnnouncementData announcement = Announcement_Create( "#GAMEMODE_ANNOUNCEMENT_SUDDEN_DEATH" )
-
- switch ( GAMETYPE )
- {
- case CAPTURE_THE_FLAG:
- case RAID:
- Announcement_SetSubText( announcement, "#GAMEMODE_ANNOUNCEMENT_SUDDEN_DEATH_CTF" )
- break
-
- case TEAM_DEATHMATCH:
- case TITAN_BRAWL:
- case HARDCORE_TDM:
- Announcement_SetSubText( announcement, "#GAMEMODE_ANNOUNCEMENT_SUDDEN_DEATH_TDM" )
- break
-
- default:
- Announcement_SetSubText( announcement, "" )
- }
-
- Announcement_SetHideOnDeath( announcement, false )
- Announcement_SetDuration( announcement, 7.0 )
- Announcement_SetPurge( announcement, true )
- AnnouncementFromClass( player, announcement )
- break
-
- case eGameState.WinnerDetermined:
- player.cv.roundSpawnCount = 0
- break
-
- case eGameState.Epilogue:
- thread MainHud_Outro( level.nv.winningTeam )
- break
-
- case eGameState.SwitchingSides:
-
- float announcementDuration = 7.0
- if ( IsRoundWinningKillReplayEnabled() == true && ( !IsRoundBased() && IsSwitchSidesBased() ) ) //Ideally this should be a call to WillShowRoundWinningKillReplay(), but that's only available on the server
- announcementDuration = SWITCHING_SIDES_DELAY + ROUND_WINNING_KILL_REPLAY_TOTAL_LENGTH
-
- AnnouncementData announcement = Announcement_Create( "#GameState_HALFTIME" )
- announcement.sortKey = RUI_SORT_SCREENFADE + 1 // Draw over screen fade
- announcement.drawOverScreenFade = true
- Announcement_SetSubText( announcement, "#GameState_SWITCHING_SIDES" )
- Announcement_SetHideOnDeath( announcement, false )
- Announcement_SetDuration( announcement, announcementDuration )
- Announcement_SetPurge( announcement, true )
-
- EmitSoundOnEntity( player, "UI_InGame_HalftimeText_Enter" )
- EmitSoundOnEntityAfterDelay( player, "UI_InGame_HalftimeText_Exit", announcementDuration )
-
- local friendlyTeam = player.GetTeam()
- local enemyTeam = friendlyTeam == TEAM_IMC ? TEAM_MILITIA : TEAM_IMC
-
- if ( friendlyTeam == TEAM_IMC )
- {
- Announcement_SetLeftIcon( announcement, TEAM_ICON_IMC )
- Announcement_SetRightIcon( announcement, TEAM_ICON_MILITIA )
- }
- else
- {
- Announcement_SetLeftIcon( announcement, TEAM_ICON_MILITIA )
- Announcement_SetRightIcon( announcement, TEAM_ICON_IMC )
- }
-
- if ( IsRoundBased() )
- {
- Announcement_SetSubText2( announcement, "#GAMEMODE_ROUND_WIN_CONDITION", GetRoundScoreLimit_FromPlaylist() )
- Announcement_SetLeftText( announcement, "#GAMEMODE_JUST_THE_SCORE", GameRules_GetTeamScore2( friendlyTeam ) )
- Announcement_SetRightText( announcement, "#GAMEMODE_JUST_THE_SCORE", GameRules_GetTeamScore2( enemyTeam ) )
- }
- else
- {
- Announcement_SetLeftText( announcement, "#GAMEMODE_JUST_THE_SCORE", GameRules_GetTeamScore( friendlyTeam ) )
- Announcement_SetRightText( announcement, "#GAMEMODE_JUST_THE_SCORE", GameRules_GetTeamScore( enemyTeam ) )
- }
-
- AnnouncementFromClass( player, announcement )
-
- break
-
- case eGameState.Postmatch:
- ShowScoreboard()
- //wait for scoreboard to be up
- delaythread( 1.5 ) ServerCallback_ResetMapSettings()
- break
- }
-}
-
-void function SwitchingSides_Changed()
-{
- if ( IsMenuLevel() )
- return
-
- thread SwitchingSides_Changed_threaded()
-}
-
-void function SwitchingSides_Changed_threaded()
-{
- //entity player = GetLocalViewPlayer()
- //
- //if ( level.nv.switchingSides )
- //{
- // player.cv.halfTimeText.SetText( "Test - Switching Sides" )
- // player.cv.halfTimeText.Show()
- // wait 1.5
- //}
- //else
- //{
- // player.cv.halfTimeText.Hide()
- //
- //}
-}
-
-void function ServerCallback_AnnounceWinner( int teamIndex, int subStringIndex, float winnerDeterminedWait )
-{
- entity player = GetLocalClientPlayer()
-
- string subString = ""
- if ( subStringIndex )
- subString = GetStringFromID( subStringIndex )
-
- if ( !level.nv.winningTeam )
- {
- AnnouncementData outcomeAnnouncement = Announcement_Create( "#GAMEMODE_DRAW" )
- outcomeAnnouncement.drawOverScreenFade = true
- Announcement_SetSubText( outcomeAnnouncement, subString )
- //Announcement_SetTitleColor( outcomeAnnouncement, TEAM_COLOR_YOU )
- Announcement_SetHideOnDeath( outcomeAnnouncement, false )
- Announcement_SetDuration( outcomeAnnouncement, winnerDeterminedWait )
- Announcement_SetPriority( outcomeAnnouncement, 500 )
- Announcement_SetPurge( outcomeAnnouncement, true )
- AnnouncementFromClass( player, outcomeAnnouncement )
- }
- else if ( IsFFAGame() )
- {
- array<entity> players = GetPlayerArrayOfTeam( level.nv.winningTeam )
- if ( players.len() )
- {
- string winText = ((players[0] == player) ? "#GAMEMODE_MATCH_WON_BY_SELF" : "#GAMEMODE_MATCH_WON_BY_ENEMY_TEAM")
- AnnouncementData outcomeAnnouncement = Announcement_Create( winText )
- outcomeAnnouncement.drawOverScreenFade = true
- Announcement_SetSubText( outcomeAnnouncement, subString )
- Announcement_SetOptionalTextArgsArray( outcomeAnnouncement, [players[0].GetPlayerName()] )
- Announcement_SetTitleColor( outcomeAnnouncement, TEAM_COLOR_YOU )
- Announcement_SetHideOnDeath( outcomeAnnouncement, false )
- Announcement_SetDuration( outcomeAnnouncement, winnerDeterminedWait )
- Announcement_SetPriority( outcomeAnnouncement, 500 )
- Announcement_SetPurge( outcomeAnnouncement, true )
- AnnouncementFromClass( player, outcomeAnnouncement )
- }
- }
- else if ( player.GetTeam() == level.nv.winningTeam )
- {
-
- AnnouncementData outcomeAnnouncement = Announcement_Create( "#GAMEMODE_VICTORY" )
- outcomeAnnouncement.announcementStyle = ANNOUNCEMENT_STYLE_RESULTS
- outcomeAnnouncement.drawOverScreenFade = true
- outcomeAnnouncement.soundAlias = "HUD_MP_Match_End_WinLoss_UI_Sweep_1P"
- Announcement_SetSubText( outcomeAnnouncement, subString )
- Announcement_SetTitleColor( outcomeAnnouncement, TEAM_COLOR_PARTY )
- Announcement_SetHideOnDeath( outcomeAnnouncement, false )
- Announcement_SetDuration( outcomeAnnouncement, winnerDeterminedWait )
- Announcement_SetPriority( outcomeAnnouncement, 500 )
- Announcement_SetPurge( outcomeAnnouncement, true )
- AnnouncementFromClass( player, outcomeAnnouncement )
- }
- else if ( level.nv.winningTeam != TEAM_UNASSIGNED )
- {
- AnnouncementData outcomeAnnouncement = Announcement_Create( "#GAMEMODE_DEFEATED" )
- outcomeAnnouncement.announcementStyle = ANNOUNCEMENT_STYLE_RESULTS
- outcomeAnnouncement.drawOverScreenFade = true
- outcomeAnnouncement.soundAlias = "HUD_MP_Match_End_WinLoss_UI_Sweep_1P"
- Announcement_SetSubText( outcomeAnnouncement, subString )
- Announcement_SetTitleColor( outcomeAnnouncement, TEAM_COLOR_ENEMY )
- Announcement_SetHideOnDeath( outcomeAnnouncement, false )
- Announcement_SetDuration( outcomeAnnouncement, winnerDeterminedWait )
- Announcement_SetPriority( outcomeAnnouncement, 500 )
- Announcement_SetPurge( outcomeAnnouncement, true )
- AnnouncementFromClass( player, outcomeAnnouncement )
- }
-}
-
-void function ServerCallback_AnnounceRoundWinner( int teamIndex, int subStringIndex, float winnerDeterminedWait, int imcTeamScore2, int militiaTeamScore2 )
-{
- string subString = ""
- if ( subStringIndex )
- subString = GetStringFromID( subStringIndex )
-
- entity player = GetLocalClientPlayer()
-
- // ANNOUNCEMENT_FLICKER_BUFFER Ensures that the INTERPOLATOR_FLICKER animation is played before the message is hidden in
- // AnnouncementMessage_DisplayOnHud(). I'm not certain why this is needed. There may be a delay before
- // ServerCallback_AnnounceRoundWinner is actually received and/or the hud fades may be framerate
- // dependent (they don't seem to play nice with timescale), or it could be something much more simple that I'm missing.
- const ANNOUNCEMENT_FLICKER_BUFFER = 0.2
-
- float announcementDuration = winnerDeterminedWait - ANNOUNCEMENT_FLICKER_BUFFER
- float subtext2IconDelay = winnerDeterminedWait - 4.5
- float conversationDelay = subtext2IconDelay + 1.5 // Bit of time to give it to breathe, and to let RoundWinningKillReplay be fully over before starting the conversation.
-
- if ( !level.nv.winningTeam )
- {
- AnnouncementData announcement = Announcement_Create( "#GAMEMODE_ROUND_DRAW" )
- announcement.drawOverScreenFade = true
- Announcement_SetSubText( announcement, subString )
- //Announcement_SetTitleColor( announcement, TEAM_COLOR_YOU )
- Announcement_SetHideOnDeath( announcement, false )
- Announcement_SetPurge( announcement, true )
- Announcement_SetDuration( announcement, announcementDuration)
-
- ShowRoundScoresInAnnouncement( announcement, subtext2IconDelay, imcTeamScore2, militiaTeamScore2 )
- AnnouncementFromClass( player, announcement )
- }
- else if ( player.GetTeam() == level.nv.winningTeam )
- {
- AnnouncementData announcement = Announcement_Create( "#GAMEMODE_ROUND_WIN" )
- announcement.drawOverScreenFade = true
- Announcement_SetSubText( announcement, subString )
- Announcement_SetTitleColor(announcement, TEAM_COLOR_FRIENDLY )
- Announcement_SetHideOnDeath( announcement, false )
- Announcement_SetPurge( announcement, true )
- Announcement_SetDuration( announcement, announcementDuration)
-
- ShowRoundScoresInAnnouncement( announcement, subtext2IconDelay, imcTeamScore2, militiaTeamScore2 )
- thread PlayRoundWonConversationWithAnnouncementDelay( conversationDelay )
-
- AnnouncementFromClass( player, announcement )
- }
- else if ( level.nv.winningTeam != TEAM_UNASSIGNED )
- {
- AnnouncementData announcement = Announcement_Create( "#GAMEMODE_ROUND_LOSS" )
- announcement.drawOverScreenFade = true
- Announcement_SetSubText( announcement, subString )
- Announcement_SetTitleColor( announcement, TEAM_COLOR_ENEMY )
- Announcement_SetHideOnDeath( announcement, false )
- Announcement_SetPurge( announcement, true )
- Announcement_SetDuration( announcement, announcementDuration)
-
- ShowRoundScoresInAnnouncement( announcement, subtext2IconDelay, imcTeamScore2, militiaTeamScore2 )
- thread PlayRoundWonConversationWithAnnouncementDelay( conversationDelay )
-
- AnnouncementFromClass( player, announcement )
- }
-}
-
-//Note that RoundWinningKillReplay doesn't send imcTeamScore2 and militiaTeamScore2 overrides.
-void function ShowRoundScoresInAnnouncement( AnnouncementData announcement, float subtext2IconDelay, int ornull imcTeamScore2 = null, int ornull militiaTeamScore2 = null )
-{
- entity player = GetLocalClientPlayer()
-
- local friendlyTeam = player.GetTeam()
- local enemyTeam = friendlyTeam == TEAM_IMC ? TEAM_MILITIA : TEAM_IMC
-
- asset leftIcon
- asset rightIcon
-
- if ( friendlyTeam == TEAM_IMC )
- {
- leftIcon = TEAM_ICON_IMC
- rightIcon = TEAM_ICON_MILITIA
- }
- else
- {
- leftIcon = TEAM_ICON_MILITIA
- rightIcon = TEAM_ICON_IMC
- }
-
- if ( level.nv.roundScoreLimitComplete == true ) //Generally this is never true except for modes with RoundWinningKillReplay enabled
- {
- if ( friendlyTeam == level.nv.winningTeam )
- {
- Announcement_SetSubText( announcement, "#GAMEMODE_MATCH_WON_BY_FRIENDLY_TEAM" )
- string friendlyTeamString = friendlyTeam == TEAM_IMC ? "#TEAM_IMC" : "#TEAM_MCOR"
- Announcement_SetOptionalSubTextArgsArray( announcement, [ friendlyTeamString ] )
- }
- else if ( enemyTeam == level.nv.winningTeam )
- {
- Announcement_SetSubText( announcement, "#GAMEMODE_MATCH_WON_BY_ENEMY_TEAM" )
- string enemyTeamString = enemyTeam == TEAM_IMC ? "#TEAM_IMC" : "#TEAM_MCOR"
- Announcement_SetOptionalSubTextArgsArray( announcement, [ enemyTeamString ] )
- }
-
- }
- else
- {
- Announcement_SetSubText2( announcement, "#GAMEMODE_ROUND_WIN_CONDITION", GetRoundScoreLimit_FromPlaylist() )
- Announcement_SetSubText2AndIconDelay( announcement, subtext2IconDelay )
- }
-
- //Hack: GetTeamScore2 doesn't work mid-kill replay because we get the rewound values as opposed to the current values.
- //Fix for R2 when we get the ability to flag certain values as "use current value instead of rewound value"
- if ( imcTeamScore2 == null && militiaTeamScore2 == null )
- {
- Announcement_SetLeftText( announcement, "#GAMEMODE_JUST_THE_SCORE", GameRules_GetTeamScore2( friendlyTeam ) )
- Announcement_SetRightText( announcement, "#GAMEMODE_JUST_THE_SCORE", GameRules_GetTeamScore2( enemyTeam ) )
- }
- else
- {
- Assert( imcTeamScore2 != null && militiaTeamScore2 != null ) //Don't have only one team with teamScore2 override
- if ( friendlyTeam == TEAM_IMC )
- {
- Announcement_SetLeftText( announcement, "#GAMEMODE_JUST_THE_SCORE", imcTeamScore2 )
- Announcement_SetRightText( announcement, "#GAMEMODE_JUST_THE_SCORE", militiaTeamScore2 )
-
- }
- else
- {
- Announcement_SetLeftText( announcement, "#GAMEMODE_JUST_THE_SCORE", militiaTeamScore2 )
- Announcement_SetRightText( announcement, "#GAMEMODE_JUST_THE_SCORE", imcTeamScore2 )
- }
- }
-
- Announcement_SetLeftIcon( announcement, leftIcon )
- Announcement_SetRightIcon( announcement, rightIcon )
-}
-
-void function PlayRoundWonConversationWithAnnouncementDelay( conversationDelay )
-{
- WaitEndFrame() //Necessary so we don't get the AnnouncementPurge signal from the same announcement we are originating from
- clGlobal.levelEnt.EndSignal( "AnnoucementPurge" )
-
- if ( conversationDelay != 0 )
- wait conversationDelay
-
- if ( level.nv.winningTeam == null )
- return
-
- entity player = GetLocalClientPlayer()
- if ( player.GetTeam() == level.nv.winningTeam )
- PlayConversationToLocalClient( "RoundWonAnnouncement" )
- else if ( level.nv.winningTeam != TEAM_UNASSIGNED )
- PlayConversationToLocalClient( "RoundLostAnnouncement" )
-}
-
-void function UpdateScoreboardBadRepPresentMessage()
-{
- if ( IsLobby() )
- return
-
- entity player = GetLocalClientPlayer()
-
- if ( level.nv.badRepPresent )
- player.cv.scoreboardBadRepPresentMessage.Show()
- else
- player.cv.scoreboardBadRepPresentMessage.Hide()
-}
-
-void function UpdateChatHudLocationForTop3()
-{
- var hudElement = HudElement( "IngameTextChat" )
- var height = hudElement.GetHeight()
- var screenSize = Hud.GetScreenSize()
- var position = hudElement.GetPos()
- HudElement( "IngameTextChat" ).SetPos( position[0], -1 * ( screenSize[1] - ( height + screenSize[1] * 0.10 ) ) )
-}
-
-void function DisplayPostMatchTop3()
-{
- array<entity> players = GetPlayerArray()
-
- for ( int i = players.len() - 1; i >= 0; i-- )
- {
- if ( IsPrivateMatchSpectator( players[ i ] ) )
- players.remove( i )
- }
-
- if ( players.len() >= 1 )
- {
- int localTeam = GetLocalClientPlayer().GetTeam()
- #if PC_PROG
- var rui = RuiCreate( $"ui/scoreboard_postmatch_top3_pc.rpak", clGlobal.topoFullScreen, RUI_DRAW_HUD, 1001 )
- UpdateChatHudLocationForTop3()
- #else
- var rui = RuiCreate( $"ui/scoreboard_postmatch_top3.rpak", clGlobal.topoFullScreen, RUI_DRAW_HUD, 1001 )
- #endif
- string gamemode = GameRules_GetGameMode()
- int functionref( entity, entity ) compareFunc = GameMode_GetScoreCompareFunc( gamemode )
- if ( compareFunc == null )
- {
- printt( "gamemode doesn't have a compare func to display the top 3")
- return
- }
- players.sort( compareFunc )
- int playerCount = players.len()
- int currentPlace = 1
- for ( int i = 0; i < 3; i++ )
- {
- if ( i >= playerCount )
- continue
-
- string playerRank
- if ( i > 0 && compareFunc( players[i - 1], players[i] ) != 0 )
- currentPlace += 1
-
- switch( currentPlace )
- {
- case 1:
- playerRank = "#GENERATION_NUMERIC_1"
- break
- case 2:
- playerRank = "#GENERATION_NUMERIC_2"
- break
- case 3:
- playerRank = "#GENERATION_NUMERIC_3"
- break
- }
-
- float cardScale = currentPlace == 1 ? 1.0 : 0.9
-
- RuiSetString( rui, "playerName" + i, players[i].GetPlayerName() )
- RuiSetString( rui, "playerRank" + i, Localize( playerRank ) )
- RuiSetFloat( rui, "cardScale" + i, cardScale )
- RuiSetImage( rui, "cardImage" + i, CallingCard_GetImage( PlayerCallingCard_GetActive( players[i] ) ) )
- RuiSetImage( rui, "iconImage" + i, CallsignIcon_GetImage( PlayerCallsignIcon_GetActive( players[i] ) ) )
- RuiSetInt( rui, "layoutType" + i, CallingCard_GetLayout( PlayerCallingCard_GetActive( players[i] ) ) )
- RuiSetImage( rui, "cardGenImage" + i, PlayerXPGetGenIcon( players[i] ) )
- RuiSetString( rui, "playerLevel" + i, PlayerXPDisplayGenAndLevel( players[i].GetGen(), players[i].GetLevel() ) )
- RuiSetBool( rui, "isFriendly" + i, localTeam == players[i].GetTeam() )
- }
- }
-}
-
-
-float function GetGameStartTime()
-{
- return expect float( level.nv.gameStartTime.tofloat() )
-}
-
-void function ClGameState_SetPilotTitanStatusCallback( int functionref(entity,int) func )
-{
- file.pilotTitanStatusCallback = func
-} \ No newline at end of file