Files
gtav-src/script/dev_ng/singleplayer/scripts/Minigames/Taxi/Taxi_Deadline.sc
T
2025-09-29 00:52:08 +02:00

1359 lines
47 KiB
Python
Executable File
Raw 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_Deadline.sc
// Dev : John R. Diaz
/*
Im on a deadline. The passenger gives you a set amount of time to get to the location. This is all or nothing.
If you exceed the time, the passenger will bail.
*/
//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"
//Consts-------------------------------------------------------
CONST_FLOAT CONST_TAXI_GOOD_SPEED 23.0 //TAXI has a max speed of 49, so half that is a decent speed
CONST_FLOAT CONST_TAXI_OJ_DISTANCE_PAD 20.0
CONST_FLOAT CONST_TAXI_OJ_TIME_TO_LOSE_ALL_TIP 240.0
CONST_INT CONST_iTaxi_DeadlineMinutes 30//45
//Local Variables-----------------------------------------------
//Custom Data
TaxiStruct myTaxiData
MODEL_NAMES mPassengerModel = G_M_M_CHIGOON_02
//Taxi Bonus Data-------------------------------------------------------------------
ENUM TAXIOJ_DL_BONUS
TDL_BONUS_SPEEDDEMON = 0,
TDL_BONUS_TOTAL
ENDENUM
CONST_INT TAXI_CONST_BONUS_CASH_SPEED_DEMON 200
CONST_FLOAT TAXI_CONST_BONUS_TIME_SPEED_DEMON 160.0
BONUS_FIELD bonusFieldDeadline[TDL_BONUS_TOTAL]
//--------------------------------------------------------------------------------
//Ints
INT iDebugThrottle = 1
INT iTipIndex =0
INT iRideProgress = 0
//INT iCurrentGameTimeInMilliseconds
//INT iTimeLimitMin
//INT iTimeLimitHour
//Floats
FLOAT fTimeLimit
SEQUENCE_INDEX siTemp
VECTOR vNewDLDropoff = <<344.74585, 452.18317, 145.993595>>
structTimer DeadlineTimer
structTimer localBanterDelay
structTimer endBanterDelay
//Dialogue Queue Info
BOOL g_bDebug = FALSE
TAXI_OJ_DIALOGUE_Q_DATA tTaxiOJ_DQ_Data
TAXI_OJ_DQ_CONVERSATION_LINE tDialogueLine[CONST_TAXIOJ_SIZE_Q]
TIMEOFDAY eDeadline
TEXT_LABEL_7 sDeadlineTime
CONST_FLOAT DEADLINE_FAIL_LEEWAY 10.0
//Aggro checks
AGGRO_ARGS aggroArgs
SCRIPT_SHARD_BIG_MESSAGE TaxiMidSize
//Debug---------------------------------------------------------------------------------------------------------------
#IF IS_DEBUG_BUILD
WIDGET_GROUP_ID taxiRideWidgets
TEXT_LABEL_63 sDebugString[5]
BOOL bDebugDrawDL_Stats
BOOL bDebugTurnOnFreeRide = FALSE
BOOL bDebugSucceed
TXM_DEBUG_SKIP_STATES tDebugState = TXM_DSS_CHECK_FOR_BUTTON_PRESS
#ENDIF
ENUM TAXI_OJ_DL_POINTOFINTEREST
TXOJ_POI_CASINO = 0,
TXOJ_POI_CASINO_WARPPT,
TXOJ_POI_NE_COUNTRYSIDE_PASSENGER_SPAWNPT_1,
TXOJ_POI_NE_COUNTRYSIDE_PASSENGER_WARPPT_1,
TXOJ_POI_NE_COUNTRYSIDE_PASSENGER_PICKUP_1,
TXOJ_POI_DEL_PERRO_BEACH_PASSENGER_SPAWNPT_2,
TXOJ_POI_DEL_PERRO_BEACH_PASSENGER_WARPPT_2,
TXOJ_POI_DEL_PERRO_BEACH_PASSENGER_PICKUP_2,
TXOJ_POI_DEL_PERRO_BEACH_PASSENGER_SPAWNPT_3,
TXOJ_POI_DEL_PERRO_BEACH_PASSENGER_WARPPT_3,
TXOJ_POI_DEL_PERRO_BEACH_PASSENGER_PICKUP_3,
TXOJ_POI_TOTAL_NUM
ENDENUM
TAXI_OJ_DL_POINTOFINTEREST eWarpPt
TAXI_OJ_DL_POINTOFINTEREST ePickupPt
//For B*328695 - to change startpt for this mission change these below------------------------------------------------
TAXI_OJ_DL_POINTOFINTEREST eSpawnPt = TXOJ_POI_NE_COUNTRYSIDE_PASSENGER_SPAWNPT_1// TXOJ_POI_DEL_PERRO_BEACH_PASSENGER_SPAWNPT_2 *****OR**** TXOJ_POI_NE_COUNTRYSIDE_PASSENGER_SPAWNPT_1
ENUM TAXI_DEADLINE_GOAL_DISTS_AND_TIMES
TXDL_OVERALL_GOAL_TIME = 0,
TXDL_TIME_GOOD_1,
TXDL_DIST_GOOD_1,
TXDL_TIME_GOOD_2,
TXDL_DIST_GOOD_2,
TXDL_TIME_GOOD_3,
TXDL_DIST_GOOD_3,
TXDL_TOTAL_GOALS
ENDENUM
FLOAT fDeadlineGoals[TXDL_TOTAL_GOALS]
CONST_INT NUM_TIME_DISTANCE_SAMPLES 22
CONST_INT NUM_POS_LINES 8
CONST_INT NUM_NEG_LINES 8
FLOAT fTimeToCheckDistanceLeft[NUM_TIME_DISTANCE_SAMPLES]
FLOAT fExpectedDistanceLeft[NUM_TIME_DISTANCE_SAMPLES]
//FUNCTIONS------------------------------------------------------------------------------------------------------------
FUNC VECTOR GET_TAXI_OJ_DL_VECTORS(TAXI_OJ_DL_POINTOFINTEREST eWhichPt )
VECTOR vReturnPoint = NULL_VECTOR()
SWITCH eWhichPt
//Casino
CASE TXOJ_POI_CASINO
vReturnPoint = << 924.2684, 50.0780, 79.7647 >>
BREAK
CASE TXOJ_POI_CASINO_WARPPT
vReturnPoint = << 916.0502, 39.3504, 79.7647 >>
BREAK
//Passenger Spawn Pt Original - NE CountrySide
CASE TXOJ_POI_NE_COUNTRYSIDE_PASSENGER_SPAWNPT_1
vReturnPoint = <<1971.2462, 3741.5171, 31.3268>> //<< 1407.9248, 3601.9922, 33.9870 >>
BREAK
//WarpPt for SpawnPt #1
CASE TXOJ_POI_NE_COUNTRYSIDE_PASSENGER_WARPPT_1
vReturnPoint = <<2004.2780, 3752.3193, 31.4156>> //<< 1368.4233, 3570.0098, 33.9975 >>
BREAK
CASE TXOJ_POI_NE_COUNTRYSIDE_PASSENGER_PICKUP_1
vReturnPoint = << 1410.8911, 3596.0676, 33.8351 >>
BREAK
//Passenger Spawn Pt Alt - Near Del Perro Beach SW part of Map
CASE TXOJ_POI_DEL_PERRO_BEACH_PASSENGER_SPAWNPT_2
vReturnPoint = << -1383.0603, -972.8339, 8.0140 >>
BREAK
//WarpPt for SpawnPt #2
CASE TXOJ_POI_DEL_PERRO_BEACH_PASSENGER_WARPPT_2
vReturnPoint = << -1399.1967, -944.1848, 9.4306 >>
BREAK
CASE TXOJ_POI_DEL_PERRO_BEACH_PASSENGER_PICKUP_2
vReturnPoint = << -1379.2621, -972.9459, 7.8097 >>
BREAK
//Alt Pickup Pt#3 by Bahama Mamas West
//Passenger Spawn Pt Alt - Near Del Perro Beach SW part of Map
CASE TXOJ_POI_DEL_PERRO_BEACH_PASSENGER_SPAWNPT_3
vReturnPoint = << -1390.7650, -584.3324, 29.2306 >>
BREAK
//WarpPt for SpawnPt #2
CASE TXOJ_POI_DEL_PERRO_BEACH_PASSENGER_WARPPT_3
vReturnPoint = << -1410.2234, -590.6025, 29.3669 >>
BREAK
CASE TXOJ_POI_DEL_PERRO_BEACH_PASSENGER_PICKUP_3
vReturnPoint = << -1379.2621, -972.9459, 7.8097 >>
BREAK
ENDSWITCH
RETURN vReturnPoint
ENDFUNC
/// PURPOSE: the index in these should correspond to the index above in VECTOR variation
///
/// PARAMS:
/// iWhichIndex -
/// RETURNS:
///
FUNC FLOAT GET_TAXI_OJ_DL_HEADINGS(TAXI_OJ_DL_POINTOFINTEREST eWhichPt)
FLOAT fReturnHeading = 0
SWITCH eWhichPt
//Casino
CASE TXOJ_POI_CASINO
fReturnHeading = 328.48
BREAK
CASE TXOJ_POI_CASINO_WARPPT
fReturnHeading = 328.48
BREAK
//Passenger Spawn Pt Original - NE CountrySide
CASE TXOJ_POI_NE_COUNTRYSIDE_PASSENGER_SPAWNPT_1
fReturnHeading = 239.1430 //237.0
BREAK
//Heading for WarpPt to SpawnPt #1
CASE TXOJ_POI_NE_COUNTRYSIDE_PASSENGER_WARPPT_1
fReturnHeading = 121.2021 //287
BREAK
//Passenger Spawn Pt Alt - Near Del Perro Beach SW part of Map
CASE TXOJ_POI_DEL_PERRO_BEACH_PASSENGER_SPAWNPT_2
fReturnHeading = 268.6
BREAK
//Heading for WarpPt for SpawnPt #2
CASE TXOJ_POI_DEL_PERRO_BEACH_PASSENGER_WARPPT_2
fReturnHeading = 218.5
BREAK
//Passenger Spawn Pt Alt - Near Del Perro Beach SW part of Map
CASE TXOJ_POI_DEL_PERRO_BEACH_PASSENGER_SPAWNPT_3
fReturnHeading = 268.6
BREAK
//Heading for WarpPt for SpawnPt #2
CASE TXOJ_POI_DEL_PERRO_BEACH_PASSENGER_WARPPT_3
fReturnHeading = 301.6025
BREAK
ENDSWITCH
RETURN fReturnHeading
ENDFUNC
PROC SETUP_TAXI_OJ_DEADLINE_GOALS()
//Picked the Country start pt
IF eSpawnPt = TXOJ_POI_NE_COUNTRYSIDE_PASSENGER_SPAWNPT_1
eWarpPt = TXOJ_POI_NE_COUNTRYSIDE_PASSENGER_WARPPT_1
ePickupPt = TXOJ_POI_NE_COUNTRYSIDE_PASSENGER_PICKUP_1
fDeadlineGoals[TXDL_OVERALL_GOAL_TIME] = 210 //165//180
fDeadlineGoals[TXDL_TIME_GOOD_1] = 60//70
fDeadlineGoals[TXDL_DIST_GOOD_1] = 3150
fDeadlineGoals[TXDL_TIME_GOOD_2] = 105//110
fDeadlineGoals[TXDL_DIST_GOOD_2] = 1800
fDeadlineGoals[TXDL_TIME_GOOD_3] = 150 //160 //TAXI_CONST_BONUS_TIME_SPEED_DEMON
fDeadlineGoals[TXDL_DIST_GOOD_3] = 200
CDEBUG1LN(DEBUG_OJ_TAXI,"Taxi Goals defined for 1st dropoff")
//Picked Del Perro Beach startpt
ELSE
eWarpPt = TXOJ_POI_DEL_PERRO_BEACH_PASSENGER_WARPPT_3
ePickupPt = TXOJ_POI_DEL_PERRO_BEACH_PASSENGER_PICKUP_3
fDeadlineGoals[TXDL_OVERALL_GOAL_TIME] = 140
fDeadlineGoals[TXDL_TIME_GOOD_1] = 60
fDeadlineGoals[TXDL_DIST_GOOD_1] = 1780
fDeadlineGoals[TXDL_TIME_GOOD_2] = 90
fDeadlineGoals[TXDL_DIST_GOOD_2] = 900
fDeadlineGoals[TXDL_TIME_GOOD_3] = 120 //TAXI_CONST_BONUS_TIME_SPEED_DEMON
fDeadlineGoals[TXDL_DIST_GOOD_3] = 228
CDEBUG1LN(DEBUG_OJ_TAXI,"Taxi Goals defined for 2nd dropoff")
ENDIF
fTimeToCheckDistanceLeft[0] = 70.050049
fExpectedDistanceLeft[0] = 3090.417480
fTimeToCheckDistanceLeft[1] = 76.252930
fExpectedDistanceLeft[1] = 2929.083252
fTimeToCheckDistanceLeft[2] = 82.693115
fExpectedDistanceLeft[2] = 2759.830322
fTimeToCheckDistanceLeft[3] = 88.343994
fExpectedDistanceLeft[3] = 2576.061279
fTimeToCheckDistanceLeft[4] = 94.978027
fExpectedDistanceLeft[4] = 2350.885986
fTimeToCheckDistanceLeft[5] = 100.798096
fExpectedDistanceLeft[5] = 2177.442383
fTimeToCheckDistanceLeft[6] = 106.467041
fExpectedDistanceLeft[6] = 2016.681396
fTimeToCheckDistanceLeft[7] = 112.928955
fExpectedDistanceLeft[7] = 1839.417358
fTimeToCheckDistanceLeft[8] = 118.420898
fExpectedDistanceLeft[8] = 1689.620483
fTimeToCheckDistanceLeft[9] = 124.424072
fExpectedDistanceLeft[9] = 1526.637939
fTimeToCheckDistanceLeft[10] = 130.760010
fExpectedDistanceLeft[10] = 1356.038818
fTimeToCheckDistanceLeft[11] = 136.699951
fExpectedDistanceLeft[11] = 1184.012695
fTimeToCheckDistanceLeft[12] = 142.572998
fExpectedDistanceLeft[12] = 1034.024048
fTimeToCheckDistanceLeft[13] = 148.216064
fExpectedDistanceLeft[13] = 894.622498
fTimeToCheckDistanceLeft[14] = 154.432129
fExpectedDistanceLeft[14] = 756.521912
fTimeToCheckDistanceLeft[15] = 160.274902
fExpectedDistanceLeft[15] = 669.363953
fTimeToCheckDistanceLeft[16] = 166.250000
fExpectedDistanceLeft[16] = 570.295349
fTimeToCheckDistanceLeft[17] = 172.250977
fExpectedDistanceLeft[17] = 521.976990
fTimeToCheckDistanceLeft[18] = 178.605957
fExpectedDistanceLeft[18] = 340.746582
fTimeToCheckDistanceLeft[19] = 184.680908
fExpectedDistanceLeft[19] = 224.309128
fTimeToCheckDistanceLeft[20] = 190.708008
fExpectedDistanceLeft[20] = 126.953461
fTimeToCheckDistanceLeft[21] = 193.06201
fExpectedDistanceLeft[21] = 81.804207
myTaxiData.vTaxiOJ_WarpPtPickup = GET_TAXI_OJ_DL_VECTORS(eWarpPt)
myTaxiData.fTaxiOJ_WarpPtHeadingPickup = GET_TAXI_OJ_DL_HEADINGS(eWarpPt)
myTaxiData.vTaxiOJ_WarpPtDropoff = GET_TAXI_OJ_DL_VECTORS(TXOJ_POI_CASINO_WARPPT)
myTaxiData.fTaxiOJ_WarpPtHeadingDropoff = GET_TAXI_OJ_DL_HEADINGS(TXOJ_POI_CASINO_WARPPT)
myTaxiData.vTaxiOJ_PassengerGoToPt = << 328.67575, 443.98456, 144.22983 >> //<< 926.2454, 44.1140, 79.8996 >>
ENDPROC
/// PURPOSE: Do all your taxi string table, and anims and whatever we need for taxi oddjobs
///
PROC REQUEST_TAXI_ODDJOB_DL_STREAMS_STAGE_01()
//Load text and UI
REQUEST_MODEL(mPassengerModel)
TaxiMidSize.siMovie = REQUEST_MG_MIDSIZED_MESSAGE()
TAXI_INIT_SHARED_STREAMS()
CDEBUG1LN(DEBUG_OJ_TAXI,"Initial Taxi Oddjob Deadline Assets requested.")
ENDPROC
PROC RELEASE_TAXI_ODDJOB_DL_STREAMS_STAGE_01()
//Load text and UI
SET_MODEL_AS_NO_LONGER_NEEDED(mPassengerModel)
CDEBUG1LN(DEBUG_OJ_TAXI,"Initial Taxi Oddjob Deadline Assets released.")
ENDPROC
//// PURPOSE: Waits for our assets to load
///
/// RETURNS: TRUE if everything has loaded correctly FALSE if there was a problem
///
FUNC BOOL HAVE_TAXI_OJ_DL_STAGE_01_ASSETS_LOADED()
IF NOT HAS_MODEL_LOADED(mPassengerModel)
CDEBUG_MESSAGE_OJ_TAXI_PERIODIC("TAXI_ASSETS_STREAMED - Loading G_M_M_ChiGoon_02",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 Deadline Stage 01 Assets Loaded")
RETURN TRUE
ENDFUNC
PROC LOCK_CASINO_DOORS_FOR_TAXI_ODDJOB()
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(PROP_CASINO_DOOR_01L,<< 929.6144, 46.3955, 80.0993 >>,TRUE,1.0, 50.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(PROP_CASINO_DOOR_01R,<< 928.6238, 44.9848, 80.0993 >>,TRUE,1.0, 50.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(PROP_CASINO_DOOR_01L,<< 928.1625, 43.7989, 79.8993 >>,TRUE,1.0, 50.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(PROP_CASINO_DOOR_01R,<< 927.4266, 42.1881, 80.0884 >>,TRUE,1.0, 50.0)
CDEBUG1LN(DEBUG_OJ_TAXI,"[AIRLOCK] -------- Casino Doors Have Been Stream Locked")
ENDPROC
PROC SET_LOCK_STATE_OF_TAXI_ODDJOB_DEADLINE_CASINO_DOORS(BOOL bLockDoors = FALSE)
IF bLockDoors
LOCK_CASINO_DOORS_FOR_TAXI_ODDJOB()
//Left side casino doors
SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(PROP_CASINO_DOOR_01L,<< 929.6144, 46.3955, 80.0993 >>,bLockDoors,0)
SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(PROP_CASINO_DOOR_01R,<< 928.6238, 44.9848, 80.0993 >>,bLockDoors,0)
//Right side casino doors
SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(PROP_CASINO_DOOR_01L,<< 928.1625, 43.7989, 79.8993 >>,bLockDoors,0)
SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(PROP_CASINO_DOOR_01R,<< 927.4266, 42.1881, 80.0884 >>,bLockDoors,0)
CDEBUG1LN(DEBUG_OJ_TAXI,"[AIRLOCK] -------- Casino Doors Have Been Locked")
ELSE
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(PROP_CASINO_DOOR_01L,<< 929.6144, 46.3955, 80.0993 >>,bLockDoors,0.0, 50.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(PROP_CASINO_DOOR_01R,<< 928.6238, 44.9848, 80.0993 >>,bLockDoors,0.0, 50.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(PROP_CASINO_DOOR_01L,<< 928.1625, 43.7989, 79.8993 >>,bLockDoors,0.0, 50.0)
SET_LOCKED_UNSTREAMED_IN_DOOR_OF_TYPE(PROP_CASINO_DOOR_01R,<< 927.4266, 42.1881, 80.0884 >>,bLockDoors,0.0, 50.0)
CDEBUG1LN(DEBUG_OJ_TAXI,"[AIRLOCK] -------- Casino Doors Have Been UNLocked")
ENDIF
ENDPROC
PROC Script_Cleanup()
#IF IS_DEBUG_BUILD
IF DOES_WIDGET_GROUP_EXIST(taxiRideWidgets)
DELETE_WIDGET_GROUP(taxiRideWidgets)
ENDIF
CLEANUP_TAXI_WIDGETS()
#ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_DontAllowToBeDraggedOutOfVehicle, FALSE)
ENDIF
RELEASE_TAXI_ODDJOB_DL_STREAMS_STAGE_01()
LOCK_CASINO_DOORS_FOR_TAXI_ODDJOB()
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_ODDJOB_GLOBAL_SETUP(myTaxiData,TXM_03_DEADLINE)
// 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, CONST_TAXI_OJ_TIP_AVERAGE_CUTOFF, CONST_TAXI_OJ_TIP_AMAZING_CUTOFF)
myTaxiData.fTaxiEnterSpeed = PEDMOVE_RUN
CDEBUG1LN(DEBUG_OJ_TAXI,"Current Dialogue line = ", tTaxiOJ_DQ_Data.iCurrentDQLine)
#IF IS_DEBUG_BUILD
#IF DEBUG_iTurnOnAllDXDebug
ENABLE_ALL_DIALOGUE_DEBUG()
#ENDIF
taxiRideWidgets = START_WIDGET_GROUP("Taxi Ride - Deadline")
INIT_ODDJOB_TAXI_WIDGETS()
ADD_WIDGET_BOOL("Show Deadline Stats", bDebugDrawDL_Stats)
STOP_WIDGET_GROUP()
INIT_TAXI_WIDGETS(taxiRideWidgets)
#ENDIF
CDEBUG1LN(DEBUG_OJ_TAXI,"-----~~~~~-------------------------------~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~----")
CDEBUG1LN(DEBUG_OJ_TAXI,"-----~~~~~~~~~~~~~~~~ Oddjobs | Taxi | Deadline ~~~~~~~~~~~~~~~~~~~~----------")
CDEBUG1LN(DEBUG_OJ_TAXI,"-----~~~~~-------------------------------~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~----")
ENDPROC
#IF IS_DEBUG_BUILD
PROC PROCESS_WIDGETS()
UPDATE_TAXI_WIDGETS(myTaxiData,tTaxiOJ_DQ_Data)
IF bDebugDrawDL_Stats
//SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
sDebugString[0] = "Compliments # "
sDebugString[0] += TAXI_UTILS_GET_STRING_FROM_INT_SP(myTaxiData.iTaxiOJ_NumCompliments)
DRAW_DEBUG_TEXT_2D(sDebugString[0],<<0.8,0.3,0.0>>)
sDebugString[1] = "Disses # "
sDebugString[1] +=TAXI_UTILS_GET_STRING_FROM_INT_SP(myTaxiData.iTaxiOJ_NumDisses)
DRAW_DEBUG_TEXT_2D(sDebugString[1],<<0.80,0.32,0.0>>)
sDebugString[2] = "Detla C - D= "
sDebugString[2] +=TAXI_UTILS_GET_STRING_FROM_INT_SP(myTaxiData.iTaxiOJ_NumCompliments - myTaxiData.iTaxiOJ_NumDisses)
DRAW_DEBUG_TEXT_2D(sDebugString[2],<<0.80,0.34,0.0>>)
ENDIF
ENDPROC
#ENDIF
PROC TAXI_OJ_DL_SET_TIPS_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)
SET_BITMASK_AS_ENUM(myTaxiData.iTaxiOJ_TipsBitMask,TAXI_TIP_BIT_TOOK_DAMAGE)
SET_BITMASK_AS_ENUM(myTaxiData.iTaxiOJ_TipsBitMask,TAXI_TIP_BIT_ROLL_CAR)
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_FREEBIE)
SET_BITMASK_AS_ENUM(myTaxiData.iTaxiOJ_TipsBitMask,TAXI_TIP_BIT_LOST_POLICE)
//Exitement Bits
SET_BITMASK_AS_ENUM(myTaxiData.iTaxiOJ_PassengerReactBits, TAXI_DF_HITPED)
SET_BITMASK_AS_ENUM(myTaxiData.iTaxiOJ_PassengerReactBits, TAXI_DF_TOOKDAMAGE)
SET_BITMASK_AS_ENUM(myTaxiData.iTaxiOJ_PassengerReactBits, TAXI_DF_ROLL)
//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 ADD_TIME_TO_HOUR(TIMEOFDAY & eTimeToAddTo, INT iHour)
IF ((GET_TIMEOFDAY_HOUR(eTimeToAddTo) + iHour) > 23)
SET_TIMEOFDAY_HOUR(eTimeToAddTo, (GET_TIMEOFDAY_HOUR(eTimeToAddTo) + iHour) - 24)
ELSE
SET_TIMEOFDAY_HOUR(eTimeToAddTo, (GET_TIMEOFDAY_HOUR(eTimeToAddTo) + iHour))
ENDIF
ENDPROC
PROC ADD_TIME_TO_MINUTE(TIMEOFDAY & eTimeToAddTo, INT iMinute)
IF (GET_TIMEOFDAY_MINUTE(eTimeToAddTo) + iMinute) > 59
SET_TIMEOFDAY_MINUTE(eTimeToAddTo, (GET_TIMEOFDAY_MINUTE(eTimeToAddTo) + iMinute) - 60)
ADD_TIME_TO_HOUR(eTimeToAddTo, 1)
ELSE
SET_TIMEOFDAY_MINUTE(eTimeToAddTo, (GET_TIMEOFDAY_MINUTE(eTimeToAddTo) + iMinute))
ENDIF
ENDPROC
//Tweak deadline time here.
//B*1311118 - adding 10 secs
FUNC TIMEOFDAY GET_TAXI_DEADLINE_TIMEOFDAY()
TIMEOFDAY eCurrentTime
eCurrentTime = GET_CURRENT_TIMEOFDAY()
ADD_TIME_TO_HOUR(eCurrentTime, 3) //2)
ADD_TIME_TO_MINUTE(eCurrentTime, CONST_iTaxi_DeadlineMinutes)
RETURN eCurrentTime
ENDFUNC
FUNC TEXT_LABEL_7 GET_TAXI_HOURS_MINUTES_STRING(TIMEOFDAY eCurrentTime)
TEXT_LABEL_7 sTimeToPrint
TEXT_LABEL_3 sTimeHours
TEXT_LABEL_3 sTimeMinutes
sTimeHours = CONVERT_INT_TO_STRING(GET_TIMEOFDAY_HOUR(eCurrentTime))
sTimeToPrint += sTimeHours
sTimeToPrint += ":"
IF GET_TIMEOFDAY_MINUTE(eCurrentTime) < 10
sTimeToPrint += "0"
ENDIF
sTimeMinutes = CONVERT_INT_TO_STRING(GET_TIMEOFDAY_MINUTE(eCurrentTime))
sTimeToPrint += sTimeMinutes
RETURN sTimeToPrint
ENDFUNC
BOOL bTaxiTimeUp
BOOL bTaxi10SecWarning
BOOL bTaxiStopWarning
INT iTaxiBeepTimeStamp
//Displays the clock in the bottom right hand side of the screen and plays warning audio during last 10 seconds
PROC DRAW_DEADLINE_CLOCK()
// iCurrentGameTimeInMilliseconds = GET_TIMEOFDAY_MINUTE(GET_CURRENT_TIMEOFDAY())*1000
// iCurrentGameTimeInMilliseconds += GET_TIMEOFDAY_HOUR(GET_CURRENT_TIMEOFDAY())*1000 * 60
//
// IF iCurrentGameTimeInMilliseconds > 719999 // IF the time is more than 11:59(am)
// IF iCurrentGameTimeInMilliseconds > 779999 // IF the time is more than 12.59(pm)
// DRAW_GENERIC_TIMER(iCurrentGameTimeInMilliseconds - 720000, "TIMER_TIME", 0, TIMER_STYLE_CLOCKPM) // show evrything from 13:00 to 23:59 - 12:00 = as 01:00(pm) to 11:59(pm)
// ELSE // IF the time is more than 11:59(am) but less than 12.59(pm)
// DRAW_GENERIC_TIMER(iCurrentGameTimeInMilliseconds, "TIMER_TIME", 0, TIMER_STYLE_CLOCKPM) // show as 24-hour clock (normal)
// ENDIF
// ELSE // ELSE the time is less than 12:00(pm)
// IF iCurrentGameTimeInMilliseconds < 60000 // IF the time is less than 01:00(am)
// DRAW_GENERIC_TIMER(iCurrentGameTimeInMilliseconds + 720000, "TIMER_TIME", 0, TIMER_STYLE_CLOCKAM) // show evrything from 00:00(am) to 00:59(am) + 12:00(am) = as 12:00(am) to 12.59
// ELSE // IF the time is less than 12:00(pm) but more than 01.00(am)
// DRAW_GENERIC_TIMER(iCurrentGameTimeInMilliseconds, "TIMER_TIME", 0, TIMER_STYLE_CLOCKAM) // show as 24-hour clock (normal)
// ENDIF
// ENDIF
// DRAW_GENERIC_TIMER((iTimeLimitHour *1000 *60 - GET_TIMEOFDAY_HOUR(GET_CURRENT_TIMEOFDAY())*1000 * 60)
// + (iTimeLimitMin *1000 - GET_TIMEOFDAY_MINUTE(GET_CURRENT_TIMEOFDAY())*1000), "TIMER_TIME")
INT iTimer = ROUND((fTimeLimit - GET_TIMER_IN_SECONDS_SAFE(DeadlineTimer))* 1000.0)
IF iTimer < 0
iTimer = 0
bTaxiTimeUp = TRUE
IF NOT bTaxiStopWarning
PLAY_SOUND_FRONTEND(-1, "TIMER_STOP", "HUD_MINI_GAME_SOUNDSET")
bTaxiStopWarning = TRUE
ENDIF
ENDIF
DRAW_GENERIC_TIMER(iTimer, "TIM_TIMER")
IF NOT bTaxiTimeUp
IF NOT bTaxi10SecWarning
FLOAT fTimer = GET_TIMER_IN_SECONDS(DeadlineTimer)
IF (fTimeLimit - fTimer) < 1.0
OR (fTimeLimit - fTimer) < 1.5
OR (fTimeLimit - fTimer) < 2.0
OR (fTimeLimit - fTimer) < 2.5
OR (fTimeLimit - fTimer) < 3.0
OR (fTimeLimit - fTimer) < 3.5
OR (fTimeLimit - fTimer) < 4.0
OR (fTimeLimit - fTimer) < 4.5
OR (fTimeLimit - fTimer) < 5.0
OR (fTimeLimit - fTimer) < 6.0
OR (fTimeLimit - fTimer) < 7.0
OR (fTimeLimit - fTimer) < 8.0
OR (fTimeLimit - fTimer) < 9.0
OR (fTimeLimit - fTimer) < 10.0
OR (fTimeLimit - fTimer) < 11.0
PLAY_SOUND_FRONTEND(-1, "10_SEC_WARNING", "HUD_MINI_GAME_SOUNDSET")
CDEBUG1LN(DEBUG_OJ_TAXI,"playing beep now")
bTaxi10SecWarning = TRUE
iTaxiBeepTimeStamp = GET_GAME_TIMER()
ENDIF
ELSE
FLOAT fTimer = GET_TIMER_IN_SECONDS(DeadlineTimer)
IF ((fTimeLimit - fTimer) < 5.5 AND GET_GAME_TIMER() - iTaxiBeepTimeStamp > 500)
OR ((fTimeLimit - fTimer) < 11.0 AND GET_GAME_TIMER() - iTaxiBeepTimeStamp > 1000)
bTaxi10SecWarning = FALSE
ENDIF
ENDIF
ENDIF
ENDPROC
FUNC FLOAT GET_DYNAMIC_STOPPING_DISTANCE_FOR_TAXI()
FLOAT fCurrentPlayerSpeed
fCurrentPlayerSpeed = GET_ENTITY_SPEED(myTaxiData.viTaxi)
IF fCurrentPlayerSpeed >= 10
RETURN fCurrentPlayerSpeed * 0.5
ENDIF
RETURN 5.0
ENDFUNC
FUNC FLOAT EVALUATE_TAXI_OJ_DEADLINE_BEST_ETA()
FLOAT fRetVal
FLOAT fVehMaxSpeed
FLOAT fDistLeft
fDistLeft = GET_PLAYER_DISTANCE_FROM_LOCATION(myTaxiData.vTaxiOJDropoff, FALSE)
IF DOES_ENTITY_EXIST(myTaxiData.viTaxi)
fVehMaxSpeed = GET_VEHICLE_ESTIMATED_MAX_SPEED(myTaxiData.viTaxi)
fVehMaxSpeed = fVehMaxSpeed * 0.65
ENDIF
fRetVal = fDistLeft/fVehMaxSpeed
CDEBUG1LN(DEBUG_OJ_TAXI,"EVALUATE_TAXI_OJ_DEADLINE_BEST_ETA: ETA = ", fRetVal)
CDEBUG1LN(DEBUG_OJ_TAXI,"EVALUATE_TAXI_OJ_DEADLINE_BEST_ETA: fDistLeft = ", fDistLeft)
CDEBUG1LN(DEBUG_OJ_TAXI,"EVALUATE_TAXI_OJ_DEADLINE_BEST_ETA: fVehMaxSpeed = ", fVehMaxSpeed)
RETURN fRetVal
ENDFUNC
FUNC BOOL CAN_TAXI_OJ_DEADLINE_TAXI_GET_TO_DESTINATION_IN_TIME()
FLOAT fTimeLeft
fTimeLeft = fTimeLimit - GET_TIMER_IN_SECONDS_SAFE(DeadlineTimer)
CDEBUG1LN(DEBUG_OJ_TAXI,"CAN_TAXI_OJ_DEADLINE_TAXI_GET_TO_DESTINATION_IN_TIME: Goal Time = ", fTimeLeft)
RETURN (fTimeLeft > EVALUATE_TAXI_OJ_DEADLINE_BEST_ETA())
ENDFUNC
INT iFeedBackIterator
INT iPosLines
INT iNegLines
BOOL bFirstFeedBackLineSaid
CONST_FLOAT TAXI_OJ_DELTA_TIME 6.0
CONST_FLOAT TAXI_OJ_FEEDBACK_WAIT_TIME 20.0
FUNC BOOL EVALUATE_NEW_TIME(TAXI_DIALOGUE_INDEX tdPositiveLine, TAXI_DIALOGUE_INDEX tdNegativeLine, FLOAT fGoodTime)
IF IS_TAXI_TIMER_STARTED(myTaxiData, TT_RIDETODEST)
// CDEBUG1LN(DEBUG_OJ_TAXI,"YP fTimeToCheckDistanceLeft[X] = ", GET_TAXI_TIMER_IN_SECONDS(myTaxiData, TT_RIDETODEST))
// CDEBUG1LN(DEBUG_OJ_TAXI,"YP fExpectedDistanceLeft[X] = ", GET_PLAYER_DISTANCE_FROM_LOCATION(myTaxiData.vTaxiOJDropoff, FALSE))
// CDEBUG1LN(DEBUG_OJ_TAXI,"")
IF iFeedBackIterator < NUM_TIME_DISTANCE_SAMPLES
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF GET_TAXI_TIMER_IN_SECONDS(myTaxiData, TT_RIDETODEST) <= fTimeToCheckDistanceLeft[iFeedBackIterator] + TAXI_OJ_DELTA_TIME
AND GET_TAXI_TIMER_IN_SECONDS(myTaxiData, TT_RIDETODEST) >= fTimeToCheckDistanceLeft[iFeedBackIterator] - TAXI_OJ_DELTA_TIME
CDEBUG1LN(DEBUG_OJ_TAXI,"EVALUATE_NEW_TIME: Current Time = ", GET_TAXI_TIMER_IN_SECONDS(myTaxiData, TT_RIDETODEST), " fTimeToCheckDistanceLeft[", iFeedBackIterator,"] = ", fTimeToCheckDistanceLeft[iFeedBackIterator])
IF GET_PLAYER_DISTANCE_FROM_LOCATION(myTaxiData.vTaxiOJDropoff, FALSE) <= fExpectedDistanceLeft[iFeedBackIterator]
AND iPosLines < NUM_POS_LINES
CDEBUG1LN(DEBUG_OJ_TAXI,"EVALUATE_NEW_TIME: + Line Curr Dist = ",GET_PLAYER_DISTANCE_FROM_LOCATION(myTaxiData.vTaxiOJDropoff, FALSE), " fExpectedDistanceLeft[", iFeedBackIterator,"] = ", fExpectedDistanceLeft[iFeedBackIterator])
IF NOT bFirstFeedBackLineSaid
CDEBUG1LN(DEBUG_OJ_TAXI,"EVALUATE_NEW_TIME: - + FIRST Line")
iFeedBackIterator++
iPosLines++
SET_NEXT_TAXI_SPEECH(myTaxiData,tdPositiveLine,TRUE)
RESTART_TIMER_NOW(localBanterDelay)
bFirstFeedBackLineSaid = TRUE
ENDIF
IF IS_TIMER_STARTED(localBanterDelay)
IF GET_TIMER_IN_SECONDS(localBanterDelay) > TAXI_OJ_FEEDBACK_WAIT_TIME
CDEBUG1LN(DEBUG_OJ_TAXI,"EVALUATE_NEW_TIME: + Line")
iFeedBackIterator++
iPosLines++
SET_NEXT_TAXI_SPEECH(myTaxiData,tdPositiveLine,TRUE)
CANCEL_TIMER(localBanterDelay)
RESTART_TIMER_NOW(localBanterDelay)
ENDIF
ENDIF
RETURN TRUE
ELIF GET_PLAYER_DISTANCE_FROM_LOCATION(myTaxiData.vTaxiOJDropoff, FALSE) > fExpectedDistanceLeft[iFeedBackIterator]
AND iNegLines < NUM_NEG_LINES
CDEBUG1LN(DEBUG_OJ_TAXI,"EVALUATE_NEW_TIME: - Line Curr Dist = ",GET_PLAYER_DISTANCE_FROM_LOCATION(myTaxiData.vTaxiOJDropoff, FALSE), " fExpectedDistanceLeft[", iFeedBackIterator,"] = ", fExpectedDistanceLeft[iFeedBackIterator])
IF NOT bFirstFeedBackLineSaid
CDEBUG1LN(DEBUG_OJ_TAXI,"EVALUATE_NEW_TIME: FIRST - Line")
iFeedBackIterator++
iNegLines++
SET_NEXT_TAXI_SPEECH(myTaxiData,tdNegativeLine,TRUE)
RESTART_TIMER_NOW(localBanterDelay)
bFirstFeedBackLineSaid = TRUE
ENDIF
IF IS_TIMER_STARTED(localBanterDelay)
IF GET_TIMER_IN_SECONDS(localBanterDelay) > TAXI_OJ_FEEDBACK_WAIT_TIME
CDEBUG1LN(DEBUG_OJ_TAXI,"EVALUATE_NEW_TIME: - Line")
iFeedBackIterator++
iNegLines++
SET_NEXT_TAXI_SPEECH(myTaxiData,tdNegativeLine,TRUE)
CANCEL_TIMER(localBanterDelay)
RESTART_TIMER_NOW(localBanterDelay)
ENDIF
ENDIF
RETURN TRUE
ENDIF
ELIF GET_TAXI_TIMER_IN_SECONDS(myTaxiData, TT_RIDETODEST) > fTimeToCheckDistanceLeft[iFeedBackIterator] + TAXI_OJ_DELTA_TIME
iFeedBackIterator++
RETURN TRUE
ENDIF
ENDIF
ELSE // all distance iterations have been checked, player should be getting there or else just say bad lines
IF GET_TAXI_TIMER_IN_SECONDS(myTaxiData, TT_RIDETODEST) >= fGoodTime
AND GET_PLAYER_DISTANCE_FROM_LOCATION(myTaxiData.vTaxiOJDropoff, FALSE) > 50
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_TIMER_STARTED(endBanterDelay)
CDEBUG1LN(DEBUG_OJ_TAXI,"starting end banter delay")
RESTART_TIMER_NOW(endBanterDelay)
ELIF GET_TIMER_IN_SECONDS(endBanterDelay) > 4.0
CDEBUG1LN(DEBUG_OJ_TAXI,"EVALUATE_NEW_TIME: - Line 3")
SET_NEXT_TAXI_SPEECH(myTaxiData,tdNegativeLine,TRUE)
ENDIF
ELSE
IF IS_TIMER_STARTED(endBanterDelay)
CDEBUG1LN(DEBUG_OJ_TAXI,"canceling end banter delay")
CANCEL_TIMER(endBanterDelay)
ENDIF
ENDIF
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
//TODO none of these values have been tweaked yet.
PROC UPDATE_PROGRESS()
IF (ROUND(GET_TAXI_TIMER_IN_SECONDS(myTaxiData, TT_RIDETODEST)*1000) % 10000) < 50
CDEBUG1LN(DEBUG_OJ_TAXI,"########################### DEADLINE CHECK")
CDEBUG1LN(DEBUG_OJ_TAXI,"Time driving passenger = ", GET_TAXI_TIMER_IN_SECONDS(myTaxiData, TT_RIDETODEST))
CDEBUG1LN(DEBUG_OJ_TAXI,"Current Mileage = ", myTaxiData.fTaxiOJ_CurrentMileage)
CDEBUG1LN(DEBUG_OJ_TAXI,"Distance from Destination = ", GET_ENTITY_DISTANCE_FROM_LOCATION(myTaxiData.viTaxi,myTaxiData.vTaxiOJDropoff))
CDEBUG1LN(DEBUG_OJ_TAXI,"########################### DEADLINE CHECK")
ENDIF
IF NOT EVALUATE_OVERALL_TIME(myTaxiData, TAXI_DI_TIME_BAD, fDeadlineGoals[TXDL_OVERALL_GOAL_TIME])
SWITCH iRideProgress
//Init Good Time Vals for Debug Info
CASE 0
SETUP_TAXI_OJ_DEADLINE_GOALS()
myTaxiData.fTaxiOJ_TimeGood = fDeadlineGoals[TXDL_TIME_GOOD_1]
myTaxiData.fTaxiOJ_DistanceGood = fDeadlineGoals[TXDL_DIST_GOOD_1]
iRideProgress++
CDEBUG1LN(DEBUG_OJ_TAXI,"Progress Taxi State = 1")
BREAK
CASE 1
EVALUATE_NEW_TIME(TAXI_DI_TIME_FAST, TAXI_DI_TIME_BAD, myTaxiData.fTaxiOJ_TimeGood)
BREAK
ENDSWITCH
ENDIF
ENDPROC
/*
ooooooooo ooooo o ooooo ooooooo ooooooo8
888 88o 888 888 888 o888 888o o888 88
888 888 888 8 88 888 888 888 888 oooo
888 888 888 8oooo88 888 o 888o o888 888o 88
o888ooo88 o888o o88o o888o o888ooooo88 88ooo88 888ooo888
*/
PROC TRIGGER_TAXI_QUEUE_DL_LINES()
//Trigger lines
SET_TAXI_OJ_INTERRUPT_TIMER_OFF(myTaxiData)
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 NOT IS_TAXI_OJ_INTERRUPTION_LINE_PLAYING(myTaxiData)
IF SAFE_IS_THIS_PRINT_BEING_DISPLAYED("TX_OBJ_DL_DO")
OR DOES_BLIP_EXIST(myTaxiData.blipTaxiDropOff)
CDEBUG1LN(DEBUG_OJ_TAXI,"--------------------------[Taxi Oddjob Objective] GO TO CASINO has been assigned")
tTaxiOJ_DQ_Data.iCurrentDQLine++
ELSE
IF GET_TAXI_SPEECH_INDEX(myTaxiData) <> TAXI_OBJ_GIVE_MAIN
SET_NEXT_TAXI_SPEECH(myTaxiData,TAXI_OBJ_GIVE_MAIN,TRUE,FALSE,TRUE)
CDEBUG1LN(DEBUG_OJ_TAXI,"--------------------------[Taxi Oddjob Objective] GO TO CASINO has been REassigned")
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
// CASE 1
// IF GET_TAXI_SPEECH_INDEX(myTaxiData) > TAXI_OBJ_GIVE_MAIN
// AND GET_TAXI_SPEECH_INDEX(myTaxiData) <> TAXI_DI_BANTER
// AND NOT IS_TAXI_OJ_INTERRUPTION_LINE_PLAYING(myTaxiData)
// SET_NEXT_TAXI_SPEECH(myTaxiData,TAXI_DI_BANTER,TRUE)
// IF g_bDebug
// SCRIPT_ASSERT("Triggering Banter 1")
// ENDIF
//
// ENDIF
// BREAK
CASE 1 //2
IF GET_TAXI_SPEECH_INDEX(myTaxiData) > TAXI_OBJ_GIVE_MAIN
AND GET_TAXI_SPEECH_INDEX(myTaxiData) <> TAXI_DI_BANTER_2
SET_BITMASK_AS_ENUM(myTaxiData.iTaxiOJ_BitsDialogue,TAXI_DXF_BANTER)
SET_NEXT_TAXI_SPEECH(myTaxiData,TAXI_DI_BANTER_2,TRUE)
IF g_bDebug
SCRIPT_ASSERT("Triggering Banter 2")
ENDIF
ENDIF
BREAK
CASE 2 //3
IF GET_TAXI_TIMER_IN_SECONDS(myTaxiData, TT_DQUEUE) > GET_RANDOM_FLOAT_IN_RANGE(8.0,14.0)
//Set Radio Station Check
IF NOT GET_TAXI_RADIO_CHECK_FLAG(myTaxiData)
TAXI_RADIO_STATION_TURN_ON(myTaxiData)
tTaxiOJ_DQ_Data.iCurrentDQLine++
IF g_bDebug
SCRIPT_ASSERT("The Taxi Radio Should Be Updating")
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
PROCESS_IMPORTANT_DIALOGUE_Q(myTaxiData,tDialogueLine, tTaxiOJ_DQ_Data, g_bDebug)
ENDPROC
/*
oooo oooo o ooooo oooo oooo
8888o 888 888 888 8888o 88
88 888o8 88 8 88 888 88 888o88
88 888 88 8oooo88 888 88 8888
o88o 8 o88o o88o o888o o888o o88o 88
*/
PROC Main_Taxi_OJ_Deadline()
//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)
RUN_GLOBAL_TAXI_UPDATES(myTaxiData,aggroArgs)
UPDATE_PROGRESS()
UPDATE_TAXI_OJ_TIP(myTaxiData,iTipIndex)
PROCESS_TAXI_EXCEPTIONS(myTaxiData)
//Track Driver progress
IF myTaxiData.tTaxiOJ_RideState = TRS_DRIVING_PASSENGER
//TAXI_DL_MONITOR_PASSENGER_HAPPINESS_AND_TIPS()
TAXI_ODDJOB_HANDLE_TAXI_BLIPPING(myTaxiData)
HANDLE_TAXI_EXCITEMENT(myTaxiData,FALSE,TRUE)
#IF IS_DEBUG_BUILD
ELIF bDebugTurnOnFreeRide
HANDLE_TAXI_EXCITEMENT(myTaxiData,TRUE,TRUE)
#ENDIF
ENDIF
//Dialogue & Objectives
IF myTaxiData.tTaxiOJ_RideState > TRS_FINDING_LOCATION
IF NOT IS_TAXI_EMERGENCY_FAIL_SET(myTaxiData)
TRIGGER_TAXI_QUEUE_DL_LINES()
ELSE
TAXI_SET_FAIL(myTaxiData,"Taxi Not Driveable",GET_TAXI_EMERGENCY_FAIL_STRING(myTaxiData))
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
//Request of our assets
REQUEST_TAXI_ODDJOB_DL_STREAMS_STAGE_01()
TAXI_RESET_TIMERS(myTaxiData, TT_DIALOGUE,TAXI_DX_DELAY)
TAXI_SPAWN_PASSENGER(myTaxiData, GET_TAXI_OJ_DL_VECTORS(eSpawnPt), GET_TAXI_OJ_DL_VECTORS(ePickupPt), "TaxiKwak",mPassengerModel,180.6)
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 HAVE_TAXI_OJ_DL_STAGE_01_ASSETS_LOADED()
INIT_ALL_TAXI_EXCITEMENT_VALUES()
//Init Bonus----------------------------------------
TAXI_INITIALIZE_BONUS_FIELD(bonusFieldDeadline[TDL_BONUS_SPEEDDEMON], "TAXI_SC_BN_03", TAXI_CONST_BONUS_CASH_SPEED_DEMON) //Completed quickly
//Init Finalized
TAXI_INITIALIZE_BONUS_INFO(myTaxiData, bonusFieldDeadline)
//SET_LOCK_STATE_OF_TAXI_ODDJOB_DEADLINE_CASINO_DOORS(TRUE)
//Setting Pickup Pt
myTaxiData.vTaxiOJPickup = GET_TAXI_OJ_DL_VECTORS(eSpawnPt)
//SET REACT BITS
INITIALIZE_GENERIC_TAXI_EXCEPTIONS()
CLEAR_ALL_TAXI_PASSENGER_REACT_BITS(myTaxiData)
//Move on to the next stage
TAXI_JOB_SET_NEXT_STATE(myTaxiData,TRS_SPAWNING)
ENDIF
BREAK
//Creates the passenger and sets objective to "PICKUP PASSENGER"---------------------------------------
CASE TRS_SPAWNING
IF PROPERTY_VIP_INIT_READY(myTaxiData)
IF NOT IS_ENTITY_DEAD(myTaxiData.piTaxiPassenger)
SET_PED_COMPONENT_VARIATION(myTaxiData.piTaxiPassenger, INT_TO_ENUM(PED_COMPONENT,0), 0, 0, 0) //(head)
SET_PED_COMPONENT_VARIATION(myTaxiData.piTaxiPassenger, INT_TO_ENUM(PED_COMPONENT,2), 1, 0, 0) //(hair)
SET_PED_COMPONENT_VARIATION(myTaxiData.piTaxiPassenger, INT_TO_ENUM(PED_COMPONENT,3), 1, 0, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(myTaxiData.piTaxiPassenger, INT_TO_ENUM(PED_COMPONENT,4), 0, 1, 0) //(lowr)
SET_PED_COMPONENT_VARIATION(myTaxiData.piTaxiPassenger, INT_TO_ENUM(PED_COMPONENT,8), 1, 1, 0) //(accs)
// SET_PED_COMPONENT_VARIATION(myTaxiData.piTaxiPassenger, PED_COMP_TORSO, 0, 0)
// SET_PED_COMPONENT_VARIATION(myTaxiData.piTaxiPassenger, PED_COMP_LEG, 0,2)
// SET_PED_COMPONENT_VARIATION(myTaxiData.piTaxiPassenger, PED_COMP_HEAD, 0,0)
ENDIF
//Give player obj to go pickup Passenger
ENABLE_TAXI_SPEECH(myTaxiData)
//Move on to the next stage
TAXI_JOB_SET_NEXT_STATE(myTaxiData,TRS_MANAGE_PICKUP)
ENDIF
BREAK
//Waits for passenger to head to cab
CASE TRS_MANAGE_PICKUP
IF TAXI_HANDLE_IV_PICKUP_NO_METER(myTaxiData)
//Move on to the next stage
TAXI_JOB_SET_NEXT_STATE(myTaxiData,TRS_WAIT_PARK)
ENDIF
BREAK
CASE TRS_WAIT_PARK
IF IS_PASSENGER_ENTERING_TAXI(myTaxiData)
myTaxiData.vTaxiOJDropoff = vNewDLDropoff //GET_TAXI_OJ_DL_VECTORS(TXOJ_POI_CASINO)
CDEBUG1LN(DEBUG_OJ_TAXI,"@@@@@@@@@@ TIME Picked up. Time hour = ", GET_TIMEOFDAY_HOUR(GET_CURRENT_TIMEOFDAY()), " Timer minutes = ", GET_TIMEOFDAY_MINUTE(GET_CURRENT_TIMEOFDAY()))
CDEBUG1LN(DEBUG_OJ_TAXI,"@@@@@@@@@@ TIME Picked up. Time = ", Get_String_From_TIMEOFDAY(GET_CURRENT_TIMEOFDAY()))
eDeadline = GET_TAXI_DEADLINE_TIMEOFDAY()
sDeadlineTime = GET_TAXI_HOURS_MINUTES_STRING(eDeadline)
CDEBUG1LN(DEBUG_OJ_TAXI,"@@@@@@@@@@ Deadline = ", Get_String_From_TIMEOFDAY(eDeadline))
CDEBUG1LN(DEBUG_OJ_TAXI,"@@@@@@@@@@ Deadline string = ", sDeadlineTime)
myTaxiData.sFastTime = sDeadlineTime
//iTimeLimitHour = GET_TIMEOFDAY_HOUR(eDeadline)
//iTimeLimitMin = GET_TIMEOFDAY_MINUTE(eDeadline)
fTimeLimit = 210//165.0
START_TIMER_NOW(DeadlineTimer)
//Greet the player
SET_NEXT_TAXI_SPEECH(myTaxiData,TAXI_DI_GREET,TRUE)
//SET_NEXT_TAXI_SPEECH(myTaxiData,TAXI_DI_OBJ,TRUE)
//CleanUp Pickup Lock & POI
CLEANUP_TAXI_PICKUP_STOP(myTaxiData)
//Set all tip checks on
TAXI_OJ_DL_SET_TIPS_AND_EXCITEMENT_TO_CHECK()
//Move on to the next stage
TAXI_JOB_SET_NEXT_STATE(myTaxiData,TRS_DRIVING_PASSENGER)
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
//Handles the driving, waits for you to reach the destination, than selects one of 3 exit scenearios
//1. Regular Pay & Thank
//2. Forgot something in the backseat
//3. Run out and try to stiff the player
/* DRIVING PASSENGER
ooooooooo oooooooooo ooooo ooooo oooo ooooo oooo oooo ooooooo8
888 88o 888 888 888 888 88 888 8888o 88 o888 88
888 888 888oooo88 888 888 88 888 88 888o88 888 oooo
888 888 888 88o 888 88888 888 88 8888 888o 88
o888ooo88 o888o 88o8 o888o 888 o888o o88o 88 888ooo888
*/
CASE TRS_DRIVING_PASSENGER
DRAW_DEADLINE_CLOCK()
IF GET_TIMER_IN_SECONDS_SAFE(DeadlineTimer) > fTimeLimit + DEADLINE_FAIL_LEEWAY
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
TAXI_SET_FAIL(myTaxiData, "Player did not hit the deadline", TFS_TAXI_STOPPED)
ELSE
KILL_ANY_CONVERSATION()
ENDIF
ENDIF
IF TAXI_HANDLE_DRIVING(myTaxiData,/*tTaxiOJ_DQ_Data, */GET_DYNAMIC_STOPPING_DISTANCE_FOR_TAXI(), 7, 30) //12,60)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
CLOSE_DIALOGUE_QUEUE(tTaxiOJ_DQ_Data,CONST_TAXI_OJ_LINE_NUM_TO_CLOSE_DIALOGUE_Q,TRUE)
CDEBUG1LN(DEBUG_OJ_TAXI,"dead line timer = ", GET_TAXI_TIMER_IN_SECONDS(myTaxiData, TT_RIDETODEST))
//Remove destination blip
REMOVE_BLIP(myTaxiData.blipTaxiDropOff)
//Ludicrous Speed Bonus
IF GET_TAXI_TIMER_IN_SECONDS(myTaxiData, TT_RIDETODEST) < fDeadlineGoals[TXDL_TIME_GOOD_3]//TAXI_CONST_BONUS_TIME_SPEED_DEMON
OR myTaxiData.iTaxiOJ_CashTip >= myTaxiData.iTaxiOJ_CashTipAmazing
TAXI_SET_BONUS_AWARD(myTaxiData,ENUM_TO_INT(TDL_BONUS_SPEEDDEMON))
ENDIF
CDEBUG1LN(DEBUG_OJ_TAXI,"##### TT_RIDETODEST = ", GET_TAXI_TIMER_IN_SECONDS(myTaxiData, TT_RIDETODEST))
CDEBUG1LN(DEBUG_OJ_TAXI,"##### TIME dropped off. Time hour = ", GET_TIMEOFDAY_HOUR(GET_CURRENT_TIMEOFDAY()), " Timer minutes = ", GET_TIMEOFDAY_MINUTE(GET_CURRENT_TIMEOFDAY()))
IF GET_TIMER_IN_SECONDS_SAFE(DeadlineTimer) > 210
myTaxiData.iTaxiOJ_CashTip = 0
ENDIF
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$CASH
SET_TAXI_FARE_OFF_MILEAGE(myTaxiData)
TAXI_OJ_RATE_OVERALL_TIP_LEVEL(myTaxiData)
CONVERT_TAXI_TIP_TO_CASH(myTaxiData)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_DontAllowToBeDraggedOutOfVehicle, TRUE)
ENDIF
TAXI_JOB_SET_NEXT_STATE(myTaxiData,TRS_REGULAR_PAYMENT)
ELSE
KILL_ANY_CONVERSATION()
ENDIF
ENDIF
BREAK
//Regular Payment
CASE TRS_REGULAR_PAYMENT
IF HAS_TAXI_OJ_PASSENGER_BEEN_DROPPED_OFF(myTaxiData, TRUE)//FALSE)
SET_LOCK_STATE_OF_TAXI_ODDJOB_DEADLINE_CASINO_DOORS(FALSE)
IF NOT IS_ENTITY_DEAD(myTaxiData.piTaxiPassenger)
IF ARE_VECTORS_EQUAL(NULL_VECTOR(),myTaxiData.vTaxiOJ_PassengerGoToPt)
SET_ENTITY_HEADING(myTaxiData.piTaxiPassenger, 84.9058)
SET_PED_KEEP_TASK(myTaxiData.piTaxiPassenger, TRUE)
ELSE
CLEAR_SEQUENCE_TASK(siTemp)
OPEN_SEQUENCE_TASK(siTemp)
TASK_LEAVE_ANY_VEHICLE(NULL)
TASK_CLEAR_LOOK_AT(NULL)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL,myTaxiData.vTaxiOJ_PassengerGoToPt,PEDMOVEBLENDRATIO_RUN)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << 322.1072, 442.4288, 140.6772 >>, PEDMOVEBLENDRATIO_RUN)//<< 935.9512, 36.1616, 79.8993 >>, PEDMOVEBLENDRATIO_RUN)
TASK_START_SCENARIO_IN_PLACE(NULL, "WORLD_HUMAN_STAND_MOBILE")
CLOSE_SEQUENCE_TASK(siTemp)
TASK_PERFORM_SEQUENCE(myTaxiData.piTaxiPassenger, siTemp)
SET_PED_KEEP_TASK(myTaxiData.piTaxiPassenger,TRUE)
ENDIF
ENDIF
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 GET_ENTITY_DISTANCE_FROM_LOCATION(myTaxiData.piTaxiPassenger, << 931.7672, 40.1704, 79.8993 >>) < 3.0 //<< 935.3044, 37.0121, 79.8993 >>) < 3.0
// OR GET_SEQUENCE_PROGRESS(myTaxiData.piTaxiPassenger) > 3
// OR GET_TAXI_TIMER_IN_SECONDS(myTaxiData, TT_GENERIC) > 5
#IF IS_DEBUG_BUILD
OR bDebugSucceed
#ENDIF
//In the off chance the player might get himself locked inside, just don't lock the doors.
// IF GET_PLAYER_DISTANCE_FROM_LOCATION(<< 931.7672, 40.1704, 79.8993 >>) > 5.0
// //SET_LOCK_STATE_OF_TAXI_ODDJOB_DEADLINE_CASINO_DOORS(TRUE)
// ENDIF
TAXI_MISSION_END(TRUE,myTaxiData)
//Move on to the next stage
TAXI_JOB_SET_NEXT_STATE(myTaxiData,TRS_CLEANUP)
// ENDIF
ENDIF
BREAK
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
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J))
IF myTaxiData.tTaxiOJ_RideState = TRS_DRIVING_PASSENGER
//If you J Skip, check the timer and add some tip
IF GET_TAXI_TIMER_IN_SECONDS(myTaxiData, TT_RIDETODEST) < fDeadlineGoals[TXDL_TIME_GOOD_3]// TAXI_CONST_BONUS_TIME_SPEED_DEMON
SET_TAXI_TIP_TO_AMAZING(myTaxiData)
ENDIF
ENDIF
ENDIF
PROCESS_TAXI_DEBUG_SKIP(myTaxiData,tDebugState)
// Debug Key: Check for Pass (not for Minigmes)
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S))
bDebugSucceed = TRUE
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 myTaxiData.tTaxiOJ_RideState > TRS_FINDING_LOCATION
PROCESS_WIDGETS()
ENDIF
#ENDIF
//END DEBUG----------------------------------------------------
IF DOES_ENTITY_EXIST(myTaxiData.piTaxiPlayer)
Main_Taxi_OJ_Deadline()
ELSE
REASSIGN_TAXI_OJ_DRIVER(myTaxiData)
ENDIF
WAIT(0)
ENDWHILE
//Test stuff
// Script should never reach here. Always terminate with cleanup function.
ENDSCRIPT