Files
gtav-src/script/dev_ng/singleplayer/include/public/tv_control_public.sch
T
2025-09-29 00:52:08 +02:00

480 lines
13 KiB
Scheme
Executable File

USING "commands_misc.sch"
USING "commands_script.sch"
USING "commands_audio.sch"
USING "globals.sch"
USING "flow_mission_data_public.sch"
ENUM TV_CHANNEL_PLAYLIST
TV_PLAYLIST_NONE=0,
TV_PLAYLIST_STD_CNT,
TV_PLAYLIST_STD_WEAZEL,
TV_PLAYLIST_LO_CNT,
TV_PLAYLIST_LO_WEAZEL,
TV_PLAYLIST_LO_RIGHTEOUS_SLAUGHTER,
TV_PLAYLIST_LO_RIGHTEOUS_SLAUGHTER_CUTSCENE,
TV_PLAYLIST_SPECIAL_WORKOUT,
TV_PLAYLIST_SPECIAL_INVADER,
TV_PLAYLIST_SPECIAL_INVADER_EXP,
TV_PLAYLIST_SPECIAL_PLSH1_INTRO,
TV_PLAYLIST_SPECIAL_LEST1_INTRO_FAME_OR_SHAME,
TV_PLAYLIST_STD_WEAZEL_FOS_EP2,
TV_PLAYLIST_SPECIAL_MP_WEAZEL,
TV_PLAYLIST_SPECIAL_MP_CCTV,
TV_PLAYLIST_END
ENDENUM
BOOL bBlockTVChannelControl, bBlockTVVolumeControl
INT iTVControlTimer
BOOL bAllowTVSoundFX = TRUE
FUNC STRING GET_XML_PLAYLIST_FOR_TV_PLAYLIST(TV_CHANNEL_PLAYLIST tvPlaylist)
STRING sReturn
SWITCH tvPlaylist
CASE TV_PLAYLIST_STD_CNT
sReturn = "PL_STD_CNT"
BREAK
CASE TV_PLAYLIST_STD_WEAZEL
sReturn = "PL_STD_WZL"
BREAK
CASE TV_PLAYLIST_LO_CNT
sReturn = "PL_LO_CNT"
BREAK
CASE TV_PLAYLIST_LO_WEAZEL
sReturn = "PL_LO_WZL"
BREAK
CASE TV_PLAYLIST_SPECIAL_WORKOUT
sReturn = "PL_SP_WORKOUT"
BREAK
CASE TV_PLAYLIST_SPECIAL_INVADER
sReturn = "PL_SP_INV"
BREAK
CASE TV_PLAYLIST_SPECIAL_INVADER_EXP
sReturn = "PL_SP_INV_EXP"
BREAK
CASE TV_PLAYLIST_LO_RIGHTEOUS_SLAUGHTER
sReturn = "PL_LO_RS"
BREAK
CASE TV_PLAYLIST_LO_RIGHTEOUS_SLAUGHTER_CUTSCENE
sReturn = "PL_LO_RS_CUTSCENE"
BREAK
CASE TV_PLAYLIST_SPECIAL_PLSH1_INTRO
sReturn = "PL_SP_PLSH1_INTRO"
BREAK
CASE TV_PLAYLIST_SPECIAL_LEST1_INTRO_FAME_OR_SHAME
sReturn = "PL_LES1_FAME_OR_SHAME"
BREAK
CASE TV_PLAYLIST_STD_WEAZEL_FOS_EP2
sReturn = "PL_STD_WZL_FOS_EP2"
BREAK
CASE TV_PLAYLIST_SPECIAL_MP_WEAZEL
sReturn = "PL_MP_WEAZEL"
BREAK
CASE TV_PLAYLIST_SPECIAL_MP_CCTV
sReturn = "PL_MP_CCTV"
BREAK
ENDSWITCH
PRINTLN("<", GET_THIS_SCRIPT_NAME(), "> GET_XML_PLAYLIST_FOR_TV_PLAYLIST() - PLAYLIST STRING = ", sReturn)
RETURN sReturn
ENDFUNC
FUNC INT SETUP_CUSTOM_TV_SCREEN( OBJECT_INDEX objectTV )
INT iRenderTarget
IF NOT IS_NAMED_RENDERTARGET_REGISTERED("tvscreen")
REGISTER_NAMED_RENDERTARGET("tvscreen")
LINK_NAMED_RENDERTARGET(GET_ENTITY_MODEL(objectTV))
IF NOT IS_NAMED_RENDERTARGET_LINKED(GET_ENTITY_MODEL(objectTV))
RELEASE_NAMED_RENDERTARGET("tvscreen")
ENDIF
ENDIF
iRenderTarget = GET_NAMED_RENDERTARGET_RENDER_ID("tvscreen")
SET_TEXT_RENDER_ID(iRenderTarget)
RETURN iRenderTarget
ENDFUNC
PROC DRAW_TO_CUSTOM_TV_SCREEN( OBJECT_INDEX objectTV, INT iRenderTarget )
SET_TEXT_RENDER_ID(iRenderTarget)
DRAW_TV_CHANNEL(0.5,0.5,1.0,1.0,0.0,255,255,255,255)
IF GET_TV_CHANNEL() <> TVCHANNELTYPE_CHANNEL_NONE
ATTACH_TV_AUDIO_TO_ENTITY(objectTV)
ENDIF
ENDPROC
PROC CLEANUP_CUSTOM_TV_SCREEN( OBJECT_INDEX objectTV, INT iRenderTarget )
IF NOT (iRenderTarget = -1)
SET_TEXT_RENDER_ID(iRenderTarget)
IF DOES_ENTITY_EXIST(objectTV)
IF GET_ENTITY_MODEL(objectTV) = V_ILEV_MM_SCREEN2
DRAW_RECT(0.5, 0.5, 1.0, 1.0, 255, 255, 255, 255) // Clears the projector render target to white.
IF IS_NAMED_RENDERTARGET_REGISTERED("big_disp")
RELEASE_NAMED_RENDERTARGET("big_disp")
ENDIF
ELSE
IF GET_ENTITY_MODEL(objectTV) = V_ILEV_MM_SCRE_OFF
//DRAW_RECT(0.5, 0.5, 1.0, 1.0, 255, 255, 255, 255) // Clears the projector render target to white.
ELSE
DRAW_RECT(0.5, 0.5, 1.0, 1.0, 0, 0, 0, 255) // Clears the render target to black.
ENDIF
ENDIF
ENDIF
IF IS_NAMED_RENDERTARGET_REGISTERED("tvscreen")
RELEASE_NAMED_RENDERTARGET("tvscreen")
ENDIF
ENDIF
ENDPROC
FUNC BOOL IS_THIS_TV_AVAILABLE_FOR_USE( TV_LOCATION eTVLocation )
IF eTVLocation != TV_LOC_NONE
IF g_TVStruct[ENUM_TO_INT(eTVLocation)].bAvailableForUse
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL IS_THIS_TV_ON( TV_LOCATION eTVLocation )
IF eTVLocation != TV_LOC_NONE
IF g_TVStruct[ENUM_TO_INT(eTVLocation)].bIsTVOn
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL IS_THIS_TV_FORCED_ON(TV_LOCATION eTVLocation)
IF eTVLocation != TV_LOC_NONE
IF g_TVStruct[ENUM_TO_INT(eTVLocation)].bForceStartAmbientTV
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC RESTORE_STANDARD_CHANNELS()
SET_TV_CHANNEL_PLAYLIST(TVCHANNELTYPE_CHANNEL_1, GET_XML_PLAYLIST_FOR_TV_PLAYLIST(TV_PLAYLIST_STD_CNT))
#if not USE_CLF_DLC
#if not USE_NRM_DLC
IF GET_MISSION_COMPLETE_STATE(SP_MISSION_FAMILY_6)
SET_TV_CHANNEL_PLAYLIST(TVCHANNELTYPE_CHANNEL_2, GET_XML_PLAYLIST_FOR_TV_PLAYLIST(TV_PLAYLIST_STD_WEAZEL_FOS_EP2))
ELSE
SET_TV_CHANNEL_PLAYLIST(TVCHANNELTYPE_CHANNEL_2, GET_XML_PLAYLIST_FOR_TV_PLAYLIST(TV_PLAYLIST_STD_WEAZEL))
ENDIF
#endif
#endif
PRINTLN("<", GET_THIS_SCRIPT_NAME(), "> RESTORE_STANDARD_CHANNELS() - FOS EP2")
ENDPROC
PROC PLAY_TV_CHANNEL_WITH_PLAYLIST(TV_LOCATION eTVLocation, TVCHANNELTYPE tvChannel, TV_CHANNEL_PLAYLIST tvPlaylist, BOOL bFromStart=FALSE)
IF eTVLocation != TV_LOC_NONE
IF NOT IS_THIS_TV_AVAILABLE_FOR_USE(eTVlocation)
SCRIPT_ASSERT("PLAY_TV_CHANNEL_WITH_PLAYLIST() - TV script has not initialised! Please use IS_THIS_TV_AVAILABLE_FOR_USE() before attempting TV playback. ")
EXIT
ENDIF
SET_TV_CHANNEL_PLAYLIST(tvChannel, GET_XML_PLAYLIST_FOR_TV_PLAYLIST(tvPlaylist), bFromStart)
SET_TV_CHANNEL(tvChannel)
g_TVStruct[ENUM_TO_INT(eTVLocation)].iTVChannelType = ENUM_TO_INT(tvChannel)
g_TVStruct[ENUM_TO_INT(eTVLocation)].iTVChannelPlaylist = ENUM_TO_INT(tvPlaylist)
ENDIF
PRINTLN("<", GET_THIS_SCRIPT_NAME(), "> PLAY_TV_CHANNEL_WITH_PLAYLIST() = ")
ENDPROC
PROC PLAY_TV_CHANNEL(TV_LOCATION eTVLocation, TVCHANNELTYPE tvChannel )
IF tvChannel <> TVCHANNELTYPE_CHANNEL_SCRIPT
AND tvChannel <> TVCHANNELTYPE_CHANNEL_SPECIAL
IF eTVLocation != TV_LOC_NONE
SET_TV_CHANNEL(tvChannel)
g_TVStruct[ENUM_TO_INT(eTVLocation)].iTVChannelType = ENUM_TO_INT(tvChannel)
ENDIF
ENDIF
PRINTLN("<", GET_THIS_SCRIPT_NAME(), "> PLAY_TV_CHANNEL()")
ENDPROC
PROC FORCE_STOP_TV(TV_LOCATION eTVLocation)
IF eTVlocation != TV_LOC_NONE
g_TVStruct[ENUM_TO_INT(eTVLocation)].bForceStopTV = TRUE
ENDIF
PRINTLN("<", GET_THIS_SCRIPT_NAME(), "> FORCE_STOP_TV() = ")
ENDPROC
FUNC TV_LOCATION GET_TV_ENUM_FOR_INTERIOR_ROOM( TEXT_LABEL_31 RoomName )
IF IS_STRING_NULL_OR_EMPTY(RoomName)
RETURN TV_LOC_NONE
ENDIF
IF ARE_STRINGS_EQUAL(RoomName, "V_Michael_G_Lounge")
RETURN TV_LOC_MICHAEL_PROJECTOR
ENDIF
IF ARE_STRINGS_EQUAL(RoomName, "V_Michael_1_Son" )
RETURN TV_LOC_JIMMY_BEDROOM
ENDIF
RETURN TV_LOC_NONE
ENDFUNC
PROC START_AMBIENT_TV_PLAYBACK( TV_LOCATION eTVLocation, TVCHANNELTYPE eTVChannelType = TVCHANNELTYPE_CHANNEL_1, TV_CHANNEL_PLAYLIST eTVPlaylist = TV_PLAYLIST_STD_CNT, BOOL bAllowPlayerControl = FALSE, BOOL bPlayFromBeginning = FALSE )
IF eTVLocation != TV_LOC_NONE
IF NOT IS_THIS_TV_AVAILABLE_FOR_USE(eTVlocation)
SCRIPT_ASSERT("START_AMBIENT_TV_PLAYBACK() - TV script has not initialised! Please use IS_THIS_TV_AVAILABLE_FOR_USE() before attempting to start TV playback. ")
EXIT
ENDIF
g_TVStruct[ENUM_TO_INT(eTVLocation)].bForceStartAmbientTV = TRUE
g_TVStruct[ENUM_TO_INT(eTVLocation)].iTVChannelType = ENUM_TO_INT(eTVChannelType)
g_TVStruct[ENUM_TO_INT(eTVLocation)].iTVChannelPlaylist = ENUM_TO_INT(eTVPlaylist)
g_TVStruct[ENUM_TO_INT(eTVLocation)].bStartPlaylistFromBeginning = bPlayFromBeginning
g_TVStruct[ENUM_TO_INT(eTVLocation)].bIsPlayerControlled = bAllowPlayerControl
// If the TV is already on (even if player controlled) change the channel and playlist immediately.
IF IS_THIS_TV_ON(eTVLocation)
SET_TV_CHANNEL(TVCHANNELTYPE_CHANNEL_NONE)
SET_TV_CHANNEL_PLAYLIST(eTVChannelType, GET_XML_PLAYLIST_FOR_TV_PLAYLIST(eTVPlaylist), bPlayFromBeginning)
SET_TV_CHANNEL(eTVChannelType)
ENDIF
ENDIF
PRINTLN("<", GET_THIS_SCRIPT_NAME(), "> START_AMBIENT_TV_PLAYBACK() - TV ID: ", ENUM_TO_INT(eTVLocation) )
g_sTVPlaybackStartedByThisScript = GET_THIS_SCRIPT_NAME()
ENDPROC
PROC STOP_AMBIENT_TV_PLAYBACK(TV_LOCATION eTVLocation)
IF eTVLocation != TV_LOC_NONE
g_TVStruct[ENUM_TO_INT(eTVLocation)].bForceStopTV = TRUE
ENDIF
PRINTLN("<", GET_THIS_SCRIPT_NAME(), "> STOP_AMBIENT_TV_PLAYBACK()")
ENDPROC
PROC STOP_TV_PLAYBACK(BOOL bRestoreStandardChannels = TRUE, TV_LOCATION eTVLocation = TV_LOC_NONE )
SET_TV_CHANNEL(TVCHANNELTYPE_CHANNEL_NONE)
IF bRestoreStandardChannels
RESTORE_STANDARD_CHANNELS()
ENDIF
IF eTVLocation != TV_LOC_NONE
g_TVStruct[ENUM_TO_INT(eTVLocation)].bForceStopTV = TRUE
ENDIF
PRINTLN("<", GET_THIS_SCRIPT_NAME(), "> STOP_TV_PLAYBACK() for TV started by ", g_sTVPlaybackStartedByThisScript)
g_sTVPlaybackStartedByThisScript = "NULL"
ENDPROC
FUNC BOOL IS_TV_SCRIPT_AVAILABLE_FOR_USE(TV_LOCATION eTVLocation)
IF eTVLocation != TV_LOC_NONE
IF g_TVStruct[ENUM_TO_INT(eTVLocation)].bAvailableForUse = TRUE
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC DISABLE_TV_CONTROLS( TV_LOCATION eTVLocation, BOOL bDisable )
IF eTVLocation != TV_LOC_NONE
g_TVStruct[ENUM_TO_INT(eTVLocation)].bTVControlsDisabled = bDisable
ENDIF
ENDPROC
FUNC BOOL IS_INPUT_ATTEMPTING_TO_CHANGE_CHANNEL(BOOL bIgnoreTimer = FALSE)
INT iDeadzone = 64
INT iAxis
iAxis = GET_CONTROL_VALUE(FRONTEND_CONTROL, INPUT_SCRIPT_LEFT_AXIS_X ) -127
IF bIgnoreTimer
OR TIMERA() > 300
//change the channels.
IF iAxis > 0+iDeadzone
OR iAxis < 0-iDeadzone
SETTIMERA(0)
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC RELEASE_TV_FOR_PLAYER_CONTROL(TV_LOCATION eTVLocation)
IF eTVLocation != TV_LOC_NONE
g_TVStruct[ENUM_TO_INT(eTVLocation)].bForceStartAmbientTV = FALSE
//g_TVStruct[ENUM_TO_INT(eTVLocation)].bForceStartTV = FALSE
IF g_TVStruct[ENUM_TO_INT(eTVLocation)].bIsTVOn
AND g_TVStruct[ENUM_TO_INT(eTVLocation)].bIsPlayerControlled = FALSE
g_TVStruct[ENUM_TO_INT(eTVLocation)].bIsPlayerControlled = TRUE
ENDIF
g_TVStruct[ENUM_TO_INT(eTVLocation)].bTVControlsDisabled = FALSE
ENDIF
ENDPROC
PROC RUN_TV_TRANSPORT_CONTROLS(BOOL bAllowChannelChange=TRUE, BOOL bAllowVolumeChange=TRUE)
INT iDeadzone = 64
INT iAxis
FLOAT fTVVolume
IF bAllowChannelChange
IF IS_INPUT_ATTEMPTING_TO_CHANGE_CHANNEL()
IF NOT bBlockTVChannelControl
IF REQUEST_AMBIENT_AUDIO_BANK( "SAFEHOUSE_MICHAEL_SIT_SOFA" )
PLAY_SOUND_FRONTEND(-1, "MICHAEL_SOFA_TV_CHANGE_CHANNEL_MASTER")
ENDIF
IF GET_TV_CHANNEL() = TVCHANNELTYPE_CHANNEL_1
SET_TV_CHANNEL(TVCHANNELTYPE_CHANNEL_2)
PRINTLN(GET_THIS_SCRIPT_NAME(), " - RUN_TV_TRANSPORT_CONTROLS - SET_TV_CHANNEL(TVCHANNELTYPE_CHANNEL_2)")
ELSE
SET_TV_CHANNEL(TVCHANNELTYPE_CHANNEL_1)
PRINTLN(GET_THIS_SCRIPT_NAME(), " - RUN_TV_TRANSPORT_CONTROLS - SET_TV_CHANNEL(TVCHANNELTYPE_CHANNEL_1)")
ENDIF
bBlockTVChannelControl = TRUE
ENDIF
ELSE
IF bBlockTVChannelControl
bBlockTVChannelControl = FALSE
ENDIF
ENDIF
ENDIF
IF bAllowVolumeChange
iAxis = GET_CONTROL_VALUE(FRONTEND_CONTROL,INPUT_SCRIPT_LEFT_AXIS_Y) - 127
//PRINTLN(GET_THIS_SCRIPT_NAME(), " - iAxis = ", iAxis)
// // Movie Volume in dB -24 to 0.
IF NOT bBlockTVVolumeControl
IF iAxis > 0+iDeadzone
fTVVolume = GET_TV_VOLUME()
fTVVolume = (fTVVolume - 0.5)
IF fTVVolume < -36.0
fTVVolume = -36.0
ENDIF
SET_TV_VOLUME(fTVVolume)
PRINTLN(GET_THIS_SCRIPT_NAME(), " - RUN_TV_TRANSPORT_CONTROLS - SET_TV_VOLUME = ", fTVVolume)
iTVControlTimer = GET_GAME_TIMER()
bBlockTVVolumeControl = TRUE
ENDIF
//turn movie volume down.
IF iAxis < 0-iDeadzone
fTVVolume = GET_TV_VOLUME()
fTVVolume = (fTVVolume + 0.5)
IF fTVVolume > 0.0
fTVVolume = 0.0
ENDIF
SET_TV_VOLUME(fTVVolume)
PRINTLN(GET_THIS_SCRIPT_NAME(), " - RUN_TV_TRANSPORT_CONTROLS - SET_TV_VOLUME = ", fTVVolume)
iTVControlTimer = GET_GAME_TIMER()
bBlockTVVolumeControl = TRUE
ENDIF
IF iAxis < 0+iDeadzone
AND iAxis > 0-iDeadzone
bAllowTVSoundFX = TRUE
ELSE
IF bAllowTVSoundFX
IF REQUEST_AMBIENT_AUDIO_BANK( "SAFEHOUSE_MICHAEL_SIT_SOFA" )
IF fTVVolume != -36.0 AND fTVVolume != 0
PLAY_SOUND_FRONTEND(-1, "MICHAEL_SOFA_REMOTE_CLICK_VOLUME_MASTER")
ENDIF
bAllowTVSoundFX = FALSE
ENDIF
ENDIF
ENDIF
ENDIF
IF bBlockTVVolumeControl
IF iAxis = 0
OR GET_GAME_TIMER() > iTVControlTimer + 24
bBlockTVVolumeControl = FALSE
ENDIF
ENDIF
ENDIF
ENDPROC
PROC SET_TV_INDESTRUCTIBLE( TV_LOCATION eTVLocation, BOOL bIsIndestructible )
PRINTLN(GET_THIS_SCRIPT_NAME(), " - SET_TV_INDESTRUCTIBLE - TV: ", eTVLocation, " Status: ", bIsIndestructible)
g_TVStruct[ENUM_TO_INT(eTVLocation)].bIsIndestructible = bIsIndestructible
ENDPROC