3683 lines
125 KiB
Python
Executable File
3683 lines
125 KiB
Python
Executable File
|
|
//Compile out Title Update changes to header functions.
|
|
//Must be before includes.
|
|
//CONST_INT USE_TU_CHANGES 0 // Removed by Kenneth R.
|
|
|
|
USING "rage_builtins.sch"
|
|
USING "globals.sch"
|
|
USING "commands_entity.sch"
|
|
USING "commands_script.sch"
|
|
USING "script_player.sch"
|
|
USING "randomChar_public.sch"
|
|
USING "dialogue_public.sch"
|
|
USING "commands_cutscene.sch"
|
|
USING "cutscene_public.sch"
|
|
USING "locates_public.sch"
|
|
USING "CompletionPercentage_public.sch"
|
|
USING "initial_scenes_TheLastOne.sch"
|
|
USING "rgeneral_include.sch"
|
|
USING "RC_Area_public.sch"
|
|
USING "RC_Helper_Functions.sch"
|
|
USING "RC_Threat_public.sch"
|
|
USING "RC_Pedsight_public.sch"
|
|
USING "script_blips.sch"
|
|
USING "commands_recording.sch"
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
USING "select_mission_stage.sch"
|
|
#ENDIF
|
|
|
|
|
|
// *****************************************************************************************
|
|
// *****************************************************************************************
|
|
// *****************************************************************************************
|
|
//
|
|
// MISSION NAME : TheLastOne.sc
|
|
// AUTHOR : Joe Binks
|
|
// DESCRIPTION : Chase the last one through the woods
|
|
//
|
|
// *****************************************************************************************
|
|
// *****************************************************************************************
|
|
// *****************************************************************************************
|
|
|
|
//*******************************************************************************************************************
|
|
// DATATYPES
|
|
//*******************************************************************************************************************
|
|
|
|
ENUM STATE_MODE
|
|
SETUP_STATE,
|
|
UPDATE_STATE,
|
|
DONE_STATE
|
|
ENDENUM
|
|
|
|
//-- Trail
|
|
|
|
CONST_INT TRAIL_SIZE_MAX 25
|
|
|
|
ENUM TRAIL_NODE_TYPE
|
|
NODETYPE_HOWL,
|
|
NODETYPE_SIGHTING
|
|
ENDENUM
|
|
|
|
STRUCT TRAIL_NODE_DATA
|
|
TRAIL_NODE_TYPE type
|
|
VECTOR vPedSpawn
|
|
FLOAT fPedSpawnRot
|
|
VECTOR vPedDest
|
|
FLOAT fTriggerDist
|
|
FLOAT fTriggerDistCar
|
|
INT iLeadInTime
|
|
INT iExclusionAngle
|
|
|
|
OBJECT_INDEX hBushA
|
|
OBJECT_INDEX hBushB
|
|
ENDSTRUCT
|
|
|
|
STRUCT TRAIL_DATA
|
|
STATE_MODE mode
|
|
|
|
TRAIL_NODE_DATA nodes[TRAIL_SIZE_MAX]
|
|
INT curNode
|
|
INT size
|
|
ENDSTRUCT
|
|
|
|
|
|
//-- The Last One
|
|
|
|
ENUM THELASTONE_STATE
|
|
BF_NULL = 0,
|
|
|
|
BF_LEADIN,
|
|
BF_HOWL,
|
|
BF_ESCAPE,
|
|
BF_LEADOUT,
|
|
BF_BRAWL,
|
|
BF_BLOCKED_FIGHT
|
|
ENDENUM
|
|
|
|
STRUCT THELASTONE_DATA
|
|
THELASTONE_STATE state
|
|
STATE_MODE mode
|
|
|
|
PED_INDEX hPed
|
|
BLIP_INDEX hBlip
|
|
INT timer
|
|
|
|
INT hHowlSnd
|
|
INT hGrumbleSnd
|
|
INT hCoughSnd
|
|
INT iNode
|
|
|
|
INT iBrawlingState
|
|
BOOL bIsLastOneShotAt
|
|
|
|
BOOL bHowlTimeoutStatus
|
|
INT howlTimeout
|
|
|
|
ENDSTRUCT
|
|
|
|
|
|
//-- Start-scene
|
|
|
|
STRUCT START_SCENE
|
|
PED_INDEX hHunter
|
|
OBJECT_INDEX hCrate
|
|
PICKUP_INDEX hGun
|
|
PICKUP_INDEX hShotGun
|
|
|
|
BOOL bHasBeenCreated
|
|
ENDSTRUCT
|
|
|
|
|
|
//-- Dressing
|
|
|
|
STRUCT DRESSING
|
|
OBJECT_INDEX hScat
|
|
BOOL bHasBeenCreated
|
|
ENDSTRUCT
|
|
|
|
|
|
//-- Lion
|
|
|
|
ENUM LION_STATE
|
|
LION_STATE_NULL = 0,
|
|
LION_STATE_READY,
|
|
LION_STATE_POUNCE,
|
|
LION_STATE_FLEE
|
|
ENDENUM
|
|
|
|
STRUCT LION_DATA
|
|
PED_INDEX hPed
|
|
LION_STATE state
|
|
STATE_MODE mode
|
|
AI_BLIP_STRUCT hBlip
|
|
|
|
VECTOR vSpawnPos
|
|
FLOAT fSpawnRot
|
|
FLOAT fTriggerRadius
|
|
ENDSTRUCT
|
|
|
|
|
|
//*******************************************************************************************************************
|
|
// STAGE DATATYPES
|
|
//*******************************************************************************************************************
|
|
|
|
ENUM MISSION_STAGE
|
|
MS_NULL = -1,
|
|
MS_INIT,
|
|
MS_INTRO,
|
|
MS_GOTOVALLEY,
|
|
MS_CHASE,
|
|
MS_OUTRO,
|
|
|
|
MS_PASSED,
|
|
MS_FAILED
|
|
ENDENUM
|
|
|
|
|
|
CONST_INT CP_INTRO 0
|
|
CONST_INT CP_GOTOVALLEY 1
|
|
CONST_INT CP_CHASE 2
|
|
CONST_INT CP_END_OF_CHASE 3
|
|
CONST_INT CP_OUTRO 4
|
|
CONST_INT CP_GOTOVALLEY2 5
|
|
CONST_INT MAX_CP 6
|
|
|
|
|
|
ENUM STAGE_SECTION
|
|
SECTION_SETUP = 0,
|
|
SECTION_RUNNING,
|
|
SECTION_FADEOUT,
|
|
SECTION_CLEANUP,
|
|
SECTION_SKIP
|
|
ENDENUM
|
|
|
|
ENUM FAIL_REASON
|
|
FAIL_REASON_DEFAULT,
|
|
FAIL_REASON_PLAYER_DEAD,
|
|
FAIL_REASON_HUNTER_DEAD,
|
|
FAIL_REASON_HUNTER_THREATENED,
|
|
FAIL_REASON_LOST_THELASTONE
|
|
ENDENUM
|
|
|
|
STRUCT MISSION_DATA
|
|
MISSION_STAGE stage
|
|
STAGE_SECTION section
|
|
INT iEvent
|
|
|
|
// A stage can store what stage should be next, then run through it's exit section. At the end of the exit section it will switch to this stage.
|
|
BOOL bSyncForSkip
|
|
BOOL bRequestJSkip
|
|
BOOL bRequestPSkip
|
|
BOOL bRequestCpSkip
|
|
INT queueCpSkip
|
|
|
|
MISSION_STAGE queueNextStage
|
|
|
|
// When the mission goes to fail-state, it should set this so the right message can be displayed
|
|
FAIL_REASON failReason
|
|
|
|
ENDSTRUCT
|
|
|
|
|
|
MISSION_DATA g_mission
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
MissionStageMenuTextStruct zSkipMenu[MAX_CP]
|
|
#ENDIF
|
|
|
|
g_structRCScriptArgs sRCLauncherDataLocal
|
|
|
|
|
|
//*******************************************************************************************************************
|
|
// DATA
|
|
//*******************************************************************************************************************
|
|
|
|
START_SCENE gStartScene
|
|
DRESSING gDressing
|
|
TRAIL_DATA gTrail
|
|
THELASTONE_DATA gTheLastOne
|
|
VECTOR vDeadInRoadPos = << -1568.8677, 4542.4253, 16.1893 >>
|
|
|
|
VECTOR vIntroAreaPos1 = <<-1295.969116,4641.688965,104.378647>>
|
|
VECTOR vIntroAreaPos2 = <<-1303.088623,4639.469727,107.984077>>
|
|
FLOAT fIntroAreaWidth = 6.0
|
|
VECTOR vRoadAreaPos1 = <<-1568.374268,4546.200195,15.217278>>
|
|
VECTOR vRoadAreaPos2 = <<-1568.955566,4539.636719,18.195089>>
|
|
FLOAT fRoadAreaWidth = 7.0
|
|
VECTOR vCliffAreaPos1 = <<-1537.227783,4535.780273,45.627308>>
|
|
VECTOR vCliffAreaPos2 = <<-1538.339355,4540.548828,48.822357>>
|
|
FLOAT fCliffAreaWidth = 8.0
|
|
|
|
CONST_INT LION_MAX 4//8
|
|
LION_DATA gLionArray[LION_MAX]
|
|
INT iLionCount
|
|
|
|
BLIP_INDEX g_hBlip
|
|
#IF IS_DEBUG_BUILD
|
|
BOOL g_bDebugWaypoints
|
|
#ENDIF
|
|
|
|
CONST_INT HOWL_TIMEOUT 60000
|
|
CONST_INT PLAYER_LEAVING_RESET_TIME 30000
|
|
CONST_INT HELP_TEXT_DELAY 1000
|
|
|
|
CONST_INT HUNTER_ID 0
|
|
|
|
OBJECT_INDEX oiRifle
|
|
|
|
/*CONST_INT NUM_VEHICLE_CHASE_LINES 3
|
|
STRING sVehicleChaseLines[NUM_VEHICLE_CHASE_LINES]
|
|
INT iCurrentVehicleChaseLines = 0
|
|
CONST_INT VEHICLE_CHASE_LINE_TIME 20000
|
|
INT iVehicleChaseLineTimer = 0*/
|
|
|
|
TEST_POLY g_polyPlayArea
|
|
TEST_POLY g_polyCliffArea
|
|
|
|
|
|
BOOL g_bObjDoneGotoValley = FALSE
|
|
BOOL g_bObjDoneLeavingValley = FALSE
|
|
//BOOL g_bHintGiven = FALSE
|
|
BOOL g_bObjDoneInvestigate = FALSE
|
|
//BOOL g_bPrintCarObj = TRUE
|
|
BOOL g_bObjDoneChase = FALSE
|
|
|
|
BOOL bBlockedByCar = FALSE
|
|
INT g_iPlayerLeavingTimer = 0
|
|
|
|
BOOL g_bDestroyCarConvReady = TRUE
|
|
|
|
BOOL g_bAudDoneStartGoValley = FALSE
|
|
BOOL g_bAudDoneStartGetGun = FALSE
|
|
BOOL g_bAudDoneHowl = FALSE
|
|
BOOL g_bAudDoneHeardHowl = FALSE
|
|
BOOL g_bAudDoneChase = FALSE
|
|
//BOOL g_bAudDoneWounded = FALSE
|
|
BOOL g_bAudDoneCornered = FALSE
|
|
|
|
BOOL g_bCutsceneInRoad = FALSE
|
|
|
|
BOOL g_bStartAnimSequence = TRUE
|
|
|
|
BOOL bLoadChaseModels = TRUE
|
|
|
|
BOOL g_bHelpDoneListen = FALSE
|
|
INT g_iHelpDelayListen = 0
|
|
|
|
INT iExplosionCounter = 0
|
|
INT iExplosionTimer = 0
|
|
|
|
INT iBlockLookBehind = -1
|
|
|
|
// Used for the sight test on the last one
|
|
INT iSightTestID = -1
|
|
|
|
INT iPassDelay
|
|
CONST_INT PASS_DELAY_TIME 5000
|
|
|
|
INT iHowlTimer = -1
|
|
CONST_INT HOWL_TIME 2000
|
|
|
|
INT iRunTimer = -1
|
|
INT iHideTimer = -1
|
|
CONST_INT CHASE_CONV_TIME 7000
|
|
|
|
INT iBumpTimer = 0
|
|
CONST_INT BUMP_TIME 10000
|
|
INT iTargetTimer = 0
|
|
CONST_INT TARGET_TIME 7000
|
|
INT iShootTimer = 0
|
|
CONST_INT SHOOT_TIME 7000
|
|
INT iReturnTimer = 0
|
|
CONST_INT RETURN_TIME 40000
|
|
|
|
INT iTriggerPostFxTime
|
|
BOOL bTriggerPostFx
|
|
|
|
structPedsForConversation pedsForConversation
|
|
|
|
INT iOutroStartTimer
|
|
//INT iConvFailedTimer = -1
|
|
|
|
CONST_INT NUM_BARKS 4
|
|
STRING sBarks[NUM_BARKS]
|
|
INT iCurrentBark = 0
|
|
INT iBarkTimer = 0
|
|
CONST_INT TIME_BETWEEN_BARKS 5000
|
|
|
|
//*******************************************************************************************************************
|
|
// MODELS + POSITIONS
|
|
//*******************************************************************************************************************
|
|
|
|
WEAPON_TYPE weapon_HunterGun = WEAPONTYPE_SNIPERRIFLE
|
|
WEAPON_TYPE weapon_HunterShotGun = WEAPONTYPE_PUMPSHOTGUN
|
|
|
|
MODEL_NAMES model_TheLastOne = IG_ORLEANS
|
|
MODEL_NAMES model_MainHunter = IG_HUNTER
|
|
MODEL_NAMES model_HunterCar = DUNE
|
|
MODEL_NAMES model_HunterGun = GET_WEAPONTYPE_MODEL(weapon_HunterGun)
|
|
MODEL_NAMES model_HunterShotGun = GET_WEAPONTYPE_MODEL(weapon_HunterShotGun)
|
|
MODEL_NAMES model_HunterCrate = PROP_CRATE_07A
|
|
|
|
MODEL_NAMES model_DressingScat = PROP_BIG_SHIT_02
|
|
MODEL_NAMES model_DressingTruck = REBEL
|
|
|
|
MODEL_NAMES model_Lion = A_C_MTLION
|
|
|
|
STRING animdict_Plead = "rcmlastone1"//"rcmsasquatch1"
|
|
STRING animdict_Leadout = "rcmlastone2leadinout"//"rcmsasquatch2leadinoutsas_2_rcm"
|
|
STRING EMPTY_STRING = "EMPTY"
|
|
ANIMATION_FLAGS eHunterAnimFlags = AF_NOT_INTERRUPTABLE | AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION
|
|
|
|
/*
|
|
VECTOR vPos_OutroRespot = << -1537.1522, 4545.0649, 45.8478 >>
|
|
FLOAT fRot_OutroRespot = 39.3353
|
|
*/
|
|
|
|
VECTOR vPos_RespotLastCar = << -1582.8912, 4758.9502, 49.7778 >>
|
|
FLOAT fRot_RespotLastCar = 357.0128
|
|
|
|
VEHICLE_INDEX viMissionFinishedVehicle
|
|
VECTOR vPos_DressingTruck = << -1557.5588, 4592.0908, 18.7528 >>
|
|
FLOAT fRot_DressingTruck = 352.9490
|
|
|
|
VECTOR vPos_ScatSite
|
|
VECTOR vRot_ScatSite
|
|
|
|
VECTOR vPos_Valley = <<-1581.155518,4698.455566,46.330231>>
|
|
|
|
VECTOR vPos_BrawlOffArena
|
|
VECTOR vPos_BrawlOnArena
|
|
//FLOAT fRad_BrawlOn
|
|
|
|
VECTOR vPos_StartPlayerSpawn
|
|
FLOAT fRot_StartPlayerSpawn
|
|
|
|
VECTOR vPos_StartHunterSpawn
|
|
FLOAT fRot_StartHunterSpawn
|
|
VECTOR vPos_CheckHunterPushed = <<-1297.85, 4639.92, 106.64>>
|
|
|
|
//VECTOR vPos_StartCrateSpawn = <<-1296.59, 4639.90, 105.57>>
|
|
//VECTOR vRot_StartCrateSpawn = <<-3.00, -7.00, -125.34>>
|
|
|
|
VECTOR vPos_StartGunSpawn = <<-1297.21, 4637.65, 105.66>>
|
|
VECTOR vRot_StartGunSpawn = <<-100.08, -59.60, -103.04>>
|
|
|
|
VECTOR vPos_StartShotGunSpawn = <<-1296.76, 4637.52, 105.67>>
|
|
VECTOR vRot_StartShotGunSpawn = <<-90.00, -55.19, -141.85>>
|
|
|
|
VECTOR vPos_ChasePlayerStart
|
|
FLOAT fRot_ChasePlayerStart
|
|
|
|
VECTOR vClearZone0 = << -1651.2321, 4672.7104, 30.9844 >> // radius 50
|
|
VECTOR vClearZone1 = << -1625.1282, 4586.0063, 42.1184 >> // radius 50
|
|
VECTOR vClearZone2 = << -1486.2358, 4551.2949, 42.7094 >> // radius 50
|
|
VECTOR vClearZone3 = << -1565.4634, 4601.7319, 19.5286 >> // radius 20
|
|
|
|
VECTOR vIntroAreaMin = <<-1315.815430,4627.916504,94.387100>>
|
|
VECTOR vIntroAreaMax = <<-1273.391968,4659.724121,113.797508>>
|
|
|
|
// variables to check for mission passed stats
|
|
BOOL bToScatOnFoot = TRUE
|
|
|
|
INT iChangeFaceTimer = -1
|
|
BOOL bChangeFace = TRUE
|
|
|
|
//*******************************************************************************************************************
|
|
// SETUP
|
|
//*******************************************************************************************************************
|
|
|
|
/// PURPOSE:
|
|
/// Adds a node for Sasquatch to use
|
|
/// PARAMS:
|
|
/// type - The type of node being added
|
|
/// vPedSpawn - The position Sasquatch will be spawned at
|
|
/// fPedSpawnRot - The rotation Sasquatch will be spawned at
|
|
/// vPedDest - Sasquatch's destination to run to
|
|
/// fTriggerDist - The distance from this node the player will trigger it on foot
|
|
/// fTriggerDistCar - The distance from this node the player will trigger it in a vehicle
|
|
/// iLeadInTime -
|
|
/// iExclusionAngle - If the player is in this angle along Sasquatch's route, it will skip this node
|
|
PROC ADD_NODE(TRAIL_NODE_TYPE type, VECTOR vPedSpawn, FLOAT fPedSpawnRot, VECTOR vPedDest, FLOAT fTriggerDist, FLOAT fTriggerDistCar, INT iLeadInTime, INT iExclusionAngle=60)
|
|
IF gTrail.size >= TRAIL_SIZE_MAX
|
|
SCRIPT_ASSERT("Trying to add too many trail nodes")
|
|
ENDIF
|
|
|
|
INT idx = gTrail.size
|
|
gTrail.nodes[idx].type = type
|
|
gTrail.nodes[idx].hBushA = NULL
|
|
gTrail.nodes[idx].hBushB = NULL
|
|
gTrail.nodes[idx].vPedSpawn = vPedSpawn
|
|
gTrail.nodes[idx].fPedSpawnRot = fPedSpawnRot
|
|
gTrail.nodes[idx].vPedDest = vPedDest
|
|
gTrail.nodes[idx].fTriggerDist = fTriggerDist
|
|
gTrail.nodes[idx].fTriggerDistCar = fTriggerDistCar
|
|
gTrail.nodes[idx].iLeadInTime = iLeadInTime
|
|
gTrail.nodes[idx].iExclusionAngle = iExclusionAngle
|
|
gTrail.size++
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Adds a node where Sasquatch runs from one point to another
|
|
/// PARAMS:
|
|
/// vPedSpawn - The position Sasquatch will be spawned at
|
|
/// vPedDest - The position Sasquatch will run to
|
|
/// fTriggerDist - The distance from this node the player will trigger it on foot
|
|
/// fTriggerDistCar - The distance from this node the player will trigger it in a vehicle
|
|
/// iLeadInTime -
|
|
/// iExclusionAngle - If the player is in this angle along Sasquatch's route, it will skip this node
|
|
PROC ADD_SIGHTING(VECTOR vPedSpawn, VECTOR vPedDest, FLOAT fTriggerDist = 30.0, FLOAT fTriggerDistCar = 70.0, INT iLeadInTime = 4000, INT iExclusionAngle = 60)
|
|
ADD_NODE(NODETYPE_SIGHTING, vPedSpawn, 0, vPedDest, fTriggerDist, fTriggerDistCar, iLeadInTime, iExclusionAngle)
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Sets the location the player must reach for the chase to start
|
|
/// PARAMS:
|
|
/// vPos - The position the player must reach for the chase to start
|
|
/// fRot - The heading to set the player to when skipping to the chase section
|
|
PROC SET_CHASE_START(VECTOR vPos, FLOAT fRot)
|
|
vPos_ChasePlayerStart = vPos
|
|
fRot_ChasePlayerStart = fRot
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Sets the position the player is set to at the start of the mission
|
|
/// PARAMS:
|
|
/// vPos - The position the player will be set to after the intro
|
|
/// fRot - The heading the player will be set to after the intro
|
|
PROC SET_START_POS_PLAYER(VECTOR vPos, FLOAT fRot)
|
|
vPos_StartPlayerSpawn = vPos
|
|
fRot_StartPlayerSpawn = fRot
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Sets the position the hunter is set to at the start of the mission
|
|
/// PARAMS:
|
|
/// vPos - The position the hunter will be set to after the intro
|
|
/// fRot - The heading the hunter will be set to after the intro
|
|
PROC SET_START_POS_HUNTER(VECTOR vPos, FLOAT fRot)
|
|
vPos_StartHunterSpawn = vPos
|
|
fRot_StartHunterSpawn = fRot
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Sets the position of the scat site
|
|
/// PARAMS:
|
|
/// vPos - The position the scat will be spawned at
|
|
/// vRot - The rotation the scat will be spawned at
|
|
PROC SET_SCATSITE_POS(VECTOR vPos, VECTOR vRot)
|
|
vPos_ScatSite = vPos
|
|
vRot_ScatSite = vRot
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Sets the position for the area where the last one will attack
|
|
/// PARAMS:
|
|
/// vOff - The centre of the area where the last one will stop attacking
|
|
/// vOn - The centre of the area where the last one will start attacking
|
|
/// fRadOn - The radius of the area where the last one will start attacking
|
|
PROC SET_BRAWLING_ARENA(VECTOR vOff, VECTOR vOn, FLOAT fRadOn)
|
|
vPos_BrawlOffArena = vOff
|
|
vPos_BrawlOnArena = vOn
|
|
|
|
//fRad_BrawlOn = fRadOn
|
|
fRadOn = fRadOn
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Initialises the values for adding a lion
|
|
/// PARAMS:
|
|
/// vPos - The position the lion will be created at
|
|
/// fRot - The heading the lion will be created at
|
|
/// fTriggerRadius - When the player is within this radius, the lion will be activated
|
|
PROC ADD_LION(VECTOR vPos, FLOAT fRot, FLOAT fTriggerRadius)
|
|
IF iLionCount >= LION_MAX
|
|
SCRIPT_ASSERT("Trying to add too many lions")
|
|
ENDIF
|
|
|
|
INT idx = iLionCount
|
|
gLionArray[idx].state = LION_STATE_NULL
|
|
gLionArray[idx].vSpawnPos = vPos
|
|
gLionArray[idx].fSpawnRot = fRot
|
|
gLionArray[idx].fTriggerRadius = fTriggerRadius
|
|
iLionCount++
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Initialises all the values used in the mission
|
|
PROC INIT_DATA()
|
|
|
|
REGISTER_SCRIPT_WITH_AUDIO()
|
|
SET_WANTED_LEVEL_MULTIPLIER(0.1)
|
|
|
|
gTrail.size = 0
|
|
vPos_ChasePlayerStart.z = 0
|
|
vPos_StartPlayerSpawn.z = 0
|
|
vPos_StartHunterSpawn.z = 0
|
|
|
|
// Setup route
|
|
// -----------
|
|
//SET_START_POS_PLAYER(<< -1302.2573, 4640.7910, 105.6339 >>, 304.7601)
|
|
//SET_START_POS_PLAYER(<<-1306.4396, 4642.0522, 106.0141>>, 249.1855)
|
|
SET_START_POS_PLAYER(<<-1301.9270, 4640.9043, 105.6265>>, 105.2908)
|
|
SET_START_POS_HUNTER(<< -1298.7554, 4639.8711, 105.6797 >>, 31.4224)
|
|
|
|
// Sneak over hill version
|
|
SET_SCATSITE_POS(<< -1562.72, 4699.07, 49.81 >>, <<9.00, 3.00, -0.00>>)
|
|
|
|
SET_CHASE_START(<< -1562.8904, 4699.2236, 49.9836 >>, 81.8633)
|
|
|
|
ADD_SIGHTING(<< -1608.5690, 4704.6196, 40.9750 >>, <<-1638.412109,4669.232910,33.017025>>, 46.5, -1, 0) // First glimpse, and up hill
|
|
//ADD_SIGHTING(<<-1641.1367, 4665.7402, 31.6091>>, <<-1638.610840,4651.239258,31.377729>>, 70, 80, 2000)
|
|
ADD_SIGHTING(<<-1641.1367, 4665.7402, 31.6091>>, <<-1636.581177,4651.864258,32.587139>>, 70, 80, 2000)
|
|
ADD_LION(<< -1628.3339, 4624.6309, 40.8662 >>, 19.5915, 30.0)
|
|
|
|
//ADD_SIGHTING(<< -1640.1631, 4616.7466, 42.6314 >>, << -1630.2805, 4597.0176, 40.9653 >>, 30, -1, 2000) // Over top of hill and on plateau
|
|
ADD_SIGHTING(<< -1640.1631, 4616.7466, 42.6314 >>, <<-1629.573486,4595.201172,40.989510>>, 30, -1, 2000) // Over top of hill and on plateau
|
|
ADD_SIGHTING(<< -1617.9073, 4577.0332, 42.3259 >>, << -1594.5806, 4587.9233, 35.4044 >>, 40, 50, 6000)
|
|
|
|
ADD_SIGHTING(<< -1579.0415, 4612.7061, 29.0916 >>, << -1547.6313, 4600.6743, 21.0284 >>, 30, -1) // Across road
|
|
//ADD_LION(<< -1534.6357, 4604.0591, 23.9694 >>, 91.2343, 45.0)
|
|
|
|
ADD_SIGHTING(<< -1530.2128, 4619.2285, 29.8095 >>, << -1508.7700, 4618.6279, 38.1616 >>, 25.0, 45) // Up into woods
|
|
//ADD_SIGHTING(<< -1498.6869, 4620.0610, 42.6271 >>, << -1491.3115, 4608.3159, 43.9719 >>, 25.0, 45, 2500)
|
|
ADD_SIGHTING(<<-1499.076416,4618.754395,42.879841>>, << -1491.3115, 4608.3159, 43.9719 >>, 25.0, 45, 2500)
|
|
//ADD_SIGHTING(<< -1476.7128, 4613.2949, 47.3980 >>, << -1471.7212, 4598.9722, 46.1177 >>, 22.5, -1, 2500)
|
|
ADD_SIGHTING(<< -1476.7128, 4613.2949, 47.3980 >>, <<-1469.926636,4596.369141,45.796448>>, 22.5, -1, 2500)
|
|
|
|
ADD_LION(<< -1458.9276, 4590.8887, 46.9975 >>, 25.5399, 25.0)
|
|
//ADD_LION(<<-1644.410645,4605.859375,44.830025>>, 15.5399, 25.0)
|
|
ADD_LION(<<-1495.754272,4569.355469,37.398315>>, -70.47, 25.0)
|
|
//ADD_LION(<< -1490.7159, 4598.1172, 41.5723 >>, 309.13, 25.0)
|
|
ADD_LION(<< -1487.8613, 4550.3735, 42.6880 >>, 149.2, 25.0)
|
|
//ADD_LION(<< -1638.7268, 4634.1973, 36.8269 >>, 141.94, 25.0)
|
|
|
|
//ADD_SIGHTING(<< -1453.7600, 4579.5317, 44.3204 >>, << -1461.2373, 4561.9448, 41.7624 >>, 27.5, 80, 3000) // Woods to cornered
|
|
ADD_SIGHTING(<< -1453.7600, 4579.5317, 44.3204 >>, <<-1461.224609,4559.684082,43.082272>>, 27.5, 80, 3000) // Woods to cornered
|
|
//ADD_SIGHTING(<< -1467.3835, 4553.3125, 45.3815 >>, << -1489.1077, 4545.5947, 44.2197 >>, 27.5, 2250)
|
|
//ADD_SIGHTING(<<-1469.6111, 4552.7456, 45.5610>>, << -1489.1077, 4545.5947, 44.2197 >>, 27.5, 2250)
|
|
ADD_SIGHTING(<<-1469.6111, 4552.7456, 45.5610>>, <<-1490.853638,4546.869629,43.323307>>, 27.5, 2250)
|
|
ADD_SIGHTING(<< -1505.9806, 4534.8262, 44.4468 >>, << -1539.3424, 4539.5303, 46.8468 >>, 45, 80, 0)
|
|
|
|
SET_BRAWLING_ARENA(<<-1537.53,4539.51,47.87>>, <<-1537.53,4539.51,47.87>>, 10.0)
|
|
|
|
// Setup play area polys
|
|
OPEN_TEST_POLY(g_polyPlayArea)
|
|
ADD_TEST_POLY_VERT(g_polyPlayArea, << -1241.7709, 4394.9653, 3.8679 >>)
|
|
ADD_TEST_POLY_VERT(g_polyPlayArea, << -1240.5320, 4611.6948, 130.3852 >>)
|
|
ADD_TEST_POLY_VERT(g_polyPlayArea, << -1221.6125, 4702.2856, 125.4371 >>)
|
|
ADD_TEST_POLY_VERT(g_polyPlayArea, << -1461.1195, 4795.8184, 84.8864 >>)
|
|
ADD_TEST_POLY_VERT(g_polyPlayArea, << -1545.0295, 4769.5073, 61.4836 >>)
|
|
ADD_TEST_POLY_VERT(g_polyPlayArea, << -1649.4033, 4828.1045, 59.7308 >>)
|
|
ADD_TEST_POLY_VERT(g_polyPlayArea, << -1828.7227, 4677.1211, 56.0479 >>)
|
|
ADD_TEST_POLY_VERT(g_polyPlayArea, << -1721.5918, 4503.2275, 0.0447 >>)
|
|
ADD_TEST_POLY_VERT(g_polyPlayArea, << -1640.8074, 4488.2358, 0.3443 >>)
|
|
ADD_TEST_POLY_VERT(g_polyPlayArea, << -1561.4725, 4377.0366, 2.2095 >>)
|
|
ADD_TEST_POLY_VERT(g_polyPlayArea, << -1359.1692, 4339.5313, 3.8651 >>)
|
|
CLOSE_TEST_POLY(g_polyPlayArea)
|
|
|
|
// setup the area for the cliff Sasquatch ends on
|
|
OPEN_TEST_POLY(g_polyCliffArea)
|
|
ADD_TEST_POLY_VERT(g_polyCliffArea, <<-1541.932373,4538.026367,46.205505>>)
|
|
ADD_TEST_POLY_VERT(g_polyCliffArea, <<-1530.172729,4515.199707,41.436943>>)
|
|
ADD_TEST_POLY_VERT(g_polyCliffArea, <<-1507.496704,4498.375977,45.285702>>)
|
|
ADD_TEST_POLY_VERT(g_polyCliffArea, <<-1489.460327,4511.402344,47.723251>>)
|
|
ADD_TEST_POLY_VERT(g_polyCliffArea, <<-1507.926880,4587.871582,34.033413>>)
|
|
ADD_TEST_POLY_VERT(g_polyCliffArea, <<-1535.494141,4571.508300,38.508503>>)
|
|
ADD_TEST_POLY_VERT(g_polyCliffArea, <<-1543.280640,4554.625488,35.515556>>)
|
|
ADD_TEST_POLY_VERT(g_polyCliffArea, <<-1539.656738,4545.944824,45.684471>>)
|
|
CLOSE_TEST_POLY(g_polyCliffArea)
|
|
|
|
sBarks[0] = "SAS1_LEADOUT_3"
|
|
sBarks[1] = "SAS1_LEADOUT_4"
|
|
sBarks[2] = "SAS1_LEADOUT_5"
|
|
sBarks[3] = "SAS1_LEADOUT_6"
|
|
|
|
ENDPROC
|
|
|
|
//*******************************************************************************************************************
|
|
// UTILS
|
|
//*******************************************************************************************************************
|
|
/// PURPOSE:
|
|
/// Loads mission text
|
|
/// RETURNS:
|
|
/// TRUE if the mission text has loaded, FALSE otherwise
|
|
FUNC BOOL LOAD_TEXT()
|
|
// Request
|
|
REQUEST_ADDITIONAL_TEXT("SAS1", MISSION_TEXT_SLOT)
|
|
REQUEST_ADDITIONAL_TEXT("SAS1AUD", MISSION_DIALOGUE_TEXT_SLOT)
|
|
|
|
// Check
|
|
IF HAS_ADDITIONAL_TEXT_LOADED(MISSION_TEXT_SLOT)
|
|
AND HAS_ADDITIONAL_TEXT_LOADED(MISSION_DIALOGUE_TEXT_SLOT)
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Enables or disables a ped
|
|
/// PARAMS:
|
|
/// hPed - The ped to be enabled/disabled
|
|
/// bVisible - TRUE to enable the ped, FALSE to disable
|
|
PROC SET_PED_ENABLED(PED_INDEX hPed, BOOL bVisible)
|
|
FREEZE_ENTITY_POSITION(hPed, NOT bVisible)
|
|
SET_ENTITY_COLLISION(hPed, bVisible)
|
|
SET_ENTITY_VISIBLE(hPed, bVisible)
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Checks if a ped has been enabled or not
|
|
/// PARAMS:
|
|
/// hPed - The ped to check
|
|
/// RETURNS:
|
|
/// TRUE if the ped is enabled, FALSE otherwise
|
|
FUNC BOOL IS_PED_ENABLED(PED_INDEX hPed)
|
|
RETURN IS_ENTITY_VISIBLE(hPed)
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Checks if a ped has been harmed
|
|
/// PARAMS:
|
|
/// hPed - The ped to check
|
|
/// RETURNS:
|
|
/// TRUE if the ped is injured, doesn't exist or has been harmed, FALSE otherwise
|
|
FUNC BOOL IS_PED_HARMED(PED_INDEX hPed)
|
|
IF DOES_ENTITY_EXIST(hPed)
|
|
IF /*(HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(hPed, PLAYER_PED_ID(), TRUE) AND HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(hPed, WEAPONTYPE_INVALID, GENERALWEAPON_TYPE_ANYWEAPON))
|
|
OR*/ IS_PED_INJURED(hPed)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Checks if the player destroys the hunter's car and plays a conversation if they have
|
|
PROC CheckHunterCar()
|
|
IF g_bDestroyCarConvReady
|
|
IF NOT IS_VEHICLE_OK(sRCLauncherDataLocal.vehID[HUNTER_ID]) AND GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), gStartScene.hHunter) < 25.0
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
IF CREATE_CONVERSATION(pedsForConversation, "SAS1AUD", "SAS1_BUGGY", CONV_PRIORITY_HIGH)
|
|
g_bDestroyCarConvReady = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
//*******************************************************************************************************************
|
|
// MISSION STAGE FUNCTIONS
|
|
//*******************************************************************************************************************
|
|
|
|
/// PURPOSE:
|
|
/// Loads the last one model and anim dictionary
|
|
PROC LOAD_THELASTONE_MODELS()
|
|
REQUEST_MODEL(model_TheLastOne)
|
|
REQUEST_ANIM_DICT(animdict_Plead)
|
|
REQUEST_ANIM_DICT(animdict_Leadout)
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Checks if the last one model and anim dictionary have loaded
|
|
/// RETURNS:
|
|
/// TRUE if the last one model and anim dictionary have loaded, FALSE otherwise
|
|
FUNC BOOL HAVE_THELASTONE_MODELS_LOADED()
|
|
IF HAS_MODEL_LOADED(model_TheLastOne)
|
|
AND HAS_ANIM_DICT_LOADED(animdict_Plead)
|
|
AND HAS_ANIM_DICT_LOADED(animdict_Leadout)
|
|
RETURN TRUE
|
|
ENDIF
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Releases The Last One model
|
|
PROC RELEASE_THELASTONE_MODELS()
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_TheLastOne)
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Creates The Last One
|
|
/// RETURNS:
|
|
/// TRUE if The Last One has been created, FALSE otherwise
|
|
FUNC BOOL CREATE_THELASTONE()
|
|
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
gTheLastOne.hPed = CREATE_PED(PEDTYPE_SPECIAL, model_TheLastOne, gTrail.nodes[1].vPedSpawn)
|
|
ELSE
|
|
gTheLastOne.hPed = CREATE_PED(PEDTYPE_SPECIAL, model_TheLastOne, gTrail.nodes[0].vPedSpawn)
|
|
ENDIF
|
|
|
|
IF IS_PED_UNINJURED(gTheLastOne.hPed)
|
|
|
|
// Setup permanent attributes
|
|
//REQUEST_PED_VISIBILITY_TRACKING(gTheLastOne.hPed)
|
|
iSightTestID = REGISTER_PEDSIGHT_TEST(PLAYER_PED_ID(), gTheLastOne.hPed, 0)
|
|
SET_ENTITY_LOAD_COLLISION_FLAG(gTheLastOne.hPed, TRUE)
|
|
SET_ENTITY_CAN_BE_DAMAGED(gTheLastOne.hPed, FALSE)
|
|
SET_PED_CAN_BE_TARGETTED(gTheLastOne.hPed, FALSE)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(gTheLastOne.hPed, TRUE)
|
|
GIVE_WEAPON_TO_PED(gTheLastOne.hPed, WEAPONTYPE_UNARMED, -1, TRUE)
|
|
SET_PED_MONEY(gTheLastOne.hPed, 0)
|
|
|
|
// Make sure he has the appropriate parts here
|
|
SET_PED_COMPONENT_VARIATION(gTheLastOne.hPed, PED_COMP_HEAD, 1, 0, 0)
|
|
SET_PED_COMPONENT_VARIATION(gTheLastOne.hPed, PED_COMP_BERD, 0, 0, 0)
|
|
SET_PED_COMPONENT_VARIATION(gTheLastOne.hPed, PED_COMP_SPECIAL, 0, 0, 0)
|
|
|
|
/*SET_PED_ALTERNATE_MOVEMENT_ANIM(gTheLastOne.hPed, AAT_IDLE, animdict_Plead, "tlo_idle_a")
|
|
SET_PED_ALTERNATE_MOVEMENT_ANIM(gTheLastOne.hPed, AAT_WALK, animdict_Plead, "tlo_walk_normal")
|
|
SET_PED_ALTERNATE_MOVEMENT_ANIM(gTheLastOne.hPed, AAT_RUN, animdict_Plead, "tlo_run_fast")
|
|
SET_PED_ALTERNATE_MOVEMENT_ANIM(gTheLastOne.hPed, AAT_SPRINT, animdict_Plead, "tlo_run_fast")*/
|
|
|
|
SET_PED_CONFIG_FLAG(gTheLastOne.hPed, PCF_UseKinematicModeWhenStationary, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(gTheLastOne.hPed, CA_CAN_FIGHT_ARMED_PEDS_WHEN_NOT_ARMED, TRUE)
|
|
|
|
// Stop the ped using human pain noises
|
|
STOP_PED_SPEAKING(gTheLastOne.hPed, TRUE)
|
|
DISABLE_PED_PAIN_AUDIO(gTheLastOne.hPed, TRUE)
|
|
|
|
SET_PED_TARGET_LOSS_RESPONSE(gTheLastOne.hPed, TLR_NEVER_LOSE_TARGET)
|
|
|
|
ADD_PED_FOR_DIALOGUE(pedsForConversation, 3, gTheLastOne.hPed, "ORLEANS")
|
|
|
|
// Setup temporary attributes
|
|
SET_PED_ENABLED(gTheLastOne.hPed, FALSE)
|
|
|
|
// Setup data
|
|
gTheLastOne.state = BF_NULL
|
|
gTheLastOne.mode = DONE_STATE
|
|
gTheLastOne.timer = 0
|
|
|
|
gTheLastOne.hHowlSnd = GET_SOUND_ID()
|
|
gTheLastOne.hGrumbleSnd = GET_SOUND_ID()
|
|
gTheLastOne.hCoughSnd = GET_SOUND_ID()
|
|
|
|
gTheLastOne.bHowlTimeoutStatus = FALSE
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
SCRIPT_ASSERT("Failed to create Bigfoot")
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Releases or deletes The Last One
|
|
/// PARAMS:
|
|
/// bDelete - TRUE if The Last One should be deleted, FALSE to release him
|
|
PROC RELEASE_THELASTONE(BOOL bDelete)
|
|
|
|
SAFE_REMOVE_BLIP(gTheLastOne.hBlip)
|
|
IF IS_PED_UNINJURED(gTheLastOne.hPed)
|
|
SET_ENTITY_LOAD_COLLISION_FLAG(gTheLastOne.hPed, FALSE)
|
|
ENDIF
|
|
|
|
IF bDelete
|
|
SAFE_DELETE_PED(gTheLastOne.hPed)
|
|
ELSE
|
|
SAFE_RELEASE_PED(gTheLastOne.hPed)
|
|
ENDIF
|
|
|
|
STOP_SOUND(gTheLastOne.hGrumbleSnd)
|
|
STOP_SOUND(gTheLastOne.hCoughSnd)
|
|
gTheLastOne.state = BF_NULL
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Releases or deletes the lions
|
|
/// PARAMS:
|
|
/// bDelete - TRUE if the lions should be deleted, FALSE to release them
|
|
PROC RELEASE_LIONS(BOOL bDelete)
|
|
INT i
|
|
REPEAT iLionCount i
|
|
IF gLionArray[i].state <> LION_STATE_NULL
|
|
CLEANUP_AI_PED_BLIP(gLionArray[i].hBlip)
|
|
IF bDelete
|
|
SAFE_DELETE_PED(gLionArray[i].hPed)
|
|
ELSE
|
|
SAFE_RELEASE_PED(gLionArray[i].hPed)
|
|
ENDIF
|
|
gLionArray[i].state = LION_STATE_NULL
|
|
gLionArray[i].mode = SETUP_STATE
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Releases or deletes the hunter, the pickups and the props from the start of the mission
|
|
/// PARAMS:
|
|
/// bDelete - TRUE if they should be deleted, FALSE if they should be released
|
|
PROC RELEASE_START_SCENE(BOOL bDelete)
|
|
IF gStartScene.bHasBeenCreated = TRUE
|
|
IF bDelete
|
|
SAFE_DELETE_PED(gStartScene.hHunter)
|
|
SAFE_REMOVE_PICKUP(gStartScene.hGun)
|
|
SAFE_REMOVE_PICKUP(gStartScene.hShotGun)
|
|
SAFE_DELETE_OBJECT(gStartScene.hCrate)
|
|
ELSE
|
|
IF DOES_ENTITY_EXIST(gStartScene.hHunter)
|
|
IF IS_PED_UNINJURED(gStartScene.hHunter)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(gStartScene.hHunter, FALSE)
|
|
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(gStartScene.hHunter, FALSE)
|
|
//FREEZE_ENTITY_POSITION(gStartScene.hHunter, FALSE)
|
|
ENDIF
|
|
SAFE_RELEASE_PED(gStartScene.hHunter)
|
|
ENDIF
|
|
SAFE_REMOVE_PICKUP(gStartScene.hGun)
|
|
SAFE_REMOVE_PICKUP(gStartScene.hShotGun)
|
|
SAFE_RELEASE_OBJECT(gStartScene.hCrate)
|
|
ENDIF
|
|
|
|
gStartScene.bHasBeenCreated = FALSE
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Initialises the variables used in mission stage selection
|
|
PROC INIT_MISSION_DATA()
|
|
g_mission.bRequestJSkip = FALSE
|
|
g_mission.bRequestPSkip = FALSE
|
|
g_mission.bRequestCpSkip = FALSE
|
|
g_mission.bSyncForSkip = FALSE
|
|
g_mission.queueNextStage = MS_NULL
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
zSkipMenu[0].sTxtLabel = "Intro"
|
|
zSkipMenu[1].sTxtLabel = "Go to valley"
|
|
zSkipMenu[2].sTxtLabel = "Chase"
|
|
zSkipMenu[3].sTxtLabel = "Kill Sasquatch"
|
|
zSkipMenu[4].sTxtLabel = "Outro"
|
|
zSkipMenu[5].sTxtLabel = "Go to valley (and create waypoints)"
|
|
|
|
INT i
|
|
REPEAT MAX_CP i
|
|
zSkipMenu[i].bSelectable = TRUE
|
|
ENDREPEAT
|
|
#ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Sets the next stage to move to
|
|
/// PARAMS:
|
|
/// newStage - The next stage to move to
|
|
PROC QUEUE_MISSION_STAGE(MISSION_STAGE newStage)
|
|
g_mission.queueNextStage = newStage
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Sets the next stage to skip to for a checkpoint
|
|
/// PARAMS:
|
|
/// iCheckpoint - The stage to skip to
|
|
PROC QUEUE_CP_SKIP(INT iCheckpoint)
|
|
g_mission.queueCpSkip = iCheckpoint
|
|
g_mission.bRequestCpSkip = TRUE
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Skips to the end of the chase where the player has Sasquatch cornered. Used by checkpoints and debugging
|
|
PROC SKIP_TO_CHASE_END()
|
|
RC_START_Z_SKIP()
|
|
|
|
RELEASE_THELASTONE(TRUE)
|
|
RELEASE_LIONS(TRUE)
|
|
RELEASE_START_SCENE(TRUE)
|
|
SAFE_DELETE_VEHICLE(sRCLauncherDataLocal.vehID[HUNTER_ID])
|
|
LOAD_THELASTONE_MODELS()
|
|
|
|
WHILE NOT HAVE_THELASTONE_MODELS_LOADED()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
CREATE_THELASTONE()
|
|
SAFE_TELEPORT_ENTITY(gTheLastOne.hPed, << -1539.3424, 4539.5303, 46.8468 >>)
|
|
SET_PED_ENABLED(gTheLastOne.hPed, TRUE)
|
|
gTheLastOne.state = BF_BRAWL
|
|
gTheLastOne.mode = SETUP_STATE
|
|
|
|
SAFE_REMOVE_BLIP(gTheLastOne.hBlip)
|
|
gTheLastOne.hBlip = CREATE_PED_BLIP(gTheLastOne.hPed)
|
|
SET_BLIP_SCALE(gTheLastOne.hBlip, BLIP_SIZE_VEHICLE)
|
|
|
|
gTrail.curNode = gTrail.size-1
|
|
gTrail.mode = UPDATE_STATE
|
|
g_bAudDoneCornered = TRUE
|
|
|
|
IF NOT IS_REPLAY_BEING_SET_UP()
|
|
SAFE_TELEPORT_ENTITY(PLAYER_PED_ID(), <<-1518.7616, 4540.3525, 44.5008>>, 95.2894)
|
|
ENDIF
|
|
|
|
//RELEASE_THELASTONE_MODELS()
|
|
REQUEST_CUTSCENE("sas_2_rcm_t7") // Pre-request outro so it's ready at the end
|
|
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_END_OF_CHASE, "Kill Sasquatch", TRUE)
|
|
|
|
g_mission.stage = MS_CHASE
|
|
g_mission.section = SECTION_RUNNING
|
|
g_mission.queueNextStage = MS_NULL
|
|
g_mission.bSyncForSkip = FALSE
|
|
g_bHelpDoneListen = TRUE
|
|
|
|
IF IS_REPLAY_BEING_SET_UP()
|
|
END_REPLAY_SETUP()
|
|
ELSE
|
|
WAIT_FOR_WORLD_TO_LOAD(GET_ENTITY_COORDS(PLAYER_PED_ID()))
|
|
ENDIF
|
|
|
|
RC_END_Z_SKIP()
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Change to the queued mission stage
|
|
PROC CHANGE_MISSION_STAGE()
|
|
|
|
// Handle skips
|
|
IF g_mission.bRequestJSkip OR g_mission.bRequestPSkip OR g_mission.bRequestCpSkip
|
|
g_mission.bSyncForSkip = TRUE
|
|
ELSE
|
|
g_mission.bSyncForSkip = FALSE
|
|
ENDIF
|
|
|
|
IF g_mission.bRequestCpSkip
|
|
SWITCH (g_mission.queueCpSkip)
|
|
CASE CP_INTRO
|
|
g_mission.queueNextStage = MS_INTRO
|
|
BREAK
|
|
|
|
CASE CP_GOTOVALLEY
|
|
g_mission.queueNextStage = MS_GOTOVALLEY
|
|
#IF IS_DEBUG_BUILD
|
|
g_bDebugWaypoints = FALSE
|
|
#ENDIF
|
|
BREAK
|
|
|
|
CASE CP_CHASE
|
|
g_mission.queueNextStage = MS_CHASE
|
|
BREAK
|
|
|
|
CASE CP_OUTRO
|
|
g_mission.queueNextStage = MS_OUTRO
|
|
BREAK
|
|
|
|
CASE CP_GOTOVALLEY2
|
|
g_mission.queueNextStage = MS_GOTOVALLEY
|
|
#IF IS_DEBUG_BUILD
|
|
g_bDebugWaypoints = TRUE
|
|
#ENDIF
|
|
BREAK
|
|
|
|
CASE CP_END_OF_CHASE
|
|
g_mission.queueNextStage = MS_CHASE
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
// Change stage
|
|
|
|
g_mission.stage = g_mission.queueNextStage
|
|
g_mission.section = SECTION_SETUP
|
|
g_mission.iEvent = 0
|
|
|
|
IF g_mission.bRequestCpSkip AND g_mission.queueCpSkip = CP_END_OF_CHASE
|
|
SKIP_TO_CHASE_END()
|
|
ENDIF
|
|
|
|
g_mission.bRequestJSkip = FALSE
|
|
g_mission.bRequestPSkip = FALSE
|
|
g_mission.bRequestCpSkip = FALSE
|
|
|
|
ENDPROC
|
|
|
|
//*******************************************************************************************************************
|
|
// START
|
|
//*******************************************************************************************************************
|
|
|
|
/// PURPOSE:
|
|
/// Loads the models and anim dictionaries needed at the start of the mission
|
|
PROC LOAD_START_MODELS()
|
|
REQUEST_MODEL(model_MainHunter)
|
|
REQUEST_MODEL(model_HunterCar)
|
|
REQUEST_MODEL(model_HunterGun)
|
|
REQUEST_MODEL(model_HunterShotGun)
|
|
REQUEST_MODEL(model_HunterCrate)
|
|
|
|
REQUEST_VEHICLE_ASSET(model_HunterCar)
|
|
|
|
REQUEST_ANIM_DICT(animdict_Plead)
|
|
REQUEST_ANIM_DICT(animdict_Leadout)
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Checks if the models needed at the start of the mission have loaded
|
|
/// RETURNS:
|
|
/// TRUE if they have, FALSE if they haven't
|
|
FUNC BOOL HAVE_START_MODELS_LOADED()
|
|
IF HAS_MODEL_LOADED(model_MainHunter)
|
|
AND HAS_MODEL_LOADED(model_HunterCar)
|
|
AND HAS_MODEL_LOADED(model_HunterGun)
|
|
AND HAS_MODEL_LOADED(model_HunterShotGun)
|
|
AND HAS_MODEL_LOADED(model_HunterCrate)
|
|
AND HAS_VEHICLE_ASSET_LOADED(model_HunterCar)
|
|
AND HAS_ANIM_DICT_LOADED(animdict_Plead)
|
|
AND HAS_ANIM_DICT_LOADED(animdict_Leadout)
|
|
RETURN TRUE
|
|
ENDIF
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Releases the models needed at the start of the mission
|
|
PROC RELEASE_START_MODELS()
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_MainHunter)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_HunterCar)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_HunterGun)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_HunterShotGun)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_HunterCrate)
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Initialises the start scene ped values
|
|
/// PARAMS:
|
|
/// hPed - The ped whose values we want to initialise
|
|
/// hRelGroup - The relationship group to add this ped to
|
|
/// weapon - The weapon to give this ped
|
|
/// RETURNS:
|
|
/// TRUE if the ped is uninjured and can be initialise, FALSE if they're injured or don't exist
|
|
FUNC BOOL SETUP_START_SCENE_PED(PED_INDEX hPed, REL_GROUP_HASH hRelGroup, WEAPON_TYPE weapon = WEAPONTYPE_UNARMED)
|
|
IF IS_PED_UNINJURED(hPed)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(hPed, hRelGroup)
|
|
SET_PED_CONFIG_FLAG(hPed, PCF_KeepRelationshipGroupAfterCleanUp, TRUE)
|
|
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(hPed, TRUE)
|
|
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(hPed, TRUE)
|
|
SET_PED_CAN_BE_TARGETTED(hPed, FALSE)
|
|
|
|
IF weapon <> WEAPONTYPE_UNARMED
|
|
GIVE_WEAPON_TO_PED(hPed, weapon, 100, TRUE)
|
|
SET_PED_ACCURACY(hPed, 10)
|
|
ENDIF
|
|
RETURN TRUE
|
|
ENDIF
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Creates the scat model used as dressing in the intro
|
|
/// RETURNS:
|
|
/// TRUE if the set dressing was created, FALSE otherwise
|
|
FUNC BOOL ATTEMPT_CREATE_DRESSING()
|
|
|
|
IF gDressing.bHasBeenCreated
|
|
RETURN TRUE
|
|
ELSE
|
|
REQUEST_MODEL(model_DressingScat)
|
|
|
|
IF HAS_MODEL_LOADED(model_DressingScat)
|
|
gDressing.hScat = CREATE_OBJECT_NO_OFFSET(model_DressingScat, vPos_ScatSite)
|
|
IF DOES_ENTITY_EXIST(gDressing.hScat)
|
|
SET_ENTITY_ROTATION(gDressing.hScat, vRot_ScatSite)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_DressingScat)
|
|
FREEZE_ENTITY_POSITION(gDressing.hScat, TRUE)
|
|
ELSE
|
|
RETURN FALSE
|
|
ENDIF
|
|
|
|
gDressing.bHasBeenCreated = TRUE
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
PROC CREATE_PICKUPS()
|
|
PRINTSTRING("Paul create the pickups.") PRINTNL()
|
|
|
|
INT iPlacementFlags = 0
|
|
SET_BIT(iPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_ORIENT_TO_GROUND))
|
|
IF NOT DOES_PICKUP_EXIST(gStartScene.hGun)
|
|
//gStartScene.hGun = CREATE_PICKUP(PICKUP_WEAPON_SNIPERRIFLE, vPos_StartGunSpawn, iPlacementFlags, 100)
|
|
gStartScene.hGun = CREATE_PICKUP_ROTATE(PICKUP_WEAPON_SNIPERRIFLE, vPos_StartGunSpawn, vRot_StartGunSpawn, iPlacementFlags, 100, EULER_XYZ)
|
|
ENDIF
|
|
|
|
IF NOT DOES_PICKUP_EXIST(gStartScene.hShotGun)
|
|
IF vPos_StartShotGunSpawn.z <> 0.0
|
|
//gStartScene.hShotGun = CREATE_PICKUP(PICKUP_WEAPON_PUMPSHOTGUN, vPos_StartGunSpawn, iPlacementFlags, 48)
|
|
gStartScene.hShotGun =CREATE_PICKUP_ROTATE(PICKUP_WEAPON_PUMPSHOTGUN, vPos_StartShotGunSpawn, vRot_StartShotGunSpawn, iPlacementFlags, 48, EULER_XYZ)
|
|
ENDIF
|
|
ENDIF
|
|
//<<-1297.21, 4637.65, 105.66>>, <<-100.08, -59.60, -103.04>>
|
|
//vPos_StartShotGunSpawn = vPos_StartShotGunSpawn
|
|
//vRot_StartShotGunSpawn = vRot_StartShotGunSpawn
|
|
//<<-1296.76, 4637.52, 105.67>>, <<-90.00, -55.19, -141.85>>
|
|
//vRot_StartGunSpawn = vRot_StartGunSpawn
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Sets up the start scene for the mission
|
|
PROC CREATE_START_SCENE(BOOL bPlacePlayer = TRUE)
|
|
IF gStartScene.bHasBeenCreated = FALSE
|
|
// Set player pos
|
|
IF bPlacePlayer
|
|
IF IS_PED_UNINJURED(PLAYER_PED_ID()) AND NOT IS_REPLAY_BEING_SET_UP()
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), vPos_StartPlayerSpawn)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), fRot_StartPlayerSpawn)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
|
|
ENDIF
|
|
//ENDIF
|
|
|
|
// Create hunter
|
|
IF IS_PED_UNINJURED(sRCLauncherDataLocal.pedID[HUNTER_ID])
|
|
gStartScene.hHunter = sRCLauncherDataLocal.pedID[HUNTER_ID]
|
|
SET_ENTITY_COORDS(gStartScene.hHunter, vPos_StartHunterSpawn)
|
|
SET_ENTITY_HEADING(gStartScene.hHunter, fRot_StartHunterSpawn)
|
|
ELSE
|
|
gStartScene.hHunter = CREATE_PED(PEDTYPE_MISSION, model_MainHunter, vPos_StartHunterSpawn, fRot_StartHunterSpawn)
|
|
SAFE_DELETE_PED(sRCLauncherDataLocal.pedID[HUNTER_ID])
|
|
ENDIF
|
|
|
|
IF SETUP_START_SCENE_PED(gStartScene.hHunter, RELGROUPHASH_PLAYER, weapon_HunterGun)
|
|
IF IS_PED_UNINJURED(PLAYER_PED_ID())
|
|
TASK_LOOK_AT_ENTITY(gStartScene.hHunter, PLAYER_PED_ID(), -1, SLF_USE_TORSO)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// Create pickups
|
|
CREATE_PICKUPS()
|
|
|
|
gStartScene.bHasBeenCreated = TRUE
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
//*******************************************************************************************************************
|
|
// THELASTONE
|
|
//*******************************************************************************************************************
|
|
|
|
/// PURPOSE:
|
|
/// Starts The Last One's actions from a set node
|
|
/// PARAMS:
|
|
/// iNode - The node to start The Last One from
|
|
/// RETURNS:
|
|
/// TRUE if The Last One could be started, FALSE otherwise
|
|
FUNC BOOL START_THELASTONE_CYCLE(INT iNode)
|
|
|
|
IF gTheLastOne.state = BF_NULL
|
|
IF iNode <= 1 AND IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
gTheLastOne.state = BF_ESCAPE
|
|
ELSE
|
|
gTheLastOne.state = BF_LEADIN
|
|
ENDIF
|
|
gTheLastOne.mode = SETUP_STATE
|
|
gTheLastOne.iNode = iNode
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
SCRIPT_ASSERT("Trying to start TheLastOne cycle, but state <> NULL. Not an issue if debug skipping, only a problem in regular game flow")
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Checks if The Last One's howl has timed out
|
|
/// RETURNS:
|
|
/// TRUE if it's timed out, FALSE otherwise
|
|
FUNC BOOL HAS_THELASTONE_HOWL_TIMED_OUT()
|
|
RETURN gTheLastOne.bHowlTimeoutStatus
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Makes Sasquatch react to being shot at
|
|
PROC SET_THELASTONE_SHOT_AT()
|
|
|
|
IF gTheLastOne.state = BF_ESCAPE
|
|
AND gTheLastOne.mode = UPDATE_STATE AND IS_PED_UNINJURED(gTheLastOne.hPed)
|
|
|
|
STOP_SOUND(gTheLastOne.hGrumbleSnd)
|
|
PLAY_SOUND_FROM_ENTITY(gTheLastOne.hGrumbleSnd, "WOUNDED", gTheLastOne.hPed, "SASQUATCH_01_SOUNDSET") // This should be played from the last one, not from the player
|
|
//TRIGGER_SONAR_BLIP(GET_ENTITY_COORDS(gTheLastOne.hPed), 30, HUD_COLOUR_RED)
|
|
gTheLastOne.bIsLastOneShotAt = TRUE
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Checks if it's ok to start Sasquatch running from his node
|
|
/// PARAMS:
|
|
/// curNode - The node we're checking
|
|
/// RETURNS:
|
|
/// TRUE if it's OK to start him running, FALSE if the player has done something to make this node unsuitable
|
|
FUNC BOOL CAN_DO_THELASTONE_SIGHTING(TRAIL_NODE_DATA& curNode)
|
|
|
|
// If this is the final node, going to have to do the run whatever
|
|
IF (gTrail.curNode = gTrail.size-1)
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
// Otherwise...
|
|
|
|
// Player must be apporaching from behind the trigger point (otherwise he could head the last one off)
|
|
VECTOR vStartToPlayer
|
|
VECTOR vStartToEnd
|
|
vStartToPlayer = NORMALISE_VECTOR(GET_ENTITY_COORDS(PLAYER_PED_ID()) - curNode.vPedSpawn)
|
|
vStartToEnd = NORMALISE_VECTOR(curNode.vPedDest - curNode.vPedSpawn)
|
|
|
|
IF vStartToPlayer.x*vStartToEnd.x + vStartToPlayer.y*vStartToEnd.y < COS( TO_FLOAT(curNode.iExclusionAngle) )
|
|
|
|
// No cars can be blocking the way
|
|
VECTOR vMin
|
|
VECTOR vMax
|
|
|
|
IF curNode.vPedSpawn.x < curNode.vPedDest.x
|
|
vMin.x = curNode.vPedSpawn.x - 4.0
|
|
vMax.x = curNode.vPedDest.x + 4.0
|
|
ELSE
|
|
vMin.x = curNode.vPedDest.x - 4.0
|
|
vMax.x = curNode.vPedSpawn.x + 4.0
|
|
ENDIF
|
|
|
|
IF curNode.vPedSpawn.y < curNode.vPedDest.y
|
|
vMin.y = curNode.vPedSpawn.y - 4.0
|
|
vMax.y = curNode.vPedDest.y + 4.0
|
|
ELSE
|
|
vMin.y = curNode.vPedDest.y - 4.0
|
|
vMax.y = curNode.vPedSpawn.y + 4.0
|
|
ENDIF
|
|
|
|
IF curNode.vPedSpawn.z < curNode.vPedDest.z
|
|
vMin.z = curNode.vPedSpawn.z - 4.0
|
|
vMax.z = curNode.vPedDest.z + 4.0
|
|
ELSE
|
|
vMin.z = curNode.vPedDest.z - 4.0
|
|
vMax.z = curNode.vPedSpawn.z + 4.0
|
|
ENDIF
|
|
|
|
RETURN NOT IS_AREA_OCCUPIED(vMin, vMax, FALSE, TRUE, FALSE, FALSE, FALSE)
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// If player shoots the last one with any proper gun, make it a one shot kill
|
|
PROC ONE_SHOT_KILL()
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(gTheLastOne.hPed, PLAYER_PED_ID())
|
|
/*IF NOT HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(gTheLastOne.hPed, WEAPONTYPE_INVALID, GENERALWEAPON_TYPE_ANYMELEE)
|
|
AND NOT HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(gTheLastOne.hPed, WEAPONTYPE_STUNGUN)*/
|
|
/*IF NOT HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(gTheLastOne.hPed, WEAPONTYPE_UNARMED)
|
|
// Rubber gun is being moved to DLC, commenting out for now but will probably need to put this back in
|
|
//AND NOT HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(gTheLastOne.hPed, WEAPONTYPE_DLC_RUBBERGUN)
|
|
SET_ENTITY_HEALTH(gTheLastOne.hPed, 99)
|
|
ENDIF*/
|
|
SET_ENTITY_HEALTH(gTheLastOne.hPed, 99)
|
|
//EXPLODE_PED_HEAD(gTheLastOne.hPed)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Makes the mountain lions stop attacking the player and run away
|
|
PROC MAKE_LIONS_FLEE()
|
|
INT i
|
|
REPEAT iLionCount i
|
|
CPRINTLN(DEBUG_MISSION,"Checking lion")
|
|
IF IS_PED_UNINJURED(gLionArray[i].hPed)
|
|
CPRINTLN(DEBUG_MISSION,"Making lion flee")
|
|
TASK_SMART_FLEE_PED(gLionArray[i].hPed, PLAYER_PED_ID(), 500, -1)
|
|
SAFE_RELEASE_PED(gLionArray[i].hPed)
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Plays dialogue for when the Last One is running
|
|
PROC PLAY_RUN_LINE()
|
|
|
|
IF iRunTimer < 0
|
|
iRunTimer = GET_GAME_TIMER() + CHASE_CONV_TIME
|
|
iHideTimer = -1
|
|
ELIF GET_GAME_TIMER() > iRunTimer
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND NOT IS_MESSAGE_BEING_DISPLAYED() AND NOT IS_PED_STOPPED(PLAYER_PED_ID())
|
|
IF CREATE_CONVERSATION(pedsForConversation, "SAS1AUD", "SAS1_RUNS", CONV_PRIORITY_MEDIUM)
|
|
iRunTimer = GET_GAME_TIMER() + CHASE_CONV_TIME
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Plays dialogue for when the Last One is hiding
|
|
PROC PLAY_HIDE_LINE()
|
|
|
|
IF iHideTimer < 0
|
|
iHideTimer = GET_GAME_TIMER() + CHASE_CONV_TIME
|
|
iRunTimer = -1
|
|
ELIF GET_GAME_TIMER() > iHideTimer
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND NOT IS_MESSAGE_BEING_DISPLAYED() AND NOT IS_PED_STOPPED(PLAYER_PED_ID())
|
|
IF CREATE_CONVERSATION(pedsForConversation, "SAS1AUD", "SAS1_HIDE", CONV_PRIORITY_MEDIUM)
|
|
iHideTimer = GET_GAME_TIMER() + CHASE_CONV_TIME
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Updates the Last One behaviour
|
|
/// PARAMS:
|
|
/// curNode - The node he's currently using
|
|
PROC UPDATE_THELASTONE_CYCLE(TRAIL_NODE_DATA& curNode)
|
|
|
|
FLOAT fTriggerDist = curNode.fTriggerDist
|
|
INT iLeadInTime = curNode.iLeadInTime
|
|
|
|
// If ped is in vehicle, override trigger radius / lead in time
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
fTriggerDist = curNode.fTriggerDistCar
|
|
|
|
/*IF gTrail.curNode = 1
|
|
iLeadInTime = 0 // This is just a hack so that if the first one gets skipped cause player is in a car, then there's no delay before trail starts
|
|
ELSE*/
|
|
iLeadInTime = 2000
|
|
//ENDIF
|
|
ENDIF
|
|
|
|
SWITCH (gTheLastOne.state)
|
|
//------------------------------ LEADIN
|
|
CASE BF_LEADIN
|
|
|
|
IF IS_PED_UNINJURED(gTheLastOne.hPed)
|
|
IF gTheLastOne.mode = SETUP_STATE
|
|
SET_PED_ENABLED(gTheLastOne.hPed, FALSE)
|
|
IF gTheLastOne.iNode > 0
|
|
SAFE_REMOVE_BLIP(gTheLastOne.hBlip)
|
|
ENDIF
|
|
|
|
SET_ENTITY_COORDS(gTheLastOne.hPed, curNode.vPedSpawn)
|
|
IF curNode.type = NODETYPE_SIGHTING
|
|
SET_ENTITY_FACING(gTheLastOne.hPed, curNode.vPedDest)
|
|
ENDIF
|
|
|
|
gTheLastOne.timer = GET_GAME_TIMER() + iLeadInTime
|
|
gTheLastOne.mode = UPDATE_STATE
|
|
|
|
ELIF gTheLastOne.mode = UPDATE_STATE
|
|
IF fTriggerDist = -1.0
|
|
gTheLastOne.state = BF_NULL
|
|
gTheLastOne.mode = SETUP_STATE
|
|
|
|
ELIF GET_GAME_TIMER() > gTheLastOne.timer
|
|
gTheLastOne.state = BF_HOWL
|
|
gTheLastOne.mode = SETUP_STATE
|
|
|
|
ELIF IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), curNode.vPedSpawn, fTriggerDist)
|
|
gTheLastOne.state = BF_HOWL
|
|
gTheLastOne.mode = SETUP_STATE
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
//------------------------------ HOWL
|
|
CASE BF_HOWL
|
|
IF IS_PED_UNINJURED(gTheLastOne.hPed)
|
|
IF gTheLastOne.mode = SETUP_STATE
|
|
gTheLastOne.howlTimeout = GET_GAME_TIMER() + HOWL_TIMEOUT
|
|
gTheLastOne.timer = 0
|
|
gTheLastOne.mode = UPDATE_STATE
|
|
|
|
ELIF fTriggerDist = -1.0 OR IS_ENTITY_IN_RANGE_ENTITY(gTheLastOne.hPed, PLAYER_PED_ID(), fTriggerDist)
|
|
|
|
IF curNode.type = NODETYPE_SIGHTING AND fTriggerDist <> -1.0 AND CAN_DO_THELASTONE_SIGHTING(curNode)
|
|
// Sighting is safe -> run to destination
|
|
gTheLastOne.state = BF_ESCAPE
|
|
gTheLastOne.mode = SETUP_STATE
|
|
ELSE
|
|
// Disallowed angle -> skip to next node
|
|
gTheLastOne.state = BF_LEADOUT
|
|
gTheLastOne.mode = SETUP_STATE
|
|
ENDIF
|
|
|
|
ELIF DOES_BLIP_EXIST(gTheLastOne.hBlip) // Decay blip
|
|
INT iAlpha
|
|
iAlpha = GET_BLIP_ALPHA(gTheLastOne.hBlip) - 5
|
|
IF iAlpha > 0
|
|
SET_BLIP_ALPHA(gTheLastOne.hBlip, iAlpha)
|
|
ELSE
|
|
SAFE_REMOVE_BLIP(gTheLastOne.hBlip)
|
|
ENDIF
|
|
|
|
ELIF GET_GAME_TIMER() > gTheLastOne.howlTimeout
|
|
gTheLastOne.bHowlTimeoutStatus = TRUE
|
|
|
|
ELIF GET_GAME_TIMER() > gTheLastOne.timer
|
|
IF HAS_SOUND_FINISHED(gTheLastOne.hGrumbleSnd) AND HAS_SOUND_FINISHED(gTheLastOne.hGrumbleSnd) AND HAS_SOUND_FINISHED(gTheLastOne.hCoughSnd)
|
|
PLAY_SOUND_FROM_ENTITY(gTheLastOne.hHowlSnd, "ALERT", gTheLastOne.hPed, "SASQUATCH_01_SOUNDSET")
|
|
CPRINTLN(DEBUG_MISSION,"Triggering sonar blip at node ", gTrail.curNode)
|
|
TRIGGER_SONAR_BLIP(GET_ENTITY_COORDS(gTheLastOne.hPed), 30, HUD_COLOUR_RED)
|
|
ENDIF
|
|
|
|
/*gTheLastOne.hBlip = CREATE_PED_BLIP(gTheLastOne.hPed)
|
|
IF DOES_BLIP_EXIST(gTheLastOne.hBlip)
|
|
SET_BLIP_ALPHA(gTheLastOne.hBlip, 200)
|
|
ENDIF*/
|
|
gTheLastOne.timer = GET_GAME_TIMER() + 7500
|
|
ENDIF
|
|
|
|
FORCE_SONAR_BLIPS_THIS_FRAME()
|
|
PLAY_HIDE_LINE()
|
|
ENDIF
|
|
BREAK
|
|
|
|
//------------------------------ ESCAPE
|
|
CASE BF_ESCAPE
|
|
IF IS_PED_UNINJURED(gTheLastOne.hPed)
|
|
IF gTheLastOne.mode = SETUP_STATE
|
|
SET_PED_ENABLED(gTheLastOne.hPed, TRUE)
|
|
TASK_GO_STRAIGHT_TO_COORD(gTheLastOne.hPed, curNode.vPedDest, PEDMOVE_SPRINT, -1)//20000)
|
|
IF HAS_SOUND_FINISHED(gTheLastOne.hGrumbleSnd) AND HAS_SOUND_FINISHED(gTheLastOne.hGrumbleSnd) AND HAS_SOUND_FINISHED(gTheLastOne.hCoughSnd)
|
|
PLAY_SOUND_FROM_ENTITY(gTheLastOne.hGrumbleSnd, "RUNNING", gTheLastOne.hPed, "SASQUATCH_01_SOUNDSET") // This should be played from the last one, not from the player
|
|
//TRIGGER_SONAR_BLIP(GET_ENTITY_COORDS(gTheLastOne.hPed), 30, HUD_COLOUR_RED)
|
|
ENDIF
|
|
gTheLastOne.bIsLastOneShotAt = FALSE
|
|
|
|
IF NOT DOES_BLIP_EXIST(gTheLastOne.hBlip)
|
|
gTheLastOne.hBlip = CREATE_PED_BLIP(gTheLastOne.hPed)
|
|
SET_BLIP_SCALE(gTheLastOne.hBlip, BLIP_SIZE_VEHICLE)
|
|
ELSE
|
|
SET_BLIP_ALPHA(gTheLastOne.hBlip, 255)
|
|
ENDIF
|
|
|
|
// IF this is the last run, make the last one vulnerable
|
|
IF gTrail.curNode = gTrail.size-1
|
|
SET_ENTITY_CAN_BE_DAMAGED(gTheLastOne.hPed, TRUE)
|
|
SET_PED_CAN_BE_TARGETTED(gTheLastOne.hPed, TRUE)
|
|
SET_ENTITY_HEALTH(gTheLastOne.hPed, 110)
|
|
ENDIF
|
|
|
|
//gTheLastOne.timer = GET_GAME_TIMER() + 15000
|
|
gTheLastOne.mode = UPDATE_STATE
|
|
|
|
ELIF gTheLastOne.mode = UPDATE_STATE
|
|
|
|
//ELIF NOT IsPedPerformingTask(gTheLastOne.hPed, SCRIPT_TASK_GO_STRAIGHT_TO_COORD) AND NOT IsPedPerformingTask(gTheLastOne.hPed, SCRIPT_TASK_PLAY_ANIM)
|
|
// gTheLastOne.mode = DONE_STATE
|
|
|
|
/*ELIF IS_ENTITY_IN_RANGE_COORDS(gTheLastOne.hPed, curNode.vPedDest, 1.5)
|
|
gTheLastOne.mode = DONE_STATE
|
|
|
|
ELIF gTrail.curNode < (gTrail.size-1) AND IS_ENTITY_IN_RANGE_COORDS(gTheLastOne.hPed, curNode.vPedDest, 3.5) AND NOT IsPedPerformingTask(gTheLastOne.hPed, SCRIPT_TASK_PLAY_ANIM)
|
|
gTheLastOne.mode = DONE_STATE
|
|
*/
|
|
IF gTrail.curNode < (gTrail.size-1) AND IS_ENTITY_IN_RANGE_COORDS(gTheLastOne.hPed, curNode.vPedDest, 4.0) AND NOT IsPedPerformingTask(gTheLastOne.hPed, SCRIPT_TASK_PLAY_ANIM)
|
|
TASK_PLAY_ANIM(gTheLastOne.hPed, animdict_Plead, "tlo_leap_out", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_DEFAULT | AF_TURN_OFF_COLLISION)
|
|
gTheLastOne.mode = DONE_STATE
|
|
|
|
ELIF gTrail.curNode >= (gTrail.size-1) AND IS_ENTITY_IN_RANGE_COORDS(gTheLastOne.hPed, curNode.vPedDest, 1.5)
|
|
gTheLastOne.mode = DONE_STATE
|
|
|
|
/*ELIF GET_GAME_TIMER() > gTheLastOne.timer
|
|
gTheLastOne.mode = DONE_STATE*/
|
|
|
|
ELIF HAS_SOUND_FINISHED(gTheLastOne.hGrumbleSnd) AND HAS_SOUND_FINISHED(gTheLastOne.hGrumbleSnd) AND HAS_SOUND_FINISHED(gTheLastOne.hCoughSnd)
|
|
IF gTheLastOne.bIsLastOneShotAt = FALSE
|
|
PLAY_SOUND_FROM_ENTITY(gTheLastOne.hGrumbleSnd, "RUNNING", gTheLastOne.hPed, "SASQUATCH_01_SOUNDSET") // This should be played from the last one, not from the player
|
|
//TRIGGER_SONAR_BLIP(GET_ENTITY_COORDS(gTheLastOne.hPed), 30, HUD_COLOUR_RED)
|
|
ELSE
|
|
PLAY_SOUND_FROM_ENTITY(gTheLastOne.hGrumbleSnd, "WOUNDED", gTheLastOne.hPed, "SASQUATCH_01_SOUNDSET") // This should be played from the last one, not from the player
|
|
//TRIGGER_SONAR_BLIP(GET_ENTITY_COORDS(gTheLastOne.hPed), 30, HUD_COLOUR_RED)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
VEHICLE_INDEX viPlayer
|
|
viPlayer = GET_PLAYERS_LAST_VEHICLE()
|
|
IF IS_VEHICLE_OK(viPlayer) AND IS_ENTITY_TOUCHING_ENTITY(viPlayer, gTheLastOne.hPed)
|
|
gTheLastOne.state = BF_BLOCKED_FIGHT
|
|
gTheLastOne.mode = SETUP_STATE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
PLAY_RUN_LINE()
|
|
|
|
IF gTheLastOne.mode = DONE_STATE AND IS_PED_UNINJURED(gTheLastOne.hPed) AND NOT IsPedPerformingTask(gTheLastOne.hPed, SCRIPT_TASK_PLAY_ANIM)
|
|
CLEAR_PED_TASKS(gTheLastOne.hPed)
|
|
|
|
IF gTrail.curNode < gTrail.size-1
|
|
IF HAS_SOUND_FINISHED(gTheLastOne.hGrumbleSnd) AND HAS_SOUND_FINISHED(gTheLastOne.hGrumbleSnd) AND HAS_SOUND_FINISHED(gTheLastOne.hCoughSnd)
|
|
PLAY_SOUND_FROM_ENTITY(gTheLastOne.hCoughSnd, "COUGH", gTheLastOne.hPed, "SASQUATCH_01_SOUNDSET") // This should be played from the last one, not from the player
|
|
//TRIGGER_SONAR_BLIP(GET_ENTITY_COORDS(gTheLastOne.hPed), 30, HUD_COLOUR_RED)
|
|
ENDIF
|
|
gTheLastOne.state = BF_LEADOUT
|
|
gTheLastOne.mode = SETUP_STATE
|
|
ELSE
|
|
gTheLastOne.state = BF_BRAWL
|
|
gTheLastOne.mode = SETUP_STATE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
//------------------------------ LEADOUT
|
|
CASE BF_LEADOUT
|
|
|
|
IF gTheLastOne.mode = SETUP_STATE
|
|
SET_PED_ENABLED(gTheLastOne.hPed, FALSE)
|
|
gTheLastOne.mode = UPDATE_STATE
|
|
ENDIF
|
|
|
|
PLAY_HIDE_LINE()
|
|
|
|
IF IS_PED_UNINJURED(gTheLastOne.hPed)
|
|
IF DOES_BLIP_EXIST(gTheLastOne.hBlip) // Decay blip
|
|
INT iAlpha
|
|
INT iSub
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
iSub = 16
|
|
ELSE
|
|
iSub = 8
|
|
ENDIF
|
|
iAlpha = GET_BLIP_ALPHA(gTheLastOne.hBlip) - iSub
|
|
IF iAlpha > 0
|
|
SET_BLIP_ALPHA(gTheLastOne.hBlip, iAlpha)
|
|
ELSE
|
|
SAFE_REMOVE_BLIP(gTheLastOne.hBlip)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT DOES_BLIP_EXIST(gTheLastOne.hBlip)
|
|
gTheLastOne.state = BF_NULL
|
|
gTheLastOne.mode = SETUP_STATE
|
|
ENDIF
|
|
BREAK
|
|
|
|
//------------------------------ BRAWL
|
|
CASE BF_BRAWL
|
|
IF IS_PED_UNINJURED(gTheLastOne.hPed)
|
|
IF gTheLastOne.mode = SETUP_STATE
|
|
ADD_PED_FOR_DIALOGUE(pedsForConversation, 3, gTheLastOne.hPed, "ORLEANS")
|
|
|
|
SET_ENTITY_CAN_BE_DAMAGED(gTheLastOne.hPed, TRUE)
|
|
SET_PED_CAN_BE_TARGETTED(gTheLastOne.hPed, TRUE)
|
|
SET_PED_ENABLED(gTheLastOne.hPed, TRUE)
|
|
|
|
IF NOT DOES_BLIP_EXIST(gTheLastOne.hBlip)
|
|
gTheLastOne.hBlip = CREATE_PED_BLIP(gTheLastOne.hPed)
|
|
SET_BLIP_SCALE(gTheLastOne.hBlip, BLIP_SIZE_VEHICLE)
|
|
ELSE
|
|
SET_BLIP_ALPHA(gTheLastOne.hBlip, 255)
|
|
ENDIF
|
|
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_END_OF_CHASE, "Kill Sasquatch", TRUE)
|
|
|
|
//CLEAR_PED_TASKS_IMMEDIATELY(gTheLastOne.hPed)
|
|
|
|
SEQUENCE_INDEX seq
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
/*TASK_PLAY_ANIM(NULL, animdict_Plead, "sas_idle_01")
|
|
TASK_PLAY_ANIM(NULL, animdict_Plead, "sas_idle_action_01")
|
|
TASK_PLAY_ANIM(NULL, animdict_Plead, "sas_idle_02")
|
|
TASK_PLAY_ANIM(NULL, animdict_Plead, "sas_idle_action_02")
|
|
TASK_PLAY_ANIM(NULL, animdict_Plead, "sas_idle_03")
|
|
SET_SEQUENCE_TO_REPEAT(seq, REPEAT_FOREVER)*/
|
|
TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID(), 2000)
|
|
//TASK_PLAY_ANIM(NULL, animdict_Plead, "convict_idleshort", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING)
|
|
TASK_COWER(NULL)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(gTheLastOne.hPed, seq)
|
|
|
|
// Stop the mountain lions attacking
|
|
MAKE_LIONS_FLEE()
|
|
|
|
//iConvFailedTimer = -1
|
|
|
|
gTheLastOne.mode = UPDATE_STATE
|
|
gTheLastOne.iBrawlingState = 0
|
|
|
|
// SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
|
|
|
|
ELIF gTheLastOne.mode = UPDATE_STATE
|
|
// DRAW_DEBUG_SPHERE(GET_ENTITY_COORDS(PLAYER_PED_ID()), 12, 0, 0, 255, 60)
|
|
|
|
/*IF HAS_SOUND_FINISHED(gTheLastOne.hGrumbleSnd) AND HAS_SOUND_FINISHED(gTheLastOne.hGrumbleSnd) AND HAS_SOUND_FINISHED(gTheLastOne.hCoughSnd)
|
|
PLAY_SOUND_FROM_ENTITY(gTheLastOne.hGrumbleSnd, "CORNERED", gTheLastOne.hPed, "SASQUATCH_01_SOUNDSET") // This should be played from the last one, not from the player
|
|
TRIGGER_SONAR_BLIP(GET_ENTITY_COORDS(gTheLastOne.hPed), 30, HUD_COLOUR_RED)
|
|
ENDIF*/
|
|
|
|
// STATE: Play anim
|
|
IF gTheLastOne.iBrawlingState = 0
|
|
/*IF CREATE_CONVERSATION(pedsForConversation, "SAS1AUD", "SAS1_LEADOUT", CONV_PRIORITY_HIGH)
|
|
OR CONVERSATION_TIMED_OUT(iConvFailedTimer)
|
|
gTheLastOne.iBrawlingState = 1
|
|
ENDIF*/
|
|
/*IF (IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) AND IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_ENTITY_COORDS(gTheLastOne.hPed), <<fRad_BrawlOn*2,fRad_BrawlOn*2,fRad_BrawlOn*2>>))
|
|
OR (NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) AND IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_ENTITY_COORDS(gTheLastOne.hPed), <<fRad_BrawlOn,fRad_BrawlOn,fRad_BrawlOn>>))*/
|
|
IF IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), gTheLastOne.hPed, 20.0)
|
|
SET_ENTITY_HEALTH(gTheLastOne.hPed, 110)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(gTheLastOne.hPed, RELGROUPHASH_HATES_PLAYER)
|
|
SET_PED_CONFIG_FLAG(gTheLastOne.hPed, PCF_UseKinematicModeWhenStationary, TRUE)
|
|
// Stop the mountain lions attacking
|
|
MAKE_LIONS_FLEE()
|
|
iCurrentBark = 0
|
|
iBarkTimer = GET_GAME_TIMER()
|
|
gTheLastOne.iBrawlingState = 1
|
|
ENDIF
|
|
ELIF gTheLastOne.iBrawlingState = 1
|
|
// If Player is in arena -> flee over the edge of the cliff
|
|
/*IF (IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) AND IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_ENTITY_COORDS(gTheLastOne.hPed), <<fRad_BrawlOn*2,fRad_BrawlOn*2,fRad_BrawlOn*2>>))
|
|
OR (NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) AND IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_ENTITY_COORDS(gTheLastOne.hPed), <<fRad_BrawlOn,fRad_BrawlOn,fRad_BrawlOn>>))
|
|
SET_ENTITY_HEALTH(gTheLastOne.hPed, 110)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(gTheLastOne.hPed, RELGROUPHASH_HATES_PLAYER)
|
|
SET_PED_CONFIG_FLAG(gTheLastOne.hPed, PCF_UseKinematicModeWhenStationary, TRUE)
|
|
// Stop the mountain lions attacking
|
|
MAKE_LIONS_FLEE()
|
|
gTheLastOne.iBrawlingState = 2
|
|
ENDIF*/
|
|
IF GET_GAME_TIMER() > iBarkTimer
|
|
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(pedsForConversation, "SAS1AUD", "SAS1_LEADOUT", sBarks[iCurrentBark], CONV_PRIORITY_MEDIUM)
|
|
iBarkTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(3000, TIME_BETWEEN_BARKS)
|
|
iCurrentBark = GET_RANDOM_INT_IN_RANGE(0, NUM_BARKS)
|
|
/*iCurrentBark++
|
|
IF iCurrentBark >= NUM_BARKS
|
|
iCurrentBark = 0
|
|
ENDIF*/
|
|
ENDIF
|
|
ENDIF
|
|
/*ELIF gTheLastOne.iBrawlingState = 2
|
|
// if the player gets close enough to start brawling, The Last One kicks the shit out of them
|
|
IF IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), gTheLastOne.hPed, 3.5) AND NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
SET_ENTITY_HEALTH(gTheLastOne.hPed, 110)
|
|
TASK_COMBAT_PED(gTheLastOne.hPed, PLAYER_PED_ID())
|
|
//SET_AI_MELEE_WEAPON_DAMAGE_MODIFIER(500.0)
|
|
//SET_PLAYER_MELEE_WEAPON_DEFENSE_MODIFIER(PLAYER_ID(), 0.11)
|
|
//SET_PLAYER_MELEE_WEAPON_DAMAGE_MODIFIER(PLAYER_ID(), 0.11)
|
|
gTheLastOne.iBrawlingState = 3
|
|
ENDIF*/
|
|
ENDIF
|
|
|
|
ONE_SHOT_KILL()
|
|
ENDIF
|
|
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE BF_BLOCKED_FIGHT
|
|
IF IS_PED_UNINJURED(gTheLastOne.hPed)
|
|
IF gTheLastOne.mode = SETUP_STATE
|
|
|
|
SET_ENTITY_CAN_BE_DAMAGED(gTheLastOne.hPed, TRUE)
|
|
SET_PED_CAN_BE_TARGETTED(gTheLastOne.hPed, TRUE)
|
|
SET_ENTITY_HEALTH(gTheLastOne.hPed, 120)
|
|
SET_PED_ENABLED(gTheLastOne.hPed, TRUE)
|
|
|
|
IF NOT DOES_BLIP_EXIST(gTheLastOne.hBlip)
|
|
gTheLastOne.hBlip = CREATE_PED_BLIP(gTheLastOne.hPed)
|
|
SET_BLIP_SCALE(gTheLastOne.hBlip, BLIP_SIZE_VEHICLE)
|
|
ELSE
|
|
SET_BLIP_ALPHA(gTheLastOne.hBlip, 255)
|
|
ENDIF
|
|
|
|
bBlockedByCar = TRUE
|
|
|
|
TASK_COMBAT_PED(gTheLastOne.hPed, PLAYER_PED_ID())
|
|
|
|
// Stop the mountain lions attacking
|
|
MAKE_LIONS_FLEE()
|
|
|
|
gTheLastOne.mode = UPDATE_STATE
|
|
ELIF gTheLastOne.mode = UPDATE_STATE
|
|
// in combat
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
//------------------------------ NULL
|
|
CASE BF_NULL
|
|
IF gTheLastOne.mode = SETUP_STATE
|
|
SAFE_REMOVE_BLIP(gTheLastOne.hBlip)
|
|
gTheLastOne.mode = DONE_STATE
|
|
ENDIF
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDPROC
|
|
|
|
//*******************************************************************************************************************
|
|
// LION
|
|
//*******************************************************************************************************************
|
|
|
|
/// PURPOSE:
|
|
/// Loads the mountain lion model
|
|
PROC LOAD_LION_MODELS()
|
|
REQUEST_MODEL(model_Lion)
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Checks if the mountain lion model has loaded
|
|
/// RETURNS:
|
|
/// TRUE if it's loaded, FALSE otherwise
|
|
FUNC BOOL HAVE_LION_MODELS_LOADED()
|
|
RETURN HAS_MODEL_LOADED(model_Lion)
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Releases the mountain lion model
|
|
PROC RELEASE_LION_MODELS()
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(model_Lion)
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Creates the mountain lions
|
|
PROC CREATE_LIONS()
|
|
|
|
INT i
|
|
REPEAT iLionCount i
|
|
gLionArray[i].hPed = CREATE_PED(PEDTYPE_SPECIAL, model_Lion, gLionArray[i].vSpawnPos, gLionArray[i].fSpawnRot)
|
|
|
|
IF IS_PED_UNINJURED(gLionArray[i].hPed)
|
|
|
|
// Setup permenant attributes
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(gLionArray[i].hPed, TRUE)
|
|
|
|
SET_PED_TARGET_LOSS_RESPONSE(gLionArray[i].hPed, TLR_NEVER_LOSE_TARGET)
|
|
|
|
TASK_WANDER_IN_AREA(gLionArray[i].hPed, gLionArray[i].vSpawnPos, 15.0)
|
|
|
|
SET_PED_COMBAT_ATTRIBUTES(gLionArray[i].hPed, CA_CAN_FIGHT_ARMED_PEDS_WHEN_NOT_ARMED, TRUE)
|
|
|
|
GIVE_DELAYED_WEAPON_TO_PED(gLionArray[i].hPed, WEAPONTYPE_COUGAR, -1, TRUE)
|
|
|
|
// Setup data
|
|
gLionArray[i].state = LION_STATE_READY
|
|
gLionArray[i].mode = SETUP_STATE
|
|
|
|
ELSE
|
|
SCRIPT_ASSERT("Failed to create lion")
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Updates the mountain lion behaviour
|
|
/// PARAMS:
|
|
/// lion - The lion whose behaviour we're updating
|
|
PROC UPDATE_LION(LION_DATA& lion)
|
|
UPDATE_AI_PED_BLIP(lion.hPed, lion.hBlip)
|
|
SWITCH (lion.state)
|
|
|
|
CASE LION_STATE_READY
|
|
IF NOT IS_PED_UNINJURED(lion.hPed)
|
|
lion.state = LION_STATE_NULL
|
|
lion.mode = SETUP_STATE
|
|
ELSE
|
|
IF IS_ENTITY_IN_RANGE_ENTITY(lion.hPed, PLAYER_PED_ID(), lion.fTriggerRadius)
|
|
IF HAS_ENTITY_CLEAR_LOS_TO_ENTITY(lion.hPed, PLAYER_PED_ID())
|
|
lion.state = LION_STATE_POUNCE
|
|
lion.mode = SETUP_STATE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE LION_STATE_POUNCE
|
|
IF NOT IS_PED_UNINJURED(lion.hPed)
|
|
lion.state = LION_STATE_NULL
|
|
lion.mode = SETUP_STATE
|
|
|
|
ELIF lion.mode = SETUP_STATE
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
TASK_SMART_FLEE_PED(lion.hPed, PLAYER_PED_ID(), 500, -1)
|
|
ELSE
|
|
TASK_COMBAT_PED(lion.hPed, PLAYER_PED_ID())
|
|
ENDIF
|
|
lion.mode = UPDATE_STATE
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE LION_STATE_NULL
|
|
IF lion.mode = SETUP_STATE
|
|
SAFE_RELEASE_PED(lion.hPed)
|
|
lion.mode = UPDATE_STATE
|
|
ENDIF
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDPROC
|
|
|
|
FUNC BOOL IS_PED_ANIMAL(PED_INDEX ped)
|
|
MODEL_NAMES mnPedModel = GET_ENTITY_MODEL(ped)
|
|
IF mnPedModel = A_C_BOAR
|
|
OR mnPedModel = A_C_CHICKENHAWK
|
|
OR mnPedModel = A_C_CHIMP
|
|
OR mnPedModel = A_C_CHOP
|
|
OR mnPedModel = A_C_CORMORANT
|
|
OR mnPedModel = A_C_COW
|
|
OR mnPedModel = A_C_COYOTE
|
|
OR mnPedModel = A_C_CROW
|
|
OR mnPedModel = A_C_DEER
|
|
OR mnPedModel = A_C_HEN
|
|
//OR mnPedModel = A_C_HORSE
|
|
OR mnPedModel = A_C_MTLION
|
|
OR mnPedModel = A_C_PIG
|
|
OR mnPedModel = A_C_PIGEON
|
|
OR mnPedModel = A_C_RAT
|
|
OR mnPedModel = A_C_RETRIEVER
|
|
OR mnPedModel = A_C_RHESUS
|
|
OR mnPedModel = A_C_ROTTWEILER
|
|
OR mnPedModel = A_C_SEAGULL
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Checks for the player killing any wild animals
|
|
PROC CHECK_FOR_DEAD_ANIMALS()
|
|
|
|
EVENT_NAMES eEventType
|
|
STRUCT_ENTITY_ID sEntityID
|
|
INT iCount = 0
|
|
PED_INDEX ped
|
|
|
|
// to stop things crying about unreference variable
|
|
REPEAT GET_NUMBER_OF_EVENTS(SCRIPT_EVENT_QUEUE_AI) iCount
|
|
eEventType = GET_EVENT_AT_INDEX(SCRIPT_EVENT_QUEUE_AI, iCount)
|
|
|
|
SWITCH (eEventType)
|
|
CASE EVENT_ENTITY_DAMAGED
|
|
|
|
// Grab the event data and process also kill the ped on injury
|
|
GET_EVENT_DATA(SCRIPT_EVENT_QUEUE_AI, iCount, sEntityID, SIZE_OF(STRUCT_ENTITY_ID))
|
|
|
|
IF DOES_ENTITY_EXIST(sEntityID.EntityId)
|
|
|
|
IF IS_ENTITY_A_PED(sEntityID.EntityId)
|
|
ped = GET_PED_INDEX_FROM_ENTITY_INDEX(sEntityID.EntityId)
|
|
IF IS_PED_ANIMAL(ped)
|
|
IF IS_ENTITY_DEAD(ped)
|
|
INFORM_MISSION_STATS_OF_INCREMENT(TLO_AMBIENT_ANIMAL_KILLS)
|
|
ELIF IS_PED_INJURED(ped)
|
|
SET_ENTITY_HEALTH(ped, 0) // insta kill the ped
|
|
INFORM_MISSION_STATS_OF_INCREMENT(TLO_AMBIENT_ANIMAL_KILLS)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDREPEAT
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Checks for the player shooting the last one
|
|
PROC CHECK_FOR_ORLEANS_INJURY()
|
|
|
|
IF HAS_BULLET_IMPACTED_IN_AREA(GET_ENTITY_COORDS(gTheLastOne.hPed), 1.5)
|
|
IF gTrail.curNode < gTrail.size-1
|
|
SET_THELASTONE_SHOT_AT()
|
|
|
|
// increase the shot at count for the mission stats
|
|
INFORM_MISSION_STATS_OF_INCREMENT(TLO_WOUNDS)
|
|
|
|
//IF g_bAudDoneWounded = FALSE
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
ADD_PED_FOR_DIALOGUE(pedsForConversation, 1, PLAYER_PED_ID(), "FRANKLIN")
|
|
/*IF CREATE_CONVERSATION(pedsForConversation, "SAS1AUD", "SAS1_CHASE2", CONV_PRIORITY_MEDIUM) // Conversation: "Wounded him, that'll slow him down"
|
|
g_bAudDoneWounded = TRUE
|
|
ENDIF*/
|
|
CREATE_CONVERSATION(pedsForConversation, "SAS1AUD", "SAS1_CHASE2", CONV_PRIORITY_MEDIUM) // Conversation: "Wounded him, that'll slow him down"
|
|
ENDIF
|
|
//ENDIF
|
|
ENDIF
|
|
|
|
ELIF HAS_BULLET_IMPACTED_IN_AREA(GET_ENTITY_COORDS(gTheLastOne.hPed), 5.0)
|
|
IF gTrail.curNode < gTrail.size-1
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
ADD_PED_FOR_DIALOGUE(pedsForConversation, 1, PLAYER_PED_ID(), "FRANKLIN")
|
|
CREATE_CONVERSATION(pedsForConversation, "SAS1AUD", "SAS1_MISS", CONV_PRIORITY_MEDIUM)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
//*******************************************************************************************************************
|
|
// TRAIL
|
|
//*******************************************************************************************************************
|
|
|
|
/// PURPOSE:
|
|
/// Sets the Last One chase to its beginning
|
|
PROC START_TRAIL()
|
|
gTrail.mode = SETUP_STATE
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
gTrail.curNode = 1
|
|
ELSE
|
|
gTrail.curNode = 0
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Updates the Last One chase
|
|
PROC UPDATE_TRAIL()
|
|
|
|
// Display current node
|
|
// DISPLAY_TEXT_WITH_NUMBER(0.1, 0.1, "NUMBR", gTrail.curNode)
|
|
|
|
// Process nodes (the last one)
|
|
SWITCH (gTrail.nodes[gTrail.curNode].type)
|
|
|
|
CASE NODETYPE_HOWL
|
|
FALLTHRU
|
|
CASE NODETYPE_SIGHTING
|
|
IF gTrail.mode = SETUP_STATE
|
|
START_THELASTONE_CYCLE(gTrail.curNode)
|
|
gTrail.mode = UPDATE_STATE
|
|
|
|
ELIF gTrail.mode = UPDATE_STATE
|
|
UPDATE_THELASTONE_CYCLE(gTrail.nodes[gTheLastOne.iNode])
|
|
|
|
IF gTheLastOne.state = BF_NULL AND gTheLastOne.mode = DONE_STATE
|
|
gTrail.mode = DONE_STATE
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
// Process lions
|
|
INT i
|
|
REPEAT iLionCount i
|
|
UPDATE_LION(gLionArray[i])
|
|
ENDREPEAT
|
|
|
|
ENDPROC
|
|
|
|
/*PROC PLAY_IN_VEHICLE_LINE()
|
|
IF iCurrentVehicleChaseLines < NUM_VEHICLE_CHASE_LINES AND IS_PED_UNINJURED(PLAYER_PED_ID()) AND IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
IF GET_GAME_TIMER() > iVehicleChaseLineTimer
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(pedsForConversation, "SAS1AUD", "SAS1_VEHICLE", sVehicleChaseLines[iCurrentVehicleChaseLines], CONV_PRIORITY_MEDIUM)
|
|
iCurrentVehicleChaseLines++
|
|
iVehicleChaseLineTimer = GET_GAME_TIMER() + VEHICLE_CHASE_LINE_TIME
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC*/
|
|
|
|
/// PURPOSE:
|
|
/// Clears vehicles and peds from the chase area
|
|
PROC CLEAR_ROUTE_AREAS()
|
|
CLEAR_AREA(vClearZone0, 50, TRUE)
|
|
CLEAR_AREA(vClearZone1, 50, TRUE)
|
|
CLEAR_AREA(vClearZone2, 50, TRUE)
|
|
CLEAR_AREA(vClearZone3, 20, TRUE)
|
|
|
|
VEHICLE_INDEX hPlayerCar = GET_PLAYERS_LAST_VEHICLE()
|
|
IF DOES_ENTITY_EXIST(hPlayerCar) AND NOT IS_ENTITY_DEAD(hPlayerCar)
|
|
IF IS_ENTITY_IN_RANGE_COORDS(hPlayerCar, vClearZone0, 50)
|
|
OR IS_ENTITY_IN_RANGE_COORDS(hPlayerCar, vClearZone1, 50)
|
|
OR IS_ENTITY_IN_RANGE_COORDS(hPlayerCar, vClearZone2, 50)
|
|
OR IS_ENTITY_IN_RANGE_COORDS(hPlayerCar, vClearZone3, 20)
|
|
SET_ENTITY_COORDS(hPlayerCar, vPos_RespotLastCar)
|
|
SET_ENTITY_HEADING(hPlayerCar, fRot_RespotLastCar)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(hPlayerCar)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
//*******************************************************************************************************************
|
|
// MAIN BODY STAGES
|
|
//*******************************************************************************************************************
|
|
|
|
// ===========================================================================================================
|
|
// Termination
|
|
// ===========================================================================================================
|
|
|
|
// -----------------------------------------------------------------------------------------------------------
|
|
// Script Cleanup
|
|
// -----------------------------------------------------------------------------------------------------------
|
|
|
|
/// PURPOSE:
|
|
/// Stops dialogue and clears objectives
|
|
PROC Script_TextCleanup()
|
|
STOP_SCRIPTED_CONVERSATION(FALSE)
|
|
CLEAR_PRINTS()
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Cleans up the script
|
|
PROC Script_Cleanup()
|
|
|
|
// Ensure launcher is cleaned up
|
|
RC_CLEANUP_LAUNCHER()
|
|
|
|
// If the mission was triggered then additional mission cleanup will be required.
|
|
IF (Random_Character_Cleanup_If_Triggered())
|
|
CPRINTLN(DEBUG_MISSION,"...Random Character Script was triggered so additional cleanup required")
|
|
RELEASE_THELASTONE_MODELS()
|
|
ENDIF
|
|
|
|
IF IS_PED_UNINJURED(PLAYER_PED_ID())
|
|
TASK_CLEAR_LOOK_AT(PLAYER_PED_ID())
|
|
ENDIF
|
|
|
|
SET_WANTED_LEVEL_MULTIPLIER(1.0)
|
|
|
|
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
STOP_SCRIPTED_CONVERSATION(FALSE)
|
|
ENDIF
|
|
|
|
RESET_AI_MELEE_WEAPON_DAMAGE_MODIFIER()
|
|
RESET_AI_WEAPON_DAMAGE_MODIFIER()
|
|
SET_PLAYER_MELEE_WEAPON_DEFENSE_MODIFIER(PLAYER_ID(), 1.0)
|
|
SET_PLAYER_MELEE_WEAPON_DAMAGE_MODIFIER(PLAYER_ID(), 1.0)
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("SASQUATCH_MIX")
|
|
STOP_AUDIO_SCENE("SASQUATCH_MIX")
|
|
ENDIF
|
|
|
|
SET_PED_MODEL_IS_SUPPRESSED(model_Lion, FALSE)
|
|
|
|
RELEASE_THELASTONE(FALSE)
|
|
RELEASE_LIONS(FALSE)
|
|
RELEASE_START_SCENE(FALSE)
|
|
SAFE_RELEASE_VEHICLE(viMissionFinishedVehicle)
|
|
|
|
//DELETE_WAYPOINTS()
|
|
|
|
SET_PED_PATHS_BACK_TO_ORIGINAL(vIntroAreaMin, vIntroAreaMax)
|
|
SET_SCENARIO_TYPE_ENABLED("WORLD_HUMAN_HIKER",TRUE)
|
|
SET_SCENARIO_TYPE_ENABLED("WORLD_MOUNTAIN_LION_WANDER",TRUE)
|
|
|
|
//Cleanup the scene created by the launcher
|
|
RC_CleanupSceneEntities(sRCLauncherDataLocal, FALSE)
|
|
TERMINATE_THIS_THREAD()
|
|
|
|
ENDPROC
|
|
|
|
|
|
// -----------------------------------------------------------------------------------------------------------
|
|
// Script Pass
|
|
// -----------------------------------------------------------------------------------------------------------
|
|
|
|
/// PURPOSE:
|
|
/// Passes the mission
|
|
PROC Script_Passed()
|
|
IF bToScatOnFoot
|
|
INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(TLO_TO_SITE_ON_FOOT)
|
|
ENDIF
|
|
|
|
Script_TextCleanup()
|
|
Random_Character_Passed(CP_RAND_C_SAS1)
|
|
Script_Cleanup()
|
|
|
|
ENDPROC
|
|
|
|
// ===========================================================================================================
|
|
// STAGES
|
|
// ===========================================================================================================
|
|
/// PURPOSE:
|
|
/// Loads the audio and text used by the mission, creates the set dressing for the intro. Skips to the appropriate stage on a replay
|
|
PROC STAGE_Init()
|
|
IF REQUEST_SCRIPT_AUDIO_BANK("SCRIPT\\SAS_BANK_01") AND REQUEST_SCRIPT_AUDIO_BANK("SCRIPT\\SAS_BANK_02") AND REQUEST_SCRIPT_AUDIO_BANK("SAS_BANK_03") AND LOAD_TEXT() AND ATTEMPT_CREATE_DRESSING()
|
|
CPRINTLN(DEBUG_MISSION,"STAGE_Init")
|
|
|
|
// Disable the ambient audio zone
|
|
IF IS_AMBIENT_ZONE_ENABLED("AZ_DISTANT_SASQUATCH")
|
|
SET_AMBIENT_ZONE_STATE_PERSISTENT("AZ_DISTANT_SASQUATCH", FALSE, TRUE)
|
|
ENDIF
|
|
|
|
SET_PED_MODEL_IS_SUPPRESSED(model_Lion, TRUE)
|
|
|
|
IF IS_PED_UNINJURED(PLAYER_PED_ID())
|
|
ADD_PED_FOR_DIALOGUE(pedsForConversation, 1, PLAYER_PED_ID(), "FRANKLIN")
|
|
ENDIF
|
|
|
|
IF Is_Replay_In_Progress()
|
|
INT iReplayStage = GET_REPLAY_MID_MISSION_STAGE()
|
|
|
|
IF g_bShitskipAccepted = TRUE
|
|
IF iReplayStage = CP_INTRO
|
|
iReplayStage = CP_CHASE
|
|
ELSE
|
|
iReplayStage++
|
|
ENDIF
|
|
bToScatOnFoot = FALSE
|
|
ENDIF
|
|
|
|
AMMO_TYPE eAmmoType
|
|
IF HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN)
|
|
eAmmoType = GET_PED_AMMO_TYPE_FROM_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN)
|
|
IF GET_PED_AMMO_BY_TYPE(PLAYER_PED_ID(), eAmmoType) < 8
|
|
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN, 8, TRUE)
|
|
ENDIF
|
|
ELSE
|
|
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_PUMPSHOTGUN, 8, TRUE)
|
|
ENDIF
|
|
|
|
SWITCH iReplayStage
|
|
CASE CP_INTRO
|
|
START_REPLAY_SETUP(vPos_StartPlayerSpawn, fRot_StartPlayerSpawn)
|
|
QUEUE_CP_SKIP(CP_GOTOVALLEY)
|
|
CHANGE_MISSION_STAGE()
|
|
BREAK
|
|
|
|
CASE CP_CHASE
|
|
START_REPLAY_SETUP(vPos_ChasePlayerStart, fRot_ChasePlayerStart)
|
|
QUEUE_CP_SKIP(CP_CHASE)
|
|
CHANGE_MISSION_STAGE()
|
|
BREAK
|
|
|
|
CASE CP_END_OF_CHASE
|
|
START_REPLAY_SETUP(<<-1518.7616, 4540.3525, 44.5008>>, 95.2894)
|
|
QUEUE_CP_SKIP(CP_END_OF_CHASE)
|
|
CHANGE_MISSION_STAGE()
|
|
BREAK
|
|
|
|
CASE CP_OUTRO
|
|
//START_REPLAY_SETUP(<<-1518.7616, 4540.3525, 44.5008>>, 95.2894)
|
|
QUEUE_CP_SKIP(CP_OUTRO)
|
|
CHANGE_MISSION_STAGE()
|
|
BREAK
|
|
|
|
DEFAULT
|
|
SCRIPT_ASSERT("Replay in progress: Unknown checkpoint selected")
|
|
BREAK
|
|
ENDSWITCH
|
|
ELSE
|
|
IF IS_REPEAT_PLAY_ACTIVE()
|
|
//REQUEST_CUTSCENE("sas_1_rcm")
|
|
REQUEST_CUTSCENE_WITH_PLAYBACK_LIST("sas_1_rcm_concat", CS_SECTION_1 | CS_SECTION_3)
|
|
WHILE NOT HAS_CUTSCENE_LOADED_WITH_FAILSAFE()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
ENDIF
|
|
REQUEST_ANIM_DICT(animdict_Plead)
|
|
REQUEST_ANIM_DICT(animdict_Leadout)
|
|
QUEUE_MISSION_STAGE(MS_INTRO)
|
|
CHANGE_MISSION_STAGE()
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Plays the intro
|
|
PROC STAGE_Intro()
|
|
|
|
// Mocap scene
|
|
// -------------
|
|
IF g_mission.bSyncForSkip = TRUE
|
|
CPRINTLN(DEBUG_MISSION,"Skipping to STAGE_Intro")
|
|
RC_START_Z_SKIP()
|
|
|
|
RELEASE_THELASTONE(TRUE)
|
|
RELEASE_LIONS(TRUE)
|
|
RELEASE_START_SCENE(TRUE)
|
|
RC_CleanupSceneEntities(sRCLauncherDataLocal, TRUE, TRUE, TRUE)
|
|
|
|
// Re-create the initial scene
|
|
eInitialSceneStage = IS_REQUEST_SCENE
|
|
WHILE NOT SetupScene_TheLastOne(sRCLauncherDataLocal)
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
IF HAS_CUTSCENE_LOADED_WITH_FAILSAFE()
|
|
REMOVE_CUTSCENE()
|
|
ENDIF
|
|
|
|
WAIT_FOR_WORLD_TO_LOAD(GET_ENTITY_COORDS(PLAYER_PED_ID()))
|
|
RC_END_Z_SKIP()
|
|
g_mission.bSyncForSkip = FALSE
|
|
ENDIF
|
|
|
|
IF g_mission.section = SECTION_SETUP
|
|
//RC_REQUEST_CUTSCENE("sas_1_rcm")
|
|
RC_PRE_REQUEST_CUTSCENE(FALSE)
|
|
FLOAT fDistPlayerSectionOne
|
|
fDistPlayerSectionOne = GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), <<-1295.843628,4641.988281,105.332458>>)
|
|
FLOAT fDistPlayerSectionTwo
|
|
fDistPlayerSectionTwo = GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), <<-1301.435303,4641.213867,105.624947>>)
|
|
FLOAT fDifference
|
|
fDifference = fDistPlayerSectionOne - fDistPlayerSectionTwo
|
|
IF fDifference < 0
|
|
fDifference *= -1
|
|
ENDIF
|
|
// Don't load new cutscenes if the player is in the middle of the two locates
|
|
//IF fDifference > 0.5//1
|
|
IF fDistPlayerSectionOne < fDistPlayerSectionTwo
|
|
REQUEST_CUTSCENE_WITH_PLAYBACK_LIST("sas_1_rcm_concat", CS_SECTION_1 | CS_SECTION_3)
|
|
ELSE
|
|
REQUEST_CUTSCENE_WITH_PLAYBACK_LIST("sas_1_rcm_concat", CS_SECTION_2 | CS_SECTION_3)
|
|
ENDIF
|
|
//ENDIF
|
|
IF RC_IS_CUTSCENE_OK_TO_START()
|
|
CREATE_PICKUPS()
|
|
/*IF IS_VEHICLE_OK(sRCLauncherDataLocal.vehID[HUNTER_ID])
|
|
SET_ENTITY_COORDS(sRCLauncherDataLocal.vehID[HUNTER_ID], << -1303.1628, 4648.0850, 104.9664 >>)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(sRCLauncherDataLocal.vehID[HUNTER_ID])
|
|
ACTIVATE_PHYSICS(sRCLauncherDataLocal.vehID[HUNTER_ID])
|
|
SET_ENTITY_HEADING(sRCLauncherDataLocal.vehID[HUNTER_ID], 293.1504)
|
|
ENDIF*/
|
|
|
|
IF IS_PED_UNINJURED(PLAYER_PED_ID())
|
|
REGISTER_ENTITY_FOR_CUTSCENE(PLAYER_PED_ID(), "Franklin", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
// Insert hunter ped into cutscene
|
|
IF IS_PED_UNINJURED(sRCLauncherDataLocal.pedID[HUNTER_ID])
|
|
REGISTER_ENTITY_FOR_CUTSCENE(sRCLauncherDataLocal.pedID[HUNTER_ID], "Hunter", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
oiRifle = CREATE_WEAPON_OBJECT_FROM_CURRENT_PED_WEAPON_WITH_COMPONENTS(sRCLauncherDataLocal.pedID[HUNTER_ID])
|
|
IF DOES_ENTITY_EXIST(oiRifle)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(oiRifle, "SAS_SniperRifle", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SAFE_FADE_SCREEN_IN_FROM_BLACK(500, FALSE)
|
|
|
|
// stop peds walking through the intro
|
|
SET_PED_PATHS_IN_AREA(vIntroAreaMin, vIntroAreaMax, FALSE)
|
|
SET_SCENARIO_TYPE_ENABLED("WORLD_HUMAN_HIKER",FALSE)
|
|
SET_SCENARIO_TYPE_ENABLED("WORLD_MOUNTAIN_LION_WANDER",FALSE)
|
|
|
|
RC_CLEANUP_LAUNCHER()
|
|
START_CUTSCENE()
|
|
WAIT(0)
|
|
REPLAY_CHECK_FOR_EVENT_THIS_FRAME("SF_TheLastOne")
|
|
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA_WITH_SIZE_LIMIT(vIntroAreaPos1, vIntroAreaPos2, fIntroAreaWidth, <<-1310.38, 4642.96, 107.35>>, 313.34, GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR())
|
|
RC_START_CUTSCENE_MODE(<< -1298.98, 4640.16, 105.67>>)
|
|
CLEAR_AREA(<< -1561.793213, 4668.805664, 48.043373 >>, 218.907410, TRUE)
|
|
|
|
LOAD_START_MODELS()
|
|
CPRINTLN(DEBUG_MISSION,"Setup STAGE_Intro")
|
|
|
|
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
ENDIF
|
|
|
|
g_mission.section = SECTION_RUNNING
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF g_mission.section = SECTION_RUNNING
|
|
IF DOES_ENTITY_EXIST(PLAYER_PED_ID())
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Franklin")
|
|
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
ENDIF
|
|
/*SET_ENTITY_COORDS(PLAYER_PED_ID(), vPos_StartPlayerSpawn)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), fRot_StartPlayerSpawn)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(-11.3366)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(6.5818)*/
|
|
ENDIF
|
|
ENDIF
|
|
IF IS_PED_UNINJURED(sRCLauncherDataLocal.pedID[HUNTER_ID])
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Hunter")
|
|
gStartScene.hHunter = sRCLauncherDataLocal.pedID[HUNTER_ID]
|
|
/*SET_ENTITY_COORDS(gStartScene.hHunter, vPos_StartHunterSpawn)
|
|
SET_ENTITY_HEADING(gStartScene.hHunter, fRot_StartHunterSpawn)*/
|
|
|
|
IF SETUP_START_SCENE_PED(gStartScene.hHunter, RELGROUPHASH_PLAYER, weapon_HunterGun)
|
|
//TASK_LOOK_AT_ENTITY(gStartScene.hHunter, PLAYER_PED_ID(), -1, SLF_USE_TORSO)
|
|
IF HAS_ANIM_DICT_LOADED(animdict_Plead)
|
|
/*SEQUENCE_INDEX siHunter
|
|
OPEN_SEQUENCE_TASK(siHunter)
|
|
TASK_PLAY_ANIM(NULL, animdict_Plead, "hunter_leadout", NORMAL_BLEND_IN, SLOW_BLEND_OUT)
|
|
TASK_PLAY_ANIM(NULL, animdict_Plead, "hunter_idle", NORMAL_BLEND_IN, SLOW_BLEND_OUT)
|
|
TASK_PLAY_ANIM(NULL, animdict_Plead, "hunter_idle_action", NORMAL_BLEND_IN, SLOW_BLEND_OUT)
|
|
TASK_PLAY_ANIM(NULL, animdict_Plead, "hunter_idle_look", NORMAL_BLEND_IN, SLOW_BLEND_OUT)
|
|
//TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID(), -1)
|
|
CLOSE_SEQUENCE_TASK(siHunter)
|
|
TASK_PERFORM_SEQUENCE(gStartScene.hHunter, siHunter)
|
|
CLEAR_SEQUENCE_TASK(siHunter)*/
|
|
TASK_PLAY_ANIM(gStartScene.hHunter, animdict_Plead, "hunter_leadout", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, eHunterAnimFlags)
|
|
//FREEZE_ENTITY_POSITION(gStartScene.hHunter, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
|
|
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF g_mission.bRequestJSkip
|
|
STOP_CUTSCENE()
|
|
QUEUE_MISSION_STAGE(MS_GOTOVALLEY)
|
|
g_mission.section = SECTION_CLEANUP
|
|
|
|
ELIF g_mission.bRequestCpSkip
|
|
STOP_CUTSCENE()
|
|
g_mission.section = SECTION_CLEANUP
|
|
|
|
ELIF HAS_CUTSCENE_FINISHED()
|
|
LOAD_START_MODELS()
|
|
IF HAVE_START_MODELS_LOADED()
|
|
g_mission.section = SECTION_CLEANUP
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF g_mission.section = SECTION_CLEANUP
|
|
IF HAS_CUTSCENE_FINISHED()
|
|
REPLAY_STOP_EVENT()
|
|
RC_END_CUTSCENE_MODE(true, TRUE, TRUE, FALSE)
|
|
RC_SET_ENTITY_PROOFS_FOR_CUTSCENE(sRCLauncherDataLocal, FALSE)
|
|
SAFE_DELETE_OBJECT(oiRifle)
|
|
/*IF IS_PED_UNINJURED(sRCLauncherDataLocal.pedID[HUNTER_ID])
|
|
gStartScene.hHunter = sRCLauncherDataLocal.pedID[HUNTER_ID]
|
|
SET_ENTITY_COORDS(gStartScene.hHunter, vPos_StartHunterSpawn)
|
|
//SET_ENTITY_HEADING(gStartScene.hHunter, fRot_StartHunterSpawn)
|
|
|
|
IF SETUP_START_SCENE_PED(gStartScene.hHunter, RELGROUPHASH_PLAYER, weapon_HunterGun)
|
|
TASK_LOOK_AT_ENTITY(gStartScene.hHunter, PLAYER_PED_ID(), -1, SLF_USE_TORSO)
|
|
ENDIF
|
|
ENDIF*/
|
|
//SET_PED_PATHS_BACK_TO_ORIGINAL(vIntroAreaMin, vIntroAreaMax)
|
|
iBlockLookBehind = GET_GAME_TIMER() + 500
|
|
CPRINTLN(DEBUG_MISSION,"Cleanup STAGE_Intro")
|
|
QUEUE_MISSION_STAGE(MS_GOTOVALLEY)
|
|
CHANGE_MISSION_STAGE()
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC TRIGGER_HUNTER_ANIMS()
|
|
IF g_bStartAnimSequence AND IS_PED_UNINJURED(gStartScene.hHunter)
|
|
IF IS_ENTITY_PLAYING_ANIM(gStartScene.hHunter, animdict_Plead, "hunter_leadout")
|
|
IF GET_ENTITY_ANIM_CURRENT_TIME(gStartScene.hHunter,animdict_Plead,"hunter_leadout") > 0.9
|
|
IF HAS_ANIM_DICT_LOADED(animdict_Plead)
|
|
SEQUENCE_INDEX siHunter
|
|
OPEN_SEQUENCE_TASK(siHunter)
|
|
TASK_PLAY_ANIM(NULL, animdict_Plead, "hunter_idle", NORMAL_BLEND_IN, INSTANT_BLEND_OUT, -1, eHunterAnimFlags)
|
|
TASK_PLAY_ANIM(NULL, animdict_Plead, "hunter_idle_action", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, eHunterAnimFlags)
|
|
TASK_PLAY_ANIM(NULL, animdict_Plead, "hunter_idle_look", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, eHunterAnimFlags)
|
|
TASK_PLAY_ANIM(NULL, animdict_Plead, "hunter_idle_action", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, eHunterAnimFlags)
|
|
TASK_PLAY_ANIM(NULL, animdict_Plead, "hunter_idle", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, eHunterAnimFlags)
|
|
TASK_PLAY_ANIM(NULL, animdict_Plead, "hunter_idle", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, eHunterAnimFlags)
|
|
TASK_PLAY_ANIM(NULL, animdict_Plead, "hunter_idle_look", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, eHunterAnimFlags)
|
|
SET_SEQUENCE_TO_REPEAT(siHunter, REPEAT_FOREVER)
|
|
CLOSE_SEQUENCE_TASK(siHunter)
|
|
TASK_PERFORM_SEQUENCE(gStartScene.hHunter, siHunter)
|
|
CLEAR_SEQUENCE_TASK(siHunter)
|
|
g_bStartAnimSequence = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Plays a comversation if the appropriate timer has expired
|
|
/// PARAMS:
|
|
/// iConvTimer - The timer to check
|
|
/// iTimeIncrease - The amount of time to increase the timer by if the conversation plays
|
|
/// sDialogue - The conversation to play
|
|
PROC PlayHunterDialogue(INT & iConvTimer, INT iTimeIncrease, STRING sDialogue)
|
|
IF GET_GAME_TIMER() > iConvTimer
|
|
ADD_PED_FOR_DIALOGUE(pedsForConversation, 4, gStartScene.hHunter, "HUNTER")
|
|
IF IS_MESSAGE_BEING_DISPLAYED()
|
|
IF CREATE_CONVERSATION(pedsForConversation, "SAS1AUD", sDialogue, CONV_PRIORITY_MEDIUM, DO_NOT_DISPLAY_SUBTITLES)
|
|
iConvTimer = GET_GAME_TIMER() + iTimeIncrease
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(pedsForConversation, "SAS1AUD", sDialogue, CONV_PRIORITY_MEDIUM)
|
|
iConvTimer = GET_GAME_TIMER() + iTimeIncrease
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Controls dialogue from the hunter if the player aims at him, bumps into him, shoots nearby or hangs around
|
|
/// Only play lines if the player is within 50m of the hunter
|
|
PROC CONTROL_HUNTER_CONVS()
|
|
IF IS_PED_UNINJURED(gStartScene.hHunter) AND IS_PED_UNINJURED(PLAYER_PED_ID())
|
|
IF IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), gStartScene.hHunter, 50)
|
|
// Dialogue for the player aiming at the hunter
|
|
IF IS_PLAYER_VISIBLY_TARGETTING_PED(gStartScene.hHunter)
|
|
PlayHunterDialogue(iTargetTimer, TARGET_TIME, "SAS1_TARGET")
|
|
ENDIF
|
|
|
|
// Dialogue for the player shooting in the same area as the hunter
|
|
IF IS_PED_SHOOTING(PLAYER_PED_ID())
|
|
PlayHunterDialogue(iShootTimer, SHOOT_TIME, "SAS1_GUN")
|
|
ENDIF
|
|
|
|
// Dialogue for the player bumping into the hunter
|
|
IF IS_ENTITY_TOUCHING_ENTITY(PLAYER_PED_ID(), gStartScene.hHunter)
|
|
PlayHunterDialogue(iBumpTimer, BUMP_TIME, "SAS1_BUMP")
|
|
ENDIF
|
|
|
|
// Dialogue for the player hanging around
|
|
PlayHunterDialogue(iReturnTimer, RETURN_TIME, "SAS1_RETURN")
|
|
ELSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// The player drives to the scat site and hears the Last One
|
|
PROC STAGE_GoToValley()
|
|
|
|
IF GET_GAME_TIMER() > iBlockLookBehind AND iBlockLookBehind > 0
|
|
//DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_BEHIND)
|
|
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
iBlockLookBehind = -1
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF g_mission.bSyncForSkip = TRUE
|
|
RC_START_Z_SKIP()
|
|
CPRINTLN(DEBUG_MISSION,"Skipping to STAGE_GoToValley")
|
|
//-- Sync for skip
|
|
RELEASE_THELASTONE(TRUE)
|
|
RELEASE_LIONS(TRUE)
|
|
RELEASE_START_SCENE(TRUE)
|
|
RC_CleanupSceneEntities(sRCLauncherDataLocal, TRUE, TRUE, TRUE)
|
|
|
|
// Re-create the initial scene
|
|
eInitialSceneStage = IS_REQUEST_SCENE
|
|
WHILE NOT SetupScene_TheLastOne(sRCLauncherDataLocal)
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
LOAD_START_MODELS()
|
|
WHILE NOT HAVE_START_MODELS_LOADED()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
CREATE_START_SCENE()
|
|
|
|
WHILE NOT LOAD_TEXT()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
WHILE NOT ATTEMPT_CREATE_DRESSING()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
g_bStartAnimSequence = TRUE
|
|
|
|
IF IS_REPLAY_BEING_SET_UP()
|
|
END_REPLAY_SETUP()
|
|
ELSE
|
|
WAIT_FOR_WORLD_TO_LOAD(GET_ENTITY_COORDS(PLAYER_PED_ID()))
|
|
ENDIF
|
|
|
|
RC_END_Z_SKIP()
|
|
g_mission.bSyncForSkip = FALSE
|
|
ENDIF
|
|
|
|
IF g_mission.section = SECTION_SETUP
|
|
// Create start scene
|
|
LOAD_START_MODELS()
|
|
IF HAVE_START_MODELS_LOADED()
|
|
//CREATE_START_SCENE(FALSE)
|
|
RELEASE_START_MODELS()
|
|
|
|
IF IS_PED_UNINJURED(gStartScene.hHunter)
|
|
SET_PED_CONFIG_FLAG(gStartScene.hHunter, PCF_UseKinematicModeWhenStationary, TRUE)
|
|
SET_PED_CAN_RAGDOLL_FROM_PLAYER_IMPACT(gStartScene.hHunter, FALSE)
|
|
ENDIF
|
|
|
|
g_hBlip = ADD_BLIP_FOR_RADIUS(vPos_Valley, 75.0)
|
|
SET_BLIP_COLOUR(g_hBlip, BLIP_COLOUR_YELLOW)
|
|
SET_BLIP_ALPHA(g_hBlip , 128)
|
|
SHOW_HEIGHT_ON_BLIP(g_hBlip, FALSE)
|
|
|
|
/*LOAD_THELASTONE_MODELS()
|
|
LOAD_LION_MODELS()*/
|
|
|
|
CLEAR_AREA(vClearZone0, 100, TRUE)
|
|
CLEAR_AREA(vClearZone1, 100, TRUE)
|
|
CLEAR_AREA(vClearZone2, 100, TRUE)
|
|
CLEAR_AREA(vClearZone3, 100, TRUE)
|
|
|
|
g_bObjDoneGotoValley = FALSE
|
|
g_bObjDoneLeavingValley = FALSE
|
|
//g_bHintGiven = FALSE
|
|
g_bObjDoneInvestigate = FALSE
|
|
|
|
g_bAudDoneStartGoValley = FALSE
|
|
g_bAudDoneStartGetGun = FALSE
|
|
g_bAudDoneHowl = FALSE
|
|
g_bAudDoneHeardHowl = FALSE
|
|
|
|
//g_bPrintCarObj = TRUE
|
|
|
|
g_bDestroyCarConvReady = TRUE
|
|
|
|
g_bStartAnimSequence = TRUE
|
|
|
|
bLoadChaseModels = TRUE
|
|
|
|
iReturnTimer = GET_GAME_TIMER() + RETURN_TIME
|
|
|
|
START_AUDIO_SCENE("SASQUATCH_MIX")
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(3.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
CPRINTLN(DEBUG_MISSION,"Setup STAGE_GoToValley")
|
|
g_mission.section = SECTION_RUNNING
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF g_mission.section = SECTION_RUNNING
|
|
|
|
CHECK_FOR_DEAD_ANIMALS()
|
|
UPDATE_PEDSIGHT_TESTS()
|
|
TRIGGER_HUNTER_ANIMS()
|
|
|
|
//--- Check state fail conditions + stage skips
|
|
IF NOT IS_PED_UNINJURED(PLAYER_PED_ID())
|
|
QUEUE_MISSION_STAGE(MS_FAILED)
|
|
g_mission.failReason = FAIL_REASON_PLAYER_DEAD
|
|
g_mission.section = SECTION_CLEANUP
|
|
|
|
ELIF IS_PED_HARMED(gStartScene.hHunter)
|
|
QUEUE_MISSION_STAGE(MS_FAILED)
|
|
PRINT_NOW("Hunnter dead", 7000, 1)
|
|
g_mission.failReason = FAIL_REASON_HUNTER_DEAD
|
|
g_mission.section = SECTION_CLEANUP
|
|
|
|
// Only fail if the player is actually attacking the hunter, have dialogue for aiming and shooting in the general area
|
|
ELIF HAS_PLAYER_THREATENED_PED(gStartScene.hHunter, FALSE, 70, 170, TRUE)
|
|
OR NOT IS_ENTITY_IN_RANGE_COORDS(gStartScene.hHunter, vPos_CheckHunterPushed, 1.5)
|
|
OR IS_PED_RAGDOLL(gStartScene.hHunter)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(gStartScene.hHunter, RELGROUPHASH_HATES_PLAYER)
|
|
TASK_COMBAT_PED(gStartScene.hHunter, PLAYER_PED_ID())
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
//ADD_NON_CRITICAL_STANDARD_CONVERSATION_TO_BUFFER(pedsForConversation, "SAS1AUD", "SAS1_START3", CONV_PRIORITY_MEDIUM, DO_NOT_DISPLAY_SUBTITLES)
|
|
|
|
QUEUE_MISSION_STAGE(MS_FAILED)
|
|
g_mission.failReason = FAIL_REASON_HUNTER_THREATENED
|
|
g_mission.section = SECTION_CLEANUP
|
|
|
|
/*ELIF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vPos_ChasePlayerStart, <<6.0, 6.0, 6.0>>)
|
|
QUEUE_MISSION_STAGE(MS_CHASE)
|
|
g_mission.section = SECTION_CLEANUP*/
|
|
|
|
ELIF g_mission.bRequestCpSkip
|
|
g_mission.section = SECTION_CLEANUP
|
|
|
|
ELIF g_mission.bRequestJSkip
|
|
QUEUE_MISSION_STAGE(MS_CHASE)
|
|
g_mission.section = SECTION_CLEANUP
|
|
|
|
ELIF g_mission.bRequestPSkip
|
|
QUEUE_MISSION_STAGE(MS_INTRO)
|
|
g_mission.section = SECTION_CLEANUP
|
|
|
|
ELSE
|
|
// Update hunter to face player
|
|
/*VECTOR vPedToPlayer = GET_ENTITY_COORDS(PLAYER_PED_ID()) - GET_ENTITY_COORDS(gStartScene.hHunter)
|
|
VECTOR vPedForward = GET_ENTITY_FORWARD_VECTOR(gStartScene.hHunter)
|
|
IF GET_SCRIPT_TASK_STATUS(gStartScene.hHunter, SCRIPT_TASK_TURN_PED_TO_FACE_ENTITY) <> PERFORMING_TASK
|
|
AND ABSF(GET_ANGLE_BETWEEN_2D_VECTORS(vPedToPlayer.x, vPedToPlayer.y, vPedForward.x, vPedForward.y)) > 65
|
|
TASK_TURN_PED_TO_FACE_ENTITY(gStartScene.hHunter, PLAYER_PED_ID(), 1500)
|
|
ENDIF*/
|
|
|
|
// Check if player is in valley
|
|
BOOL bIsPlayerInValley = IS_POINT_IN_POLY_2D(g_polyPlayArea, GET_ENTITY_COORDS(PLAYER_PED_ID()))
|
|
|
|
IF bLoadChaseModels AND IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), vPos_ScatSite, 250)
|
|
LOAD_THELASTONE_MODELS()
|
|
LOAD_LION_MODELS()
|
|
bLoadChaseModels = FALSE
|
|
ENDIF
|
|
|
|
// Check if the player is in a vehicle for the mission stat tracking
|
|
IF bToScatOnFoot
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
bToScatOnFoot = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
CONTROL_HUNTER_CONVS()
|
|
|
|
/*IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vPos_ScatSite, <<1,1,LOCATE_SIZE_HEIGHT>>, TRUE)
|
|
// need this here to avoid the locate chevron flashing off for a frame
|
|
ENDIF*/
|
|
|
|
IF g_bAudDoneStartGoValley = FALSE
|
|
/*IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vPos_ScatSite, <<1,1,LOCATE_SIZE_HEIGHT>>, TRUE)
|
|
// need this here to avoid the locate chevron flashing off for a frame
|
|
ENDIF*/
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
ADD_PED_FOR_DIALOGUE(pedsForConversation, 4, gStartScene.hHunter, "HUNTER")
|
|
//IF CREATE_CONVERSATION(pedsForConversation, "SAS1AUD", "SAS1_START1", CONV_PRIORITY_MEDIUM) // Conversation: "Scat sites down in the valley"
|
|
IF CREATE_MULTIPART_CONVERSATION_WITH_3_LINES(pedsForConversation, "SAS1AUD", "SAS1_LO", "SAS1_LO_1", "SAS1_START1", "SAS1_START1_1", "SAS1_START1", "SAS1_START1_2", CONV_PRIORITY_MEDIUM)
|
|
g_bAudDoneStartGoValley = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ELIF g_bAudDoneStartGetGun = FALSE
|
|
/*IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vPos_ScatSite, <<1,1,LOCATE_SIZE_HEIGHT>>, TRUE)
|
|
// need this here to avoid the locate chevron flashing off for a frame
|
|
ENDIF*/
|
|
CheckHunterCar()
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
ADD_PED_FOR_DIALOGUE(pedsForConversation, 4, gStartScene.hHunter, "HUNTER")
|
|
|
|
IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), gStartScene.hHunter, <<25,25,25>>)
|
|
IF HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_ADVANCEDRIFLE)
|
|
OR HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_ASSAULTRIFLE)
|
|
OR HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_CARBINERIFLE)
|
|
OR HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_DLC_SPECIALCARBINE)
|
|
OR HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_SNIPERRIFLE)
|
|
IF CREATE_CONVERSATION(pedsForConversation, "SAS1AUD", "SAS1_START2", CONV_PRIORITY_MEDIUM) // Conversation: "If I hear them terrible howls I know you found him..."
|
|
g_bAudDoneStartGetGun = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(pedsForConversation, "SAS1AUD", "SAS1_START1B", CONV_PRIORITY_MEDIUM) // Conversation: "Better take a rifle, city boy"
|
|
g_bAudDoneStartGetGun = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
g_bAudDoneStartGetGun = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ELIF g_bObjDoneGotoValley = FALSE
|
|
/*IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vPos_ScatSite, <<1,1,LOCATE_SIZE_HEIGHT>>, TRUE)
|
|
// need this here to avoid the locate chevron flashing off for a frame
|
|
ENDIF*/
|
|
CheckHunterCar()
|
|
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), gStartScene.hHunter) > 25.0
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
ENDIF
|
|
ELSE
|
|
PRINT_NOW("SAS1_B1", DEFAULT_GOD_TEXT_TIME, 0) // Objective: Investigate the scat site
|
|
g_bObjDoneGotoValley = TRUE
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
/*IF g_bHintGiven = FALSE
|
|
IF IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), vPos_ScatSite, 25.0)
|
|
SET_GAMEPLAY_COORD_HINT(vPos_ScatSite, -1)
|
|
g_bHintGiven = TRUE
|
|
ENDIF
|
|
EL*/IF g_bObjDoneInvestigate = FALSE
|
|
/*IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vPos_ScatSite, <<1,1,LOCATE_SIZE_HEIGHT>>, TRUE)
|
|
// need this here to avoid the locate chevron flashing off for a frame
|
|
ENDIF*/
|
|
IF IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), vPos_ScatSite, 5)
|
|
/*IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
IF g_bPrintCarObj
|
|
PRINT_NOW("SAS1_CAR", DEFAULT_GOD_TEXT_TIME, 0) // Leave your vehicle.
|
|
g_bPrintCarObj = FALSE
|
|
ENDIF
|
|
ELSE
|
|
IF IS_THIS_PRINT_BEING_DISPLAYED("SAS1_CAR")
|
|
CLEAR_THIS_PRINT("SAS1_CAR")
|
|
ENDIF*/
|
|
ADD_PED_FOR_DIALOGUE(pedsForConversation, 1, PLAYER_PED_ID(), "FRANKLIN") // Dialogue: "Damn that's nasty."
|
|
IF CREATE_CONVERSATION(pedsForConversation, "SAS1AUD", "SAS1_SCAT", CONV_PRIORITY_MEDIUM)
|
|
REPLAY_RECORD_BACK_FOR_TIME(2.0, 4.0)
|
|
//SAFE_REMOVE_BLIP(g_hBlip)
|
|
g_bObjDoneInvestigate = TRUE
|
|
//iHowlTimer = -1
|
|
ENDIF
|
|
//ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF g_bAudDoneHowl = FALSE
|
|
/*IF NOT IS_PED_STOPPED(PLAYER_PED_ID())
|
|
STOP_GAMEPLAY_HINT()
|
|
ENDIF*/
|
|
|
|
IF IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), gTrail.nodes[0].vPedSpawn, 40)
|
|
//IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
/*IF iHowlTimer < 0
|
|
iHowlTimer = GET_GAME_TIMER() + HOWL_TIME
|
|
ELIF GET_GAME_TIMER() > iHowlTimer AND HAVE_THELASTONE_MODELS_LOADED()*/
|
|
IF CREATE_THELASTONE()
|
|
SAFE_REMOVE_BLIP(g_hBlip)
|
|
gTheLastOne.hBlip = CREATE_PED_BLIP(gTheLastOne.hPed)
|
|
SET_BLIP_SCALE(gTheLastOne.hBlip, BLIP_SIZE_VEHICLE)
|
|
PLAY_SOUND_FROM_COORD(gTheLastOne.hHowlSnd, "ALERT", <<-1541.9651, 4692.7246, 44.0651>>, "SASQUATCH_01_SOUNDSET") // Audio: Howl
|
|
TRIGGER_SONAR_BLIP(GET_ENTITY_COORDS(gTheLastOne.hPed), 30, HUD_COLOUR_RED)
|
|
TASK_LOOK_AT_COORD(PLAYER_PED_ID(), gTrail.nodes[0].vPedSpawn, 6000, SLF_USE_TORSO)
|
|
//STOP_GAMEPLAY_HINT()
|
|
g_bAudDoneHowl = TRUE
|
|
iHowlTimer = -1
|
|
|
|
// Clear areas over hill
|
|
CLEAR_ROUTE_AREAS()
|
|
ENDIF
|
|
//ENDIF
|
|
ENDIF
|
|
|
|
ELIF g_bAudDoneHeardHowl = FALSE
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF iHowlTimer < 0
|
|
iHowlTimer = GET_GAME_TIMER() + HOWL_TIME
|
|
ELIF GET_GAME_TIMER() > iHowlTimer
|
|
ADD_PED_FOR_DIALOGUE(pedsForConversation, 1, PLAYER_PED_ID(), "FRANKLIN")
|
|
IF CREATE_CONVERSATION(pedsForConversation, "SAS1AUD", "SAS1_CHASE1a", CONV_PRIORITY_MEDIUM) // Dialogue: "What in the hell was that"
|
|
g_bAudDoneHeardHowl = TRUE
|
|
QUEUE_MISSION_STAGE(MS_CHASE)
|
|
g_mission.section = SECTION_CLEANUP
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
/*ELIF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
QUEUE_MISSION_STAGE(MS_CHASE)
|
|
g_mission.section = SECTION_CLEANUP*/
|
|
ENDIF
|
|
|
|
IF g_bObjDoneLeavingValley = FALSE
|
|
IF bIsPlayerInValley = FALSE
|
|
PRINT_NOW("SAS1_A0", DEFAULT_GOD_TEXT_TIME, 0) // Objective: Don't leave the valley
|
|
g_bObjDoneLeavingValley = TRUE
|
|
g_iPlayerLeavingTimer = GET_GAME_TIMER() + PLAYER_LEAVING_RESET_TIME
|
|
ENDIF
|
|
|
|
ELIF GET_GAME_TIMER() > g_iPlayerLeavingTimer
|
|
IF bIsPlayerInValley
|
|
g_bObjDoneLeavingValley = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF g_mission.section = SECTION_CLEANUP
|
|
SAFE_REMOVE_BLIP(g_hBlip)
|
|
CPRINTLN(DEBUG_MISSION,"Cleanup STAGE_GoToValley")
|
|
CHANGE_MISSION_STAGE()
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC SwitchToOutro()
|
|
CLEAR_PRINTS()
|
|
SAFE_REMOVE_BLIP(gTheLastOne.hBlip)
|
|
IF IS_POINT_IN_POLY_2D(g_polyCliffArea, GET_ENTITY_COORDS(gTheLastOne.hPed, FALSE))
|
|
g_bCutsceneInRoad = FALSE
|
|
ELSE
|
|
g_bCutsceneInRoad = TRUE
|
|
ENDIF
|
|
CHANGE_MISSION_STAGE()
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// The player chases the Last One
|
|
PROC STAGE_Chase()
|
|
|
|
IF g_mission.bSyncForSkip = TRUE
|
|
//-- Sync for skip
|
|
RC_START_Z_SKIP()
|
|
CPRINTLN(DEBUG_MISSION,"Skipping to STAGE_Chase")
|
|
RELEASE_THELASTONE(TRUE)
|
|
RELEASE_LIONS(TRUE)
|
|
RELEASE_START_SCENE(TRUE)
|
|
|
|
IF IS_PED_UNINJURED(PLAYER_PED_ID()) AND NOT IS_REPLAY_BEING_SET_UP()
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), vPos_ChasePlayerStart)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), fRot_ChasePlayerStart)
|
|
ENDIF
|
|
|
|
WHILE NOT LOAD_TEXT()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
WHILE NOT ATTEMPT_CREATE_DRESSING()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
IF IS_REPLAY_BEING_SET_UP()
|
|
END_REPLAY_SETUP()
|
|
ELSE
|
|
WAIT_FOR_WORLD_TO_LOAD(GET_ENTITY_COORDS(PLAYER_PED_ID()))
|
|
ENDIF
|
|
|
|
RC_END_Z_SKIP()
|
|
g_mission.bSyncForSkip = FALSE
|
|
ENDIF
|
|
|
|
IF g_mission.section = SECTION_SETUP
|
|
LOAD_THELASTONE_MODELS()
|
|
LOAD_LION_MODELS()
|
|
IF HAVE_THELASTONE_MODELS_LOADED()
|
|
AND HAVE_LION_MODELS_LOADED()
|
|
RELEASE_START_SCENE(FALSE)
|
|
|
|
IF NOT DOES_ENTITY_EXIST(gTheLastOne.hPed)
|
|
CREATE_THELASTONE()
|
|
ENDIF
|
|
CREATE_LIONS()
|
|
START_TRAIL()
|
|
|
|
//RELEASE_THELASTONE_MODELS()
|
|
RELEASE_LION_MODELS()
|
|
REQUEST_CUTSCENE("sas_2_rcm_t7") // Pre-request outro so it's ready at the end
|
|
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_CHASE, "Chase")
|
|
|
|
g_bAudDoneChase = FALSE
|
|
//g_bAudDoneWounded = FALSE
|
|
g_bAudDoneCornered = FALSE
|
|
|
|
/*iCurrentVehicleChaseLines = 0
|
|
sVehicleChaseLines[0] = "SAS1_VEHICLE_1"
|
|
sVehicleChaseLines[1] = "SAS1_VEHICLE_2"
|
|
sVehicleChaseLines[2] = "SAS1_VEHICLE_3"
|
|
iVehicleChaseLineTimer = 0*/
|
|
|
|
// Tone down the amount of damage the lions do
|
|
SET_AI_MELEE_WEAPON_DAMAGE_MODIFIER(0.2)
|
|
SET_AI_WEAPON_DAMAGE_MODIFIER(0.2)
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(3.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
iExplosionCounter = 0
|
|
iExplosionTimer = 0
|
|
bBlockedByCar = FALSE
|
|
|
|
g_bObjDoneChase = FALSE
|
|
g_bObjDoneLeavingValley = FALSE
|
|
CPRINTLN(DEBUG_MISSION,"Setup STAGE_Chase")
|
|
g_bHelpDoneListen = FALSE
|
|
g_mission.section = SECTION_RUNNING
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF g_mission.section = SECTION_RUNNING
|
|
|
|
//--- Check state fail conditions + stage skips
|
|
IF NOT IS_PED_UNINJURED(PLAYER_PED_ID())
|
|
QUEUE_MISSION_STAGE(MS_FAILED)
|
|
g_mission.failReason = FAIL_REASON_PLAYER_DEAD
|
|
g_mission.section = SECTION_CLEANUP
|
|
|
|
ELIF HAS_THELASTONE_HOWL_TIMED_OUT()
|
|
QUEUE_MISSION_STAGE(MS_FAILED)
|
|
g_mission.failReason = FAIL_REASON_LOST_THELASTONE
|
|
g_mission.section = SECTION_CLEANUP
|
|
|
|
ELIF NOT IS_PED_UNINJURED(gTheLastOne.hPed)
|
|
IF IS_EXPLOSION_IN_SPHERE(EXP_TAG_DONTCARE, GET_ENTITY_COORDS(gTheLastOne.hPed), 4.0)
|
|
OR bBlockedByCar
|
|
REPLAY_RECORD_BACK_FOR_TIME(3.0, 2.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
Script_Passed()
|
|
ELSE
|
|
QUEUE_MISSION_STAGE(MS_OUTRO)
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
iOutroStartTimer = GET_GAME_TIMER() + 3000
|
|
g_mission.section = SECTION_CLEANUP
|
|
SAFE_REMOVE_BLIP(gTheLastOne.hBlip)
|
|
ENDIF
|
|
|
|
ELIF IS_EXPLOSION_IN_SPHERE(EXP_TAG_DONTCARE, GET_ENTITY_COORDS(gTheLastOne.hPed), 4.0)
|
|
IF GET_GAME_TIMER() > iExplosionTimer
|
|
iExplosionCounter++
|
|
iExplosionTimer = GET_GAME_TIMER() + 1000
|
|
INFORM_MISSION_STATS_OF_INCREMENT(TLO_WOUNDS)
|
|
ENDIF
|
|
|
|
IF (g_bAudDoneCornered AND iExplosionCounter > 0) OR (NOT g_bAudDoneCornered AND iExplosionCounter > 1)
|
|
IF IS_PED_UNINJURED(gTheLastOne.hPed)
|
|
//EXPLODE_PED_HEAD(gTheLastOne.hPed)
|
|
SET_ENTITY_HEALTH(gTheLastOne.hPed, 99)
|
|
ENDIF
|
|
REPLAY_RECORD_BACK_FOR_TIME(3.0, 2, REPLAY_IMPORTANCE_HIGH) // Record the player exploding the sasquatch
|
|
Script_Passed()
|
|
ENDIF
|
|
|
|
ELIF g_mission.bRequestCpSkip
|
|
g_mission.section = SECTION_CLEANUP
|
|
|
|
ELIF g_mission.bRequestJSkip
|
|
IF g_bAudDoneCornered
|
|
QUEUE_MISSION_STAGE(MS_OUTRO)
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
iOutroStartTimer = GET_GAME_TIMER() + 3000
|
|
g_mission.section = SECTION_CLEANUP
|
|
ELSE
|
|
SKIP_TO_CHASE_END()
|
|
g_mission.bRequestJSkip = FALSE
|
|
g_mission.bRequestPSkip = FALSE
|
|
g_mission.bRequestCpSkip = FALSE
|
|
ENDIF
|
|
|
|
ELIF g_mission.bRequestPSkip
|
|
QUEUE_MISSION_STAGE(MS_GOTOVALLEY)
|
|
g_mission.section = SECTION_CLEANUP
|
|
|
|
//--- Update state
|
|
ELSE
|
|
UPDATE_TRAIL()
|
|
|
|
//PLAY_IN_VEHICLE_LINE()
|
|
|
|
CHECK_FOR_DEAD_ANIMALS()
|
|
CHECK_FOR_ORLEANS_INJURY()
|
|
|
|
IF gTrail.mode = DONE_STATE
|
|
gTrail.mode = SETUP_STATE
|
|
IF gTrail.curNode = 0 AND NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
gTrail.curNode = 2
|
|
ELSE
|
|
gTrail.curNode++
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), gTrail.nodes[10].vPedDest, DEFAULT_CUTSCENE_LOAD_DIST)
|
|
REQUEST_CUTSCENE("sas_2_rcm_t7") // Pre-request outro so it's ready at the end
|
|
ENDIF
|
|
|
|
IF g_bObjDoneChase = FALSE
|
|
PRINT_NOW("SAS1_C1", DEFAULT_GOD_TEXT_TIME, 0) // Objective: "Kill the Last One"
|
|
g_bObjDoneChase = TRUE
|
|
g_iHelpDelayListen = GET_GAME_TIMER() + HELP_TEXT_DELAY
|
|
|
|
ELIF g_bHelpDoneListen = FALSE
|
|
IF g_iHelpDelayListen < GET_GAME_TIMER()
|
|
PRINT_HELP("SAS1_H0") // Listen for the Last One's howl to find his location.
|
|
g_bHelpDoneListen = TRUE
|
|
ENDIF
|
|
|
|
ELIF g_bAudDoneChase = FALSE
|
|
IF gTrail.curNode < 5
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
//AND IS_TRACKED_PED_VISIBLE(gTheLastOne.hPed)
|
|
AND DID_SIGHTTEST_PASS(iSightTestID)
|
|
ADD_PED_FOR_DIALOGUE(pedsForConversation, 1, PLAYER_PED_ID(), "FRANKLIN")
|
|
ADD_NON_CRITICAL_STANDARD_CONVERSATION_TO_BUFFER(pedsForConversation, "SAS1AUD", "SAS1_CHASE1b", CONV_PRIORITY_MEDIUM, DO_NOT_DISPLAY_SUBTITLES)
|
|
g_bAudDoneChase = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ELIF g_bAudDoneCornered = FALSE
|
|
IF gTrail.curNode >= gTrail.size-1
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
AND IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vPos_BrawlOnArena, <<35,35,35>>)
|
|
// Stop the mountain lions attacking
|
|
MAKE_LIONS_FLEE()
|
|
ADD_PED_FOR_DIALOGUE(pedsForConversation, 1, PLAYER_PED_ID(), "FRANKLIN")
|
|
IF CREATE_CONVERSATION(pedsForConversation, "SAS1AUD", "SAS1_CHASE3", CONV_PRIORITY_MEDIUM) // Conversation: "You cornered now"
|
|
SET_PED_ANGLED_DEFENSIVE_AREA(gTheLastOne.hPed, <<-1536.6, 4543.7, 45.5>>, <<-1538.2,4536.2,48.6>>, 5.0)
|
|
g_bAudDoneCornered = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF g_bObjDoneLeavingValley = FALSE
|
|
IF NOT IS_POINT_IN_POLY_2D(g_polyPlayArea, GET_ENTITY_COORDS(PLAYER_PED_ID()))
|
|
PRINT_NOW("SAS1_C2", DEFAULT_GOD_TEXT_TIME, 0) // Don't leave the Last One
|
|
g_bObjDoneLeavingValley = TRUE
|
|
g_iPlayerLeavingTimer = GET_GAME_TIMER() + PLAYER_LEAVING_RESET_TIME
|
|
ENDIF
|
|
|
|
ELIF GET_GAME_TIMER() > g_iPlayerLeavingTimer
|
|
IF IS_POINT_IN_POLY_2D(g_polyPlayArea, GET_ENTITY_COORDS(PLAYER_PED_ID()))
|
|
g_bObjDoneLeavingValley = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF g_mission.section = SECTION_CLEANUP
|
|
IF g_mission.queueNextStage = MS_OUTRO
|
|
IF GET_GAME_TIMER() > iOutroStartTimer
|
|
CPRINTLN(DEBUG_MISSION,"Cleanup STAGE_Chase")
|
|
SwitchToOutro()
|
|
ENDIF
|
|
ELSE
|
|
CPRINTLN(DEBUG_MISSION,"Cleanup STAGE_Chase")
|
|
SAFE_REMOVE_BLIP(gTheLastOne.hBlip)
|
|
CLEAR_PRINTS()
|
|
CHANGE_MISSION_STAGE()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Plays the outro cutscene after the player shoots the Last One
|
|
PROC STAGE_Outro()
|
|
|
|
// Mocap scene
|
|
// -------------
|
|
|
|
IF g_mission.bSyncForSkip = TRUE
|
|
RC_START_Z_SKIP()
|
|
CPRINTLN(DEBUG_MISSION,"Skipping to STAGE_Outro")
|
|
RELEASE_THELASTONE(TRUE)
|
|
RELEASE_LIONS(TRUE)
|
|
RELEASE_START_SCENE(TRUE)
|
|
LOAD_THELASTONE_MODELS()
|
|
WHILE NOT HAVE_THELASTONE_MODELS_LOADED()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
WHILE NOT DOES_ENTITY_EXIST(gTheLastOne.hPed)
|
|
CREATE_THELASTONE()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
SET_PED_ENABLED(gTheLastOne.hPed, TRUE)
|
|
|
|
WHILE NOT LOAD_TEXT()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
WHILE NOT ATTEMPT_CREATE_DRESSING()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
REQUEST_MODEL(model_DressingTruck)
|
|
REQUEST_MODEL(model_TheLastOne)
|
|
//REQUEST_ANIM_DICT("Dead")
|
|
|
|
RC_REQUEST_CUTSCENE("sas_2_rcm_t7")
|
|
WHILE NOT RC_IS_CUTSCENE_OK_TO_START()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
IF IS_REPLAY_BEING_SET_UP()
|
|
END_REPLAY_SETUP()
|
|
SAFE_FADE_SCREEN_IN_FROM_BLACK()
|
|
RC_END_Z_SKIP()
|
|
ELSE
|
|
WAIT_FOR_WORLD_TO_LOAD(GET_ENTITY_COORDS(PLAYER_PED_ID()))
|
|
ENDIF
|
|
|
|
//RC_END_Z_SKIP()
|
|
g_mission.bSyncForSkip = FALSE
|
|
ENDIF
|
|
|
|
IF g_mission.section = SECTION_SETUP
|
|
|
|
REQUEST_MODEL(model_DressingTruck)
|
|
REQUEST_MODEL(model_TheLastOne)
|
|
//REQUEST_ANIM_DICT("Dead")
|
|
|
|
RC_REQUEST_CUTSCENE("sas_2_rcm_t7")
|
|
|
|
IF RC_IS_CUTSCENE_OK_TO_START()
|
|
|
|
//RELEASE_THELASTONE(TRUE)
|
|
IF g_bCutsceneInRoad
|
|
IF NOT IS_SCREEN_FADED_OUT()
|
|
DO_SCREEN_FADE_OUT(FLOW_FAIL_FADE_TIME)
|
|
ENDIF
|
|
RC_START_CUTSCENE_MODE(<<0.0,0.0,0.0>>, FALSE, FALSE, FALSE)
|
|
WAIT(FLOW_FAIL_FADE_TIME+1000)
|
|
/*IF NOT (GET_PEDS_CURRENT_WEAPON(PLAYER_PED_ID()) = WEAPONTYPE_UNARMED) AND NOT IS_PED_IN_ANY_HELI(PLAYER_PED_ID())
|
|
oiRifle = CREATE_WEAPON_OBJECT_FROM_CURRENT_PED_WEAPON_WITH_COMPONENTS(PLAYER_PED_ID())
|
|
IF DOES_ENTITY_EXIST(oiRifle)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(oiRifle, "Franklins_weapon", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
ENDIF*/
|
|
/*gTheLastOne.hPed = CREATE_PED(PEDTYPE_SPECIAL, model_Bigfoot, <<-1566.59, 4542.98, 17.14>>, -90.15)
|
|
SET_ENTITY_COORDS_NO_OFFSET(gTheLastOne.hPed, <<-1566.59, 4542.98, 17.14>>)*/
|
|
IF DOES_ENTITY_EXIST(gTheLastOne.hPed) AND IS_PED_INJURED(gTheLastOne.hPed)
|
|
// Set health to only just alive so that he dies with a single hit
|
|
RESURRECT_PED(gTheLastOne.hPed)
|
|
ENDIF
|
|
IF IS_PED_UNINJURED(gTheLastOne.hPed)
|
|
SET_ENTITY_HEALTH(gTheLastOne.hPed, 110)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(gTheLastOne.hPed, "Orleans", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
START_CUTSCENE_AT_COORDS(vDeadInRoadPos)
|
|
WAIT(0)
|
|
REPLAY_CHECK_FOR_EVENT_THIS_FRAME("SF_TheLastOne")
|
|
REPLAY_RECORD_BACK_FOR_TIME(5.0, 0.0)
|
|
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA_WITH_SIZE_LIMIT(vRoadAreaPos1, vRoadAreaPos2, fRoadAreaWidth, << -1519.9150, 4524.7002, 44.4031 >>, 116.3951, GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR())
|
|
RC_START_CUTSCENE_MODE(vDeadInRoadPos)
|
|
ELSE
|
|
/*IF NOT (GET_PEDS_CURRENT_WEAPON(PLAYER_PED_ID()) = WEAPONTYPE_UNARMED) AND NOT IS_PED_IN_ANY_HELI(PLAYER_PED_ID())
|
|
oiRifle = CREATE_WEAPON_OBJECT_FROM_CURRENT_PED_WEAPON_WITH_COMPONENTS(PLAYER_PED_ID())
|
|
IF DOES_ENTITY_EXIST(oiRifle)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(oiRifle, "Franklins_weapon", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
ENDIF*/
|
|
/*gTheLastOne.hPed = CREATE_PED(PEDTYPE_SPECIAL, model_Bigfoot, vPos_BrawlOffArena)
|
|
SET_ENTITY_COORDS_NO_OFFSET(gTheLastOne.hPed, vPos_BrawlOffArena)*/
|
|
IF DOES_ENTITY_EXIST(gTheLastOne.hPed) AND IS_PED_INJURED(gTheLastOne.hPed)
|
|
// Set health to only just alive so that he dies with a single hit
|
|
RESURRECT_PED(gTheLastOne.hPed)
|
|
ENDIF
|
|
IF IS_PED_UNINJURED(gTheLastOne.hPed)
|
|
SET_ENTITY_HEALTH(gTheLastOne.hPed, 110)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(gTheLastOne.hPed, "Orleans", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
SET_PED_PRELOAD_VARIATION_DATA(gTheLastOne.hPed, PED_COMP_HEAD, 1, 1)
|
|
SET_PED_PRELOAD_VARIATION_DATA(gTheLastOne.hPed, PED_COMP_BERD, 1, 0)
|
|
SET_PED_PRELOAD_VARIATION_DATA(gTheLastOne.hPed, PED_COMP_SPECIAL, 1, 0)
|
|
SET_PED_PRELOAD_VARIATION_DATA(gTheLastOne.hPed, PED_COMP_TEETH, 1, 0)
|
|
ENDIF
|
|
START_CUTSCENE()
|
|
WAIT(0)
|
|
REPLAY_CHECK_FOR_EVENT_THIS_FRAME("SF_TheLastOne")
|
|
REPLAY_RECORD_BACK_FOR_TIME(5.0, 0.0)
|
|
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA_WITH_SIZE_LIMIT(vCliffAreaPos1, vCliffAreaPos2, fCliffAreaWidth, <<-1530.6138, 4538.0234, 46.8171>>, 318.992, GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR())
|
|
RC_START_CUTSCENE_MODE(vPos_BrawlOffArena)
|
|
ENDIF
|
|
|
|
RELEASE_LIONS(FALSE)
|
|
RELEASE_START_SCENE(TRUE)
|
|
|
|
// set timer to change the face
|
|
iChangeFaceTimer = GET_GAME_TIMER() + 500
|
|
bChangeFace = TRUE
|
|
|
|
// Create truck (or use players last car)
|
|
VEHICLE_INDEX hVehicle = GET_PLAYERS_LAST_VEHICLE()
|
|
CLEAR_AREA(vPos_DressingTruck, 200.0, TRUE)
|
|
|
|
iTriggerPostFxTime = GET_CUTSCENE_TOTAL_DURATION() - 300
|
|
bTriggerPostFx = TRUE
|
|
|
|
IF IS_VEHICLE_OK(hVehicle)
|
|
SET_ENTITY_COORDS(hVehicle, vPos_DressingTruck)
|
|
SET_ENTITY_HEADING(hVehicle, fRot_DressingTruck)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(hVehicle)
|
|
ENDIF
|
|
CPRINTLN(DEBUG_MISSION,"Setup STAGE_Outro")
|
|
g_mission.section = SECTION_RUNNING
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF g_mission.section = SECTION_RUNNING
|
|
IF NOT IS_VEHICLE_OK(viMissionFinishedVehicle)
|
|
viMissionFinishedVehicle = GET_PLAYERS_LAST_VEHICLE()
|
|
IF NOT IS_VEHICLE_OK(viMissionFinishedVehicle) AND HAS_MODEL_LOADED(model_DressingTruck)
|
|
viMissionFinishedVehicle = CREATE_VEHICLE(model_DressingTruck, vPos_DressingTruck, fRot_DressingTruck)
|
|
IF IS_VEHICLE_OK(viMissionFinishedVehicle)
|
|
SET_VEHICLE_COLOUR_COMBINATION(viMissionFinishedVehicle, 1)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
/*IF DOES_ENTITY_EXIST(gTheLastOne.hPed)
|
|
IF IS_ENTITY_ALIVE(gTheLastOne.hPed)
|
|
SET_ENTITY_HEALTH(gTheLastOne.hPed, 0)
|
|
ENDIF
|
|
ELSE*/
|
|
/*IF NOT DOES_ENTITY_EXIST(gTheLastOne.hPed)
|
|
IF HAS_MODEL_LOADED(model_Bigfoot) //AND HAS_ANIM_DICT_LOADED("Dead")
|
|
IF g_bCutsceneInRoad
|
|
gTheLastOne.hPed = CREATE_PED(PEDTYPE_SPECIAL, model_Bigfoot, <<-1566.59, 4542.98, 17.14>>, -90.15)
|
|
SET_ENTITY_COORDS_NO_OFFSET(gTheLastOne.hPed, <<-1566.59, 4542.98, 17.14>>)
|
|
ELSE
|
|
gTheLastOne.hPed = CREATE_PED(PEDTYPE_SPECIAL, model_Bigfoot, vPos_BrawlOffArena)
|
|
SET_ENTITY_COORDS_NO_OFFSET(gTheLastOne.hPed, vPos_BrawlOffArena)
|
|
ENDIF
|
|
//TASK_PLAY_ANIM(gTheLastOne.hPed, "Dead", "dead_a", INSTANT_BLEND_IN)
|
|
//TASK_PLAY_ANIM(gTheLastOne.hPed, animdict_Plead, "sas_idle_sit", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING | AF_NOT_INTERRUPTABLE)
|
|
SET_ENTITY_VISIBLE(gTheLastOne.hPed, FALSE)
|
|
SET_PED_MONEY(gTheLastOne.hPed, 0)
|
|
ENDIF
|
|
ENDIF*/
|
|
|
|
// Place player
|
|
/*IF IS_PED_UNINJURED(PLAYER_PED_ID())
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Franklin")
|
|
IF g_bCutsceneInRoad
|
|
SET_ENTITY_COORDS_NO_OFFSET(PLAYER_PED_ID(), << -1568.5000, 4531.7500, 16.6564 >>)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 343.2536)
|
|
ELSE
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), vPos_OutroRespot)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), fRot_OutroRespot)
|
|
ENDIF
|
|
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(-22)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
|
|
ENDIF
|
|
ENDIF*/
|
|
|
|
IF IS_PLAYER_IN_FIRST_PERSON_CAMERA()
|
|
IF bTriggerPostFx
|
|
IF GET_CUTSCENE_TIME() > iTriggerPostFxTime
|
|
ANIMPOSTFX_PLAY("CamPushInNeutral", 0, FALSE)
|
|
bTriggerPostFx = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
//IF CAN_SET_EXIT_STATE_FOR_CAMERA()
|
|
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_FOOT)= CAM_VIEW_MODE_FIRST_PERSON
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(-36.1791)
|
|
//CPRINTLN(DEBUG_MISSION, "Setting camera exit pitch")
|
|
ENDIF
|
|
//CPRINTLN(DEBUG_MISSION, "setting camera exit state")
|
|
//ENDIF
|
|
|
|
IF IS_PED_UNINJURED(gTheLastOne.hPed)
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Orleans")
|
|
/*SEQUENCE_INDEX siSasquatch
|
|
OPEN_SEQUENCE_TASK(siSasquatch)
|
|
TASK_PLAY_ANIM(NULL, animdict_Plead, "sas_idle_sit", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, 5000, AF_LOOPING | AF_NOT_INTERRUPTABLE)
|
|
TASK_PLAY_ANIM(NULL, animdict_Plead, "sas_idle_sit", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE | AF_ENDS_IN_DEAD_POSE)
|
|
CLOSE_SEQUENCE_TASK(siSasquatch)
|
|
TASK_PERFORM_SEQUENCE(gTheLastOne.hPed, siSasquatch)
|
|
CLEAR_SEQUENCE_TASK(siSasquatch)*/
|
|
/*IF g_bCutsceneInRoad
|
|
SET_ENTITY_COORDS_GROUNDED(gTheLastOne.hPed, <<-1569.26, 4542.49, 17.25>>)
|
|
// PRINT_NOW("Setting Sasquatch pos", DEFAULT_HELP_TEXT_TIME, 1) - Don't check in with this!
|
|
ELSE
|
|
SET_ENTITY_COORDS_GROUNDED(gTheLastOne.hPed, <<-1539.40, 4538.07, 49.38>>)
|
|
// PRINT_NOW("Setting Sasquatch pos", DEFAULT_HELP_TEXT_TIME, 1) - Don't check in with this!
|
|
ENDIF*/
|
|
//TASK_PLAY_ANIM(gTheLastOne.hPed, animdict_Plead, "sas_idle_sit", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING | AF_NOT_INTERRUPTABLE)
|
|
|
|
IF g_bCutsceneInRoad
|
|
SET_ENTITY_COORDS_GROUNDED(gTheLastOne.hPed, <<-1569.30, 4542.46, 17.21>>)
|
|
ELSE
|
|
SET_ENTITY_COORDS_GROUNDED(gTheLastOne.hPed, <<-1538.96, 4538.03, 47.83>>)
|
|
ENDIF
|
|
SET_PED_CONFIG_FLAG(gTheLastOne.hPed, PCF_UseKinematicModeWhenStationary, TRUE)
|
|
SET_PED_CAN_RAGDOLL_FROM_PLAYER_IMPACT(gTheLastOne.hPed, FALSE)
|
|
SEQUENCE_INDEX siSasquatch
|
|
OPEN_SEQUENCE_TASK(siSasquatch)
|
|
//TASK_PLAY_ANIM(NULL, animdict_Plead, "sas_idle_sit", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, 5000, AF_LOOPING | AF_NOT_INTERRUPTABLE)
|
|
/*TASK_PLAY_ANIM(NULL, animdict_Leadout, "leadout_sas_3_rcm_sas", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE)
|
|
IF NOT g_bCutsceneInRoad
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-1479.375000,4511.744141,46.871365>>, PEDMOVE_SPRINT)
|
|
ENDIF
|
|
TASK_SMART_FLEE_PED(NULL, PLAYER_PED_ID(), 500, -1)*/
|
|
TASK_PLAY_ANIM(NULL, animdict_Leadout, "leadout_sas_3_rcm_sas", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE | AF_USE_KINEMATIC_PHYSICS | AF_ABORT_ON_WEAPON_DAMAGE, default, default, AIK_DISABLE_LEG_IK)
|
|
TASK_PLAY_ANIM(NULL, animdict_Leadout, "sas_idle_sit", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_LOOPING | AF_NOT_INTERRUPTABLE | AF_USE_KINEMATIC_PHYSICS | AF_ABORT_ON_WEAPON_DAMAGE, default, default, AIK_DISABLE_LEG_IK)
|
|
CLOSE_SEQUENCE_TASK(siSasquatch)
|
|
TASK_PERFORM_SEQUENCE(gTheLastOne.hPed, siSasquatch)
|
|
CLEAR_SEQUENCE_TASK(siSasquatch)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(gTheLastOne.hPed, TRUE)
|
|
//SET_SUPPRESS_LOW_RAGDOLL_LOD_SWITCH_UPON_DEATH(gTheLastOne.hPed)
|
|
//SET_ENTITY_VISIBLE(gTheLastOne.hPed, TRUE)
|
|
SET_PED_MONEY(gTheLastOne.hPed, 0)
|
|
|
|
APPLY_PED_BLOOD_DAMAGE_BY_ZONE(gTheLastOne.hPed, PDZ_HEAD,0.810, 0.733, BDT_BULLET_LARGE)
|
|
APPLY_PED_BLOOD_DAMAGE_BY_ZONE(gTheLastOne.hPed, PDZ_TORSO,0.940, 0.590, BDT_BULLET_LARGE)
|
|
|
|
IF IS_PED_UNINJURED(PLAYER_PED_ID()) AND CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("FRANKLIN")
|
|
TASK_LOOK_AT_ENTITY(PLAYER_PED_ID(), gTheLastOne.hPed, -1, SLF_FAST_TURN_RATE | SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH)
|
|
TASK_LOOK_AT_ENTITY(gTheLastOne.hPed, PLAYER_PED_ID(), -1, SLF_FAST_TURN_RATE | SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bChangeFace
|
|
IF GET_GAME_TIMER() > iChangeFaceTimer
|
|
SET_PED_COMPONENT_VARIATION(gTheLastOne.hPed, PED_COMP_HEAD, 1, 1, 0)
|
|
SET_PED_COMPONENT_VARIATION(gTheLastOne.hPed, PED_COMP_BERD, 1, 0, 0)
|
|
SET_PED_COMPONENT_VARIATION(gTheLastOne.hPed, PED_COMP_SPECIAL, 1, 0, 0)
|
|
SET_PED_COMPONENT_VARIATION(gTheLastOne.hPed, PED_COMP_TEETH, 1, 0, 0)
|
|
bChangeFace = false
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF g_mission.bRequestPSkip
|
|
//QUEUE_MISSION_STAGE(MS_CHASE)
|
|
STOP_CUTSCENE()
|
|
//g_mission.section = SECTION_CLEANUP
|
|
SKIP_TO_CHASE_END()
|
|
g_mission.bRequestJSkip = FALSE
|
|
g_mission.bRequestPSkip = FALSE
|
|
g_mission.bRequestCpSkip = FALSE
|
|
|
|
ELIF g_mission.bRequestCpSkip
|
|
STOP_CUTSCENE()
|
|
QUEUE_MISSION_STAGE(MS_PASSED)
|
|
g_mission.section = SECTION_CLEANUP
|
|
|
|
ELIF NOT IS_CUTSCENE_PLAYING()
|
|
QUEUE_MISSION_STAGE(MS_PASSED)
|
|
g_mission.section = SECTION_CLEANUP
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF g_mission.section = SECTION_CLEANUP
|
|
IF NOT IS_CUTSCENE_PLAYING()
|
|
REPLAY_STOP_EVENT()
|
|
/*IF IS_PED_UNINJURED(gTheLastOne.hPed)
|
|
SEQUENCE_INDEX siSasquatch
|
|
OPEN_SEQUENCE_TASK(siSasquatch)
|
|
TASK_PLAY_ANIM(NULL, animdict_Plead, "sas_idle_sit", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, 5000, AF_LOOPING | AF_NOT_INTERRUPTABLE)
|
|
TASK_PLAY_ANIM(NULL, animdict_Plead, "sas_idle_sit", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE | AF_ENDS_IN_DEAD_POSE)
|
|
CLOSE_SEQUENCE_TASK(siSasquatch)
|
|
TASK_PERFORM_SEQUENCE(gTheLastOne.hPed, siSasquatch)
|
|
CLEAR_SEQUENCE_TASK(siSasquatch)
|
|
SET_ENTITY_VISIBLE(gTheLastOne.hPed, TRUE)
|
|
ENDIF*/
|
|
|
|
RC_END_CUTSCENE_MODE()
|
|
|
|
IF WAS_CUTSCENE_SKIPPED()
|
|
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_FOOT)= CAM_VIEW_MODE_FIRST_PERSON
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(-36.1791)
|
|
CPRINTLN(DEBUG_MISSION, "Setting camera exit pitch, skipped cutscene")
|
|
ENDIF
|
|
CPRINTLN(DEBUG_MISSION, "Skipped cutscene")
|
|
ENDIF
|
|
|
|
CPRINTLN(DEBUG_MISSION,"Cleanup STAGE_Outro")
|
|
CHANGE_MISSION_STAGE()
|
|
SAFE_DELETE_OBJECT(oiRifle)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Fades the screen out and fails the mission
|
|
PROC STAGE_FailFade()
|
|
|
|
SWITCH g_mission.section
|
|
|
|
CASE SECTION_SETUP
|
|
|
|
CLEAR_PRINTS()
|
|
|
|
IF IS_PED_HARMED(gStartScene.hHunter)
|
|
g_mission.failReason = FAIL_REASON_HUNTER_DEAD
|
|
ENDIF
|
|
|
|
// Enable the ambient audio zone again
|
|
IF NOT IS_AMBIENT_ZONE_ENABLED("AZ_DISTANT_SASQUATCH")
|
|
SET_AMBIENT_ZONE_STATE_PERSISTENT("AZ_DISTANT_SASQUATCH", TRUE, TRUE)
|
|
ENDIF
|
|
|
|
CPRINTLN(DEBUG_MISSION,"Setup STAGE_FailFade")
|
|
|
|
STRING sFailType
|
|
sFailType = EMPTY_STRING
|
|
|
|
// Convert fail reason to string
|
|
SWITCH(g_mission.failReason)
|
|
CASE FAIL_REASON_HUNTER_DEAD
|
|
sFailType = "SAS1_X0" // ~r~You killed the hunter.
|
|
BREAK
|
|
|
|
CASE FAIL_REASON_HUNTER_THREATENED
|
|
sFailType = "SAS1_X1" // ~r~You threatened the hunter.
|
|
BREAK
|
|
|
|
CASE FAIL_REASON_LOST_THELASTONE
|
|
sFailType = "SAS1_X6" // ~r~The Last One escaped.
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF ARE_STRINGS_EQUAL(sFailType, EMPTY_STRING)
|
|
Random_Character_Failed()
|
|
ELSE
|
|
Random_Character_Failed_With_Reason(sFailType)//, TRUE, bDelayFade)
|
|
ENDIF
|
|
|
|
g_mission.section = SECTION_RUNNING
|
|
BREAK
|
|
|
|
CASE SECTION_RUNNING
|
|
IF GET_MISSION_FLOW_SAFE_TO_CLEANUP()
|
|
CPRINTLN(DEBUG_MISSION,"Cleanup STAGE_FailFade")
|
|
|
|
Script_TextCleanup()
|
|
|
|
// Immediately destroy all entities
|
|
RELEASE_THELASTONE(TRUE)
|
|
RELEASE_LIONS(TRUE)
|
|
RELEASE_START_SCENE(TRUE)
|
|
Script_Cleanup()
|
|
ELSE
|
|
// not finished fading out
|
|
// you may want to handle dialogue etc here.
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDPROC
|
|
|
|
PROC STAGE_PassDelay()
|
|
|
|
SWITCH g_mission.section
|
|
|
|
CASE SECTION_SETUP
|
|
|
|
IF IS_PED_UNINJURED(gTheLastOne.hPed)
|
|
ADD_PED_FOR_DIALOGUE(pedsForConversation, 3, gTheLastOne.hPed, "ORLEANS")
|
|
IF CREATE_CONVERSATION(pedsForConversation, "SAS1AUD", "SAS1_LEADOUT", CONV_PRIORITY_HIGH)
|
|
CLEAR_PRINTS()
|
|
REPLAY_RECORD_BACK_FOR_TIME(2.0, 4.0)
|
|
iPassDelay = GET_GAME_TIMER() + PASS_DELAY_TIME
|
|
|
|
g_mission.section = SECTION_RUNNING
|
|
ENDIF
|
|
ELSE
|
|
Script_Passed()
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE SECTION_RUNNING
|
|
IF (GET_GAME_TIMER() > iPassDelay AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED())
|
|
OR NOT IS_PED_UNINJURED(gTheLastOne.hPed)
|
|
Script_Passed()
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDPROC
|
|
|
|
// ===========================================================================================================
|
|
// DEBUG FUNCTIONS
|
|
// ===========================================================================================================
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
|
|
/// PURPOSE:
|
|
/// Check for Forced Pass or Fail and handle skipping stages
|
|
PROC DEBUG_Check_Debug_Keys()
|
|
IF g_mission.stage <> MS_FAILED
|
|
IF g_mission.section = SECTION_RUNNING
|
|
|
|
// Mission is running, so reset sync-for-skip flag
|
|
g_mission.bSyncForSkip = FALSE
|
|
|
|
// Check for Pass
|
|
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S))
|
|
WAIT_FOR_CUTSCENE_TO_STOP()
|
|
Script_Passed()
|
|
|
|
// Check for Fail
|
|
ELIF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F))
|
|
WAIT_FOR_CUTSCENE_TO_STOP()
|
|
QUEUE_MISSION_STAGE(MS_FAILED)
|
|
g_mission.failReason = FAIL_REASON_DEFAULT
|
|
g_mission.section = SECTION_CLEANUP
|
|
|
|
// Check for J skip
|
|
ELIF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J))
|
|
g_mission.bRequestJSkip = TRUE
|
|
|
|
// Check for P skip
|
|
ELIF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P))
|
|
g_mission.bRequestPSkip = TRUE
|
|
|
|
// Check for Z skip
|
|
ELIF LAUNCH_MISSION_STAGE_MENU(zSkipMenu, g_mission.queueCpSkip, g_mission.queueCpSkip)
|
|
g_mission.bRequestCpSkip = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
#ENDIF
|
|
|
|
// ===========================================================================================================
|
|
// Script Loop
|
|
// ===========================================================================================================
|
|
|
|
SCRIPT(g_structRCScriptArgs sRCLauncherDataIn)
|
|
|
|
sRCLauncherDataLocal = sRCLauncherDataIn
|
|
RC_TakeEntityOwnership(sRCLauncherDataLocal)
|
|
|
|
SET_MISSION_FLAG(TRUE)
|
|
|
|
//-- Setup callback when player is killed, arrested or goes to multiplayer
|
|
IF (HAS_FORCE_CLEANUP_OCCURRED(DEFAULT_FORCE_CLEANUP_FLAGS|FORCE_CLEANUP_FLAG_DEBUG_MENU))
|
|
PRINT_LAUNCHER_DEBUG("Force cleanup [TERMINATING]")
|
|
Random_Character_Failed()
|
|
Script_Cleanup()
|
|
ENDIF
|
|
|
|
IF Is_Replay_In_Progress() // Set up the initial scene for replays
|
|
IF Get_Replay_Mid_Mission_Stage() = 0
|
|
g_bSceneAutoTrigger = TRUE
|
|
// Re-create the initial scene
|
|
eInitialSceneStage = IS_REQUEST_SCENE
|
|
WHILE NOT SetupScene_TheLastOne(sRCLauncherDataLocal)
|
|
WAIT(0)
|
|
ENDWHILE
|
|
RC_SET_ENTITY_PROOFS_FOR_CUTSCENE(sRCLauncherDataLocal, FALSE)
|
|
g_bSceneAutoTrigger = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//-- Mission initialisation ***************
|
|
INIT_DATA()
|
|
INIT_MISSION_DATA()
|
|
|
|
//-- Mission loop *************************
|
|
|
|
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
|
|
|
|
WHILE(TRUE)
|
|
REPLAY_CHECK_FOR_EVENT_THIS_FRAME("SF_TheLastOne")
|
|
|
|
UPDATE_MISSION_NAME_DISPLAYING(sRCLauncherDataLocal.sIntroCutscene)
|
|
|
|
// Debug drawing functions, uncomment to see them
|
|
|
|
// IF IS_PED_UNINJURED(g_TheLastOne.hPed)
|
|
// IF IS_TRACKED_PED_VISIBLE(g_TheLastOne.hPed)
|
|
// DISPLAY_TEXT(0.1,0.2,"DEST_DK")
|
|
// ENDIF
|
|
// ENDIF
|
|
|
|
// DISPLAY_POLY(g_polyPlayArea) // play area = red
|
|
// DISPLAY_POLY(g_polyFailArea, 100, 100, 255) // fail area = blue
|
|
//DISPLAY_POLY(g_polyCliffArea, 0, 255, 0) // cliff area = green
|
|
//DISPLAY_POLY2(g_polyCliffArea)
|
|
|
|
// DISPLAY_TEXT_WITH_FLOAT(0.5, 0.5, "NUMBR", GET_ENTITY_SPEED(PLAYER_PED_ID()), 1)
|
|
// DISPLAY_TEXT_WITH_FLOAT(0.5, 0.8, "NUMBR", VDIST(GET_ENTITY_COORDS(PLAYER_PED_ID()), vPos_ScatSite), 2)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF g_bDebugWaypoints
|
|
DISPLAY_TEXT_WITH_NUMBER(0.1, 0.1, "NUMBR", gTrail.curNode)
|
|
|
|
|
|
DRAW_DEBUG_SPHERE(gTrail.nodes[0].vPedSpawn, 2)
|
|
DRAW_DEBUG_SPHERE(gTrail.nodes[0].vPedDest, 2, 255,0, 0)
|
|
|
|
DRAW_DEBUG_SPHERE(gTrail.nodes[1].vPedSpawn, 2)
|
|
DRAW_DEBUG_SPHERE(gTrail.nodes[1].vPedDest, 2, 255, 0, 0)
|
|
|
|
DRAW_DEBUG_SPHERE(gTrail.nodes[2].vPedSpawn, 2)
|
|
DRAW_DEBUG_SPHERE(gTrail.nodes[2].vPedDest, 2, 255, 0,0)
|
|
|
|
DRAW_DEBUG_SPHERE(gTrail.nodes[3].vPedSpawn, 2)
|
|
DRAW_DEBUG_SPHERE(gTrail.nodes[3].vPedDest, 2, 255, 0 ,0)
|
|
|
|
DRAW_DEBUG_SPHERE(gTrail.nodes[4].vPedSpawn, 2)
|
|
DRAW_DEBUG_SPHERE(gTrail.nodes[4].vPedDest, 2, 255, 0, 0)
|
|
|
|
DRAW_DEBUG_SPHERE(gTrail.nodes[5].vPedSpawn, 2)
|
|
DRAW_DEBUG_SPHERE(gTrail.nodes[5].vPedDest, 2, 255, 0, 0)
|
|
|
|
DRAW_DEBUG_SPHERE(gTrail.nodes[6].vPedSpawn, 2)
|
|
DRAW_DEBUG_SPHERE(gTrail.nodes[6].vPedDest, 2, 255, 0, 0)
|
|
|
|
DRAW_DEBUG_SPHERE(gTrail.nodes[7].vPedSpawn, 2)
|
|
DRAW_DEBUG_SPHERE(gTrail.nodes[7].vPedDest, 2, 255, 0, 0)
|
|
|
|
DRAW_DEBUG_SPHERE(gTrail.nodes[8].vPedSpawn, 2)
|
|
DRAW_DEBUG_SPHERE(gTrail.nodes[8].vPedDest, 2, 255, 0, 0)
|
|
|
|
DRAW_DEBUG_SPHERE(gTrail.nodes[9].vPedSpawn, 2)
|
|
DRAW_DEBUG_SPHERE(gTrail.nodes[9].vPedDest, 2, 255, 0, 0)
|
|
|
|
DRAW_DEBUG_SPHERE(gTrail.nodes[10].vPedSpawn, 2)
|
|
DRAW_DEBUG_SPHERE(gTrail.nodes[10].vPedDest, 2, 255, 0, 0)
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
// Remove all scenario peds during the mission
|
|
//SET_SCENARIO_PED_DENSITY_MULTIPLIER_THIS_FRAME(1.0, 0.0)
|
|
|
|
// Don't want the player to be able to take photos of the last guy B* 1392716
|
|
DISABLE_CELLPHONE_CAMERA_APP_THIS_FRAME_ONLY()
|
|
|
|
//Fix for bug 2174315
|
|
IF DOES_ENTITY_EXIST(gTheLastOne.hPed)
|
|
REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME()
|
|
ENDIF
|
|
|
|
IF IS_PED_UNINJURED(PLAYER_PED_ID())
|
|
SWITCH (g_mission.stage)
|
|
CASE MS_INIT
|
|
STAGE_Init()
|
|
BREAK
|
|
|
|
CASE MS_INTRO
|
|
STAGE_Intro()
|
|
BREAK
|
|
|
|
CASE MS_GOTOVALLEY
|
|
STAGE_GoToValley()
|
|
BREAK
|
|
|
|
CASE MS_CHASE
|
|
STAGE_Chase()
|
|
BREAK
|
|
|
|
CASE MS_OUTRO
|
|
STAGE_Outro()
|
|
BREAK
|
|
|
|
CASE MS_PASSED
|
|
STAGE_PassDelay()
|
|
BREAK
|
|
|
|
CASE MS_FAILED
|
|
STAGE_FailFade()
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
WAIT(0)
|
|
|
|
// Check debug completion/failure
|
|
#IF IS_DEBUG_BUILD
|
|
DEBUG_Check_Debug_Keys()
|
|
#ENDIF
|
|
ENDWHILE
|
|
|
|
SCRIPT_ASSERT("Script should never reach here. Always terminate with cleanup function.")
|
|
ENDSCRIPT
|