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

527 lines
15 KiB
Scheme
Executable File

///private header for family sfx control scripts
/// alwyn.roberts@rockstarnorth.com
///
USING "commands_audio.sch"
USING "commands_interiors.sch"
USING "commands_misc.sch"
// *******************************************************************************************
// FAMILY CONST_VALUES
// *******************************************************************************************
CONST_INT iCONST_FAMILY_SFX_INVALID -1
ENUM enumFamilySfxEntityType
FSE_0_ped = 0,
FSE_1_coord,
MAX_FAMILY_SFX_ENTITY_TYPES
ENDENUM
// *******************************************************************************************
// FAMILY STREAM PRIVATE FUNCTIONS
// *******************************************************************************************
FUNC BOOL PRIVATE_Play_Family_Stream(INT &iSfxStage, STRING streamName, VECTOR position)
SWITCH iSfxStage
CASE 0 // load and play stream...
IF LOAD_STREAM(streamName)
IF ARE_STRINGS_EQUAL(streamName, "AFT_SON_PORN")
SET_AUDIO_FLAG("DisableReplayScriptStreamRecording", TRUE)
ENDIF
PLAY_STREAM_FROM_POSITION(position)
iSfxStage = 1
ENDIF
BREAK
CASE 1 // playing stream at position...
#IF IS_DEBUG_BUILD
TEXT_LABEL_63 str
str = "sfx \""
str += streamName
str += "\""
DrawDebugFamilyTextWithOffset(str, position, 0, HUD_COLOUR_BLUEDARK)
DrawDebugFamilySphere(position, 0.1, HUD_COLOUR_BLUEDARK)
#ENDIF
BREAK
DEFAULT
CPRINTLN(DEBUG_FAMILY, "invalid iSfxStage ", iSfxStage, " in PRIVATE_Play_Family_Stream()")
CASSERTLN(DEBUG_FAMILY, "invalid iSfxStage in PRIVATE_Play_Family_Stream()")
RETURN FALSE
BREAK
ENDSWITCH
RETURN TRUE
ENDFUNC
//FUNC BOOL PRIVATE_Update_Family_Stream(enumFamilyEvents eFamilyEvent, INT &iSfxStage,
// STRING streamName, VECTOR position)
// SWITCH eFamilyEvent
// CASE FE_F_LAMAR_and_STRETCH_bbq_outside
// IF PRIVATE_Play_Family_Stream(iSfxStage, streamName, position)
// RETURN TRUE
// ENDIF
// BREAK
//
// ENDSWITCH
//
// #IF IS_DEBUG_BUILD
// CPRINTLN(DEBUG_FAMILY, "invalid eFamilyEvent ", Get_String_From_FamilyEvent(eFamilyEvent), " in PRIVATE_Update_Family_Stream()")
// #ENDIF
//
// CASSERTLN(DEBUG_FAMILY, "invalid eFamilyEvent PRIVATE_Update_Family_Stream()")
// RETURN FALSE
//ENDFUNC
// *******************************************************************************************
// FAMILY SFX PRIVATE FUNCTIONS
// *******************************************************************************************
FUNC BOOL PRIVATE_Play_Family_SFX_On_Entity(INT &iSfxStage, INT &iSfxID,
STRING BankName, STRING SFXName, ENTITY_INDEX entityID,
enumFamilySfxEntityType eFamilySfxEntityType, TEXT_LABEL_63 &RequestedBankName)
#IF IS_DEBUG_BUILD
TEXT_LABEL_63 str, strSFXName
INT iTaunterAnimOutLength = GET_LENGTH_OF_LITERAL_STRING(SFXName)
IF iTaunterAnimOutLength >= 8
strSFXName = GET_STRING_FROM_STRING(SFXName,
iTaunterAnimOutLength - 8,
iTaunterAnimOutLength)
ELSE
strSFXName = SFXName
ENDIF
#ENDIF
CONST_INT iSFX_0_loadStream 0
CONST_INT iSFX_1_playSound 1
CONST_INT iSFX_2_playingSound 2
CONST_INT iSFX_3_pausedSound 3
CONST_INT iSFX_4_bankLoaded 4
SWITCH iSfxStage
CASE iSFX_0_loadStream // load stream...
//url:bugstar:677528
IF (iSfxID <> iCONST_FAMILY_SFX_INVALID)
STOP_SOUND(iSfxID)
RELEASE_SOUND_ID(iSfxID)
iSfxID = iCONST_FAMILY_SFX_INVALID
ENDIF
IF NOT IS_STRING_NULL_OR_EMPTY(BankName)
IF REQUEST_AMBIENT_AUDIO_BANK(BankName)
RequestedBankName = BankName
iSfxStage = iSFX_1_playSound
ENDIF
ELSE
iSfxStage = iSFX_1_playSound
ENDIF
BREAK
CASE iSFX_1_playSound // play stream...
IF NOT DOES_ENTITY_EXIST(entityID)
IF IS_STRING_NULL_OR_EMPTY(SFXName)
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_FAMILY, "PRIVATE_Play_Family_SFX_On_Entity - ", "entity doesnt exist \"", SFXName, "\" and SFXName is empty")
#ENDIF
iSfxStage = iSFX_4_bankLoaded
RETURN FALSE
ENDIF
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_FAMILY, "PRIVATE_Play_Family_SFX_On_Entity - ", "entity doesnt exist \"", SFXName, "\"")
#ENDIF
RETURN FALSE
ENDIF
SWITCH eFamilySfxEntityType
CASE FSE_0_ped
iSfxID = GET_SOUND_ID()
PLAY_SOUND_FROM_ENTITY(iSfxID, SFXName, entityID)
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_FAMILY, "PLAY_SOUND_FROM_ENTITY(", iSfxID, ", \"", SFXName, "\", ", GET_MODEL_NAME_FOR_DEBUG(GET_ENTITY_MODEL(entityID)), ")", " //BankName:\"", BankName, "\"")
#ENDIF
BREAK
CASE FSE_1_coord
iSfxID = GET_SOUND_ID()
PLAY_SOUND_FROM_COORD(iSfxID, SFXName, GET_ENTITY_COORDS(entityID))
#IF IS_DEBUG_BUILD
VECTOR vEntityCoord
vEntityCoord = GET_ENTITY_COORDS(entityID)
CPRINTLN(DEBUG_FAMILY, "PLAY_SOUND_FROM_COORD(", iSfxID, ", \"", SFXName, "\", ", vEntityCoord, ")", " //BankName:\"", BankName, "\"")
#ENDIF
BREAK
DEFAULT
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_FAMILY, "PRIVATE_Play_Family_SFX_On_Entity - ", " invalid eFamilySfxEntityType FSE_", ENUM_TO_INT(eFamilySfxEntityType), "_unknown")
#ENDIF
RETURN FALSE
BREAK
ENDSWITCH
iSfxStage = iSFX_2_playingSound
BREAK
CASE iSFX_2_playingSound // play stream at entity...
#IF IS_DEBUG_BUILD
str = "sfx \""
str += strSFXName
str += "\""
#ENDIF
IF (iSfxID <> iCONST_FAMILY_SFX_INVALID)
IF NOT HAS_SOUND_FINISHED(iSfxID)
#IF IS_DEBUG_BUILD
str += " playing"
#ENDIF
ELSE
#IF IS_DEBUG_BUILD
str += " FINISHED"
#ENDIF
iSfxStage = iSFX_0_loadStream
RETURN TRUE
ENDIF
ELSE
#IF IS_DEBUG_BUILD
str += " INVALID?"
#ENDIF
iSfxStage = iSFX_0_loadStream
RETURN TRUE
ENDIF
#IF IS_DEBUG_BUILD
DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(entityID), 3, HUD_COLOUR_BLUEDARK)
#ENDIF
IF (eFamilySfxEntityType <> FSE_1_coord)
IF IS_ENTITY_A_PED(entityID)
PED_INDEX pedID
pedID = GET_PED_INDEX_FROM_ENTITY_INDEX(entityID)
IF IS_ANY_SPEECH_PLAYING(pedID)
iSfxStage = iSFX_3_pausedSound
ENDIF
ENDIF
ENDIF
BREAK
CASE iSFX_3_pausedSound // ped is playing a line of dialogie, stop speech until ped has finished talking...
#IF IS_DEBUG_BUILD
str = "sfx \""
str += strSFXName
str += "\""
str += " paused"
DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(entityID), 3, HUD_COLOUR_BLUELIGHT)
#ENDIF
IF IS_ENTITY_A_PED(entityID)
PED_INDEX pedID
pedID = GET_PED_INDEX_FROM_ENTITY_INDEX(entityID)
IF NOT IS_ANY_SPEECH_PLAYING(pedID)
iSfxStage = iSFX_0_loadStream
ENDIF
ENDIF
BREAK
CASE iSFX_4_bankLoaded
// #IF IS_DEBUG_BUILD
// str = "bank \""
// str += BankName
// str += "\""
// str += " loaded"
//
// DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(entityID), 3, HUD_COLOUR_BLUELIGHT)
// #ENDIF
// IF IS_ENTITY_A_PED(entityID)
// PED_INDEX pedID
// pedID = GET_PED_INDEX_FROM_ENTITY_INDEX(entityID)
// IF NOT IS_ANY_SPEECH_PLAYING(pedID)
// iSfxStage = iSFX_0_loadStream
// ENDIF
// ENDIF
BREAK
DEFAULT
CPRINTLN(DEBUG_FAMILY, "invalid iSfxStage ", iSfxStage, " in PRIVATE_Play_Family_SFX_On_Entity()")
CASSERTLN(DEBUG_FAMILY, "invalid iSfxStage ", iSfxStage, " in PRIVATE_Play_Family_SFX_On_Entity()")
RETURN FALSE
BREAK
ENDSWITCH
RETURN TRUE
ENDFUNC
//
FUNC FLOAT PRIVATE_Get_Variable_For_Player_In_Room(enumFamilyEvents eFamilyEvent,
INTERIOR_INSTANCE_INDEX iInteriorForThisPlayer,
INTERIOR_INSTANCE_INDEX iInteriorForThisFamilyMember)
SWITCH eFamilyEvent
#IF NOT IS_JAPANESE_BUILD
CASE FE_M2_WIFE_using_vibrator
CASE FE_M_WIFE_using_vibrator_END
CASE FE_M7_WIFE_using_vibrator
#ENDIF
#IF IS_JAPANESE_BUILD
CASE NO_FAMILY_EVENTS
#ENDIF
// I've added a variable to this sound - if you pass a value to MichaelInRoom
// (0 when he's not, 1 when he is) to the sound using
// SET_VARIABLE_ON_SOUND(SoundID,"MichaelInRoom", FloatValue)
// it will make it sound appropriately occluded when necessary.
// It defaults to 0.
IF (iInteriorForThisPlayer = iInteriorForThisFamilyMember)
RETURN 1.0
ENDIF
RETURN 0.0
BREAK
ENDSWITCH
RETURN -1.0
ENDFUNC
FUNC BOOL PRIVATE_Set_Variable_On_Family_Sound(enumFamilyEvents eFamilyEvent, INT iSfxID, FLOAT VariableValue = 0.0)
IF NOT HAS_SOUND_FINISHED(iSfxID)
SWITCH eFamilyEvent
#IF NOT IS_JAPANESE_BUILD
CASE FE_M2_WIFE_using_vibrator
// CASE FE_M_WIFE_using_vibrator_END
CASE FE_M7_WIFE_using_vibrator
// I've added a variable to this sound - if you pass a value to MichaelInRoom
// (0 when he's not, 1 when he is) to the sound using
// SET_VARIABLE_ON_SOUND(SoundID,"MichaelInRoom", FloatValue)
// it will make it sound appropriately occluded when necessary.
// It defaults to 0.
SET_VARIABLE_ON_SOUND(iSfxID, "MichaelInRoom", VariableValue)
RETURN TRUE
BREAK
#ENDIF
CASE FE_M_GARDENER_with_leaf_blower
// I made sounds for a bit back - if you load the bank:
// GARDEN_LEAF_BLOWER
// you can then trigger the sound
// Leaf_Blower
// from the SoundSet
// MICHAELS_GARDEN_SOUNDS
//
// To control the blowing set a variable called "Blow" on the sound
// - values range from "0" (idling) to "-1" (blowing).
SET_VARIABLE_ON_SOUND(iSfxID, "Blow", VariableValue)
RETURN TRUE
BREAK
ENDSWITCH
ENDIF
RETURN TRUE
ENDFUNC
FUNC BOOL PRIVATE_Update_Family_Sfx(enumFamilyEvents eFamilyEvent, INT &iSfxStage, INT &iSfxID,
STRING BankName, STRING SFXName, ENTITY_INDEX entityID, TEXT_LABEL_63 &RequestedBankName, FLOAT VariableValue = 0.0)
SWITCH eFamilyEvent
CASE FE_M_FAMILY_on_laptops FALLTHRU
CASE FE_M2_SON_gaming_loop FALLTHRU
// CASE FE_M2_SON_gaming_exit FALLTHRU
CASE FE_M7_SON_gaming FALLTHRU
CASE FE_M7_SON_on_laptop_looking_for_jobs FALLTHRU
CASE FE_M_SON_smoking_weed_in_a_bong FALLTHRU
CASE FE_M_DAUGHTER_purges_in_the_bathroom FALLTHRU
CASE FE_M_DAUGHTER_sex_sounds_from_room FALLTHRU
CASE FE_M_DAUGHTER_crying_over_a_guy FALLTHRU
CASE FE_M_DAUGHTER_sniffs_drugs_in_toilet FALLTHRU
CASE FE_M_DAUGHTER_dancing_practice FALLTHRU
CASE FE_M7_DAUGHTER_studying_does_nails FALLTHRU
#IF NOT IS_JAPANESE_BUILD
CASE FE_M2_WIFE_using_vibrator FALLTHRU
// CASE FE_M_WIFE_using_vibrator_END FALLTHRU
CASE FE_M7_WIFE_using_vibrator FALLTHRU
#ENDIF
CASE FE_M_WIFE_gets_drink_in_kitchen FALLTHRU
CASE FE_M2_WIFE_with_shopping_bags_enter FALLTHRU
CASE FE_M7_WIFE_with_shopping_bags_enter FALLTHRU
CASE FE_M_MEXMAID_does_the_dishes FALLTHRU
CASE FE_M2_MEXMAID_clean_surface_a FALLTHRU
CASE FE_M2_MEXMAID_clean_surface_b FALLTHRU
CASE FE_M2_MEXMAID_clean_surface_c FALLTHRU
CASE FE_M7_MEXMAID_clean_surface FALLTHRU
CASE FE_M2_MEXMAID_clean_window FALLTHRU
CASE FE_M7_MEXMAID_clean_window FALLTHRU
CASE FE_M_MEXMAID_MIC4_clean_window FALLTHRU
CASE FE_M_GARDENER_with_leaf_blower FALLTHRU
// CASE FE_M_GARDENER_trimming_hedges FALLTHRU
CASE FE_M_GARDENER_cleaning_pool FALLTHRU
CASE FE_M_GARDENER_mowing_lawn FALLTHRU
CASE FE_M_GARDENER_watering_flowers FALLTHRU
// CASE FE_M_GARDENER_spraying_for_weeds FALLTHRU
// CASE FE_F_LAMAR_and_STRETCH_bbq_outside FALLTHRU
CASE FE_T0_RON_smoking_crystal FALLTHRU
CASE FE_T0_RON_drinks_moonshine_from_a_jar FALLTHRU
CASE FE_T0_RON_listens_to_radio_broadcast FALLTHRU
CASE FE_T0_RON_monitoring_police_frequency FALLTHRU
CASE FE_T0_RONEX_trying_to_pick_up_signals FALLTHRU
CASE FE_T0_RONEX_working_a_moonshine_sill FALLTHRU
#IF NOT IS_JAPANESE_BUILD
CASE FE_T0_TREVOR_doing_a_shit FALLTHRU
#ENDIF
CASE FE_T0_TREVOR_blowing_shit_up FALLTHRU
CASE FE_T0_TREVOR_smoking_crystal FALLTHRU
CASE FE_T0_MICHAEL_drinking_beer FALLTHRU
CASE FE_T0_KIDNAPPED_WIFE_does_garden_work FALLTHRU
CASE FE_T0_KIDNAPPED_WIFE_cleaning FALLTHRU
CASE FE_T1_FLOYD_cleaning FALLTHRU
CASE FE_T1_FLOYD_with_wade_post_docks1
IF PRIVATE_Play_Family_SFX_On_Entity(iSfxStage, iSfxID, BankName, SFXName, entityID, FSE_0_ped, RequestedBankName)
PRIVATE_Set_Variable_On_Family_Sound(eFamilyEvent, iSfxID, VariableValue)
RETURN TRUE
ENDIF
RETURN FALSE
BREAK
CASE FE_M_SON_rapping_in_the_shower FALLTHRU
CASE FE_M_DAUGHTER_shower
IF PRIVATE_Play_Family_SFX_On_Entity(iSfxStage, iSfxID, BankName, SFXName, entityID, FSE_1_coord, RequestedBankName)
PRIVATE_Set_Variable_On_Family_Sound(eFamilyEvent, iSfxID, VariableValue)
RETURN TRUE
ENDIF
RETURN FALSE
BREAK
ENDSWITCH
#IF IS_DEBUG_BUILD
TEXT_LABEL_63 str
str += ("invalid eFamilyEvent ")
INT iTaunterAnimOutLength
iTaunterAnimOutLength = GET_LENGTH_OF_LITERAL_STRING(Get_String_From_FamilyEvent(eFamilyEvent))
IF iTaunterAnimOutLength >= 12
str += GET_STRING_FROM_STRING(Get_String_From_FamilyEvent(eFamilyEvent),
iTaunterAnimOutLength - 12,
iTaunterAnimOutLength)
ELSE
str += Get_String_From_FamilyEvent(eFamilyEvent)
ENDIF
str += (" in Update_Family_Sfx()")
CASSERTLN(DEBUG_FAMILY, str)
#ENDIF
RETURN PRIVATE_Play_Family_SFX_On_Entity(iSfxStage, iSfxID, BankName, SFXName, entityID, FSE_0_ped, RequestedBankName)
ENDFUNC
// *******************************************************************************************
// FAMILY STREAM & SFX CLEANUP PRIVATE FUNCTIONS
// *******************************************************************************************
FUNC BOOL PRIVATE_Cleanup_Family_Stream_And_Sfx(INT &iSfxStage, INT &iSfxID, TEXT_LABEL_63 &RequestedBankName)
STOP_STREAM()
IF (iSfxStage = 0)
AND (iSfxID = iCONST_FAMILY_SFX_INVALID)
AND IS_STRING_NULL_OR_EMPTY(RequestedBankName)
RETURN FALSE
ENDIF
#IF IS_DEBUG_BUILD
IF (iSfxID <> iCONST_FAMILY_SFX_INVALID)
IF (iSfxStage <> 0)
CPRINTLN(DEBUG_FAMILY, "PRIVATE_Cleanup_Family_Stream_And_Sfx(", " iSfxStage = ", iSfxStage, " iSfxID = ", iSfxID, ")")
ELSE
CPRINTLN(DEBUG_FAMILY, "PRIVATE_Cleanup_Family_Stream_And_Sfx(", " iSfxID = ", iSfxID, ")")
ENDIF
ELSE
IF (iSfxStage <> 0)
CPRINTLN(DEBUG_FAMILY, "PRIVATE_Cleanup_Family_Stream_And_Sfx(", " iSfxStage = ", iSfxStage, ")")
ELSE
CPRINTLN(DEBUG_FAMILY, "PRIVATE_Cleanup_Family_Stream_And_Sfx(", ")")
ENDIF
ENDIF
#ENDIF
IF (iSfxStage <> 0)
STOP_STREAM() //cleanup PRIVATE_Play_Family_Stream()
iSfxStage = 0
ENDIF
IF (iSfxID <> iCONST_FAMILY_SFX_INVALID)
STOP_SOUND(iSfxID)
iSfxID = iCONST_FAMILY_SFX_INVALID
ENDIF
IF NOT IS_STRING_NULL_OR_EMPTY(RequestedBankName)
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_FAMILY, "RELEASE_NAMED_SCRIPT_AUDIO_BANK(\"", RequestedBankName, "\")")
#ENDIF
RELEASE_NAMED_SCRIPT_AUDIO_BANK(RequestedBankName)
IF ARE_STRINGS_EQUAL(RequestedBankName, "AFT_SON_PORN")
SET_AUDIO_FLAG("DisableReplayScriptStreamRecording", FALSE)
ENDIF
ELSE
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_FAMILY, "bul(\"", RequestedBankName, "\")")
#ENDIF
ENDIF
RequestedBankName = ""
RETURN TRUE
ENDFUNC