Files
2025-09-29 00:52:08 +02:00

745 lines
25 KiB
Python
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//=======================================================================================================================================
// Taxi_NeedExcitement.sc
// Dev : John R. Diaz
/*
Show me some excitement. The passenger requests excitement. Bonus tips for air time, close calls with other cars, high speeds, and long drifts.
No penalties for collisions.
*/
//CHANGELOG==========================================================================================================
//9/27/11 - Reformatting/prettifying all taxi oj scripts
//===================================================================================================================
//Compile out Title Update changes to header functions.
//Must be before includes.
//CONST_INT USE_TU_CHANGES 0 // Removed by Kenneth R.
//Includes------------------------------------------------------
USING "Taxi_Includes.sch"
//Local Variables-----------------------------------------------
ENUM TAXIOJ_NEX_BONUS
TNEX_BONUS_EXTREME = 0,
TNEX_BONUS_TOTAL
ENDENUM
TaxiStruct myTaxiData
TAXI_PED_RUN_STATE myRunState = TPRS_INIT
TAXI_MONEY_STRUCT taxiMoney
BONUS_FIELD bonusFieldNeedExcitement[TNEX_BONUS_TOTAL]
MODEL_NAMES mPassengerModel = A_M_Y_SKATER_02
//Vectors
VECTOR vPassengerPt = << -496.0739, -336.6628, 33.5017 >> //Fanny Howe Medical Center
VECTOR vPassengerPickupPt = << -484.6879, -330.1646, 33.3534 >>
VECTOR vDropOff = << 725.3476, 1204.5260, 324.9057 >> //<< 742.5978, 1200.3478, 325.3470 >> //Vinewood Sign
//VECTOR vOffRoadLookAt = << 503.3788, 750.9902, 198.4714 >>
//Ints
INT iDebugThrottle = 1
INT iTipIndex = 0
//Bools
BOOL bDropOffFound
BOOL bOffroadChallenged = FALSE
//BOOL bOffroadHelpShown = FALSE
//DialogueQ Info
BOOL g_bDebug = FALSE
TAXI_OJ_DIALOGUE_Q_DATA tTaxiOJ_DQ_Data
TAXI_OJ_DQ_CONVERSATION_LINE tDialogueLine[CONST_TAXIOJ_SIZE_Q]
CONST_INT CONST_TAXI_NEX_AMAZING_CUTOFF 30
CONST_INT TAXI_CONST_BONUS_CASH_DAREDEVIL 200
AGGRO_ARGS aggroArgs
structTimer shoutDelay
SCRIPT_SHARD_BIG_MESSAGE TaxiMidSize
//Debug---------------------------------------------------------------------------------------------------------------
#IF IS_DEBUG_BUILD
//HUD_2D_DEADLINE hudDeadline
WIDGET_GROUP_ID taxiRideWidgets,ojTaxiWidgets_Excitement
BOOL bDebugTurnOnFreeRide = FALSE
BOOL bDebugShowExcitement
TEXT_LABEL_63 sDebugString[2]
BOOL bDebugBonusDaredevil
BOOL bFreeRideisOn
TXM_DEBUG_SKIP_STATES tDebugState = TXM_DSS_CHECK_FOR_BUTTON_PRESS
#ENDIF
//FUNCTIONS------------------------------------------------------------------------------------------------------------
PROC Script_Cleanup()
#IF IS_DEBUG_BUILD
IF DOES_WIDGET_GROUP_EXIST(taxiRideWidgets)
DELETE_WIDGET_GROUP(taxiRideWidgets)
ENDIF
IF DOES_WIDGET_GROUP_EXIST(ojTaxiWidgets_Excitement)
DELETE_WIDGET_GROUP(ojTaxiWidgets_Excitement)
ENDIF
CLEANUP_TAXI_WIDGETS()
#ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(mPassengerModel)
REMOVE_ANIM_DICT("gestures@m@standing@casual")
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
TERMINATE_THIS_THREAD()
ENDPROC
// Perform any special commands if the script fails
// NOTE: This can include WAITs prior to the Mission_Cleanup() call
PROC Script_Failed()
TAXI_SCRIPT_FAILED(myTaxiData)
Script_Cleanup()
ENDPROC
PROC INITIALIZE_SCRIPT_VARIABLES(TAXI_MISSION_TYPES thisMissionType = TXM_01_NEEDEXCITEMENT)
TAXI_ODDJOB_GLOBAL_SETUP(myTaxiData,thisMissionType)
// Set our initial state up. VIP missions don't start at TRS_FINDING_LOCATION.
myTaxiData.tTaxiOJ_RideState = TRS_INIT_STREAM
SET_TAXI_TIP_CUTOFFS(myTaxiData, 7, 14)//CONST_TAXI_OJ_TIP_AVERAGE_CUTOFF,4)
myTaxiData.vTaxiOJ_WarpPtPickup = << -492.4436, -290.3657, 34.4860 >>
myTaxiData.fTaxiOJ_WarpPtHeadingPickup = 202.0759
myTaxiData.vTaxiOJ_WarpPtDropoff = << 856.3766, 1288.9180, 357.7924 >>
myTaxiData.fTaxiOJ_WarpPtHeadingDropoff = 162.3
myTaxiData.fTaxiEnterSpeed = PEDMOVEBLENDRATIO_WALK //PEDMOVE_RUN
//TODO : Set the POI
myTaxiData.vTaxiOJ_PassengerGoToPt = << 810.3334, 1172.4128, 321.8036 >>
#IF IS_DEBUG_BUILD
#IF DEBUG_iTurnOnAllDXDebug
ENABLE_ALL_DIALOGUE_DEBUG()
#ENDIF
taxiRideWidgets = START_WIDGET_GROUP("Taxi Ride - Need Excitement")
INIT_ODDJOB_TAXI_WIDGETS()
//Excitement Widget
ojTaxiWidgets_Excitement = START_WIDGET_GROUP("Excitement")
ADD_WIDGET_STRING("Excitement Ride Test")
ADD_WIDGET_BOOL("Turn On Free Ride", bDebugTurnOnFreeRide)
ADD_WIDGET_BOOL("Show Excitement",bDebugShowExcitement)
ADD_WIDGET_STRING("Debug Taxi Bonus")
ADD_WIDGET_BOOL(" Daredevil",bDebugBonusDaredevil)
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
INIT_TAXI_WIDGETS(taxiRideWidgets)
#ENDIF
CDEBUG1LN(DEBUG_OJ_TAXI,"-----~~~~~-------------------------------~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~----")
CDEBUG1LN(DEBUG_OJ_TAXI,"-----~~~~~~~~~~~~~~~~ Oddjobs | Taxi | Needs Excitement ~~~~~~~~~~~~~----------")
CDEBUG1LN(DEBUG_OJ_TAXI,"-----~~~~~-------------------------------~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~----")
ENDPROC
#IF IS_DEBUG_BUILD
PROC PROCESS_WIDGETS()
UPDATE_TAXI_WIDGETS(myTaxiData,tTaxiOJ_DQ_Data)
IF bDebugShowExcitement
sDebugString[0] = "Excitement = "
sDebugString[0] += TAXI_UTILS_GET_STRING_FROM_INT_SP(myTaxiData.iTaxiOJ_PassengerExcitement)
sDebugString[0] += " /100"
DRAW_DEBUG_TEXT_2D(sDebugString[0], <<0.07, 0.46,0.0>>)
ENDIF
IF bDebugBonusDaredevil
IF myTaxiData.iTaxiOJ_PassengerExcitement < TAXI_CONST_EXCITEMENT_LEVEL_HI
sDebugString[1]= "Daredevil Bonus LOCKED "
DRAW_DEBUG_TEXT_2D(sDebugString[1],<<0.07,0.77,0.0>>,255,0,0)
ELSE
sDebugString[1]= "Daredevil Bonus UnLOCKED "
DRAW_DEBUG_TEXT_2D(sDebugString[1],<<0.07,0.77,0.0>>)
ENDIF
ENDIF
ENDPROC
#ENDIF
/// PURPOSE: Request all our mission specific assets here
///
PROC INIT_TAXI_STREAMS()
//Load text and UI
REQUEST_MODEL(mPassengerModel)
REQUEST_ANIM_DICT("gestures@m@standing@casual")
TAXI_INIT_SHARED_STREAMS()
TaxiMidSize.siMovie = REQUEST_MG_MIDSIZED_MESSAGE()
CDEBUG1LN(DEBUG_OJ_TAXI,"INIT_TAXI_STREAMS - SUCCESS")
ENDPROC
//// PURPOSE: Waits for our assets to load
///
/// RETURNS: TRUE if everything has loaded correctly FALSE if there was a problem
///
FUNC BOOL TAXI_ASSETS_STREAMED()
IF NOT HAS_MODEL_LOADED(mPassengerModel)
CDEBUG_MESSAGE_OJ_TAXI_PERIODIC("TAXI_ASSETS_STREAMED - Loading A_M_M_Skater_01",iDebugThrottle)
RETURN FALSE
ENDIF
IF NOT HAS_ANIM_DICT_LOADED("gestures@m@standing@casual")
CDEBUG_MESSAGE_OJ_TAXI_PERIODIC("TAXI_ASSETS_STREAMED - Loading gestures@m@standing@casual",iDebugThrottle)
RETURN FALSE
ENDIF
IF NOT HAS_SCALEFORM_MOVIE_LOADED(TaxiMidSize.siMovie)
#IF IS_DEBUG_BUILD
CDEBUG_MESSAGE_OJ_TAXI_PERIODIC("TAXI_ASSETS_STREAMED - Loading TaxiMidSize.siMovie",iDebugThrottle)
#ENDIF
RETURN FALSE
ENDIF
IF NOT TAXI_SHARED_ASSETS_STREAMED(iDebugThrottle)
CDEBUG_MESSAGE_OJ_TAXI_PERIODIC("TAXI_ASSETS_STREAMED - Loading shared assets",iDebugThrottle)
RETURN FALSE
ENDIF
CDEBUG1LN(DEBUG_OJ_TAXI,"TAXI_ASSETS_STREAMED - SUCCESS")
RETURN TRUE
ENDFUNC
PROC TAXI_OJ_NEX_SET_TIP_AND_EXCITEMENT_TO_CHECK()
//Tip Bits
SET_BITMASK_AS_ENUM(myTaxiData.iTaxiOJ_TipsBitMask,TAXI_TIP_BIT_POS_DELIVERY_TIME)
SET_BITMASK_AS_ENUM(myTaxiData.iTaxiOJ_TipsBitMask,TAXI_TIP_BIT_HIT_PED_POS)
SET_BITMASK_AS_ENUM(myTaxiData.iTaxiOJ_TipsBitMask,TAXI_TIP_BIT_TOOK_DAMAGE_POS)
SET_BITMASK_AS_ENUM(myTaxiData.iTaxiOJ_TipsBitMask,TAXI_TIP_BIT_ROLL_CAR_POS)
SET_BITMASK_AS_ENUM(myTaxiData.iTaxiOJ_TipsBitMask,TAXI_TIP_BIT_LEFT_CAR)
SET_BITMASK_AS_ENUM(myTaxiData.iTaxiOJ_TipsBitMask,TAXI_TIP_BIT_STOPPED)
SET_BITMASK_AS_ENUM(myTaxiData.iTaxiOJ_TipsBitMask,TAXI_TIP_BIT_RADIO_STATION_LIKE)
SET_BITMASK_AS_ENUM(myTaxiData.iTaxiOJ_TipsBitMask,TAXI_TIP_BIT_RADIO_STATION_DISLIKE)
SET_BITMASK_AS_ENUM(myTaxiData.iTaxiOJ_TipsBitMask,TAXI_TIP_BIT_LOST_POLICE)
//Tips for Excitement
SET_BITMASK_AS_ENUM(myTaxiData.iTaxiOJ_TipsBitMask,TAXI_TIP_BIT_BORED)
SET_BITMASK_AS_ENUM(myTaxiData.iTaxiOJ_TipsBitMask,TAXI_TIP_BIT_SPEEDING)
SET_BITMASK_AS_ENUM(myTaxiData.iTaxiOJ_TipsBitMask,TAXI_TIP_BIT_AIR)
SET_BITMASK_AS_ENUM(myTaxiData.iTaxiOJ_TipsBitMask,TAXI_TIP_BIT_POWERSLIDING)
SET_BITMASK_AS_ENUM(myTaxiData.iTaxiOJ_TipsBitMask,TAXI_TIP_BIT_ONCOMING)
SET_BITMASK_AS_ENUM(myTaxiData.iTaxiOJ_TipsBitMask,TAXI_TIP_BIT_SIDEWALK)
SET_BITMASK_AS_ENUM(myTaxiData.iTaxiOJ_TipsBitMask,TAXI_TIP_BIT_OFFROAD)
//This one is important for THIS mission
SET_BITMASK_AS_ENUM(myTaxiData.iTaxiOJ_TipsBitMask,TAXI_TIP_BIT_POS_EXCITEMENT)
//EXCITEMENT BITS
SET_BITMASK_AS_ENUM(myTaxiData.iTaxiOJ_PassengerReactBits,TAXI_DF_SPEEDING)
SET_BITMASK_AS_ENUM(myTaxiData.iTaxiOJ_PassengerReactBits,TAXI_DF_TOOKDAMAGE)
SET_BITMASK_AS_ENUM(myTaxiData.iTaxiOJ_PassengerReactBits,TAXI_DF_WRONGLANE)
SET_BITMASK_AS_ENUM(myTaxiData.iTaxiOJ_PassengerReactBits,TAXI_DF_SIDEWALK)
SET_BITMASK_AS_ENUM(myTaxiData.iTaxiOJ_PassengerReactBits,TAXI_DF_ROLL)
SET_BITMASK_AS_ENUM(myTaxiData.iTaxiOJ_PassengerReactBits,TAXI_DF_HITPED)
SET_BITMASK_AS_ENUM(myTaxiData.iTaxiOJ_PassengerReactBits,TAXI_DF_AIR)
//SET_BITMASK_AS_ENUM(myTaxiData.iTaxiOJ_PassengerReactBits,TAXI_DF_OFFROAD) // this is now set after the challenge is issued
SET_BITMASK_AS_ENUM(myTaxiData.iTaxiOJ_PassengerReactBits,TAXI_DF_REVERSE)
SET_BITMASK_AS_ENUM(myTaxiData.iTaxiOJ_PassengerReactBits,TAXI_DF_POWERSLIDE)
SET_BITMASK_AS_ENUM(myTaxiData.iTaxiOJ_PassengerReactBits,TAXI_DF_NEAR_MISS)
//Turn off aggro bits
SET_BITMASK_AS_ENUM(aggroArgs.iBitFieldDontCheck, EAggro_Wanted)
//Start the mission timer here
TAXI_START_TIMER(myTaxiData, TT_RIDETODEST)
CDEBUG1LN(DEBUG_OJ_TAXI,"TAXI_OJ_DL_SET_TIPS_TO_CHECK set tips to check on")
ENDPROC
PROC TRIGGER_TAXI_QUEUE_NE_LINES()
//SET_TAXI_OJ_INTERRUPT_TIMER_OFF(myTaxiData)
//Trigger lines
IF IS_BANTER_SAFE_TO_PLAY(myTaxiData,tTaxiOJ_DQ_Data)
SWITCH tTaxiOJ_DQ_Data.iCurrentDQLine
CASE 0
IF myTaxiData.tTaxiOJ_RideState = TRS_DRIVING_PASSENGER
IF GET_TAXI_SPEECH_INDEX(myTaxiData) > TAXI_OBJ_GIVE_MAIN
AND GET_TAXI_SPEECH_INDEX(myTaxiData) <> TAXI_DI_BANTER
SET_NEXT_TAXI_SPEECH(myTaxiData,TAXI_DI_BANTER,TRUE)
TAXI_RESET_TIMERS(myTaxiData, TT_BORING)
IF g_bDebug
SCRIPT_ASSERT("Triggering Banter 1")
ENDIF
ENDIF
ENDIF
BREAK
CASE 1
IF GET_TAXI_TIMER_IN_SECONDS(myTaxiData, TT_DQUEUE) > 15
IF GET_TAXI_SPEECH_INDEX(myTaxiData) > TAXI_OBJ_GIVE_MAIN
AND GET_TAXI_SPEECH_INDEX(myTaxiData) <> TAXI_DI_BANTER_3
SET_BITMASK_AS_ENUM(myTaxiData.iTaxiOJ_BitsDialogue,TAXI_DXF_BANTER)
SET_NEXT_TAXI_SPEECH(myTaxiData,TAXI_DI_BANTER_3,TRUE)
IF g_bDebug
SCRIPT_ASSERT("Triggering Banter 3")
ENDIF
ENDIF
ELSE
IF (GET_GAME_TIMER() % 1000) < 50
CDEBUG1LN(DEBUG_OJ_TAXI,"banter timer = ", GET_TAXI_TIMER_IN_SECONDS(myTaxiData, TT_BANTER))
ENDIF
ENDIF
BREAK
CASE 2
IF GET_TAXI_TIMER_IN_SECONDS(myTaxiData, TT_DQUEUE) > 30
IF GET_TAXI_SPEECH_INDEX(myTaxiData) > TAXI_OBJ_GIVE_MAIN
AND GET_TAXI_SPEECH_INDEX(myTaxiData) <> TAXI_DI_BANTER_2
SET_NEXT_TAXI_SPEECH(myTaxiData,TAXI_DI_BANTER_2,TRUE)
IF g_bDebug
SCRIPT_ASSERT("Triggering Banter 2")
ENDIF
ENDIF
ELSE
IF (GET_GAME_TIMER() % 1000) < 50
CDEBUG1LN(DEBUG_OJ_TAXI,"banter timer = ", GET_TAXI_TIMER_IN_SECONDS(myTaxiData, TT_BANTER))
ENDIF
ENDIF
BREAK
CASE 3
IF GET_TAXI_TIMER_IN_SECONDS(myTaxiData, TT_DQUEUE) > 30
IF GET_TAXI_SPEECH_INDEX(myTaxiData) > TAXI_OBJ_GIVE_MAIN
AND GET_TAXI_SPEECH_INDEX(myTaxiData) <> TAXI_DI_BANTER_4
SET_NEXT_TAXI_SPEECH(myTaxiData,TAXI_DI_BANTER_4,TRUE)
IF g_bDebug
SCRIPT_ASSERT("Triggering Banter 4")
ENDIF
ENDIF
ELSE
IF (GET_GAME_TIMER() % 1000) < 50
CDEBUG1LN(DEBUG_OJ_TAXI,"banter timer = ", GET_TAXI_TIMER_IN_SECONDS(myTaxiData, TT_BANTER))
ENDIF
ENDIF
BREAK
CASE 4
IF GET_TAXI_TIMER_IN_SECONDS(myTaxiData, TT_DQUEUE) > 30
IF GET_TAXI_SPEECH_INDEX(myTaxiData) > TAXI_OBJ_GIVE_MAIN
AND GET_TAXI_SPEECH_INDEX(myTaxiData) <> TAXI_DI_BANTER_5
SET_NEXT_TAXI_SPEECH(myTaxiData,TAXI_DI_BANTER_5,TRUE)
IF g_bDebug
SCRIPT_ASSERT("Triggering Banter 5")
ENDIF
ENDIF
ELSE
IF (GET_GAME_TIMER() % 1000) < 50
CDEBUG1LN(DEBUG_OJ_TAXI,"banter timer = ", GET_TAXI_TIMER_IN_SECONDS(myTaxiData, TT_BANTER))
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
//PROCESS_IMPORTANT_DIALOGUE_Q(myTaxiData,tDialogueLine, tTaxiOJ_DQ_Data, g_bDebug)
PROCESS_MANUAL_DIALOGUE_Q(myTaxiData,tDialogueLine, tTaxiOJ_DQ_Data, 1, g_bDebug)
ENDPROC
PROC Main_Taxi_OJ_NeedsExcitement()
//Handles Fail Or No Taxi-------------------------------------------------------------------------------
IF IS_TAXI_JOB_IN_FAIL_STATE(myTaxiData)
TAXI_OJ_CLEAR_ALL_BLIPS(myTaxiData)
IF myTaxiData.tTaxiOJ_RideState > TRS_INIT_STREAM
IF TAXI_HANDLE_FAIL(myTaxiData)
Script_Failed()
ENDIF
ELSE
IF GET_TAXI_TIMER_IN_SECONDS(myTaxiData, TT_CLEANUP) > 5.0
CDEBUG1LN(DEBUG_OJ_TAXI,"Fail During State: "," ", myTaxiData.sTaxiOJ_RideState, " ", myTaxiData.sTaxiOJ_Reason4Fail)
SET_PROPERTY_MANAGEMENT_RESULT(PROPERTY_MANAGEMENT_RESULT_FAILURE)
Script_Cleanup()
ENDIF
ENDIF
//Proceed
ELSE
//Run Throughtout the Entire Mission--------------------------------------------------------------
TAXI_OJ_MAINTAIN_GLOBAL_GATES(myTaxiData)
IF myTaxiData.tTaxiOJ_RideState <= TRS_DRIVING_PASSENGER
//Gobal taxi updates that all taxi missions run every frame
RUN_GLOBAL_TAXI_UPDATES(myTaxiData,aggroArgs)
PROCESS_TAXI_EXCEPTIONS(myTaxiData)
ENDIF
//Tips
UPDATE_TAXI_OJ_TIP(myTaxiData,iTipIndex)
//Dialogue & Objectives
IF myTaxiData.tTaxiOJ_RideState > TRS_FINDING_LOCATION
IF NOT IS_TAXI_EMERGENCY_FAIL_SET(myTaxiData)
TRIGGER_TAXI_QUEUE_NE_LINES()
ELSE
TAXI_SET_FAIL(myTaxiData,"Taxi Not Driveable",GET_TAXI_EMERGENCY_FAIL_STRING(myTaxiData))
ENDIF
ENDIF
IF myTaxiData.tTaxiOJ_RideState = TRS_DRIVING_PASSENGER
IF myTaxiData.bObjPrinted
//once the player gets near the mountain, add leeway
IF ( NOT IS_ENTITY_DEAD(myTaxiData.viTaxi)
AND (GET_ENTITY_DISTANCE_FROM_LOCATION(myTaxiData.viTaxi,myTaxiData.vTaxiOJDropoff)) > 450 )
HANDLE_TAXI_EXCITEMENT(myTaxiData,FALSE)
ELSE
HANDLE_TAXI_EXCITEMENT(myTaxiData,FALSE,TRUE)
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
ELIF bDebugTurnOnFreeRide
HANDLE_TAXI_EXCITEMENT(myTaxiData,TRUE)
IF NOT bFreeRideisOn
TAXI_OJ_NEX_SET_TIP_AND_EXCITEMENT_TO_CHECK()
bFreeRideisOn = TRUE
ENDIF
#ENDIF
ENDIF
//================================================================================================
SWITCH myTaxiData.tTaxiOJ_RideState
/*PRESTREAM and Check that the player and taxi are good to go----------------------------------------
ooooo oooo oooo ooooo ooooooooooo
888 8888o 88 888 88 888 88
888 88 888o88 888 888
888 88 8888 888 888
o888o o88o 88 o888o o888o
*/
CASE TRS_INIT_STREAM
//Initialize bonuses
TAXI_INITIALIZE_BONUS_FIELD(bonusFieldNeedExcitement[TNEX_BONUS_EXTREME], "TAXI_SC_BN_02",TAXI_CONST_BONUS_CASH_DAREDEVIL)
TAXI_INITIALIZE_BONUS_INFO(myTaxiData, bonusFieldNeedExcitement)
//Request of our assets
INIT_TAXI_STREAMS()
TAXI_RESET_TIMERS(myTaxiData, TT_DIALOGUE,TAXI_DX_DELAY)
TAXI_SPAWN_PASSENGER(myTaxiData, vPassengerPt, vPassengerPickupPt,"TaxiFelipe",mPassengerModel,256,30.0)
TAXI_INIT_PASSENGER_BLIP(myTaxiData)
//Move on to the next stage
TAXI_JOB_SET_NEXT_STATE(myTaxiData,TRS_STREAMING)
BREAK
//Wait for streaming to finish--------------------------------------------------------------
CASE TRS_STREAMING
IF TAXI_ASSETS_STREAMED()
INIT_ALL_TAXI_EXCITEMENT_VALUES()
INITIALIZE_GENERIC_TAXI_EXCEPTIONS()
CLEAR_ALL_TAXI_PASSENGER_REACT_BITS(myTaxiData)
myTaxiData.vTaxiOJPickup = vPassengerPt
TAXI_JOB_SET_NEXT_STATE(myTaxiData,TRS_SPAWNING)
ENDIF
BREAK
//Spawn Passenger---------------------------------------------------------------------------
CASE TRS_SPAWNING
IF PROPERTY_VIP_INIT_READY(myTaxiData)
IF NOT IS_ENTITY_DEAD(myTaxiData.piTaxiPassenger)
SET_PED_CONFIG_FLAG(myTaxiData.piTaxiPassenger, PCF_GetOutUndriveableVehicle, FALSE)
SET_PED_COMPONENT_VARIATION(myTaxiData.piTaxiPassenger, PED_COMP_TORSO, 1, 1)
SET_PED_COMPONENT_VARIATION(myTaxiData.piTaxiPassenger, PED_COMP_LEG, 1, 2)
SET_PED_COMPONENT_VARIATION(myTaxiData.piTaxiPassenger, PED_COMP_HEAD, 0,1)
SET_PED_COMPONENT_VARIATION(myTaxiData.piTaxiPassenger, PED_COMP_JBIB, 1,0) //Remove Headphones per B*1460010
ENDIF
//Give player obj to go pickup Passenger
ENABLE_TAXI_SPEECH(myTaxiData)
TAXI_JOB_SET_NEXT_STATE(myTaxiData,TRS_MANAGE_PICKUP)
ENDIF
BREAK
//Waits for passenger to head to cab---------------------------------------------------------
CASE TRS_MANAGE_PICKUP
IF NOT IS_ENTITY_IN_ANGLED_AREA( myTaxiData.viTaxi, <<-484.921753,-370.123108,33.408054>>, <<-517.908936,-362.789948,37.313259>>, 28.75)
AND NOT IS_ENTITY_IN_ANGLED_AREA( myTaxiData.viTaxi, <<-472.058838,-321.036041,33.353264>>, <<-485.478973,-285.421692,37.492317>>, 28.75)
IF TAXI_HANDLE_IV_PICKUP_NO_METER(myTaxiData, FALSE, 30)//, FALSE, 18)
//Move on to the next stage
TAXI_JOB_SET_NEXT_STATE(myTaxiData,TRS_WAIT_PARK)
ENDIF
ENDIF
BREAK
CASE TRS_WAIT_PARK
IF IS_PASSENGER_ENTERING_TAXI(myTaxiData)
myTaxiData.vTaxiOJDropoff = vDropOff
bDropOffFound = TRUE
//Greet the player
SET_NEXT_TAXI_SPEECH(myTaxiData,TAXI_DI_GREET,TRUE)
//CleanUp Pickup Lock & POI
CLEANUP_TAXI_PICKUP_STOP(myTaxiData)
//Set Vehicle Health
myTaxiData.iOldVehicleHealth = GET_ENTITY_HEALTH(myTaxiData.viTaxi)
TAXI_JOB_SET_NEXT_STATE(myTaxiData,TRS_WAIT_FOR_TIME)
ENDIF
// check to see if player dived, if so send back to prev state
IF IS_VEHICLE_DRIVEABLE( myTaxiData.viTaxi)
IF NOT IS_PED_IN_VEHICLE(myTaxiData.piTaxiPlayer, myTaxiData.viTaxi)
TAXI_HANDLE_PLAYER_DIVE(myTaxiData)
TAXI_JOB_SET_NEXT_STATE(myTaxiData,TRS_MANAGE_PICKUP)
ENDIF
ENDIF
BREAK
//This state simply waits for the obj to be given before drawing the countdown timer.
CASE TRS_WAIT_FOR_TIME
IF bDropOffFound
TAXI_OJ_NEX_SET_TIP_AND_EXCITEMENT_TO_CHECK()
//IF bStartTiming
TAXI_JOB_SET_NEXT_STATE(myTaxiData,TRS_DRIVING_PASSENGER)
ENDIF
BREAK
CASE TRS_DRIVING_PASSENGER
IF (GET_ENTITY_DISTANCE_FROM_LOCATION(myTaxiData.viTaxi,myTaxiData.vTaxiOJDropoff)) < 875
AND GET_TAXI_SPEECH_INDEX(myTaxiData) <> TAXI_DI_OFFROAD_CHALLENGE
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
AND NOT bOffroadChallenged
CDEBUG1LN(DEBUG_OJ_TAXI,"[TAXI-NE] offroad challenge issued")
SET_BITMASK_AS_ENUM(myTaxiData.iTaxiOJ_PassengerReactBits,TAXI_DF_OFFROAD)
SET_NEXT_TAXI_SPEECH(myTaxiData, TAXI_DI_OFFROAD_CHALLENGE, TRUE, FALSE,TRUE)
SETTIMERA(0)
bOffroadChallenged = TRUE
ENDIF
//Set Radio Station Check
IF IS_BITMASK_AS_ENUM_SET(myTaxiData.iTaxiOJ_BitsDialogue,TAXI_DXF_BANTER)
IF NOT GET_TAXI_RADIO_CHECK_FLAG(myTaxiData)
//TAXI_RADIO_STATION_TURN_ON(myTaxiData)
//SCRIPT_ASSERT("The Taxi Radio Should Be Updating")
ENDIF
ENDIF
IF TAXI_HANDLE_EXCITEMENT_DRIVING_DEUX(myTaxiData/*,tTaxiOJ_DQ_Data*/,9,7.5)
//Remove destination blip
REMOVE_BLIP(myTaxiData.blipTaxiDropOff)
KILL_ANY_CONVERSATION()
CLOSE_DIALOGUE_QUEUE(tTaxiOJ_DQ_Data, default, TRUE)
// Tip is now decided using the bonus item system. No more tiers... for now.
IF myTaxiData.iTaxiOJ_PassengerExcitement >= TAXI_CONST_EXCITEMENT_LEVEL_HI
TAXI_SET_BONUS_AWARD(myTaxiData, ENUM_TO_INT(TNEX_BONUS_EXTREME))
ENDIF
//CASH $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
SET_TAXI_FARE_OFF_MILEAGE(myTaxiData)
TAXI_OJ_RATE_OVERALL_TIP_LEVEL(myTaxiData)
//If you sucked he's gonna run on you
//IF myTaxiData.iTaxiOJ_PassengerExcitement < TAXI_CONST_EXCITEMENT_LEVEL_MED
IF myTaxiData.iTaxiOJ_CashTip < myTaxiData.iTaxiOJ_CashTipAvg
TAXI_JOB_SET_NEXT_STATE(myTaxiData,TRS_SPECIAL_ENDING)
ELSE
CDEBUG1LN(DEBUG_OJ_TAXI,"[TAXI-NE] look task given")
TASK_LOOK_AT_ENTITY(myTaxiData.piTaxiPassenger, PLAYER_PED_ID(), -1, SLF_SLOW_TURN_RATE | SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_HIGH)
TASK_LOOK_AT_ENTITY(PLAYER_PED_ID(), myTaxiData.piTaxiPassenger, -1, SLF_SLOW_TURN_RATE | SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_HIGH)
TAXI_JOB_SET_NEXT_STATE(myTaxiData,TRS_REGULAR_PAYMENT)
ENDIF
CONVERT_TAXI_TIP_TO_CASH(myTaxiData)
ENDIF
BREAK
//Regular Payment---------------------------------------------------------------------------
CASE TRS_REGULAR_PAYMENT
//Wait til passenger is done speaking/paying than tell him to leave vehicle
IF HAS_TAXI_OJ_PASSENGER_BEEN_DROPPED_OFF(myTaxiData)
TASK_CLEAR_LOOK_AT(myTaxiData.piTaxiPassenger)
TASK_CLEAR_LOOK_AT(PLAYER_PED_ID())
TAXI_OJ_TASK_PASSENGER_DROPOFF(myTaxiData)
TAXI_JOB_SET_NEXT_STATE(myTaxiData,TRS_SCORECARD_GRADE)
ENDIF
BREAK
//Passenger attempts to run out-------------------------------------------------------------
CASE TRS_SPECIAL_ENDING
IF myRunState = TPRS_RUNNING
AND NOT TAXI_HAS_PASSENGER_ESCAPED(myTaxiData.piTaxiPlayer, myTaxiData.piTaxiPassenger)
IF NOT IS_TIMER_STARTED(shoutDelay)
RESTART_TIMER_NOW(shoutDelay)
ELIF GET_TIMER_IN_SECONDS(shoutDelay) > 5.0
SET_NEXT_TAXI_SPEECH(myTaxiData, TAXI_DI_RUNOFF_SHOUTS, TRUE, FALSE, TRUE)
RESTART_TIMER_NOW(shoutDelay)
ENDIF
ENDIF
IF TAXI_SET_PED_RUNNING(myRunState, myTaxiData, myTaxiData.piTaxiPassenger, taxiMoney,TRUE)
IF NOT IS_PED_INJURED(myTaxiData.piTaxiPassenger)
//SET_NEXT_TAXI_SPEECH(myTaxiData, TAXI_DI_MAKE_PAY_END, TRUE, FALSE, TRUE)
CREATE_CONVERSATION(myTaxiData.tTaxiOJ_Convo, myTaxiData.sTaxiOJ_DXSubtitleGroupID, "txm2_runoff", CONV_PRIORITY_VERY_HIGH)
ENDIF
//State++
TAXI_JOB_SET_NEXT_STATE(myTaxiData,TRS_SCORECARD_GRADE)
ENDIF
BREAK
//Pop up the scorecard----------------------------------------------------------------------
CASE TRS_SCORECARD_GRADE
IF TAXI_CALC_SCORECARD(myTaxiData,TaxiMidSize)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
TAXI_MISSION_END(TRUE,myTaxiData)
TAXI_JOB_SET_NEXT_STATE(myTaxiData,TRS_CLEANUP)
ENDIF
ENDIF
BREAK
//Clean everything up
CASE TRS_CLEANUP
Script_Cleanup()
BREAK
ENDSWITCH
ENDIF
ENDPROC
SCRIPT
// Handles the player being busted or arrested, or if the player
// jumps into Multiplayer from Singleplayer ensures the script
// gets cleaned up properly under the correct circumstances
IF (HAS_FORCE_CLEANUP_OCCURRED(DEFAULT_FORCE_CLEANUP_FLAGS | FORCE_CLEANUP_FLAG_REPEAT_PLAY))
SET_PROPERTY_MANAGEMENT_RESULT(PROPERTY_MANAGEMENT_RESULT_FAILURE)
Script_Cleanup()
ENDIF
// Any initialisation (generally, only mission scripts should set
// the mission flag to TRUE)
SET_MISSION_FLAG(TRUE)
INITIALIZE_SCRIPT_VARIABLES()
// The script loop
WHILE (TRUE)
// Maintain the script perform per-frame functionality
//All skips and debug shortcuts-------------------------------
#IF IS_DEBUG_BUILD
PROCESS_TAXI_DEBUG_SKIP(myTaxiData,tDebugState)
// Debug Key: Check for Pass (not for Minigmes)
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S))
TAXI_ODDJOB_DEBUG_SKIP_TO_SCORECARD(myTaxiData)
ENDIF
// Debug Key: Check for Fail (not for Minigames)
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F))
TAXI_DEBUG_FAIL_TRIGGERED(myTaxiData)
Script_Failed()
ENDIF
// Debug Key: set vehicle health to 0.0
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_E))
IF NOT IS_ENTITY_DEAD(myTaxiData.viTaxi)
SET_VEHICLE_ENGINE_HEALTH(myTaxiData.viTaxi, 0.0)
ENDIF
ENDIF
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_Q))
IF NOT IS_ENTITY_DEAD(myTaxiData.viTaxi)
SET_VEHICLE_ENGINE_HEALTH(myTaxiData.viTaxi, 50.0)
ENDIF
ENDIF
PROCESS_WIDGETS()
#ENDIF
//END DEBUG----------------------------------------------------
IF DOES_ENTITY_EXIST(myTaxiData.piTaxiPlayer)
Main_Taxi_OJ_NeedsExcitement()
ELSE
REASSIGN_TAXI_OJ_DRIVER(myTaxiData)
ENDIF
WAIT(0)
ENDWHILE
// Script should never reach here. Always terminate with cleanup function.
ENDSCRIPT