USING "dialogue_public.sch" //"commands_speech.sch" ///private header for family task control scripts /// alwyn.roberts@rockstarnorth.com /// // ******************************************************************************************* // FAMILY NAME VARIABLES // ******************************************************************************************* ENUM enumFamilySpeechCheck FSC_checkDistance2d = BIT0, FSC_checkLocateBounds = BIT1, FSC_checkOnSameFloor = BIT2, FSC_checkOnScreen = BIT3, FSC_checkTenSecDelay = BIT4, FSC_checkListenerAlive = BIT5, FSC_singleRandomLine = BIT6, #IF USE_TU_CHANGES FSC_setVoiceLocationForPed = BIT7, #ENDIF FSC_invalid = ALLBITS ENDENUM #IF IS_DEBUG_BUILD BOOL bEdit_speech_bounds = FALSE #ENDIF // ******************************************************************************************* // FAMILY NAME FUNCTIONS // ******************************************************************************************* FUNC STRING Get_VoiceID_From_FamilyMember(enumFamilyMember eFamilyMember) SWITCH eFamilyMember CASE FM_MICHAEL_SON RETURN "JIMMY" BREAK CASE FM_MICHAEL_DAUGHTER RETURN "TRACEY" BREAK CASE FM_MICHAEL_WIFE RETURN "AMANDA" BREAK CASE FM_MICHAEL_MEXMAID RETURN "MAID" BREAK CASE FM_MICHAEL_GARDENER RETURN "GARDENER" BREAK CASE FM_FRANKLIN_AUNT RETURN "DENISE" BREAK CASE FM_FRANKLIN_LAMAR RETURN "LAMAR" BREAK CASE FM_FRANKLIN_STRETCH RETURN "STRETCH" BREAK CASE FM_TREVOR_0_RON RETURN "NERVOUSRON" BREAK CASE FM_TREVOR_0_MICHAEL RETURN "MICHAEL" BREAK CASE FM_TREVOR_0_TREVOR RETURN "TREVOR" BREAK CASE FM_TREVOR_0_WIFE RETURN "PATRICIA" BREAK CASE FM_TREVOR_0_MOTHER RETURN "TREVORMOM" BREAK CASE FM_TREVOR_1_FLOYD RETURN "FLOYD" BREAK CASE FM_TREVOR_1_WADE RETURN "WADE" BREAK ENDSWITCH SCRIPT_ASSERT("invalid eFamilyMember Get_VoiceID_From_FamilyMember()") RETURN "NULL" ENDFUNC FUNC STRING Get_SpeechLabel_From_FamilyEvent(enumFamilyEvents eFamilyEvent, INT &iRandCount, INT &iSpeechBit, INT &iPlayerBitset) // set default speech bits SET_BITMASK_AS_ENUM(iSpeechBit, FSC_checkDistance2d | FSC_checkOnSameFloor | FSC_singleRandomLine | FSC_checkTenSecDelay) SWITCH eFamilyEvent CASE FE_M_FAMILY_on_laptops iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "" BREAK CASE FE_M_FAMILY_MIC4_locked_in_room CLEAR_BITMASK_AS_ENUM(iSpeechBit, FSC_singleRandomLine) iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "MIC4_IG_1" BREAK CASE FE_M7_FAMILY_finished_breakfast SET_BITMASK_AS_ENUM(iSpeechBit, FSC_checkListenerAlive) CLEAR_BITMASK_AS_ENUM(iSpeechBit, FSC_singleRandomLine) iRandCount = 4 iPlayerBitset = BIT_MICHAEL RETURN "FMM7_9_0" BREAK CASE FE_M7_FAMILY_finished_pizza SET_BITMASK_AS_ENUM(iSpeechBit, FSC_checkListenerAlive) CLEAR_BITMASK_AS_ENUM(iSpeechBit, FSC_singleRandomLine) iRandCount = 4 iPlayerBitset = BIT_MICHAEL RETURN "FMM7_9_1" BREAK CASE FE_M7_FAMILY_watching_TV SET_BITMASK_AS_ENUM(iSpeechBit, FSC_checkListenerAlive) CLEAR_BITMASK_AS_ENUM(iSpeechBit, FSC_singleRandomLine) iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "FMM7_9_2" BREAK CASE FE_M2_SON_watching_TV iRandCount = 0 iPlayerBitset = BIT_MICHAEL RETURN "" BREAK //"Hey Dad, fill up my car when I get back, will you?" CASE FE_M_SON_sleeping iRandCount = 12 iPlayerBitset = BIT_MICHAEL RETURN "FMM_0_0" BREAK //"Zzzzzz..." CASE FE_M2_SON_gaming_loop SET_BITMASK_AS_ENUM(iSpeechBit, FSC_checkLocateBounds) iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "JIM_IG_2a" BREAK // CASE FE_M2_SON_gaming_exit iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "" BREAK // CASE FE_M7_SON_gaming_exit iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "" BREAK CASE FE_M_SON_rapping_in_the_shower SET_BITMASK_AS_ENUM(iSpeechBit, FSC_checkLocateBounds) iRandCount = 22 iPlayerBitset = BIT_MICHAEL RETURN "FMM_0_2" BREAK //"Hear the neighbors talk, but you know that they be losin'" CASE FE_M_SON_Borrows_sisters_car iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "" BREAK //"God Dad, since you wont buy me a car I'm taking Tracys" CASE FE_M_SON_watching_porn SET_BITMASK_AS_ENUM(iSpeechBit, FSC_checkLocateBounds) CLEAR_BITMASK_AS_ENUM(iSpeechBit, FSC_checkTenSecDelay) iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "" BREAK //"mmm... oh yeah... where did I put my tube sock?" CASE FE_M_SON_in_room_asks_for_munchies iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "JIM_IG_3" BREAK CASE FE_M_SON_phone_calls_in_room CLEAR_BITMASK_AS_ENUM(iSpeechBit, FSC_singleRandomLine) iRandCount = 4 iPlayerBitset = BIT_MICHAEL RETURN "FMM_0_6" BREAK //"Yes, I know you fucked my sister dude. Hasn't everyone?" CASE FE_M_SON_on_ecstasy_AND_friendly CLEAR_BITMASK_AS_ENUM(iSpeechBit, FSC_singleRandomLine) iRandCount = 3 iPlayerBitset = BIT_MICHAEL RETURN "JIM_IG_5" BREAK CASE FE_M_SON_Fighting_with_sister_A SET_BITMASK_AS_ENUM(iSpeechBit, FSC_checkListenerAlive | FSC_checkLocateBounds) iRandCount = 6 iPlayerBitset = BIT_MICHAEL RETURN "FMM_0_8" BREAK CASE FE_M_SON_Fighting_with_sister_B SET_BITMASK_AS_ENUM(iSpeechBit, FSC_checkListenerAlive | FSC_checkLocateBounds) iRandCount = 6 iPlayerBitset = BIT_MICHAEL RETURN "FMM_0_8" BREAK CASE FE_M_SON_Fighting_with_sister_C SET_BITMASK_AS_ENUM(iSpeechBit, FSC_checkListenerAlive | FSC_checkLocateBounds) iRandCount = 6 iPlayerBitset = BIT_MICHAEL RETURN "FMM_0_8" BREAK CASE FE_M_SON_Fighting_with_sister_D SET_BITMASK_AS_ENUM(iSpeechBit, FSC_checkListenerAlive | FSC_checkLocateBounds) iRandCount = 6 iPlayerBitset = BIT_MICHAEL RETURN "FMM_0_8" BREAK CASE FE_M_SON_smoking_weed_in_a_bong iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "JIM_IG_1" BREAK CASE FE_M_SON_raids_fridge_for_food SET_BITMASK_AS_ENUM(iSpeechBit, FSC_checkLocateBounds) iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "JIM_IG_4" BREAK CASE FE_M7_SON_jumping_jacks iRandCount = 9 iPlayerBitset = BIT_MICHAEL RETURN "FAMR_IG_2a" BREAK CASE FE_M7_SON_gaming iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "" BREAK CASE FE_M7_SON_going_for_a_bike_ride iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "" BREAK CASE FE_M7_SON_coming_back_from_a_bike_ride iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "" BREAK CASE FE_M7_SON_on_laptop_looking_for_jobs iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "FMM7_0_5" BREAK CASE FE_M7_SON_watching_TV_with_tracey SET_BITMASK_AS_ENUM(iSpeechBit, FSC_checkListenerAlive) iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "FMM7_0_6" BREAK CASE FE_M2_DAUGHTER_sunbathing SET_BITMASK_AS_ENUM(iSpeechBit, FSC_checkLocateBounds) iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "TRA_IG_3" BREAK CASE FE_M_DAUGHTER_workout_with_mp3 IF NOT g_bMagDemoActive SET_BITMASK_AS_ENUM(iSpeechBit, FSC_checkLocateBounds) CLEAR_BITMASK_AS_ENUM(iSpeechBit, FSC_singleRandomLine) iRandCount = 3 iPlayerBitset = BIT_MICHAEL RETURN "TRA_IG_5" ELSE SET_BITMASK_AS_ENUM(iSpeechBit, FSC_checkLocateBounds) CLEAR_BITMASK_AS_ENUM(iSpeechBit, FSC_singleRandomLine) iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "TRA_IG_MD" ENDIF BREAK CASE FE_M_DAUGHTER_Going_out_in_her_car iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "" BREAK //"Hey Dad, fill up my car when I get back, will you?" CASE FE_M_DAUGHTER_walks_to_room_music iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "FMM_1_3" BREAK //"...Wake up in the mornin feelin like P diddy ..." CASE FE_M_DAUGHTER_dancing_practice CLEAR_BITMASK_AS_ENUM(iSpeechBit, FSC_checkTenSecDelay) SET_BITMASK_AS_ENUM(iSpeechBit, FSC_checkOnScreen) iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "" BREAK CASE FE_M_DAUGHTER_purges_in_the_bathroom SET_BITMASK_AS_ENUM(iSpeechBit, FSC_checkLocateBounds) iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "TRA_IG_7" BREAK CASE FE_M_DAUGHTER_on_phone_to_friends // CLEAR_BITMASK_AS_ENUM(iSpeechBit, FSC_checkTenSecDelay) CLEAR_BITMASK_AS_ENUM(iSpeechBit, FSC_singleRandomLine) SET_BITMASK_AS_ENUM(iSpeechBit, FSC_checkOnScreen) SET_BITMASK_AS_ENUM(iSpeechBit, FSC_checkLocateBounds) iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "FMM_1_6" BREAK //"So I said, like I told you, I said..." CASE FE_M_DAUGHTER_on_phone_LOCKED RETURN Get_SpeechLabel_From_FamilyEvent(FE_M_DAUGHTER_on_phone_to_friends, iRandCount, iSpeechBit, iPlayerBitset) BREAK //iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "FMM_2_2" BREAK //"Game, set and match." CASE FE_M_DAUGHTER_shower SET_BITMASK_AS_ENUM(iSpeechBit, FSC_checkLocateBounds) iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "FMM_1_8" BREAK //"...7am, waking up in the morning, Gotta be fresh, gotta go downstairs..." CASE FE_M_DAUGHTER_watching_TV_sober iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "FMM_1_9" BREAK //""God, my life is JUST like this show." CASE FE_M_DAUGHTER_watching_TV_drunk iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "TRA_IG_15" BREAK CASE FE_M_DAUGHTER_screaming_at_dad CLEAR_BITMASK_AS_ENUM(iSpeechBit, FSC_singleRandomLine) iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "" BREAK CASE FE_M_DAUGHTER_sniffs_drugs_in_toilet iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "FMM_1_11" BREAK //"*snort* uh, I think he sold me the cheap crap." CASE FE_M_DAUGHTER_sex_sounds_from_room iRandCount = 15 iPlayerBitset = BIT_MICHAEL RETURN "" BREAK //"Don't stop, don't stop... why have you stopped?" CASE FE_M_DAUGHTER_crying_over_a_guy CLEAR_BITMASK_AS_ENUM(iSpeechBit, FSC_singleRandomLine) iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "TRA_IG_1" BREAK CASE FE_M_DAUGHTER_Coming_home_drunk CLEAR_BITMASK_AS_ENUM(iSpeechBit, FSC_singleRandomLine) iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "TRA_IG_6" BREAK CASE FE_M_DAUGHTER_sleeping iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "" BREAK //"Zzzzzz..." CASE FE_M_DAUGHTER_couchsleep iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "" BREAK //"Zzzzzz..." CASE FE_M7_DAUGHTER_studying_on_phone iRandCount = 15 iPlayerBitset = BIT_MICHAEL RETURN "FMM7_1_0" BREAK CASE FE_M7_DAUGHTER_studying_does_nails iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "FMM7_1_1" BREAK CASE FE_M7_DAUGHTER_sunbathing SET_BITMASK_AS_ENUM(iSpeechBit, FSC_checkLocateBounds) iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "" BREAK CASE FE_M_WIFE_screams_at_mexmaid iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "" BREAK CASE FE_M2_WIFE_in_face_mask CLEAR_BITMASK_AS_ENUM(iSpeechBit, FSC_singleRandomLine) iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "AM_IG_10" BREAK CASE FE_M7_WIFE_in_face_mask CLEAR_BITMASK_AS_ENUM(iSpeechBit, FSC_singleRandomLine) iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "AMr_IG_10" BREAK CASE FE_M_WIFE_playing_tennis RETURN Get_SpeechLabel_From_FamilyEvent(FAMILY_MEMBER_BUSY, iRandCount, iSpeechBit, iPlayerBitset) BREAK //iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "FMM_2_2" BREAK //"Game, set and match." CASE FE_M2_WIFE_doing_yoga CLEAR_BITMASK_AS_ENUM(iSpeechBit, FSC_singleRandomLine) iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "AM_IG_4" BREAK CASE FE_M7_WIFE_doing_yoga CLEAR_BITMASK_AS_ENUM(iSpeechBit, FSC_singleRandomLine) iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "AMr_IG_4" BREAK // CASE FE_M_WIFE_getting_nails_done iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "FMM_2_4" BREAK //"Oh, I love that colour." // CASE FE_M_WIFE_leaving_in_car_v2 iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "" BREAK // CASE FE_M_WIFE_MD_leaving_in_car_v3 iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "" BREAK CASE FE_M_WIFE_leaving_in_car iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "" BREAK CASE FE_M2_WIFE_with_shopping_bags_enter CLEAR_BITMASK_AS_ENUM(iSpeechBit, FSC_singleRandomLine) iRandCount = 3 iPlayerBitset = BIT_MICHAEL RETURN "" BREAK CASE FE_M7_WIFE_with_shopping_bags_enter CLEAR_BITMASK_AS_ENUM(iSpeechBit, FSC_singleRandomLine) iRandCount = 3 iPlayerBitset = BIT_MICHAEL RETURN "" BREAK // CASE FE_M2_WIFE_with_shopping_bags_idle CLEAR_BITMASK_AS_ENUM(iSpeechBit, FSC_singleRandomLine) iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "AM_IG_7" BREAK // CASE FE_M7_WIFE_with_shopping_bags_idle CLEAR_BITMASK_AS_ENUM(iSpeechBit, FSC_singleRandomLine) iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "AMr_IG_7" BREAK // CASE FE_M2_WIFE_with_shopping_bags_exit CLEAR_BITMASK_AS_ENUM(iSpeechBit, FSC_singleRandomLine) iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "AM_IG_7" BREAK // CASE FE_M7_WIFE_with_shopping_bags_exit CLEAR_BITMASK_AS_ENUM(iSpeechBit, FSC_singleRandomLine) iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "AMr_IG_7" BREAK CASE FE_M_WIFE_gets_drink_in_kitchen iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "AM_IG_8" BREAK CASE FE_M2_WIFE_sunbathing CLEAR_BITMASK_AS_ENUM(iSpeechBit, FSC_singleRandomLine) iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "AM_IG_5" BREAK CASE FE_M7_WIFE_sunbathing CLEAR_BITMASK_AS_ENUM(iSpeechBit, FSC_singleRandomLine) iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "AMr_IG_5" BREAK // CASE FE_M_WIFE_getting_botox_done iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "FMM_2_8" BREAK //"Don't you dare make me smile Michael." CASE FE_M2_WIFE_passed_out_SOFA iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "AM_IG_1" BREAK CASE FE_M7_WIFE_passed_out_SOFA iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "AMr_IG_1" BREAK // CASE FE_M_WIFE_screaming_at_son_P1 iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "" BREAK CASE FE_M_WIFE_screaming_at_son_P2 iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "" BREAK CASE FE_M_WIFE_screaming_at_son_P3 iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "" BREAK CASE FE_M_WIFE_screaming_at_daughter CLEAR_BITMASK_AS_ENUM(iSpeechBit, FSC_singleRandomLine) iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "" BREAK CASE FE_M2_WIFE_phones_man_OR_therapist CLEAR_BITMASK_AS_ENUM(iSpeechBit, FSC_singleRandomLine) iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "AM_IG_11" BREAK CASE FE_M7_WIFE_phones_man_OR_therapist CLEAR_BITMASK_AS_ENUM(iSpeechBit, FSC_singleRandomLine) iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "AMr_IG_11" BREAK CASE FE_M_WIFE_hangs_up_and_wanders CLEAR_BITMASK_AS_ENUM(iSpeechBit, FSC_singleRandomLine) iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "" BREAK #IF NOT IS_JAPANESE_BUILD CASE FE_M2_WIFE_using_vibrator iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "" BREAK CASE FE_M_WIFE_using_vibrator_END iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "" BREAK CASE FE_M7_WIFE_using_vibrator iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "AMr_IG_6" BREAK #ENDIF CASE FE_M_WIFE_passed_out_BED iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "AM_IG_1" BREAK //"Wha, how did I end up in bed?" CASE FE_M2_WIFE_sleeping iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "" BREAK //"Zzzzzz..." CASE FE_M7_WIFE_sleeping iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "" BREAK //"Zzzzzz..." CASE FE_M7_WIFE_Making_juice iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "" BREAK CASE FE_M7_WIFE_shopping_with_daughter CLEAR_BITMASK_AS_ENUM(iSpeechBit, FSC_singleRandomLine) iRandCount = 3 iPlayerBitset = BIT_MICHAEL RETURN "" BREAK // CASE FE_M7_WIFE_shopping_with_son CLEAR_BITMASK_AS_ENUM(iSpeechBit, FSC_singleRandomLine) iRandCount = 3 iPlayerBitset = BIT_MICHAEL RETURN "" BREAK // CASE FE_M7_WIFE_on_phone iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "FMM7_2_3" BREAK CASE FE_M2_MEXMAID_cleans_booze_pot_other iRandCount = 3 iPlayerBitset = BIT_MICHAEL RETURN "MA_IG_1" BREAK CASE FE_M2_MEXMAID_clean_surface_a RETURN Get_SpeechLabel_From_FamilyEvent(FE_M2_MEXMAID_cleans_booze_pot_other, iRandCount, iSpeechBit, iPlayerBitset) BREAK CASE FE_M2_MEXMAID_clean_surface_b RETURN Get_SpeechLabel_From_FamilyEvent(FE_M2_MEXMAID_cleans_booze_pot_other, iRandCount, iSpeechBit, iPlayerBitset) BREAK CASE FE_M2_MEXMAID_clean_surface_c RETURN Get_SpeechLabel_From_FamilyEvent(FE_M2_MEXMAID_cleans_booze_pot_other, iRandCount, iSpeechBit, iPlayerBitset) BREAK CASE FE_M2_MEXMAID_clean_window iRandCount = 3 iPlayerBitset = BIT_MICHAEL RETURN "" BREAK CASE FE_M_MEXMAID_MIC4_clean_window iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "MA_IG_1b" BREAK CASE FE_M_MEXMAID_does_the_dishes iRandCount = 3 iPlayerBitset = BIT_MICHAEL RETURN "MA_IG_2" BREAK CASE FE_M_MEXMAID_stealing_stuff iRandCount = 3 iPlayerBitset = BIT_MICHAEL RETURN "" BREAK CASE FE_M_MEXMAID_stealing_stuff_caught iRandCount = 3 iPlayerBitset = BIT_MICHAEL RETURN "" BREAK CASE FE_M7_MEXMAID_cleans_booze_pot_other iRandCount = 6 iPlayerBitset = BIT_MICHAEL RETURN "FMM7_3_0" BREAK CASE FE_M7_MEXMAID_clean_surface iRandCount = 6 iPlayerBitset = BIT_MICHAEL RETURN "FMM7_surface" BREAK CASE FE_M7_MEXMAID_clean_window iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "FMM7_window" BREAK CASE FE_M_GARDENER_with_leaf_blower iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "FMM_4_0" BREAK //"Don't mind me Mr Michael, just getting rid of some of these leaves." CASE FE_M_GARDENER_planting_flowers iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "" BREAK // CASE FE_M_GARDENER_trimming_hedges iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "FMM_4_1" BREAK //"Don't mind me Mr Michael, just giving these hedges a trim." CASE FE_M_GARDENER_cleaning_pool iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "GAR_IG_4" BREAK CASE FE_M_GARDENER_mowing_lawn iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "FMM_4_3" BREAK //"Don't mind me Mr Michael, just mowing the lawn." CASE FE_M_GARDENER_watering_flowers iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "GAR_IG_5" BREAK // CASE FE_M_GARDENER_spraying_for_weeds iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "FMM_4_8" BREAK CASE FE_M_GARDENER_on_phone iRandCount = 4 iPlayerBitset = BIT_MICHAEL RETURN "GAR_IG_6" BREAK CASE FE_M_GARDENER_smoking_weed SET_BITMASK_AS_ENUM(iSpeechBit, FSC_checkLocateBounds) iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "GAR_IG_7" BREAK CASE FE_F_AUNT_pelvic_floor_exercises iRandCount = 5 iPlayerBitset = BIT_FRANKLIN RETURN "DEN_IG_1" BREAK CASE FE_F_AUNT_in_face_mask iRandCount = 3 iPlayerBitset = BIT_FRANKLIN RETURN "DEN_IG_2" BREAK CASE FE_F_AUNT_watching_TV iRandCount = 3 iPlayerBitset = BIT_FRANKLIN RETURN "DEN_IG_3" BREAK CASE FE_F_AUNT_listens_to_selfhelp_tapes_x iRandCount = 5 iPlayerBitset = BIT_FRANKLIN RETURN "DEN_IG_4" BREAK CASE FE_F_AUNT_returned_to_aunts CLEAR_BITMASK_AS_ENUM(iSpeechBit, FSC_singleRandomLine) SET_BITMASK_AS_ENUM(iSpeechBit, FSC_checkLocateBounds #IF USE_TU_CHANGES | FSC_setVoiceLocationForPed #ENDIF ) iRandCount = 5 iPlayerBitset = BIT_FRANKLIN RETURN "DEN_RETURN" BREAK // CASE FE_F_LAMAR_and_STRETCH_chill_outside // SET_BITMASK_AS_ENUM(iSpeechBit, FSC_checkListenerAlive) // CLEAR_BITMASK_AS_ENUM(iSpeechBit, FSC_singleRandomLine) // iRandCount = 5 iPlayerBitset = BIT_FRANKLIN RETURN "LAS_IG_1" // BREAK // CASE FE_F_LAMAR_and_STRETCH_bbq_outside // SET_BITMASK_AS_ENUM(iSpeechBit, FSC_checkListenerAlive) // CLEAR_BITMASK_AS_ENUM(iSpeechBit, FSC_singleRandomLine) // iRandCount = 5 iPlayerBitset = BIT_FRANKLIN RETURN "LAS_IG_2" // BREAK // CASE FE_F_LAMAR_and_STRETCH_arguing // SET_BITMASK_AS_ENUM(iSpeechBit, FSC_checkListenerAlive) // CLEAR_BITMASK_AS_ENUM(iSpeechBit, FSC_singleRandomLine) // iRandCount = 5 iPlayerBitset = BIT_FRANKLIN RETURN "LAS_IG_3" // BREAK // CASE FE_F_LAMAR_and_STRETCH_shout_at_cops // SET_BITMASK_AS_ENUM(iSpeechBit, FSC_checkListenerAlive) // CLEAR_BITMASK_AS_ENUM(iSpeechBit, FSC_singleRandomLine) // iRandCount = 5 iPlayerBitset = BIT_FRANKLIN RETURN "LAS_IG_4" // BREAK CASE FE_F_LAMAR_and_STRETCH_wandering iRandCount = 5 iPlayerBitset = BIT_FRANKLIN RETURN "" BREAK // CASE FE_F_DOG_doing_something iRandCount = 5 iPlayerBitset = BIT_FRANKLIN RETURN "FMF_2_0" BREAK //"" CASE FE_T0_RON_monitoring_police_frequency iRandCount = 3 iPlayerBitset = BIT_TREVOR RETURN "RON_IG_1" BREAK CASE FE_T0_RON_listens_to_radio_broadcast iRandCount = 3 iPlayerBitset = BIT_TREVOR RETURN "RON_IG_2" BREAK CASE FE_T0_RON_ranting_about_government_LAYING CLEAR_BITMASK_AS_ENUM(iSpeechBit, FSC_singleRandomLine) iRandCount = 3 iPlayerBitset = BIT_TREVOR RETURN "RON_IG_3" BREAK CASE FE_T0_RON_ranting_about_government_SITTING RETURN Get_SpeechLabel_From_FamilyEvent(FE_T0_RON_ranting_about_government_LAYING, iRandCount, iSpeechBit, iPlayerBitset) BREAK CASE FE_T0_RON_smoking_crystal iRandCount = 3 iPlayerBitset = BIT_TREVOR RETURN "RON_IG_4" BREAK CASE FE_T0_RON_drinks_moonshine_from_a_jar iRandCount = 5 iPlayerBitset = BIT_TREVOR RETURN "RON_IG_5" BREAK CASE FE_T0_RON_stares_through_binoculars iRandCount = 5 iPlayerBitset = BIT_TREVOR RETURN "RON_IG_6" BREAK CASE FE_T0_MICHAEL_depressed_head_in_hands iRandCount = 5 iPlayerBitset = BIT_TREVOR RETURN "MIC_IG_1" BREAK CASE FE_T0_MICHAEL_sunbathing iRandCount = 5 iPlayerBitset = BIT_TREVOR RETURN "MIC_IG_2" BREAK CASE FE_T0_MICHAEL_drinking_beer iRandCount = 5 iPlayerBitset = BIT_TREVOR RETURN "MIC_IG_3" BREAK CASE FE_T0_MICHAEL_on_phone_to_therapist iRandCount = 5 iPlayerBitset = BIT_TREVOR RETURN "" BREAK CASE FE_T0_MICHAEL_hangs_up_and_wanders CLEAR_BITMASK_AS_ENUM(iSpeechBit, FSC_singleRandomLine) iRandCount = 5 iPlayerBitset = BIT_TREVOR RETURN "" BREAK CASE FE_T0_TREVOR_and_kidnapped_wife_walk CLEAR_BITMASK_AS_ENUM(iSpeechBit, FSC_singleRandomLine) SET_BITMASK_AS_ENUM(iSpeechBit, FSC_checkListenerAlive) iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "TRV_IG_1" BREAK CASE FE_T0_TREVOR_and_kidnapped_wife_stare CLEAR_BITMASK_AS_ENUM(iSpeechBit, FSC_singleRandomLine) SET_BITMASK_AS_ENUM(iSpeechBit, FSC_checkListenerAlive) iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "TRV_IG_2" BREAK CASE FE_T0_TREVOR_smoking_crystal iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "TRV_IG_3" BREAK #IF NOT IS_JAPANESE_BUILD CASE FE_T0_TREVOR_doing_a_shit iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "TRV_IG_4" BREAK #ENDIF //CASE FE_T0_TREVOR_and_kidnapped_wife_laugh CLEAR_BITMASK_AS_ENUM(iSpeechBit, FSC_singleRandomLine) CLEAR_BITMASK_AS_ENUM(iSpeechBit, FSC_checkTenSecDelay) SET_BITMASK_AS_ENUM(iSpeechBit, FSC_checkListenerAlive) iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "" BREAK CASE FE_T0_TREVOR_blowing_shit_up iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "TRV_IG_6" BREAK CASE FE_T0_TREVOR_passed_out_naked_drunk iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "TRV_IG_7" BREAK CASE FE_T0_RONEX_outside_looking_lonely iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "RONEX_IG_1" BREAK CASE FE_T0_RONEX_trying_to_pick_up_signals iRandCount = 5 iPlayerBitset = BIT_TREVOR | BIT_MICHAEL RETURN "" BREAK //"Sssh, I though I heard something from the greys" CASE FE_T0_RONEX_working_a_moonshine_sill iRandCount = 5 iPlayerBitset = BIT_TREVOR | BIT_MICHAEL | BIT_FRANKLIN RETURN "" BREAK CASE FE_T0_RONEX_doing_target_practice iRandCount = 5 iPlayerBitset = BIT_TREVOR | BIT_MICHAEL RETURN "RONEX_IG_4" BREAK CASE FE_T0_KIDNAPPED_WIFE_cleaning iRandCount = 5 iPlayerBitset = BIT_TREVOR | BIT_MICHAEL RETURN "PAT_IG_1" BREAK CASE FE_T0_KIDNAPPED_WIFE_does_garden_work iRandCount = 5 iPlayerBitset = BIT_TREVOR | BIT_MICHAEL RETURN "PAT_IG_2" BREAK CASE FE_T0_KIDNAPPED_WIFE_talks_to_Michael SET_BITMASK_AS_ENUM(iSpeechBit, FSC_checkListenerAlive) CLEAR_BITMASK_AS_ENUM(iSpeechBit, FSC_singleRandomLine) iRandCount = 5 iPlayerBitset = BIT_TREVOR | BIT_MICHAEL RETURN "PAT_IG_3" BREAK // CASE FE_T0_KIDNAPPED_WIFE_cooking_a_meal iRandCount = 5 iPlayerBitset = BIT_TREVOR | BIT_MICHAEL RETURN "FMT_4_3" BREAK //"A little more oregano, some salt. Mmm, thats good" CASE FE_T0_MOTHER_duringRandomChar iRandCount = 5 iPlayerBitset = BIT_TREVOR CLEAR_BITMASK_AS_ENUM(iSpeechBit, FSC_singleRandomLine) RETURN "" BREAK // CASE FE_T0_MOTHER_something_b iRandCount = 5 iPlayerBitset = BIT_TREVOR RETURN "" BREAK // CASE FE_T0_MOTHER_something_c iRandCount = 5 iPlayerBitset = BIT_TREVOR RETURN "" BREAK CASE FE_T1_FLOYD_cleaning iRandCount = 5 iPlayerBitset = BIT_TREVOR RETURN "FL_IG_1" BREAK CASE FE_T1_FLOYD_cries_in_foetal_position iRandCount = 5 iPlayerBitset = BIT_TREVOR RETURN "FL_IG_2" BREAK CASE FE_T1_FLOYD_cries_on_sofa iRandCount = 5 iPlayerBitset = BIT_TREVOR RETURN "FL_IG_2" BREAK CASE FE_T1_FLOYD_pineapple iRandCount = 0 iPlayerBitset = BIT_TREVOR RETURN "" BREAK CASE FE_T1_FLOYD_on_phone_to_girlfriend iRandCount = 12 iPlayerBitset = BIT_TREVOR RETURN "FL_IG_3a" BREAK CASE FE_T1_FLOYD_hangs_up_and_wanders iRandCount = 5 iPlayerBitset = BIT_TREVOR RETURN "" BREAK CASE FE_T1_FLOYD_hiding_from_Trevor_a iRandCount = 5 iPlayerBitset = BIT_TREVOR RETURN "" BREAK CASE FE_T1_FLOYD_hiding_from_Trevor_b RETURN Get_SpeechLabel_From_FamilyEvent(FE_T1_FLOYD_hiding_from_Trevor_a, iRandCount, iSpeechBit, iPlayerBitset) BREAK CASE FE_T1_FLOYD_hiding_from_Trevor_c RETURN Get_SpeechLabel_From_FamilyEvent(FE_T1_FLOYD_hiding_from_Trevor_a, iRandCount, iSpeechBit, iPlayerBitset) BREAK CASE FE_T1_FLOYD_is_sleeping iRandCount = 5 iPlayerBitset = BIT_TREVOR RETURN "FL_IG_5" BREAK // CASE FE_T1_FLOYD_with_wade_post_trevor3 iRandCount = 5 iPlayerBitset = BIT_TREVOR RETURN "FL_IG_6" BREAK CASE FE_T1_FLOYD_with_wade_post_docks1 iRandCount = 9 iPlayerBitset = BIT_TREVOR RETURN "FL_IG_7" BREAK CASE FE_ANY_find_family_event iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "" BREAK CASE FE_ANY_wander_family_event iRandCount = 5 iPlayerBitset = BIT_MICHAEL RETURN "" BREAK CASE NO_FAMILY_EVENTS iRandCount = 5 iPlayerBitset = BIT_NOBODY RETURN "" BREAK ENDSWITCH #IF IS_DEBUG_BUILD CPRINTLN(DEBUG_FAMILY, "invalid eFamilyEvent ", Get_String_From_FamilyEvent(eFamilyEvent), " in Get_SpeechLabel_From_FamilyEvent()") SCRIPT_ASSERT("invalid eFamilyEvent Get_SpeechLabel_From_FamilyEvent()") #ENDIF iRandCount = -1 iPlayerBitset = 0 RETURN "NULL" ENDFUNC // ******************************************************************************************* // FAMILY SPEECH FUNCTIONS // ******************************************************************************************* FUNC BOOL FAMILY_Is_Any_Dialogue_Playing(PED_INDEX pedID) IF IS_ANY_SPEECH_PLAYING(PLAYER_PED_ID()) RETURN(TRUE) ENDIF IF IS_ANY_SPEECH_PLAYING(pedID) RETURN(TRUE) ENDIF IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() RETURN(TRUE) ENDIF IF IS_CALLING_ANY_CONTACT() RETURN(TRUE) ENDIF RETURN(FALSE) ENDFUNC FUNC BOOL Is_Family_Speech_Loaded_And_Setup(STRING strTextBlock, TEXT_BLOCK_SLOTS SlotNumber = AMBIENT_DIALOGUE_TEXT_SLOT) //AMBIENT_DIALOGUE_TEXT_SLOT IF HAS_THIS_ADDITIONAL_TEXT_LOADED(strTextBlock, SlotNumber) RETURN(TRUE) ELSE IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND NOT IS_MOBILE_PHONE_CALL_ONGOING() IF NOT IS_STREAMING_ADDITIONAL_TEXT(SlotNumber) REQUEST_ADDITIONAL_TEXT(strTextBlock, SlotNumber) ENDIF ENDIF ENDIF RETURN(FALSE) ENDFUNC FUNC BOOL GetRandomConversationFromLabel(STRING strTextBlock, TEXT_LABEL &strLabel, TEXT_LABEL &tCreatedConvLabels[]) IF IS_STRING_NULL_OR_EMPTY(strLabel) RETURN FALSE ENDIF IF Is_Family_Speech_Loaded_And_Setup(strTextBlock) TEXT_LABEL tLabel = strLabel TEXT_LABEL tZero = "" INT iNumberOfRandomConvs = -1 //is the conv randomline or singleconv? tLabel = strLabel tLabel += "a" tLabel += "_" tLabel += tZero tLabel += "1" IF DOES_TEXT_LABEL_EXIST(tLabel) tZero = "" ELSE tZero = "0" tLabel = strLabel tLabel += "a" tLabel += "_" tLabel += tZero tLabel += "1" IF DOES_TEXT_LABEL_EXIST(tLabel) ELSE CPRINTLN(DEBUG_FAMILY, "invalid GetRandomConversationFromLabel(", strLabel, ", ", tLabel, ") - block \"", strTextBlock, "\"") RETURN(FALSE) ENDIF ENDIF TEXT_LABEL tLabels[15] BOOL bReachedEnd = TRUE // does first variation exist? tLabel = strLabel tLabel += "a" tLabel += "_" tLabel += tZero tLabel += "1" IF DOES_TEXT_LABEL_EXIST(tLabel) iNumberOfRandomConvs++ tLabels[iNumberOfRandomConvs] = strLabel tLabels[iNumberOfRandomConvs] += "a" bReachedEnd = FALSE ENDIF // does second variation exist? IF NOT bReachedEnd bReachedEnd = TRUE tLabel = strLabel tLabel += "b" tLabel += "_" tLabel += tZero tLabel += "1" IF DOES_TEXT_LABEL_EXIST(tLabel) iNumberOfRandomConvs++ tLabels[iNumberOfRandomConvs] = strLabel tLabels[iNumberOfRandomConvs] += "b" bReachedEnd = FALSE ENDIF ENDIF // does third variation exist? IF NOT bReachedEnd bReachedEnd = TRUE tLabel = strLabel tLabel += "c" tLabel += "_" tLabel += tZero tLabel += "1" IF DOES_TEXT_LABEL_EXIST(tLabel) iNumberOfRandomConvs++ tLabels[iNumberOfRandomConvs] = strLabel tLabels[iNumberOfRandomConvs] += "c" bReachedEnd = FALSE ENDIF ENDIF // does forth variation exist? IF NOT bReachedEnd bReachedEnd = TRUE tLabel = strLabel tLabel += "d" tLabel += "_" tLabel += tZero tLabel += "1" IF DOES_TEXT_LABEL_EXIST(tLabel) iNumberOfRandomConvs++ tLabels[iNumberOfRandomConvs] = strLabel tLabels[iNumberOfRandomConvs] += "d" bReachedEnd = FALSE ENDIF ENDIF // does fifth variation exist??? IF NOT bReachedEnd bReachedEnd = TRUE tLabel = strLabel tLabel += "e" tLabel += "_" tLabel += tZero tLabel += "1" IF DOES_TEXT_LABEL_EXIST(tLabel) iNumberOfRandomConvs++ tLabels[iNumberOfRandomConvs] = strLabel tLabels[iNumberOfRandomConvs] += "e" bReachedEnd = FALSE ENDIF ENDIF // does sixth variation exist??? IF NOT bReachedEnd bReachedEnd = TRUE tLabel = strLabel tLabel += "f" tLabel += "_" tLabel += tZero tLabel += "1" IF DOES_TEXT_LABEL_EXIST(tLabel) iNumberOfRandomConvs++ tLabels[iNumberOfRandomConvs] = strLabel tLabels[iNumberOfRandomConvs] += "f" bReachedEnd = FALSE ENDIF ENDIF // does seventh variation exist??? IF NOT bReachedEnd bReachedEnd = TRUE tLabel = strLabel tLabel += "g" tLabel += "_" tLabel += tZero tLabel += "1" IF DOES_TEXT_LABEL_EXIST(tLabel) iNumberOfRandomConvs++ tLabels[iNumberOfRandomConvs] = strLabel tLabels[iNumberOfRandomConvs] += "g" bReachedEnd = FALSE ENDIF ENDIF // does eigth variation exist??? IF NOT bReachedEnd bReachedEnd = TRUE tLabel = strLabel tLabel += "h" tLabel += "_" tLabel += tZero tLabel += "1" IF DOES_TEXT_LABEL_EXIST(tLabel) iNumberOfRandomConvs++ tLabels[iNumberOfRandomConvs] = strLabel tLabels[iNumberOfRandomConvs] += "h" bReachedEnd = FALSE ENDIF ENDIF // does nineth variation exist??? IF NOT bReachedEnd bReachedEnd = TRUE tLabel = strLabel tLabel += "i" tLabel += "_" tLabel += tZero tLabel += "1" IF DOES_TEXT_LABEL_EXIST(tLabel) iNumberOfRandomConvs++ tLabels[iNumberOfRandomConvs] = strLabel tLabels[iNumberOfRandomConvs] += "i" bReachedEnd = FALSE ENDIF ENDIF // does tenth variation exist??? IF NOT bReachedEnd bReachedEnd = TRUE tLabel = strLabel tLabel += "j" tLabel += "_" tLabel += tZero tLabel += "1" IF DOES_TEXT_LABEL_EXIST(tLabel) iNumberOfRandomConvs++ tLabels[iNumberOfRandomConvs] = strLabel tLabels[iNumberOfRandomConvs] += "j" bReachedEnd = FALSE ENDIF ENDIF // does eleventh variation exist??? IF NOT bReachedEnd bReachedEnd = TRUE tLabel = strLabel tLabel += "k" tLabel += "_" tLabel += tZero tLabel += "1" IF DOES_TEXT_LABEL_EXIST(tLabel) iNumberOfRandomConvs++ tLabels[iNumberOfRandomConvs] = strLabel tLabels[iNumberOfRandomConvs] += "k" bReachedEnd = FALSE ENDIF ENDIF // does twelvth variation exist??? IF NOT bReachedEnd bReachedEnd = TRUE tLabel = strLabel tLabel += "JJJ" tLabel += "_" tLabel += tZero tLabel += "1" IF DOES_TEXT_LABEL_EXIST(tLabel) iNumberOfRandomConvs++ tLabels[iNumberOfRandomConvs] = strLabel tLabels[iNumberOfRandomConvs] += "JJJ" bReachedEnd = FALSE ENDIF ENDIF // does thirteenth variation exist??? IF NOT bReachedEnd bReachedEnd = TRUE tLabel = strLabel tLabel += "m" tLabel += "_" tLabel += tZero tLabel += "1" IF DOES_TEXT_LABEL_EXIST(tLabel) iNumberOfRandomConvs++ tLabels[iNumberOfRandomConvs] = strLabel tLabels[iNumberOfRandomConvs] += "m" bReachedEnd = FALSE ENDIF ENDIF // does fourteenth variation exist??? IF NOT bReachedEnd bReachedEnd = TRUE tLabel = strLabel tLabel += "n" tLabel += "_" tLabel += tZero tLabel += "1" IF DOES_TEXT_LABEL_EXIST(tLabel) iNumberOfRandomConvs++ tLabels[iNumberOfRandomConvs] = strLabel tLabels[iNumberOfRandomConvs] += "n" bReachedEnd = FALSE ENDIF ENDIF // does fifteenth variation exist??? IF NOT bReachedEnd bReachedEnd = TRUE tLabel = strLabel tLabel += "o" tLabel += "_" tLabel += tZero tLabel += "1" IF DOES_TEXT_LABEL_EXIST(tLabel) iNumberOfRandomConvs++ tLabels[iNumberOfRandomConvs] = strLabel tLabels[iNumberOfRandomConvs] += "o" bReachedEnd = FALSE ENDIF ENDIF // // // // // INT iMAX_FamilyConvs = iNumberOfRandomConvs INT iConvs REPEAT COUNT_OF(tCreatedConvLabels) iConvs #IF IS_DEBUG_BUILD IF g_bDrawDebugFamilyStuff CPRINTLN(DEBUG_FAMILY, "tCreatedConvLabels[", iConvs, "]: \"", tCreatedConvLabels[iConvs], "\"") ENDIF #ENDIF IF NOT IS_STRING_NULL_OR_EMPTY(tCreatedConvLabels[iConvs]) INT iLabels REPEAT COUNT_OF(tLabels) iLabels IF NOT IS_STRING_NULL_OR_EMPTY(tLabels[iLabels]) IF ARE_STRINGS_EQUAL(tCreatedConvLabels[iConvs], tLabels[iLabels]) #IF IS_DEBUG_BUILD CPRINTLN(DEBUG_FAMILY, " tLabels[", iLabels, "]: \"", tLabels[iLabels], "\" matches \"", tCreatedConvLabels[iConvs], "\"") #ENDIF INT iNewConvs FOR iNewConvs = iLabels TO COUNT_OF(tLabels)-1 #IF IS_DEBUG_BUILD IF g_bDrawDebugFamilyStuff CPRINTLN(DEBUG_FAMILY, " tLabels[", iNewConvs, "] = tLabels[", iNewConvs, "+1] ") ENDIF #ENDIF IF ((iNewConvs+1) < COUNT_OF(tLabels)) tLabels[iNewConvs] = tLabels[iNewConvs+1] ELSE tLabels[iNewConvs] = "" ENDIF ENDFOR iMAX_FamilyConvs-- ELSE #IF IS_DEBUG_BUILD IF g_bDrawDebugFamilyStuff CDEBUG3LN(DEBUG_FAMILY, " tLabels[", iLabels, "]: \"", tLabels[iLabels], "\" doesn't match \"", tCreatedConvLabels[iConvs], "\"") ENDIF #ENDIF ENDIF ELSE #IF IS_DEBUG_BUILD IF g_bDrawDebugFamilyStuff CDEBUG3LN(DEBUG_FAMILY, " tLabels[", iLabels, "]: \"", tLabels[iLabels], "\"") ENDIF #ENDIF ENDIF ENDREPEAT ENDIF ENDREPEAT INT iConvName = GET_RANDOM_INT_IN_RANGE(0, iMAX_FamilyConvs+1) strLabel = tLabels[iConvName] #IF IS_DEBUG_BUILD IF g_bDrawDebugFamilyStuff OR IS_STRING_NULL_OR_EMPTY(strLabel) CPRINTLN(DEBUG_FAMILY, "strLabel = tLabels[", iConvName, "] \"", strLabel, "\"") INT iLabels REPEAT COUNT_OF(tLabels) iLabels CPRINTLN(DEBUG_FAMILY, " tLabels[", iLabels, "]: \"", tLabels[iLabels], "\"") ENDREPEAT ENDIF #ENDIF // // // // // #IF IS_DEBUG_BUILD IF g_bDrawDebugFamilyStuff OR IS_STRING_NULL_OR_EMPTY(strLabel) CPRINTLN(DEBUG_FAMILY, "GetRandomConversationFromLabel(", strLabel, ") [", 0, ", ", iNumberOfRandomConvs+1, ": ", iConvName, "]") ENDIF #ENDIF IF IS_STRING_NULL_OR_EMPTY(strLabel) CPRINTLN(DEBUG_FAMILY, GET_THIS_SCRIPT_NAME(), ": GetRandomConversationFromLabel(", strLabel, ") [", 0, ", ", iNumberOfRandomConvs+1, ": ", iConvName, "] is null???") RETURN(FALSE) ENDIF RETURN(TRUE) ENDIF RETURN(FALSE) ENDFUNC FUNC BOOL Is_Ped_Playing_Family_Speech(STRING strTextBlock, STRING strLabel, structPedsForConversation &inSpeechStruct, enumConversationPriority enSpeechPriority, TEXT_LABEL &tCreatedConvLabels[], STRING stringFacialAnimClip = NULL) IF IS_STRING_NULL_OR_EMPTY(strLabel) CASSERTLN(DEBUG_FAMILY, GET_THIS_SCRIPT_NAME(), " Is_Ped_Playing_Family_Speech - attempting to create a null conversation??") RETURN(FALSE) ENDIF CDEBUG3LN(DEBUG_FAMILY, GET_THIS_SCRIPT_NAME(), " Is_Ped_Playing_Family_Speech.GET_CURRENT_STACK_SIZE(", GET_CURRENT_STACK_SIZE() ," max ", GET_ALLOCATED_STACK_SIZE(), ")") IF Is_Family_Speech_Loaded_And_Setup(strTextBlock) STRING sVoiceID = "" SWITCH GET_CURRENT_PLAYER_PED_ENUM() CASE CHAR_MICHAEL sVoiceID = "MICHAEL" BREAK CASE CHAR_FRANKLIN sVoiceID = "FRANKLIN" BREAK CASE CHAR_TREVOR sVoiceID = "TREVOR" BREAK ENDSWITCH IF IS_STRING_NULL_OR_EMPTY(stringFacialAnimClip) ADD_PED_FOR_DIALOGUE(inSpeechStruct, 0, PLAYER_PED_ID(), sVoiceID) CDEBUG3LN(DEBUG_FAMILY, GET_THIS_SCRIPT_NAME(), " Is_Ped_Playing_Family_Speech.GET_CURRENT_STACK_SIZE(", GET_CURRENT_STACK_SIZE(), "/", GET_ALLOCATED_STACK_SIZE(), ") before creating animless conversation \"", strTextBlock, "\", \"", strLabel, "\"") IF CREATE_CONVERSATION(inSpeechStruct, strTextBlock, strLabel, enSpeechPriority) CDEBUG3LN(DEBUG_FAMILY, GET_THIS_SCRIPT_NAME(), " Is_Ped_Playing_Family_Speech.GET_CURRENT_STACK_SIZE(", GET_CURRENT_STACK_SIZE(), "/", GET_ALLOCATED_STACK_SIZE(), ") before creating animless conversation \"", strTextBlock, "\", \"", strLabel, "\"") INT iConv = COUNT_OF(tCreatedConvLabels)-1 WHILE (iConv > 0) tCreatedConvLabels[iConv] = tCreatedConvLabels[iConv-1] iConv-- ENDWHILE tCreatedConvLabels[0] = strLabel #IF IS_DEBUG_BUILD CPRINTLN(DEBUG_FAMILY, "CREATE_FAMILY_CONVERSATION: \"", strLabel, "\"") REPEAT COUNT_OF(tCreatedConvLabels) iConv CPRINTLN(DEBUG_FAMILY, " tCreatedConvLabels[", iConv, "]: \"", tCreatedConvLabels[iConv], "\"") ENDREPEAT CPRINTLN(DEBUG_FAMILY, "") #ENDIF RETURN(TRUE) ENDIF ELSE ADD_PED_FOR_DIALOGUE(inSpeechStruct, 0, PLAYER_PED_ID(), sVoiceID) CDEBUG3LN(DEBUG_FAMILY, GET_THIS_SCRIPT_NAME(), " Is_Ped_Playing_Family_Speech.GET_CURRENT_STACK_SIZE(", GET_CURRENT_STACK_SIZE(), "/", GET_ALLOCATED_STACK_SIZE(), ") before animated conversation \"", strTextBlock, "\", \"", strLabel, "\"") IF CREATE_CONVERSATION(inSpeechStruct, strTextBlock, strLabel, enSpeechPriority) CDEBUG3LN(DEBUG_FAMILY, GET_THIS_SCRIPT_NAME(), " Is_Ped_Playing_Family_Speech.GET_CURRENT_STACK_SIZE(", GET_CURRENT_STACK_SIZE(), "/", GET_ALLOCATED_STACK_SIZE(), ") before creating animated conversation \"", strTextBlock, "\", \"", strLabel, "\"") PAUSE_FACE_TO_FACE_CONVERSATION(TRUE) INT iConv = COUNT_OF(tCreatedConvLabels)-1 WHILE (iConv > 0) tCreatedConvLabels[iConv] = tCreatedConvLabels[iConv-1] iConv-- ENDWHILE tCreatedConvLabels[0] = strLabel #IF IS_DEBUG_BUILD CPRINTLN(DEBUG_FAMILY, "CREATE_FAMILY_FACIAL_CONVERSATION: \"", strLabel, "\"") REPEAT COUNT_OF(tCreatedConvLabels) iConv CPRINTLN(DEBUG_FAMILY, " tCreatedConvLabels[", iConv, "]: \"", tCreatedConvLabels[iConv], "\"") ENDREPEAT CPRINTLN(DEBUG_FAMILY, "") #ENDIF RETURN(TRUE) ENDIF ENDIF ENDIF RETURN(FALSE) ENDFUNC FUNC BOOL IsSpeechListenerAlive(structPedsForConversation &inSpeechStruct, STRING strTextBlock, STRING strLabel) IF IS_STRING_NULL_OR_EMPTY(strLabel) CASSERTLN(DEBUG_FAMILY, "IsSpeechListenerAlive - Speaker Listener string has null value.") RETURN FALSE ENDIF TEXT_LABEL strLabel_SL = strLabel strLabel_SL += "SL" IF Is_Family_Speech_Loaded_And_Setup(strTextBlock) IF DOES_TEXT_LABEL_EXIST (strLabel_SL) STRING strLabel_AUD = GET_FILENAME_FOR_AUDIO_CONVERSATION (strLabel_SL) IF IS_STRING_NULL (strLabel_AUD) CPRINTLN(DEBUG_FAMILY, "Speaker Listener string has null value.") RETURN FALSE ELSE CPRINTLN(DEBUG_FAMILY, "IsSpeechListenerAlive - SL Label for dialogue ", strLabel_SL, " is \"", strLabel_AUD, "\"") CONST_INT iSLmanipulator 0 INT startPointSpeaker = (iSLmanipulator * 3), endPointSpeaker = ((iSLmanipulator * 3)+ 1) TEXT_LABEL singleSpeakerCharacter = GET_CHARACTER_FROM_AUDIO_CONVERSATION_FILENAME (strLabel_AUD, startPointSpeaker, endPointSpeaker) CPRINTLN(DEBUG_FAMILY, " speaker:'", singleSpeakerCharacter, "' [", startPointSpeaker, ", ", endPointSpeaker) INT startPointListener = ((iSLmanipulator * 3) + 1), endPointListener = ((iSLmanipulator * 3)+ 2) TEXT_LABEL singleListenerCharacter = GET_CHARACTER_FROM_AUDIO_CONVERSATION_FILENAME (strLabel_AUD, startPointListener, endPointListener) CPRINTLN(DEBUG_FAMILY, "], listener:'", singleListenerCharacter, "' [", startPointListener, ", ", endPointListener, "]") INT iSpeaker IF STRING_TO_INT(singleSpeakerCharacter, iSpeaker) IF DOES_ENTITY_EXIST(inSpeechStruct.PedInfo[iSpeaker].Index) CPRINTLN(DEBUG_FAMILY, "iSpeaker [", inSpeechStruct.PedInfo[iSpeaker].VoiceID, "] exists //", iSpeaker, " '", singleListenerCharacter, "'") ELSE CPRINTLN(DEBUG_FAMILY, "iSpeaker [", inSpeechStruct.PedInfo[iSpeaker].VoiceID, "] DOESNT EXIST //", iSpeaker) RETURN FALSE ENDIF ELSE CPRINTLN(DEBUG_FAMILY, "invalid speaker string-to-int [", singleSpeakerCharacter, "] //", iSpeaker) ENDIF INT iListener IF STRING_TO_INT(singleListenerCharacter, iListener) IF DOES_ENTITY_EXIST(inSpeechStruct.PedInfo[iListener].Index) CPRINTLN(DEBUG_FAMILY, "iListener [", inSpeechStruct.PedInfo[iListener].VoiceID, "] exists //", iListener, " '", singleListenerCharacter, "'") ELSE CPRINTLN(DEBUG_FAMILY, "iListener [", inSpeechStruct.PedInfo[iListener].VoiceID, "] DOESNT EXIST //", iListener) RETURN FALSE ENDIF ELSE CPRINTLN(DEBUG_FAMILY, "invalid listener string-to-int [", singleListenerCharacter, "] //", iListener) ENDIF ENDIF ELSE CPRINTLN(DEBUG_FAMILY, "IsSpeechListenerAlive - Speaker Listener label for conversation \"", strLabel_SL, "\" does not exist. Check americandialogue.txt to see if the root is present and you've made the gxt.") RETURN FALSE ENDIF ELSE CPRINTLN(DEBUG_FAMILY, "IsSpeechListenerAlive - Is_Family_Speech_Loaded_And_Setup()") RETURN FALSE ENDIF RETURN TRUE ENDFUNC FUNC BOOL PRIVATE_IsPlayerAtFamilyEventSpeechBounds(PED_INDEX memberID, enumFamilyEvents eFamilyEvent) VECTOR VecOffset = <<0,0,0>>, VecBounds = <<5,5,2>> SWITCH eFamilyEvent CASE FE_M2_SON_gaming_loop VecOffset = << 0.0, 2.0, 0.0>> VecBounds = <<5.0, 7.0, 2.0>> BREAK CASE FE_M_SON_raids_fridge_for_food VecOffset = << 0.0, 0.0, 0.0>> VecBounds = <<5.0, 5.0, 2.0>> BREAK CASE FE_M_SON_watching_porn VecOffset = << 0.0, 3.9, 0.0>> VecBounds = <<5.0, 5.0, 2.0>> BREAK CASE FE_M_SON_rapping_in_the_shower VecOffset = << 1.0,-2.0, 0.0>> VecBounds = <<5.0, 5.0, 2.0>> BREAK CASE FE_M_SON_Fighting_with_sister_A VecOffset = << 0.0, 5.0, 0.0>> VecBounds = <<5.0, 7.5, 2.0>> BREAK CASE FE_M_SON_Fighting_with_sister_B VecOffset = << 0.0, 5.0, 0.0>> VecBounds = <<5.0, 7.5, 2.0>> BREAK CASE FE_M_SON_Fighting_with_sister_C VecOffset = << 0.0, 5.0, 0.0>> VecBounds = <<5.0, 7.5, 2.0>> BREAK CASE FE_M_SON_Fighting_with_sister_D VecOffset = << 0.0, 5.0, 0.0>> VecBounds = <<5.0, 7.5, 2.0>> BREAK CASE FE_M2_DAUGHTER_sunbathing VecOffset = <<-1.0,-0.5, 0.0>> VecBounds = <<6.5, 3.5, 2.0>> BREAK CASE FE_M7_DAUGHTER_sunbathing PRIVATE_IsPlayerAtFamilyEventSpeechBounds(memberID, FE_M2_DAUGHTER_sunbathing) BREAK CASE FE_M_DAUGHTER_shower VecOffset = << 1.0,-2.0, 0.0>> VecBounds = <<5.0, 5.0, 2.0>> BREAK CASE FE_M_DAUGHTER_workout_with_mp3 VecOffset = <<-1.5, 0.5, 0.0>> VecBounds = <<5.0, 6.5, 2.0>> BREAK CASE FE_M_DAUGHTER_on_phone_to_friends VecOffset = <<-2.1, 4.1, 0.0>> VecBounds = <<5.5, 5.5, 2.0>> BREAK CASE FE_M_DAUGHTER_on_phone_LOCKED PRIVATE_IsPlayerAtFamilyEventSpeechBounds(memberID, FE_M_DAUGHTER_on_phone_to_friends) BREAK CASE FE_M_DAUGHTER_purges_in_the_bathroom VecOffset = << 0.0, 5.0, 0.0>> VecBounds = <<5.0, 7.5, 2.0>> BREAK CASE FE_M_GARDENER_smoking_weed VecOffset = << 0.0, 0.0, 0.0>> VecBounds = <<2.0, 2.0, 2.0>> BREAK CASE FE_F_AUNT_returned_to_aunts VecOffset = << 0.0, 0.0, 0.0>> VecBounds = <<10.0, 10.0, 2.0>> BREAK DEFAULT VecOffset = <<0,0,0>> VecBounds = <<5,5,2>> #IF IS_DEBUG_BUILD CPRINTLN(DEBUG_FAMILY, "invalid eFamilyEvent ", Get_String_From_FamilyEvent(eFamilyEvent), " in IsPlayerAtFamilyEventSpeechBounds()") SCRIPT_ASSERT("invalid eFamilyEvent IsPlayerAtFamilyEventSpeechBounds()") #ENDIF BREAK ENDSWITCH #IF IS_DEBUG_BUILD IF bEdit_speech_bounds TEXT_LABEL_63 str = "FamilyEventSpeechBounds:" str += Get_String_From_FamilyEvent(eFamilyEvent) VECTOR vMemberCoord = GET_ENTITY_COORDS(memberID) WIDGET_GROUP_ID family_scene_widget = START_WIDGET_GROUP(str) ADD_WIDGET_BOOL("bEdit_speech_bounds", bEdit_speech_bounds) ADD_WIDGET_VECTOR_SLIDER("VecOffset", VecOffset, -20.0, 20.0, 0.1) ADD_WIDGET_VECTOR_SLIDER("VecBounds", VecBounds, 0.0, 20.0, 0.5) STOP_WIDGET_GROUP() WHILE bEdit_speech_bounds IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vMemberCoord+VecOffset, VecBounds) WAIT(0) ENDWHILE DELETE_WIDGET_GROUP(family_scene_widget) SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_STRING_TO_DEBUG_FILE("IsPlayerAtFamilyEventSpeechBounds()")SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_STRING_TO_DEBUG_FILE("CASE ")SAVE_STRING_TO_DEBUG_FILE(Get_String_From_FamilyEvent(eFamilyEvent))SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_STRING_TO_DEBUG_FILE(" VecOffset = ")SAVE_VECTOR_TO_DEBUG_FILE(VecOffset)SAVE_STRING_TO_DEBUG_FILE(" VecBounds = ")SAVE_VECTOR_TO_DEBUG_FILE(VecBounds)SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_STRING_TO_DEBUG_FILE("BREAK")SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_NEWLINE_TO_DEBUG_FILE() RETURN FALSE ENDIF #ENDIF VECTOR vMemberCoord = GET_ENTITY_COORDS(memberID) IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vMemberCoord+VecOffset, VecBounds) RETURN TRUE ENDIF RETURN FALSE ENDFUNC FUNC BOOL Is_Dialogue_Anim_Drinking(PED_INDEX memberID, TEXT_LABEL_63 tDialogueAnimDict, TEXT_LABEL_63 tDialogueAnimClip, INT iScene, structTimer &speechTimer) IF NOT IS_PLAYER_CONTROL_ON(PLAYER_ID()) RETURN FALSE ENDIF IF NOT IS_STRING_NULL_OR_EMPTY(tDialogueAnimDict) AND NOT IS_STRING_NULL_OR_EMPTY(tDialogueAnimClip) IF IS_PED_INJURED(memberID) RETURN FALSE ENDIF IF NOT IS_ENTITY_PLAYING_ANIM(memberID, tDialogueAnimDict, tDialogueAnimClip) RETURN FALSE ENDIF FLOAT ReturnStartPhase, ReturnEndPhase IF FIND_ANIM_EVENT_PHASE(tDialogueAnimDict, tDialogueAnimClip, "drinking", ReturnStartPhase, ReturnEndPhase) // CPRINTLN(DEBUG_FAMILY, "Is_Dialogue_Anim_Drinking() - FIND_ANIM_EVENT_PHASE(\"", tDialogueAnimDict, "\", \"", tDialogueAnimClip, "\")") IF ARE_STRINGS_EQUAL(tDialogueAnimDict, "TIMETABLE@AMANDA@DRUNK_IN_KITCHEN@") ReturnStartPhase = 0.05 ReturnEndPhase = 0.75 // #IF IS_DEBUG_BUILD // TEXT_LABEL_63 str // str = ("\"") // str += tDialogueAnimDict // str += ("\\") // str += tDialogueAnimClip // str += ("\" need \"drinking\" tag") // CPRINTLN(DEBUG_FAMILY, str) // #ENDIF ENDIF ELSE // CPRINTLN(DEBUG_FAMILY, "Is_Dialogue_Anim_Drinking() - FIND_ANIM_EVENT_PHASE(\"", tDialogueAnimDict, "\", \"", tDialogueAnimClip, "\")") IF ARE_STRINGS_EQUAL(tDialogueAnimDict, "TIMETABLE@AMANDA@DRUNK_IN_KITCHEN@") ReturnStartPhase = 0.05 ReturnEndPhase = 0.75 // #IF IS_DEBUG_BUILD // TEXT_LABEL_63 str // str = ("\"") // str += tDialogueAnimDict // str += ("\\") // str += tDialogueAnimClip // str += ("\" need \"drinking\" tag") // CPRINTLN(DEBUG_FAMILY, str) // #ENDIF ELIF ARE_STRINGS_EQUAL(tDialogueAnimDict, "TIMETABLE@RON@MOONSHINE_IG_5") //idle_a and idle_b have tags OR (ARE_STRINGS_EQUAL(tDialogueAnimDict, "TIMETABLE@MICHAEL@ON_SOFAIDLE_A") OR ARE_STRINGS_EQUAL(tDialogueAnimDict, "TIMETABLE@MICHAEL@ON_SOFAIDLE_B") OR ARE_STRINGS_EQUAL(tDialogueAnimDict, "TIMETABLE@MICHAEL@ON_SOFAIDLE_C")) // OR (ARE_STRINGS_EQUAL(tDialogueAnimDict, "TIMETABLE@JIMMY@IG_5@BASE") AND ARE_STRINGS_EQUAL(tDialogueAnimClip, "base")) //#1424988 ReturnStartPhase = 0.25 ReturnEndPhase = 0.75 // #IF IS_DEBUG_BUILD // TEXT_LABEL_63 str // str = ("\"") // str += tDialogueAnimDict // str += ("\\") // str += tDialogueAnimClip // str += ("\" need \"drinking\" tag") // CPRINTLN(DEBUG_FAMILY, str) // #ENDIF ELSE ReturnStartPhase = -1 ReturnEndPhase = -1 RETURN FALSE ENDIF ENDIF FLOAT fDialogueAnimCurrentTime = -1 IF IS_ENTITY_PLAYING_ANIM(memberID, tDialogueAnimDict, tDialogueAnimClip, ANIM_SCRIPT) fDialogueAnimCurrentTime = GET_ENTITY_ANIM_CURRENT_TIME(memberID, tDialogueAnimDict, tDialogueAnimClip) ELIF IS_ENTITY_PLAYING_ANIM(memberID, tDialogueAnimDict, tDialogueAnimClip, ANIM_SYNCED_SCENE) fDialogueAnimCurrentTime = GET_SYNCHRONIZED_SCENE_PHASE(iScene) ENDIF IF (fDialogueAnimCurrentTime > ReturnStartPhase) AND (fDialogueAnimCurrentTime < ReturnEndPhase) IF IS_TIMER_STARTED(speechTimer) IF NOT IS_TIMER_PAUSED(speechTimer) PAUSE_TIMER(speechTimer) ENDIF ENDIF RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC FUNC BOOL Play_Coming_Home_Family_Speech(INT iPlayerBitset, INT&iComingHomeFamilySpeechStage, INTERIOR_INSTANCE_INDEX iPlayerInterior, INTERIOR_INSTANCE_INDEX iSafehouseInterior, structPedsForConversation &inSpeechStruct, STRING strTextBlock, TEXT_LABEL &tCreatedConvLabels[], structTimer &speechTimer) //"FMM_HOME1" //{Michael comes home - before break up}" //"FMM_HOME2" //{Michael comes home - during break up}" //"FMM_HOME3" //{Michael comes home - after reunion}" SWITCH iComingHomeFamilySpeechStage CASE 0 IF IS_VALID_INTERIOR(iSafehouseInterior) IF IS_INTERIOR_READY(iSafehouseInterior) CPRINTLN(DEBUG_FAMILY, "safehouse interior ready") iComingHomeFamilySpeechStage = 1 IF IS_VALID_INTERIOR(iPlayerInterior) IF IS_INTERIOR_READY(iPlayerInterior) CPRINTLN(DEBUG_FAMILY, "safehouse interior ready, player interior ready") iComingHomeFamilySpeechStage = 99 RETURN FALSE ENDIF ENDIF VECTOR vSafehouseInterior, vPlayerCoord FLOAT fSafehouseInteriorDist2 vSafehouseInterior = GET_OFFSET_FROM_INTERIOR_IN_WORLD_COORDS(iSafehouseInterior, <<0,0,0>>) vPlayerCoord = GET_ENTITY_COORDS(PLAYER_PED_ID(), FALSE) fSafehouseInteriorDist2 = VDIST2(vSafehouseInterior, vPlayerCoord) CPRINTLN(DEBUG_FAMILY, "fSafehouseInteriorDist", SQRT(fSafehouseInteriorDist2)) IF (fSafehouseInteriorDist2 < (15.0*15.0)) CPRINTLN(DEBUG_FAMILY, "safehouse interior ready, player dist too far ", SQRT(fSafehouseInteriorDist2)) iComingHomeFamilySpeechStage = 99 RETURN FALSE ENDIF ENDIF ENDIF BREAK CASE 1 //player started outside the house - will be entering... IF NOT IS_BITMASK_SET(iPlayerBitset, GET_CURRENT_PLAYER_PED_BIT()) CPRINTLN(DEBUG_FAMILY, "safehouse interior ready, player not iPlayerBitset") RETURN FALSE ENDIF IF IS_VALID_INTERIOR(iPlayerInterior) IF IS_INTERIOR_READY(iPlayerInterior) CPRINTLN(DEBUG_FAMILY, "safehouse interior ready, player interior ready") iComingHomeFamilySpeechStage = 10 ELSE CPRINTLN(DEBUG_FAMILY, "safehouse interior ready, player interior not ready") ENDIF ELSE CPRINTLN(DEBUG_FAMILY, "safehouse interior ready, player interior not valid") ENDIF BREAK CASE 10 CPRINTLN(DEBUG_FAMILY, "safehouse interior not valid, player interior ready - play dialogue") IF IS_VALID_INTERIOR(iPlayerInterior) IF IS_INTERIOR_READY(iPlayerInterior) CPRINTLN(DEBUG_FAMILY, "safehouse interior ready, player interior ready") iComingHomeFamilySpeechStage = 10 ELSE CPRINTLN(DEBUG_FAMILY, "safehouse interior ready, player interior not ready") SCRIPT_ASSERT("safehouse interior ready, player interior not ready") iComingHomeFamilySpeechStage = 0 RETURN FALSE ENDIF ELSE CPRINTLN(DEBUG_FAMILY, "safehouse interior ready, player interior not valid") SCRIPT_ASSERT("safehouse interior ready, player interior not valid") iComingHomeFamilySpeechStage = 0 RETURN FALSE ENDIF TEXT_LABEL returnedStrLabel returnedStrLabel = "" SWITCH GetMichaelScheduleStage() CASE MSS_M2_WithFamily returnedStrLabel = "FMM_HOME1" BREAK CASE MSS_M4_WithoutFamily returnedStrLabel = "FMM_HOME2" BREAK CASE MSS_M6_Exiled returnedStrLabel = "" iComingHomeFamilySpeechStage = 99 RETURN FALSE BREAK CASE MSS_M7_ReunitedWithFamily IF (g_eCurrentFamilyEvent[FM_MICHAEL_SON] = FE_M_FAMILY_MIC4_locked_in_room) OR (g_eCurrentFamilyEvent[FM_MICHAEL_DAUGHTER] = FE_M_FAMILY_MIC4_locked_in_room) OR (g_eCurrentFamilyEvent[FM_MICHAEL_WIFE] = FE_M_FAMILY_MIC4_locked_in_room) returnedStrLabel = "" iComingHomeFamilySpeechStage = 99 RETURN FALSE ENDIF returnedStrLabel = "FMM_HOME3" BREAK ENDSWITCH enumConversationPriority enSpeechPriority enSpeechPriority = CONV_PRIORITY_AMBIENT_MEDIUM IF Is_Ped_Playing_Family_Speech(strTextBlock, returnedStrLabel, inSpeechStruct, enSpeechPriority, tCreatedConvLabels) RESTART_TIMER_NOW(speechTimer) iComingHomeFamilySpeechStage = 99 RETURN TRUE ENDIF BREAK CASE 99 BREAK ENDSWITCH RETURN FALSE ENDFUNC /* "FMM_2_M0a" - Michael/Amanda Pre break up chat 1 "FMM_2_M0b" - Michael/Amanda Pre break up chat 2 "FMM_2_M0c" - Michael/Amanda Pre break up chat 3 "FMM_2_M0d" - Michael/Amanda Pre break up chat 4 "FMM_2_M0e" - Michael/Amanda Pre break up chat 5 "FMM_2_M0f" - Michael/Amanda Pre break up chat 6 "FMM_2_M0g" - Michael/Amanda Pre break up chat 7 "FMM_2_M0h" - Michael/Amanda Pre break up chat 8 "FMM_2_M0i" - Michael/Amanda Pre break up chat 9 "FMM_2_M0j" - Michael/Amanda Pre break up chat 10 "FMM_2_M0k" - Michael/Amanda Pre break up chat 11 "FMM_2_M0l" - Michael/Amanda Pre break up chat 12 "FMM_2_M0m" - Michael/Amanda Pre break up chat 13 "FMM_2_M0n" - Michael/Amanda Pre break up chat 14 "FMM_2_M0o" - Michael/Amanda Pre break up chat 15 "FMM_2_M1a" - Michael/Amanda Post break up chat 1 "FMM_2_M1b" - Michael/Amanda Post break up chat 2 "FMM_2_M1c" - Michael/Amanda Post break up chat 3 "FMM_2_M1d" - Michael/Amanda Post break up chat 4 "FMM_2_M1e" - Michael/Amanda Post break up chat 5 "FMM_2_M1f" - Michael/Amanda Post break up chat 6 "FMM_2_M1g" - Michael/Amanda Post break up chat 7 "FMM_2_M1h" - Michael/Amanda Post break up chat 8 "FMM_2_M1i" - Michael/Amanda Post break up chat 9 "FMM_2_M1j" - Michael/Amanda Post break up chat 10 "FMM_2_T0a" - Trevor/Amanda greet each other 1 "FMM_2_T0b" - Trevor/Amanda greet each other 2 "FMM_2_T0c" - Trevor/Amanda greet each other 3 "FMM_2_T0d" - Trevor/Amanda greet each other 4 "FMM_2_T0e" - Trevor/Amanda greet each other 5 "FMM_2_T1a" - Trevor/Amanda insult each other 1 "FMM_2_T1b" - Trevor/Amanda insult each other 2 "FMM_2_T1c" - Trevor/Amanda insult each other 3 "FMM_2_T1d" - Trevor/Amanda insult each other 4 "FMM_2_T1e" - Trevor/Amanda insult each other 5 "FMM_2_T1f" - Trevor/Amanda insult each other 6 "FMM_2_T1g" - Trevor/Amanda insult each other 7 "FMM_2_T1h" - Trevor/Amanda insult each other 8 "FMM_2_T1i" - Trevor/Amanda insult each other 9 "FMM_2_T1j" - Trevor/Amanda insult each other 10 "FMM_2_F01" - Franklin/Amanda greet each other 1 "FMM_2_F02" - Franklin/Amanda greet each other 2 "FMM_2_F03" - Franklin/Amanda greet each other 3 "FMM_2_F04" - Franklin/Amanda greet each other 4 "FMM_2_F05" - Franklin/Amanda greet each other 5 */ FUNC BOOL Play_Greet_Player_Family_Context(PED_INDEX memberID, enumFamilyEvents eFamilyEvent, structPedsForConversation &inSpeechStruct, STRING strTextBlock, TEXT_LABEL &tCreatedConvLabels[], structTimer &speechTimer, enumConversationPriority enSpeechPriority) VECTOR vMemberCoord = GET_ENTITY_COORDS(memberID) VECTOR vPlayerCoord = GET_ENTITY_COORDS(PLAYER_PED_ID()) enumCharacterList ePlayer = GET_CURRENT_PLAYER_PED_ENUM() enumFamilyMember eFamilyMember = GET_enumFamilyMember_from_ped(memberID) TEXT_LABEL strLabel = "" SWITCH eFamilyMember CASE FM_MICHAEL_SON IF g_eCurrentFamilyEvent[FM_MICHAEL_SON] = FE_M_SON_sleeping #IF IS_DEBUG_BUILD DrawDebugSceneSphere(vMemberCoord, 0.5, HUD_COLOUR_GREENLIGHT, 0.1) #ENDIF RETURN FALSE ENDIF strLabel = "FMM_0" BREAK CASE FM_MICHAEL_DAUGHTER IF g_eCurrentFamilyEvent[FM_MICHAEL_DAUGHTER] = FE_M_DAUGHTER_sleeping #IF IS_DEBUG_BUILD DrawDebugSceneSphere(vMemberCoord, 0.5, HUD_COLOUR_GREENLIGHT, 0.1) #ENDIF RETURN FALSE ENDIF strLabel = "FMM_1" BREAK CASE FM_MICHAEL_WIFE IF g_eCurrentFamilyEvent[FM_MICHAEL_WIFE] = FE_M2_WIFE_sleeping OR g_eCurrentFamilyEvent[FM_MICHAEL_WIFE] = FE_M7_WIFE_sleeping #IF IS_DEBUG_BUILD DrawDebugSceneSphere(vMemberCoord, 0.5, HUD_COLOUR_GREENLIGHT, 0.1) #ENDIF RETURN FALSE ENDIF strLabel = "FMM_2" BREAK CASE FM_MICHAEL_MEXMAID IF ePlayer = CHAR_FRANKLIN OR ePlayer = CHAR_TREVOR #IF IS_DEBUG_BUILD DrawDebugSceneSphere(vMemberCoord, 0.5, HUD_COLOUR_GREEN, 0.1) #ENDIF RETURN FALSE ENDIF strLabel = "FMM_3" BREAK CASE FM_MICHAEL_GARDENER IF ePlayer = CHAR_FRANKLIN OR ePlayer = CHAR_TREVOR #IF IS_DEBUG_BUILD DrawDebugSceneSphere(vMemberCoord, 0.5, HUD_COLOUR_GREEN, 0.1) #ENDIF RETURN FALSE ENDIF strLabel = "FMM_4" BREAK CASE FM_FRANKLIN_AUNT IF ePlayer = CHAR_MICHAEL OR ePlayer = CHAR_TREVOR #IF IS_DEBUG_BUILD DrawDebugSceneSphere(vMemberCoord, 0.5, HUD_COLOUR_GREEN, 0.1) #ENDIF RETURN FALSE ENDIF strLabel = "FMF_0" BREAK CASE FM_FRANKLIN_LAMAR IF ePlayer = CHAR_MICHAEL #IF IS_DEBUG_BUILD DrawDebugSceneSphere(vMemberCoord, 0.5, HUD_COLOUR_GREEN, 0.1) #ENDIF RETURN FALSE ENDIF strLabel = "FMF_1" BREAK CASE FM_TREVOR_0_RON IF ePlayer = CHAR_FRANKLIN #IF IS_DEBUG_BUILD DrawDebugSceneSphere(vMemberCoord, 0.5, HUD_COLOUR_GREEN, 0.1) #ENDIF RETURN FALSE ENDIF strLabel = "FMT_0" BREAK CASE FM_TREVOR_0_WIFE IF ePlayer = CHAR_FRANKLIN OR ePlayer = CHAR_MICHAEL #IF IS_DEBUG_BUILD DrawDebugSceneSphere(vMemberCoord, 0.5, HUD_COLOUR_GREEN, 0.1) #ENDIF RETURN FALSE ENDIF strLabel = "FMT_3" BREAK DEFAULT #IF IS_DEBUG_BUILD DrawDebugSceneSphere(vMemberCoord, 0.5, HUD_COLOUR_GREEN, 0.1) #ENDIF RETURN FALSE BREAK ENDSWITCH SWITCH ePlayer CASE CHAR_MICHAEL IF (eFamilyMember = FM_MICHAEL_SON) OR (eFamilyMember = FM_MICHAEL_DAUGHTER) OR (eFamilyMember = FM_MICHAEL_MEXMAID) OR (eFamilyMember = FM_MICHAEL_GARDENER) strLabel += "_M0" ELSE #if USE_CLF_DLC strLabel += "_M1" #endif #if USE_NRM_DLC strLabel += "_M1" #endif #if not USE_CLF_DLC #if not USE_NRM_DLC IF NOT Get_Mission_Flow_Flag_State(FLOWFLAG_MICHAEL_TREVOR_EXILE_FINISHED) strLabel += "_M0" ELSE strLabel += "_M1" ENDIF #endif #endif ENDIF BREAK CASE CHAR_FRANKLIN strLabel += "_F" BREAK CASE CHAR_TREVOR IF (eFamilyMember = FM_TREVOR_0_WIFE) strLabel += "_T0" ELSE #if USE_CLF_DLC strLabel += "_T1" #endif #if USE_NRM_DLC strLabel += "_T1" #endif #if not USE_CLF_DLC #if not USE_NRM_DLC IF NOT Get_Mission_Flow_Flag_State(FLOWFLAG_MICHAEL_TREVOR_EXILE_STARTED) strLabel += "_T0" ELSE strLabel += "_T1" ENDIF #endif #endif ENDIF BREAK ENDSWITCH IF VDIST2(vMemberCoord, vPlayerCoord) > (10*10) #IF IS_DEBUG_BUILD DrawDebugSceneSphere(vMemberCoord, 0.5, HUD_COLOUR_GREEN, 0.1) #ENDIF RETURN FALSE ENDIF IF (eFamilyEvent = FE_M_SON_rapping_in_the_shower) //#1576971 OR (eFamilyEvent = FE_M_DAUGHTER_shower) CONST_FLOAT fMAX_HEIGHT_FOR_SPEECH 2.0 IF (ABSF(vPlayerCoord.z-vMemberCoord.z) > fMAX_HEIGHT_FOR_SPEECH) #IF IS_DEBUG_BUILD DrawDebugSceneSphere(vMemberCoord, 0.5, HUD_COLOUR_GREEN, 0.1) #ENDIF RETURN FALSE ENDIF ELSE IF NOT IS_ENTITY_ON_SCREEN(memberID) OR NOT IS_ENTITY_VISIBLE(memberID) #IF IS_DEBUG_BUILD DrawDebugSceneSphere(vMemberCoord, 0.5, HUD_COLOUR_GREEN, 0.1) #ENDIF RETURN FALSE ENDIF ENDIF BOOL bIgnoreLockDoorCheck = FALSE SWITCH eFamilyEvent CASE FE_M_SON_phone_calls_in_room CASE FE_M_SON_watching_porn CASE FE_M_FAMILY_MIC4_locked_in_room CASE FE_M_DAUGHTER_sniffs_drugs_in_toilet CASE FE_M_DAUGHTER_sex_sounds_from_room CASE FE_M_DAUGHTER_on_phone_LOCKED CASE FE_T1_FLOYD_with_wade_post_docks1 bIgnoreLockDoorCheck = TRUE BREAK ENDSWITCH #IF IS_DEBUG_BUILD INT iMemberRoomKey = GET_ROOM_KEY_FROM_ENTITY(memberID) TEXT_LABEL_63 sRoom = "playerRoom: " sRoom += g_sShopSettings.playerRoom sRoom += ", famRoom: " sRoom += iMemberRoomKey IF bIgnoreLockDoorCheck sRoom += " IGNORE" ENDIF IF g_sShopSettings.playerRoom <> iMemberRoomKey DrawDebugSceneTextWithOffset(sRoom, vMemberCoord, -5, HUD_COLOUR_GREEN) ELSE DrawDebugSceneTextWithOffset(sRoom, vMemberCoord, -5, HUD_COLOUR_ORANGE) ENDIF #ENDIF IF NOT IS_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_TALK) AND NOT IS_DISABLED_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_TALK) #IF IS_DEBUG_BUILD TEXT_LABEL_63 str = "greet: \"" str += strLabel str += "\"" DrawDebugSceneTextWithOffset(str, vMemberCoord, -2, HUD_COLOUR_PURE_WHITE) TEXT_LABEL strLabel_a = strLabel TEXT_LABEL strLabel_b = strLabel strLabel_b += "_01" TEXT_LABEL strLabel_c0 = strLabel, strLabel_c1 = strLabel strLabel_c0 += "a_1" strLabel_c1 += "a_2" str = "\"" IF DOES_TEXT_LABEL_EXIST(strLabel_a) str = "a:\"" str += GET_STRING_FROM_TEXT_FILE(strLabel_a) str = "\"" DrawDebugSceneTextWithOffset(str, vMemberCoord, -1, HUD_COLOUR_PURE_WHITE) ELSE IF DOES_TEXT_LABEL_EXIST(strLabel_b) str = "b:\"" str += GET_STRING_FROM_TEXT_FILE(strLabel_b) str += "\"" DrawDebugSceneTextWithOffset(str, vMemberCoord, -1, HUD_COLOUR_PURE_WHITE) ELSE IF DOES_TEXT_LABEL_EXIST(strLabel_c0) IF DOES_TEXT_LABEL_EXIST(strLabel_c1) str = "c0:\"" str += GET_STRING_FROM_TEXT_FILE(strLabel_c0) str += "\"" DrawDebugSceneTextWithOffset(str, vMemberCoord, -4, HUD_COLOUR_PURE_WHITE) str = "c1:\"" str += GET_STRING_FROM_TEXT_FILE(strLabel_c1) str += "\"" DrawDebugSceneTextWithOffset(str, vMemberCoord, -3, HUD_COLOUR_PURE_WHITE) ELSE str = "c0:\"" str += GET_STRING_FROM_TEXT_FILE(strLabel_c0) str += "\"" DrawDebugSceneTextWithOffset(str, vMemberCoord, -1, HUD_COLOUR_PURE_WHITE) ENDIF ELSE str = "d:\"" str += GET_STRING_FROM_TEXT_FILE("unknown...") str += "\"" DrawDebugSceneTextWithOffset(str, vMemberCoord, -1, HUD_COLOUR_GREENLIGHT) ENDIF ENDIF ENDIF #ENDIF RETURN FALSE ENDIF IF NOT bIgnoreLockDoorCheck #IF NOT IS_DEBUG_BUILD INT iMemberRoomKey = GET_ROOM_KEY_FROM_ENTITY(memberID) #ENDIF IF g_sShopSettings.playerRoom <> iMemberRoomKey #IF IS_DEBUG_BUILD DrawDebugSceneSphere(vMemberCoord, 0.5, HUD_COLOUR_GREEN, 0.1) #ENDIF RETURN FALSE ENDIF ENDIF TEXT_LABEL strLabelData = strLabel strLabelData += "_01" BOOL bRandomConv IF DOES_TEXT_LABEL_EXIST(strLabelData) bRandomConv = TRUE ELSE bRandomConv = FALSE ENDIF IF bRandomConv OR GetRandomConversationFromLabel(strTextBlock, strLabel, tCreatedConvLabels) IF eFamilyMember = FM_FRANKLIN_AUNT IF ePlayer = CHAR_MICHAEL ADD_PED_FOR_DIALOGUE(inSpeechStruct, 0, PLAYER_PED_ID(), "MICHAEL") ELIF ePlayer = CHAR_FRANKLIN ADD_PED_FOR_DIALOGUE(inSpeechStruct, 0, PLAYER_PED_ID(), "FRANKLIN") ELIF ePlayer = CHAR_TREVOR ADD_PED_FOR_DIALOGUE(inSpeechStruct, 0, PLAYER_PED_ID(), "TREVOR") ENDIF ENDIF IF Is_Ped_Playing_Family_Speech(strTextBlock, strLabel, inSpeechStruct, enSpeechPriority, tCreatedConvLabels) #IF IS_DEBUG_BUILD IF g_bDrawDebugFamilyStuff CPRINTLN(DEBUG_FAMILY, "family member ", Get_String_From_FamilyEvent(eFamilyEvent), " playing greet line speech \"", strLabel, "\" [block:\"", strTextBlock, "\"]") INT iRepeat REPEAT COUNT_OF(inSpeechStruct.PedInfo) iRepeat IF (inSpeechStruct.PedInfo[iRepeat].Index = memberID) CPRINTLN(DEBUG_FAMILY, " //\"", inSpeechStruct.PedInfo[iRepeat].VoiceId, "\" speaker num# ", iRepeat) ENDIF ENDREPEAT CPRINTLN(DEBUG_FAMILY, "") ENDIF #ENDIF #IF IS_DEBUG_BUILD DrawDebugSceneSphere(vMemberCoord, 0.5, HUD_COLOUR_WHITE) #ENDIF RESTART_TIMER_NOW(speechTimer) RETURN TRUE ENDIF ENDIF #IF IS_DEBUG_BUILD DrawDebugSceneSphere(vMemberCoord, 0.5, HUD_COLOUR_BLACK) #ENDIF #IF NOT IS_DEBUG_BUILD eFamilyEvent = eFamilyEvent #ENDIF RETURN FALSE ENDFUNC FUNC BOOL CheckAggro() //"FMM_AGR1" - Michael is walking after player and annoying amanda //"FMM_AGR2" - Michael/Amanda Really grief - level of intensity / irritation up from below //"FMM_AGR3" - Michael/Amanda REALLY really grief - AMANDA runs off screaming //"FMM_AGR4" - Trevor or franklin are griefing Amanda - ie walking near her, annoying her //"FMM_AGR5" - Trevor or franklin are really griefing Amanda //"FMM_AGR6" - Trevor or franklin are really griefing Amanda - she runs off screaming RETURN FALSE ENDFUNC FUNC BOOL Play_This_Family_Speech(PED_INDEX memberID, enumFamilyEvents eFamilyEvent, structPedsForConversation &inSpeechStruct, STRING strTextBlock, TEXT_LABEL &tCreatedConvLabels[], structTimer &speechTimer, INT &iCurrentRandCount, FLOAT fMAX_DIST_FOR_SPEECH_2D = 5.0, STRING stringOverrideLabel = NULL, STRING stringFacialAnimClip = NULL) CDEBUG3LN(DEBUG_FAMILY, GET_THIS_SCRIPT_NAME(), " Play_This_Family_Speech.GET_CURRENT_STACK_SIZE(", GET_CURRENT_STACK_SIZE() ," max ", GET_ALLOCATED_STACK_SIZE(), ")") enumConversationPriority enSpeechPriority = CONV_PRIORITY_AMBIENT_MEDIUM IF IS_PED_INJURED(PLAYER_PED_ID()) RETURN FALSE ENDIF IF IS_PED_INJURED(memberID) RETURN FALSE ENDIF IF NOT IS_ENTITY_VISIBLE(memberID) RETURN FALSE ENDIF //dont play if another dialogue is playing IF FAMILY_Is_Any_Dialogue_Playing(memberID) IF IS_TIMER_STARTED(speechTimer) IF NOT IS_TIMER_PAUSED(speechTimer) PAUSE_TIMER(speechTimer) ENDIF ENDIF RETURN FALSE ENDIF //dont play if MP hud is on screen IF IS_TRANSITION_ACTIVE() OR IS_SCRIPT_HUD_DISPLAYING(HUDPART_TRANSITIONHUD) OR g_bResultScreenDisplaying IF IS_TIMER_STARTED(speechTimer) IF NOT IS_TIMER_PAUSED(speechTimer) PAUSE_TIMER(speechTimer) ENDIF ENDIF RETURN FALSE ENDIF //dont play if MP hud is on screen IF IS_PLAYER_SWITCH_IN_PROGRESS() OR Is_Player_Timetable_Scene_In_Progress() IF IS_TIMER_STARTED(speechTimer) IF NOT IS_TIMER_PAUSED(speechTimer) PAUSE_TIMER(speechTimer) ENDIF ENDIF RETURN FALSE ENDIF VECTOR vPlayerCoord = GET_ENTITY_COORDS(PLAYER_PED_ID()) VECTOR vMemberCoord = GET_ENTITY_COORDS(memberID) #IF IS_DEBUG_BUILD FLOAT fDebugStringOffsetY = 0.2 FLOAT fFamilyEventRow IF (eFamilyEvent >= FE_T1_FLOYD_cleaning) fFamilyEventRow = TO_FLOAT(ENUM_TO_INT(eFamilyEvent - FE_T1_FLOYD_cleaning)) ELIF (eFamilyEvent >= FE_T0_MICHAEL_depressed_head_in_hands) fFamilyEventRow = TO_FLOAT(ENUM_TO_INT(eFamilyEvent - FE_T0_MICHAEL_depressed_head_in_hands)) ELIF (eFamilyEvent >= FE_F_AUNT_pelvic_floor_exercises) fFamilyEventRow = TO_FLOAT(ENUM_TO_INT(eFamilyEvent - FE_F_AUNT_pelvic_floor_exercises)) ELSE fFamilyEventRow = TO_FLOAT(ENUM_TO_INT(eFamilyEvent)) ENDIF #ENDIF IF Play_Greet_Player_Family_Context(memberID, eFamilyEvent, inSpeechStruct, strTextBlock, tCreatedConvLabels, speechTimer, enSpeechPriority) RETURN TRUE ENDIF CheckAggro() INT iRandCount, iSpeechBit, iPlayerBitset STRING strLabel = Get_SpeechLabel_From_FamilyEvent(eFamilyEvent, iRandCount, iSpeechBit, iPlayerBitset) IF NOT IS_STRING_NULL_OR_EMPTY(stringOverrideLabel) strLabel = stringOverrideLabel #IF IS_DEBUG_BUILD fDebugStringOffsetY = 0.25 #ENDIF ENDIF IF IS_STRING_NULL_OR_EMPTY(strLabel) #IF IS_DEBUG_BUILD TEXT_LABEL_63 str = "strLabel " str += Get_String_From_FamilyEvent(eFamilyEvent) str += " is NULL" IF DrawDebugFamilyTextWithOffset(str, vPlayerCoord, fFamilyEventRow * fDebugStringOffsetY, HUD_COLOUR_GREYDARK, 0.5) // CPRINTLN(DEBUG_FAMILY, str) ENDIF #ENDIF RETURN FALSE ENDIF IF IS_BITMASK_AS_ENUM_SET(iSpeechBit, FSC_checkLocateBounds) IF NOT PRIVATE_IsPlayerAtFamilyEventSpeechBounds(memberID, eFamilyEvent) #IF IS_DEBUG_BUILD TEXT_LABEL_63 str = "bounds " str += Get_String_From_FamilyEvent(eFamilyEvent) str += ": " str += GET_STRING_FROM_FLOAT(GET_DISTANCE_BETWEEN_COORDS(vPlayerCoord, vMemberCoord, FALSE)) DrawDebugFamilyTextWithOffset(str, vPlayerCoord, fFamilyEventRow * fDebugStringOffsetY, HUD_COLOUR_GREENDARK) #ENDIF RETURN FALSE ENDIF ELSE IF IS_BITMASK_AS_ENUM_SET(iSpeechBit, FSC_checkDistance2d) //dont play if player is too far from speaker IF (GET_DISTANCE_BETWEEN_COORDS(vPlayerCoord, vMemberCoord, FALSE) > fMAX_DIST_FOR_SPEECH_2D) #IF IS_DEBUG_BUILD TEXT_LABEL_63 str = "dist " str += Get_String_From_FamilyEvent(eFamilyEvent) str += ": " str += GET_STRING_FROM_FLOAT(GET_DISTANCE_BETWEEN_COORDS(vPlayerCoord, vMemberCoord, FALSE)) str += " > " str += ROUND(fMAX_DIST_FOR_SPEECH_2D) DrawDebugFamilyTextWithOffset(str, vPlayerCoord, fFamilyEventRow * fDebugStringOffsetY, HUD_COLOUR_GREEN) DrawDebugFamilySphere(vMemberCoord, fMAX_DIST_FOR_SPEECH_2D, HUD_COLOUR_GREEN, 0.1) #ENDIF RETURN FALSE ENDIF ENDIF IF IS_BITMASK_AS_ENUM_SET(iSpeechBit, FSC_checkOnSameFloor) //dont play if player is on a different floor from speaker CONST_FLOAT fMAX_HEIGHT_FOR_SPEECH 2.0 IF (ABSF(vPlayerCoord.z-vMemberCoord.z) > fMAX_HEIGHT_FOR_SPEECH) #IF IS_DEBUG_BUILD TEXT_LABEL_63 str = ("absf ") str += (Get_String_From_FamilyEvent(eFamilyEvent)) str += (": ") str += GET_STRING_FROM_FLOAT(ABSF(vPlayerCoord.z-vMemberCoord.z)) DrawDebugFamilyTextWithOffset(str, vPlayerCoord, fFamilyEventRow * fDebugStringOffsetY, HUD_COLOUR_GREEN) #ENDIF RETURN FALSE ENDIF ENDIF IF IS_BITMASK_AS_ENUM_SET(iSpeechBit, FSC_checkOnScreen) //dont play if ped isnt on screen IF NOT IS_ENTITY_ON_SCREEN(memberID) #IF IS_DEBUG_BUILD TEXT_LABEL_63 str = ("family member ") str += (Get_String_From_FamilyEvent(eFamilyEvent)) str += (" not on screen") DrawDebugFamilyTextWithOffset(str, vPlayerCoord, fFamilyEventRow * fDebugStringOffsetY, HUD_COLOUR_GREEN) #ENDIF RETURN FALSE ENDIF ENDIF ENDIF IF IS_BITMASK_AS_ENUM_SET(iSpeechBit, FSC_checkTenSecDelay) CONST_FLOAT fCONST_checkTenSecDelay 10.0 FLOAT fCheckTenSecDelay = fCONST_checkTenSecDelay IF iCurrentRandCount >= iRandCount // CPRINTLN(DEBUG_FAMILY, "iCurrentRandCount[", iCurrentRandCount, "] >= iRandCount[", iRandCount, "]") #IF IS_DEBUG_BUILD TEXT_LABEL_63 str = "iCurrentRandCount " str += iCurrentRandCount str += ">= iRandCount" str += iRandCount DrawDebugFamilyTextWithOffset(str, vPlayerCoord, fFamilyEventRow * fDebugStringOffsetY, HUD_COLOUR_PURPLE) #ENDIF RETURN FALSE ENDIF fCheckTenSecDelay += ((TO_FLOAT(iCurrentRandCount)/TO_FLOAT(iRandCount-1))*fCONST_checkTenSecDelay) IF eFamilyEvent = FE_M_DAUGHTER_on_phone_to_friends OR eFamilyEvent = FE_M_DAUGHTER_on_phone_LOCKED fCheckTenSecDelay *= 1.5 ENDIF #IF IS_DEBUG_BUILD INT iTaunterAnimOutLength iTaunterAnimOutLength = GET_LENGTH_OF_LITERAL_STRING(Get_String_From_FamilyEvent(eFamilyEvent)) CONST_INT iCONST_MAX_EVENT_NAME_LENGTH 25 TEXT_LABEL_63 str IF iTaunterAnimOutLength >= iCONST_MAX_EVENT_NAME_LENGTH str = GET_STRING_FROM_STRING(Get_String_From_FamilyEvent(eFamilyEvent), 0, iCONST_MAX_EVENT_NAME_LENGTH) ELSE str = Get_String_From_FamilyEvent(eFamilyEvent) ENDIF str += (" speechTimer: ") IF NOT IS_TIMER_STARTED(speechTimer) str += ("STOPPED") ELSE str += GET_STRING_FROM_FLOAT(GET_TIMER_IN_SECONDS(speechTimer)) IF NOT IS_TIMER_PAUSED(speechTimer) str += (" < ") str += ROUND(fCheckTenSecDelay) ELSE str += (" [paused]") ENDIF ENDIF str += " " str += iCurrentRandCount str += ":" str += iRandCount DrawDebugFamilyTextWithOffset(str, vPlayerCoord, fFamilyEventRow * fDebugStringOffsetY, HUD_COLOUR_PURPLE) #ENDIF IF IS_TIMER_STARTED(speechTimer) IF IS_TIMER_PAUSED(speechTimer) UNPAUSE_TIMER(speechTimer) ENDIF IF NOT TIMER_DO_WHEN_READY(speechTimer, fCheckTenSecDelay) RETURN FALSE ENDIF ENDIF ENDIF IF NOT IS_BITMASK_SET(iPlayerBitset, GET_CURRENT_PLAYER_PED_BIT()) //"FMM_0_FRA" //{Franklin sneaks into Michael's house - Jimmy responds} //"FMM_0_TRV" //{Trevor sneaks into Michael's house - Jimmy Responds} //"FMM_1_FRA" //{Tracey sees Franklin in the house} //"FMM_1_TRV" //{Tracey sees Trevor in the house} enumCharacterList ePed = GET_CURRENT_PLAYER_PED_ENUM() TEXT_LABEL strSneakLabel = "" SWITCH GET_enumFamilyMember_from_ped(memberID) CASE FM_MICHAEL_SON strSneakLabel = "FMM_0" BREAK CASE FM_MICHAEL_DAUGHTER strSneakLabel = "FMM_1" BREAK CASE FM_MICHAEL_WIFE strSneakLabel = "FMM_2" BREAK CASE FM_MICHAEL_MEXMAID strSneakLabel = "FMM_3_FT" BREAK CASE FM_FRANKLIN_AUNT strSneakLabel = "FMF_0" IF (ePed = CHAR_MICHAEL OR ePed = CHAR_TREVOR) strSneakLabel = "" ENDIF BREAK ENDSWITCH IF NOT IS_STRING_NULL_OR_EMPTY(strSneakLabel) IF NOT ARE_STRINGS_EQUAL(strSneakLabel, "FMM_3_FT") SWITCH ePed CASE CHAR_MICHAEL strSneakLabel += "_MIC" BREAK CASE CHAR_FRANKLIN strSneakLabel += "_FRA" IF ARE_STRINGS_EQUAL(strSneakLabel, "FMM_2_FRA") #if USE_CLF_DLC strSneakLabel += "2" //mid to late game #ENDIF #if USE_NRM_DLC strSneakLabel += "2" //mid to late game #ENDIF #if not USE_CLF_DLC #if not USE_NRM_DLC IF NOT GET_MISSION_COMPLETE_STATE(SP_MISSION_FAMILY_1) strSneakLabel += "1" //early game ELSE strSneakLabel += "2" //mid to late game ENDIF #ENDIF #ENDIF ENDIF BREAK CASE CHAR_TREVOR strSneakLabel += "_TRV" BREAK ENDSWITCH ENDIF IF Is_Ped_Playing_Family_Speech(strTextBlock, strSneakLabel, inSpeechStruct, enSpeechPriority, tCreatedConvLabels, stringFacialAnimClip) #IF IS_DEBUG_BUILD IF g_bDrawDebugFamilyStuff CPRINTLN(DEBUG_FAMILY, "family member ", Get_String_From_FamilyEvent(eFamilyEvent), " playing sneaked in \"", strLabel, "\" [block:\"", strTextBlock, "\"]") INT iRepeat REPEAT COUNT_OF(inSpeechStruct.PedInfo) iRepeat IF (inSpeechStruct.PedInfo[iRepeat].Index = memberID) CPRINTLN(DEBUG_FAMILY, " //\"", inSpeechStruct.PedInfo[iRepeat].VoiceId, "\" speaker num# ", iRepeat) ENDIF ENDREPEAT CPRINTLN(DEBUG_FAMILY, "") ENDIF #ENDIF RESTART_TIMER_NOW(speechTimer) iCurrentRandCount = 99 RETURN TRUE ENDIF RETURN FALSE ELSE CPRINTLN(DEBUG_FAMILY, "strSneakLabel is null") RETURN FALSE ENDIF ENDIF TEXT_LABEL strPlayerName = "" SWITCH GET_CURRENT_PLAYER_PED_ENUM() CASE CHAR_MICHAEL strPlayerName = "MICHAEL" BREAK CASE CHAR_FRANKLIN strPlayerName = "FRANKLIN" BREAK CASE CHAR_TREVOR strPlayerName = "TREVOR" BREAK ENDSWITCH #IF USE_TU_CHANGES INT YourNumberID = -1 VECTOR YourVoiceLoc = <<0,0,0>> IF IS_BITMASK_AS_ENUM_SET(iSpeechBit, FSC_setVoiceLocationForPed) YourNumberID = 1 //ENUM_TO_INT(GET_enumFamilyMember_from_ped(memberID))+1 YourVoiceLoc = <<-14.3293, -1443.6351, 29.9000>> //vMemberCoord ENDIF #ENDIF IF ARE_STRINGS_EQUAL("TRA_IG_MD", strLabel) IF IS_BITMASK_AS_ENUM_SET(iSpeechBit, FSC_singleRandomLine) // ELSE SET_BITMASK_AS_ENUM(iSpeechBit, FSC_singleRandomLine) ENDIF ENDIF IF ARE_STRINGS_EQUAL("FMT_COUNTRY", strLabel) IF IS_BITMASK_AS_ENUM_SET(iSpeechBit, FSC_singleRandomLine) CPRINTLN(DEBUG_FAMILY, "\"FMT_COUNTRY\" has FSC_singleRandomLine set...") // ELSE CPRINTLN(DEBUG_FAMILY, "\"FMT_COUNTRY\" has FSC_singleRandomLine unset...") SET_BITMASK_AS_ENUM(iSpeechBit, FSC_singleRandomLine) ENDIF ENDIF //is the speech a single line or is it a random conv IF IS_BITMASK_AS_ENUM_SET(iSpeechBit, FSC_singleRandomLine) IF NOT IS_STRING_NULL_OR_EMPTY(strLabel) // IF IS_BITMASK_AS_ENUM_SET(iSpeechBit, FSC_checkListenerAlive) IF NOT IsSpeechListenerAlive(inSpeechStruct, strTextBlock, strLabel) RETURN FALSE ENDIF ENDIF ADD_PED_FOR_DIALOGUE(inSpeechStruct, 0, PLAYER_PED_ID(), strPlayerName) #IF USE_TU_CHANGES IF IS_BITMASK_AS_ENUM_SET(iSpeechBit, FSC_setVoiceLocationForPed) ADD_PED_FOR_DIALOGUE(inSpeechStruct, YourNumberID, NULL, "DENISE") SET_VOICE_LOCATION_FOR_NULL_PED(inSpeechStruct, YourNumberID, YourVoiceLoc) ENDIF #ENDIF IF Is_Ped_Playing_Family_Speech(strTextBlock, strLabel, inSpeechStruct, enSpeechPriority, tCreatedConvLabels, stringFacialAnimClip) #IF IS_DEBUG_BUILD IF g_bDrawDebugFamilyStuff CPRINTLN(DEBUG_FAMILY, "family member ", Get_String_From_FamilyEvent(eFamilyEvent), " playing single line speech \"", strLabel, "\" [block:\"", strTextBlock, "\"]") INT iRepeat REPEAT COUNT_OF(inSpeechStruct.PedInfo) iRepeat IF (inSpeechStruct.PedInfo[iRepeat].Index = memberID) CPRINTLN(DEBUG_FAMILY, " //\"", inSpeechStruct.PedInfo[iRepeat].VoiceId, "\" speaker num# ", iRepeat) ENDIF ENDREPEAT CPRINTLN(DEBUG_FAMILY, "") ENDIF #ENDIF RESTART_TIMER_NOW(speechTimer) iCurrentRandCount++ RETURN TRUE ENDIF ELSE CASSERTLN(DEBUG_FAMILY, "Play_This_Family_Speech(", Get_String_From_FamilyEvent(eFamilyEvent), ") - strLabel is a null value.") RETURN FALSE ENDIF ELSE TEXT_LABEL returnedStrLabel = strLabel IF GetRandomConversationFromLabel(strTextBlock, returnedStrLabel, tCreatedConvLabels) IF NOT IS_STRING_NULL_OR_EMPTY(returnedStrLabel) // IF IS_BITMASK_AS_ENUM_SET(iSpeechBit, FSC_checkListenerAlive) IF NOT IsSpeechListenerAlive(inSpeechStruct, strTextBlock, returnedStrLabel) RETURN FALSE ENDIF ENDIF ADD_PED_FOR_DIALOGUE(inSpeechStruct, 0, PLAYER_PED_ID(), strPlayerName) #IF USE_TU_CHANGES IF IS_BITMASK_AS_ENUM_SET(iSpeechBit, FSC_setVoiceLocationForPed) ADD_PED_FOR_DIALOGUE(inSpeechStruct, YourNumberID, NULL, "DENISE") SET_VOICE_LOCATION_FOR_NULL_PED(inSpeechStruct, YourNumberID, YourVoiceLoc) ENDIF #ENDIF IF Is_Ped_Playing_Family_Speech(strTextBlock, returnedStrLabel, inSpeechStruct, enSpeechPriority, tCreatedConvLabels, stringFacialAnimClip) #IF IS_DEBUG_BUILD IF g_bDrawDebugFamilyStuff IF HAS_THIS_ADDITIONAL_TEXT_LOADED(strTextBlock, MISSION_DIALOGUE_TEXT_SLOT) CPRINTLN(DEBUG_FAMILY, "family member ", Get_String_From_FamilyEvent(eFamilyEvent), " playing single speech \"", returnedStrLabel, "\" [block:\"", strTextBlock, "\"", " LOADED", "]") ELSE CPRINTLN(DEBUG_FAMILY, "family member ", Get_String_From_FamilyEvent(eFamilyEvent), " playing single speech \"", returnedStrLabel, "\" [block:\"", strTextBlock, "\"", " ?unloaded?", "]") ENDIF INT iRepeat REPEAT COUNT_OF(inSpeechStruct.PedInfo) iRepeat IF (inSpeechStruct.PedInfo[iRepeat].Index = memberID) CPRINTLN(DEBUG_FAMILY, " //\"", inSpeechStruct.PedInfo[iRepeat].VoiceId, "\" speaker num# ", iRepeat) ENDIF ENDREPEAT CPRINTLN(DEBUG_FAMILY, "") ENDIF #ENDIF RESTART_TIMER_NOW(speechTimer) iCurrentRandCount++ RETURN TRUE ENDIF ELSE CASSERTLN(DEBUG_FAMILY, "Play_This_Family_Speech(", Get_String_From_FamilyEvent(eFamilyEvent), ") - returnedStrLabel is a null value.") RETURN FALSE ENDIF ENDIF ENDIF RETURN(FALSE) ENDFUNC FUNC BOOL PRIVATE_Update_Family_Context_Speech(PED_INDEX memberID, STRING Context, structTimer &speechTimer, FLOAT fContext_phase_duration = 3.0) #IF IS_DEBUG_BUILD TEXT_LABEL_63 str #ENDIF IF FAMILY_Is_Any_Dialogue_Playing(memberID) #IF IS_DEBUG_BUILD str = "Is_Any_Dialogue_Playing" DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(memberID, FALSE), 5, HUD_COLOUR_BLACK) #ENDIF RETURN FALSE ENDIF IF NOT IS_TIMER_STARTED(speechTimer) #IF IS_DEBUG_BUILD str = "timer not started" DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(memberID, FALSE), 5, HUD_COLOUR_BLACK) #ENDIF RETURN FALSE ENDIF FLOAT fSpeechTimer = GET_TIMER_IN_SECONDS(speechTimer) IF NOT TIMER_DO_WHEN_READY(speechTimer, 1.0) #IF IS_DEBUG_BUILD str = "sSpeechTimer: " str += GET_STRING_FROM_FLOAT(fSpeechTimer) str += " " str += Context DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(memberID, FALSE), 5, HUD_COLOUR_BLACK) #ENDIF RETURN FALSE ENDIF FLOAT fContextPhase = (fSpeechTimer % fCONTEXT_PHASE_DURATION) / fCONTEXT_PHASE_DURATION #IF IS_DEBUG_BUILD str = "sSpeechTimer: " str += GET_STRING_FROM_FLOAT(fSpeechTimer) str += " " str += Context str += " " str += GET_STRING_FROM_FLOAT(fContextPhase) DrawDebugFamilyTextWithOffset(str, GET_ENTITY_COORDS(memberID, FALSE), 5, HUD_COLOUR_RED) #ENDIF IF fContextPhase < 0.9 RETURN FALSE ENDIF PLAY_PED_AMBIENT_SPEECH(memberID, Context) CPRINTLN(DEBUG_FAMILY, "PLAY_PED_AMBIENT_SPEECH(memberID, \"", Context, "\")") RETURN TRUE ENDFUNC