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

4903 lines
162 KiB
Python
Executable File

// *****************************************************************************************
// *****************************************************************************************
//
// MISSION NAME : Barry1.sc
// AUTHOR : Aaron Gandaa / Stefan Arnold
// DESCRIPTION : First Barry Mission
//
// *****************************************************************************************
// *****************************************************************************************
//Compile out Title Update changes to header functions.
//Must be before includes.
//CONST_INT USE_TU_CHANGES 0 // Removed by Kenneth R.
//----------------------
// INCLUDES
//----------------------
USING "rage_builtins.sch"
USING "globals.sch"
USING "cutscene_public.sch"
USING "commands_cutscene.sch"
USING "commands_entity.sch"
USING "commands_script.sch"
USING "commands_shapetest.sch"
USING "script_player.sch"
USING "randomChar_public.sch"
USING "rgeneral_include.sch"
USING "dialogue_public.sch"
USING "RC_Helper_Functions.sch"
USING "RC_Area_public.sch"
USING "CompletionPercentage_public.sch"
USING "replay_public.sch"
USING "shop_public.sch"
USING "initial_scenes_barry.sch"
USING "RC_Asset_public.sch"
USING "cheat_controller_public.sch"
USING "commands_recording.sch"
USING "taxi_functions.sch"
#IF IS_DEBUG_BUILD
USING "select_mission_stage.sch"
USING "shared_debug.sch"
#ENDIF
//----------------------
// ENUMS
//----------------------
ENUM ALIEN_STATE
AS_NULL,
AS_DELAY, // this is the wait between us creating the alien and him starting teleport
AS_TELEPORT_FXSTART,
AS_TELEPORT,
AS_TELEPORT_OUT_START,
AS_TELEPORT_OUT,
AS_RELOCATE,
AS_DYING,
AS_DEAD,
AS_ACTIVE, // all battle states need to come after here or IS_ALIEN_IN_BATTLE_STATE() will break
AS_SUMMON_RUSH, // run towards the player
AS_SUMMON_START,
AS_SUMMON_FAIL,
AS_WATCH_SUMMON,
AS_WATCH_SUMMON_END,
AS_CHARGE_RUSH,
AS_CHARGE_START,
AS_CHARGE,
AS_BEAM_START,
AS_BEAM,
AS_BEAM_KNOCKDOWN
ENDENUM
ENUM STAGE_ENUM
SE_LEAD_IN = -1,
SE_INTRO = 0,
SE_FIRSTCONTACT,
SE_WAVE1,
SE_WAVE2,
SE_PASSOUT,
SE_OUTRO,
SE_FAILED,
SE_ABDUCT
ENDENUM
ENUM PASS_OUT_STAGE
POS_SETUP,
POS_WAIT_FOR_TIRED,
POS_START_DIALOG,
POS_WAIT_DIALOGUE,
POS_TRANSITION_FX,
POS_WAIT_PASS_OUT
ENDENUM
//----------------------
// STRUCTURES
//----------------------
STRUCT ALIEN_PED
BOOL bIsActive = FALSE
ALIEN_STATE aState
PED_INDEX pedID
BLIP_INDEX blipID
OBJECT_INDEX projectorID
OBJECT_INDEX impactID
OBJECT_INDEX screenImpactID
INT iTimer
INT iNextDamageTime
INT iLastImpactFrame
FLOAT fDistToPlayer
FLOAT fRunRatio
FLOAT fBeamLength
FLOAT fBeamEvoValue
FLOAT fBeamTriggerRange // fAlienBeamStartRange + (rand (-fAlienBeamTriggerVariance, fAlienBeamTriggerVariance) * fAlienBeamStartRange)
FLOAT fPedAlpha = 0.0
INT iClickSoundTimer
INT mindCtrlSoundID = -1
INT iButtonMashCount = 0
INT iNextSummonEffectTime
INT fOldMashSign = 0
PTFX_ID fxSummonID
PTFX_ID fxChargeID
PTFX_ID fxBeamID
PTFX_ID fxImpactID
PTFX_ID fxScreenImpactID
SHAPETEST_INDEX sBeamLOS
VECTOR vLastHitPoint
INT iAlienIndex
BOOL bHasDamaged = FALSE
BOOL bWallSpawn = FALSE
ENDSTRUCT
//----------------------
// CONSTANTS
//----------------------
CONST_INT MISSION_VERSION 015 // this so i can be sure that my changes have been accepted
CONST_INT MAX_ALIEN_PEDS 8 // reducing from 10 to reduce difficulty
CONST_INT GENDELAY_TIME 500
CONST_INT TELEPORT_TIME 450
CONST_INT ALIEN_FADE_TIME 1000
CONST_INT CHAIN_KILL_AMOUNT 5 // number of aliens to kill to do the chain
CONST_INT CHAIN_KILL_TIME 10000 // number of ms to complete the chain
CONST_INT MUSICEVENT_RC18A_START_DELAY 58500 // 33500 // 2m 07s in the FOV changes in cutscene
CONST_INT MUSICEVENT_RC18A_INCREASE_DELAY 70500 // 45500 // 12 seconds after MUSICEVENT_RC18A_START_DELAY
CONST_INT FAIL_WARNING_TIME 10000
// @SBA - Max aliens after initial rush
CONST_INT kiMaxStartingAliens 3
// @SBA - number of aliens considered already dead if you start in wave2 (this is currently for debug z-skip)
CONST_INT kiDeadAliensStartingWave2 29
// match up with object array in g_structRCScriptArgs (see initial_scenes_barry.sch)
CONST_INT OBJ_TABLE 0
CONST_INT OBJ_CHAIR 1
CONST_INT OBJ_PAPERS 2
CONST_INT OBJ_LIGHTER 3
CONST_INT OBJ_JOINT 4
CONST_INT OBJ_SIGN 5
//----------------------
// CHECKPOINTS
//----------------------
// @SBA - currently not using this, and it wasn't fully implemented yet
//CONST_INT CP_MISSION_START 0
//CONST_INT CP_MID_STAGE 1
//CONST_INT CP_OUTRO 2
CONST_INT Z_SKIP_INTRO 0
CONST_INT Z_SKIP_BATTLE 1
CONST_INT Z_SKIP_BATTLE_2 2 // @SBA - inserting this
CONST_INT Z_SKIP_PASSOUT 3
CONST_INT Z_SKIP_OUTRO 4
CONST_INT MAX_SKIP_MENU_LENGTH 5
//----------------------
// RC VARIABLES
//----------------------
g_structRCScriptArgs sRCLauncherDataLocal
//----------------------
// VARIABLES
//----------------------
INT iStateTimeOut
INT iFailTimer
STRING sFailString = ""
STAGE_ENUM stageEnum = SE_LEAD_IN
PASS_OUT_STAGE ePassOutStage
STAGE_PROGRESS stageProgress
OBJECT_INDEX gunObject
INT iDbgStageJump // now also used in checkpoint / replay stuff
SCENARIO_BLOCKING_INDEX scenarioBlock
VECTOR vPlayerCarRespot = <<174.6435, -1012.3608, 28.3152>>
FLOAT fPlayerCarRespot = 30.2623
VECTOR vBattleCenter = <<180.5319, -970.6324, 29.0923>>
FLOAT fBattleRadius = 100.0
VECTOR vMissionStart = << 188.86, -955.83, 30.09 >>
FLOAT fMissionStart = 62.08
FLOAT fPlayerWeaponDamageModifier = 1.0
FLOAT fRegenMultiplier = 1.0
FLOAT fTimeScale = 0.8
BOOL bIsPlayerInBattleArea = TRUE
INT iMissionAbandonedTimer = 0
BLIP_INDEX locationBlip
BOOL bDebugTTYSpew = FALSE
BOOL bUseIsAreaOccupied = FALSE
INT iAlphaCounter = 0
INT iSummonEscapeCount = 0
// @SBA - Weapons
WEAPON_TYPE wtSniperRifle = WEAPONTYPE_SNIPERRIFLE
WEAPON_TYPE wtPistol = WEAPONTYPE_COMBATPISTOL
WEAPON_TYPE wtGrenLauncher = WEAPONTYPE_GRENADELAUNCHER
//WEAPON_TYPE wtStunGun = WEAPONTYPE_STUNGUN
WEAPON_TYPE wtMiniGun = WEAPONTYPE_MINIGUN
ANGLED_AREA respotVehicleArea
ANGLED_AREA missionBoundary
FLOAT fPlayerAlpha = 255.0
WEAPON_TYPE playerWeapon = WEAPONTYPE_MINIGUN//wtSniperRifle
ASSET_REQUESTER assetRequester
//----------------------
// ANIM / CS VARIABLES
//----------------------
STRING sSceneHandleBarry = "Barry"
STRING sSceneHandleChair = "Barrys_chair"
STRING sSceneHandleTable = "Barrys_protest_table"
STRING sSceneHandleWeapon = "Michaels_Weapon"
STRING sSceneHandlePapers = "Barry_Pamphlet_1"
STRING sSceneHandleLighter = "Lighter_Michael"
STRING sSceneHandleJoint = "Cig_Michael"
STRING FX_DrugsIn = "DrugsMichaelAliensFightIn"
STRING FX_DrugsSkip = "DrugsMichaelAliensFight"
STRING FX_DrugsOut = "DrugsMichaelAliensFightOut"
STRING sMissionAnimDictionary = "rcmbarry"
STRING sLeadInAnimDictionary = "rcmbarryleadinout"
STRING sndAlienAmbientScene = "BARRY_01_DRUGS"
// mini game anims
STRING sAlienGrabIntroAnim = "bar_1_attack_intro_aln"
STRING sAlienGrabbedIntroAnim = "bar_1_attack_intro_mic"
STRING sAlienGrabAnim = "bar_1_attack_idle_aln"
STRING sAlienGrabbedAnim = "bar_1_attack_idle_mic"
STRING sAlienGrabFailAnim = "bar_1_attack_michael_wins_aln"
STRING sAlienGrabbedFailAnim = "bar_1_attack_michael_wins_mic"
STRING sAlienGrabWinAnim = "bar_1_attack_alien_wins_aln"
STRING sAlienGrabbedWinAnim = "bar_1_attack_alien_wins_mic"
STRING sAlienWatchAnim = "m_cower_01"
STRING sAlienTeleportAnim = "bar_1_teleport_aln"
STRING sMichaelTeleportAnim = "bar_1_teleport_mic"
STRING sExhaustedAnimEnter = "enter"
STRING sExhaustedAnim = "idle_d"
BOOL bHasMusicStarted = FALSE
BOOL bHasMusicIncreased = FALSE
BOOL bHasPlayerCameraExitState = FALSE
//----------------------
// MODEL VARIABLES
//----------------------
MODEL_NAMES alienModel = S_M_M_MOVALIEN_01
MODEL_NAMES beamDummyModel = PROP_LD_TEST_01
MODEL_NAMES mnProtestSign = Prop_Protest_Sign_01
//----------------------
// DIALOG VARIABLES
//----------------------
BOOL bHasInitialOutburst
INT iFirstDialogTime
INT iNextFightDialogTime
INT iNextFreakDialogTime
INT iNextDamageDialogTime
LOCATES_HEADER_DATA sLocateData
structPedsForConversation convoMichael
STRING sAmbientZone = "AZ_BARRY_01_AMBIENCE"
//----------------------
// ALIEN VARIABLES
//----------------------
BOOL bAutoCreateAliens = FALSE
BOOL bKillAliensOnTeleportOut = TRUE
BOOL bSummonRushFlagActive = FALSE
BOOL bSummonFlagActive = FALSE
BOOL bAllowSummoning = FALSE
INT iAlienSummonerIndex = -1
INT iAlienWatchSummonTimeOut = 3500
INT iAlienNextSummonTime
INT iAlienNextSummonTimeOut = 15000
INT iAlienButtonMashLimit = 1
INT iAlienSummonTimeLength = 6000
INT iAlienMaxHP = 500
INT iAlienMinClickTime = 1000
INT iAlienMaxClickTime = 2000
FLOAT fAlienSummonRange = 5.0
FLOAT fAlienImpactEffectSize = 0.375
FLOAT fAlienChargeEffectSize = 0.8
FLOAT fAlienTeleportEffectSize = 2.0
FLOAT fAlienDeathEffectSize = 1.0
BOOL bUseAlienSpawnPoint = TRUE
VECTOR vAlienSpawnPoint = <<183.58, -967.10, 29.09>>
FLOAT fAlienSpawnPointRadius = 38.250
FLOAT fAlienMinSpawnRadius = 30.0
FLOAT fAlienMaxSpawnRadius = 60.0
// auto alien gen
CONST_INT kiAlienAutoGenDeltaTime 200
CONST_INT kiAlienMinAutoGenBaseTime 600
CONST_INT kiAlienMaxAutoGenBaseTime 1000
INT iAlienAutoGenTime
INT iAlienMinAutoGenTime = kiAlienMinAutoGenBaseTime
INT iAlienMaxAutoGenTime = kiAlienMaxAutoGenBaseTime
INT iAlienAutoGenDeltaTime = kiAlienAutoGenDeltaTime
ALIEN_PED alienPed[MAX_ALIEN_PEDS]
//----------------------
// ALIEN BEAM VARIABLES
//----------------------
BOOL bAlienBeamKnockDown = FALSE
BOOL bBeamArmorHelpDisplayed = FALSE
INT iAlienBeamDamage = 1
INT iAlienBeamDamageDelay = 100
INT iAlienBeamChargeTime = 2000
INT iAlienBeamShootTime = 6000
FLOAT fAlienBeamStartRange = 15.0
FLOAT fAlienBeamEffectSize = 0.75
FLOAT fAlienBeamMaximumLength = 100.0
FLOAT fAlienBeamLengthInc = 0.125 // 2.5
FLOAT fAlienMinBeamTriggerVariance = -0.1
FLOAT fAlienMaxBeamTriggerVariance = 0.3
FLOAT fAlienBeamKnockDownForce = 1.75
VECTOR vAlienBeamEmitterOffset = <<0.3, 0.3, 0>>
VECTOR vAlienBeamRotationVector = <<270.0, 0.0, 0>>
FLOAT fAlienScreenImpactShift = 0.10
//FLOAT fAlienBeamEvoIncrease = 0.0125
//VECTOR vCameraForward
//VECTOR vCameraCoords
//FLOAT fCameraNearClip
//----------------------
// STATS VARIABLES
//----------------------
INT iMaxActiveAliens = kiMaxStartingAliens
INT iMaxKillChain = 0
INT iKillChain = 0
INT iKillChainEndTime = 0
INT iTotalAlienSummonCount = 0
INT iTotalAlienSpawnCount = 0
INT iTotalAlienDeadCount = 0
INT iTotalAlienDeadRequired = 31
INT iAlienAliveCount = 0
//----------------------
// DEBUG VARIABLES
//----------------------
#IF IS_DEBUG_BUILD
MissionStageMenuTextStruct sSkipMenu[MAX_SKIP_MENU_LENGTH]
WIDGET_GROUP_ID m_WidgetGroup
BOOL bUpdateWidgets = TRUE
BOOL bShowAlienPos = FALSE
#ENDIF
//----------------------
// @SBA - ADDITIONAL CONSTANTS/VARIABLES
//----------------------
CONST_INT kiSniperAmmo 10
CONST_INT kiPistolAmmo 30
CONST_INT kiGrenLaunchAmmo 10
CONST_INT kiMinigunAmmo INFINITE_AMMO
CONST_FLOAT kfMinClickSoundDist 20.0
// Min gap between fight/freak lines
CONST_INT kiDialogTimeCheck 2500
// @SBA - new pos to point at the advancing aliens
VECTOR vPlayerStartPos = << 188.86, -955.83, 29.09 >>
CONST_FLOAT kfPlayerStartHead 327.2303
BOOL bSkipAllowed = FALSE
OBJECT_INDEX oiMichaelsWeapon
// Aliens left to kill to end 1st wave
CONST_INT kiAliensLeftToKill 5
// aliens to add when player gerts minigun
INT iAliensToAdd = kiAliensLeftToKill
// Position and radius for first contact random starts
VECTOR v1stContactStartCtr = <<216.765884,-908.962097,29.692392>>
FLOAT f1stContactStartRadius = 7.00
structTIMER tmr1stContactSpawn
FLOAT f1stContactSpawnTime
// To put some time between the end of one stage and the start of the next
structTIMER tmrStageTimer
CONST_INT kiAlienWallSpawnArraySize 9
STRUCT ALIEN_WALL_SPAWN_DATA
VECTOR vAlienWallSpawnLoc
ENDSTRUCT
ALIEN_WALL_SPAWN_DATA AlienWallSpawnData[kiAlienWallSpawnArraySize]
// Top of structure for possible abduction use later
//VECTOR vTopStructure = <<214.2620, -921.4756, 59.6946>>
//VECTOR vTopStructureCamPos = <<214.4669, -921.1708, 64.5663>>
//VECTOR vTopStructureCamRot = <<-89.4999, 0.0000, 54.8117>>
// car stuff
VECTOR vPlayerVehicleLoc
FLOAT fPlayerVehicleHead
BOOL bPlayerVehicleMoved
//----------------------
// MISC FUNCTIONS
//----------------------
// Populate a single indes in the array
PROC POPULATE_ALIEN_WALL_SPAWN_DATUM(ALIEN_WALL_SPAWN_DATA &DataStruct[], INT iArrayIndex, VECTOR vSpawnLoc)
DataStruct[iArrayIndex].vAlienWallSpawnLoc = vSpawnLoc
//CPRINTLN(DEBUG_MISSION, "POPULATE_ALIEN_WALL_SPAWN_DATUM: Populating specific array datum. Spawn location = ", DataStruct[iArrayIndex].vAlienWallSpawnLoc)
ENDPROC
// populate the wall spawn data array
PROC POPULATE_ALIEN_WALL_SPAWN_DATA()
POPULATE_ALIEN_WALL_SPAWN_DATUM(AlienWallSpawnData, 0, (<<175.5842, -964.2895, 35.0957>>))
POPULATE_ALIEN_WALL_SPAWN_DATUM(AlienWallSpawnData, 1, (<<183.1626, -970.6071, 35.0957>>))
POPULATE_ALIEN_WALL_SPAWN_DATUM(AlienWallSpawnData, 2, (<<179.9724, -943.0597, 34.0921>>))
POPULATE_ALIEN_WALL_SPAWN_DATUM(AlienWallSpawnData, 3, (<<185.2821, -935.3659, 34.0922>>))
POPULATE_ALIEN_WALL_SPAWN_DATUM(AlienWallSpawnData, 4, (<<199.9392, -951.7982, 35.0511>>))
POPULATE_ALIEN_WALL_SPAWN_DATUM(AlienWallSpawnData, 5, (<<190.3101, -976.7255, 35.0916>>))
POPULATE_ALIEN_WALL_SPAWN_DATUM(AlienWallSpawnData, 6, (<<205.6451, -974.7205, 35.0476>>))
POPULATE_ALIEN_WALL_SPAWN_DATUM(AlienWallSpawnData, 7, (<<212.8866, -936.2545, 33.7047>>))
POPULATE_ALIEN_WALL_SPAWN_DATUM(AlienWallSpawnData, 8, (<<194.1555, -957.8777, 33.3463>>)) // cube
ENDPROC
/// PURPOSE:
/// @SBA - Resets the array to default values
PROC RESET_LOCAL_ALIEN_WALL_SPAWN_DATA(ALIEN_WALL_SPAWN_DATA &DataStruct[])
INT idx
REPEAT COUNT_OF(DataStruct) idx
POPULATE_ALIEN_WALL_SPAWN_DATUM(DataStruct, idx, (<<0,0,0>>))
ENDREPEAT
ENDPROC
/// PURPOSE:
/// Get a vector from the data for a wall spawn
/// PARAMS:
/// vOut - returns the vector
/// RETURNS:
/// Returns TRUE if there's a valid vector to use
FUNC BOOL GET_SPECIFIC_WALL_SPAWN_DATA(VECTOR &vOut)
INT idx
INT iIndex = 0
ALIEN_WALL_SPAWN_DATA localAlienWallSpawnData[kiAlienWallSpawnArraySize]
RESET_LOCAL_ALIEN_WALL_SPAWN_DATA(localAlienWallSpawnData)
// comb the permanent data
REPEAT kiAlienWallSpawnArraySize idx
// Make sure there's room in the array
IF iIndex < COUNT_OF(localAlienWallSpawnData)
// Make sure peds aren't too close to the prospective spawn location
// Any more condtions? Do we want a max distance too?
IF NOT IS_ANY_PED_NEAR_POINT(AlienWallSpawnData[idx].vAlienWallSpawnLoc, 1.5)
POPULATE_ALIEN_WALL_SPAWN_DATUM(localAlienWallSpawnData, iIndex, AlienWallSpawnData[idx].vAlienWallSpawnLoc)
iIndex ++
ELSE
//CPRINTLN(DEBUG_MISSION, "GET_SPECIFIC_WALL_SPAWN_DATA: *** Spawn point ", AlienWallSpawnData[idx].vAlienWallSpawnLoc, " is too close to an existing ped ***")
ENDIF
ELSE
CPRINTLN(DEBUG_MISSION, "GET_SPECIFIC_WALL_SPAWN_DATA: *** Wha' hoppend? Array Is Full! ***")
idx = kiAlienWallSpawnArraySize
ENDIF
ENDREPEAT
IF iIndex = 0
CPRINTLN(DEBUG_MISSION, "GET_SPECIFIC_WALL_SPAWN_DATA: *** No good spawn locations for wall spawn! ***")
ELSE
// Pick a random index for the specific data array
INT iReturnSpecificIndex = GET_RANDOM_INT_IN_RANGE(0, iIndex)
vOut = localAlienWallSpawnData[iReturnSpecificIndex].vAlienWallSpawnLoc
IF ARE_VECTORS_EQUAL(localAlienWallSpawnData[iReturnSpecificIndex].vAlienWallSpawnLoc, (<<0,0,0>>))
CPRINTLN(DEBUG_MISSION, "GET_SPECIFIC_WALL_SPAWN_DATA: WHOOPS! Random index = ", iReturnSpecificIndex,". Spawn location = ", vOut, ".")
ELSE
//CPRINTLN(DEBUG_MISSION, "GET_SPECIFIC_WALL_SPAWN_DATA: Returning TRUE. Random index = ", iReturnSpecificIndex,". Spawn location = ", vOut, ".")
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Obtain a valid wall spawn location and heading, if we want one
/// PARAMS:
/// vOut - returns a wall spawn location
/// fSpawnChance - chance of getting a wall spawn (or try to at least)
/// RETURNS:
/// TRUE if we've chosen a valid location to spawn; FALSE otherwise
FUNC BOOL GENERATE_ALIEN_WALL_SPAWN(VECTOR &vOut, FLOAT fSpawnChance = 0.10)
IF NOT bIsPlayerInBattleArea
RETURN FALSE
ENDIF
// Do we want a wall spawn this time?
FLOAT rnd = GET_RANDOM_FLOAT_IN_RANGE()
IF rnd > fSpawnChance
RETURN FALSE
ENDIF
VECTOR vWallLoc
IF GET_SPECIFIC_WALL_SPAWN_DATA(vWallLoc)
vOut = vWallLoc
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Resolve cars for mission
PROC RESOLVE_MISSION_VEHICLES_FOR_CUTSCENE()
CPRINTLN(DEBUG_MISSION, "Vehicles Resolved For Intro")
IF IS_REPLAY_START_VEHICLE_UNDER_SIZE_LIMIT(GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR(), TRUE)
CPRINTLN(DEBUG_MISSION, "Setting post-mission respawn location to where vehicle was")
IF IS_ENTITY_ALIVE(GET_MISSION_START_VEHICLE_INDEX())
vPlayerVehicleLoc = GET_ENTITY_COORDS(GET_MISSION_START_VEHICLE_INDEX())
fPlayerVehicleHead = GET_ENTITY_HEADING(GET_MISSION_START_VEHICLE_INDEX())
ENDIF
ENDIF
IF NOT IS_REPLAY_START_VEHICLE_UNDER_SIZE_LIMIT(GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR(), TRUE)
OR GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(GET_MISSION_START_VEHICLE_INDEX(), vMissionStart) < 10.0
vPlayerVehicleLoc = vPlayerCarRespot
fPlayerVehicleHead = fPlayerCarRespot
ENDIF
CPRINTLN(DEBUG_MISSION, "Vehicles Loc = ", vPlayerVehicleLoc)
CPRINTLN(DEBUG_MISSION, "Vehicles Head = ", fPlayerVehicleHead)
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA_WITH_SIZE_LIMIT(respotVehicleArea.vPosition[0], respotVehicleArea.vPosition[1], respotVehicleArea.fWidth,
vPlayerCarRespot, fPlayerCarRespot, GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR())
IF IS_REPLAY_START_VEHICLE_UNDER_SIZE_LIMIT(GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR(), TRUE)
SET_MISSION_VEHICLE_GEN_VEHICLE(GET_MISSION_START_VEHICLE_INDEX(), vPlayerVehicleLoc, fPlayerVehicleHead)
ENDIF
CPRINTLN(DEBUG_MISSION, "Vehicles Loc (after gen) = ", vPlayerVehicleLoc)
CPRINTLN(DEBUG_MISSION, "Vehicles Head (after gen) = ", fPlayerVehicleHead)
ENDPROC
PROC MOVE_PLAYERS_VEHICLE()
CPRINTLN(DEBUG_MISSION, "MOVE_PLAYERS_VEHICLE")
IF bPlayerVehicleMoved
CPRINTLN(DEBUG_MISSION, "Vehicle already moved")
EXIT
ENDIF
IF DOES_ENTITY_EXIST(GET_MISSION_START_VEHICLE_INDEX())
AND NOT ARE_VECTORS_EQUAL(vPlayerVehicleLoc, vPlayerCarRespot)
CLEAR_AREA(vPlayerVehicleLoc, 3.0, TRUE)
IF IS_ENTITY_ALIVE(GET_MISSION_START_VEHICLE_INDEX())
SET_ENTITY_COORDS(GET_MISSION_START_VEHICLE_INDEX(), vPlayerVehicleLoc)
SET_ENTITY_HEADING(GET_MISSION_START_VEHICLE_INDEX(), fPlayerVehicleHead)
SET_VEHICLE_ON_GROUND_PROPERLY(GET_MISSION_START_VEHICLE_INDEX())
ENDIF
IF IS_REPLAY_START_VEHICLE_UNDER_SIZE_LIMIT(GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR(), TRUE)
SET_MISSION_VEHICLE_GEN_VEHICLE(GET_MISSION_START_VEHICLE_INDEX(), vPlayerVehicleLoc, fPlayerVehicleHead)
ENDIF
CPRINTLN(DEBUG_MISSION, "Vehicles Loc = ", vPlayerVehicleLoc)
CPRINTLN(DEBUG_MISSION, "Vehicles Head = ", fPlayerVehicleHead)
ENDIF
bPlayerVehicleMoved = TRUE
ENDPROC
/// PURPOSE:
/// Tells us if the mission is in combat state
FUNC BOOL IS_MISSION_IN_COMBAT_STAGE()
INT i1 = ENUM_TO_INT(SE_INTRO)
INT i2 = ENUM_TO_INT(SE_PASSOUT)
INT i = ENUM_TO_INT(stageEnum)
RETURN (i > i1) AND (i < i2)
ENDFUNC
/// PURPOSE:
/// Resets all the values that we set up - useful for z menu
PROC RESET_MISSION_COUNTERS()
iAlienNextSummonTime = GET_GAME_TIMER()
bSummonRushFlagActive = FALSE
bSummonFlagActive = FALSE
bAllowSummoning = FALSE
iAlienSummonerIndex = -1
iTotalAlienSummonCount = 0
iTotalAlienSpawnCount = 0
iTotalAlienDeadCount = 0
iKillChain = 0
iKillChainEndTime = 0
iMaxActiveAliens = kiMaxStartingAliens
ENDPROC
/// PURPOSE:
/// Resets all the values that we set up - useful for z menu
PROC RESET_MISSION_PARAMETERS()
// @SBA - ADDED BY REQUEST (just minigun)
playerWeapon = WEAPONTYPE_MINIGUN
fAlienSummonRange = 7.5
iAlienButtonMashLimit = 10
iAlienSummonTimeLength = 6000
fAlienBeamStartRange = 15.0
iAlienBeamChargeTime = 1500
iAlienBeamShootTime = 4500
fAlienImpactEffectSize = 0.375
fAlienChargeEffectSize = 0.8
fAlienTeleportEffectSize = 2.0
fAlienBeamEffectSize = 0.75
fAlienBeamMaximumLength = 100.0
fAlienBeamLengthInc = 2.0
fAlienMinBeamTriggerVariance = -0.1
fAlienMaxBeamTriggerVariance = 0.3
fAlienMinSpawnRadius = 30.0
fAlienMaxSpawnRadius = 40.0
fAlienBeamKnockDownForce = 1.75
bAlienBeamKnockDown = FALSE
iAlienBeamDamage = 1
iAlienBeamDamageDelay = 75
iAlienWatchSummonTimeOut = 3500
iAlienMinAutoGenTime = kiAlienMinAutoGenBaseTime
iAlienMaxAutoGenTime = kiAlienMaxAutoGenBaseTime
iAlienAutoGenDeltaTime = kiAlienAutoGenDeltaTime
fTimeScale = 0.8
bPlayerVehicleMoved = FALSE
ENDPROC
PROC CLEANUP_SCREEN_FX()
IF ANIMPOSTFX_IS_RUNNING(FX_DrugsIn)
ANIMPOSTFX_STOP(FX_DrugsIn)
ENDIF
IF ANIMPOSTFX_IS_RUNNING(FX_DrugsSkip)
ANIMPOSTFX_STOP(FX_DrugsSkip)
ENDIF
IF ANIMPOSTFX_IS_RUNNING(FX_DrugsOut)
ANIMPOSTFX_STOP(FX_DrugsOut)
ENDIF
ENDPROC
/// PURPOSE:
/// Sets the mission fail reason and goes into the fail state
PROC SET_MISSION_FAILED_ABDUCTED()
IF (stageEnum <> SE_ABDUCT) AND (stageEnum <> SE_FAILED)
stageProgress = SP_LOADING
stageEnum = SE_ABDUCT
ENDIF
ENDPROC
/// PURPOSE:
/// Sets the mission fail reason and goes into the fail state
/// PARAMS:
/// sFailReason - text label of fail reason
PROC SET_MISSION_FAILED(STRING sFailReason)
IF stageEnum <> SE_FAILED
CPRINTLN(DEBUG_MISSION, "Setting mission as failed. ", sFailReason)
sFailString = sFailReason
stageProgress = SP_LOADING
stageEnum = SE_FAILED
ENDIF
ENDPROC
/// PURPOSE:
/// Handles the death sequence
/// PARAMS:
/// beamDirection - direction of beam that kills player
PROC ABDUCT_SEQUENCE_END()
IF GET_GAME_TIMER() > iFailTimer
AND iFailTimer <> -1
IF IS_ENTITY_OK(PLAYER_PED_ID())
SET_ENTITY_VISIBLE(PLAYER_PED_ID(), FALSE)
ENDIF
RC_END_CUTSCENE_MODE(TRUE, FALSE)
iFailTimer = -1
ENDIF
ENDPROC
/// PURPOSE:
/// Handles the death sequence
/// PARAMS:
/// beamDirection - direction of beam that kills player
PROC DEATH_SEQUENCE(VECTOR beamOrigin, VECTOR beamImpact, BOOL bKillPlayer = TRUE)
//VECTOR v
#IF IS_DEBUG_BUILD
IF bDebugTTYSpew = TRUE
CPRINTLN(DEBUG_MISSION, "Player got lasered to death")
ENDIF
#ENDIF
SET_PLAYER_HEALTH_RECHARGE_MULTIPLIER(PLAYER_ID(), 0)
IF NOT IS_VECTOR_ZERO(beamOrigin) AND NOT IS_VECTOR_ZERO(beamImpact)
// SHOOT_SINGLE_BULLET_BETWEEN_COORDS(beamOrigin, beamImpact, 100000, TRUE, WEAPONTYPE_PISTOL, NULL, FALSE) - IS THIS CRASHING IT?
ENDIF
gunObject = CREATE_FAKE_WEAPON_FOR_PLAYER(playerWeapon)
SAFE_RELEASE_OBJECT(gunObject)
IF (bKillPlayer = TRUE)
APPLY_DAMAGE_TO_PED(PLAYER_PED_ID(), 100000, TRUE)
EXPLODE_PED_HEAD(PLAYER_PED_ID())
ENDIF
ENDPROC
PROC HANDLE_LOCK_PLAYER_IN_FRONT_OF_TABLE()
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), (<<189.13988, -955.80487, 29.09192>>), (<<187.52740, -955.01056,31.091919>>), 2.5000000)
CPRINTLN(DEBUG_MISSION, "HANDLE_LOCK_PLAYER_IN_FRONT_OF_TABLE: Locking player")
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON)
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[0])
TASK_TURN_PED_TO_FACE_ENTITY(PLAYER_PED_ID(), sRCLauncherDataLocal.pedID[0])
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Given a point does a ground z check, checks it not in a no spawn zone and there are no peds too close
/// PARAMS:
/// pos - position to check
/// bUseSmallerPlayerRange - decrease player range so aliens can spawn closer
/// RETURNS:
/// True / False
FUNC BOOL CHECK_SPAWN_POINT_IS_OK(VECTOR &pos, BOOL bUseSmallerPlayerRange = FALSE)
VECTOR spawnPos
FLOAT fPlayerRange = 15.0
// do a safety check here
IF NOT GET_SAFE_COORD_FOR_PED(pos, FALSE, spawnPos, GSC_FLAG_NOT_ISOLATED | GSC_FLAG_NOT_INTERIOR | GSC_FLAG_NOT_WATER)
CPRINTLN(DEBUG_MISSION, "CHECK SPAWN POINT IS OK - FAILED - CAN'T GET A SAFE COORD FOR POS:[", pos.x, ",", pos.y, ",", pos.z, "]")
RETURN FALSE
ENDIF
IF bUseSmallerPlayerRange
fPlayerRange = 2.5
ELIF iTotalAlienDeadCount > 27
fPlayerRange = 10.0
ENDIF
IF IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), spawnPos, fPlayerRange)
CPRINTLN(DEBUG_MISSION, "CHECK SPAWN POINT IS OK - FAILED - PLAYER WITHIN RANGE OF SPAWN POS:[", spawnPos.x, ",", spawnPos.y, ",", spawnPos.z, "] - RANGE:", fPlayerRange)
RETURN FALSE
ENDIF
// check there isn't a ped in the same area
//IF IS_ANY_PED_IN_SPHERE(spawnPos, 2.0, PLAYER_PED_ID()) /// don't need to exclude player as the check above will do that
IF (GET_DISTANCE_BETWEEN_COORDS(spawnPos, vBattleCenter) > fBattleRadius)
CPRINTLN(DEBUG_MISSION, "CHECK SPAWN POINT IS OK - FAILED - SPAWN POS:[", spawnPos.x, ",", spawnPos.y, ",", spawnPos.z, "] IS TOO FAR AWAY FROM BATTLE CENTER")
RETURN FALSE
ENDIF
IF NOT IS_POINT_IN_ANGLED_AREA(spawnPos, missionBoundary.vPosition[0], missionBoundary.vPosition[1], missionBoundary.fWidth)
CPRINTLN(DEBUG_MISSION, "CHECK SPAWN POINT IS OK - FAILED - SPAWN POS:[", spawnPos.x, ",", spawnPos.y, ",", spawnPos.z, "] IS NOT WITHIN MISSION BOUNDARY")
RETURN FALSE
ENDIF
IF (bUseIsAreaOccupied)
IF IS_ANY_PED_IN_SPHERE(spawnPos, 2.0)
CPRINTLN(DEBUG_MISSION, "CHECK SPAWN POINT IS OK - FAILED - IS_ANY_PED_IN_SPHERE - SPAWN POS:[", spawnPos.x, ",", spawnPos.y, ",", spawnPos.z, "] THERE IS ANOTHER ALIEN WITHIN 2 METERS")
RETURN FALSE
ENDIF
ELSE
IF IS_ANY_PED_NEAR_POINT(spawnPos, 2.0)
CPRINTLN(DEBUG_MISSION, "CHECK SPAWN POINT IS OK - FAILED - IS_ANY_PED_NEAR_POINT - SPAWN POS:[", spawnPos.x, ",", spawnPos.y, ",", spawnPos.z, "] THERE IS ANOTHER ALIEN WITHIN 2 METERS")
RETURN FALSE
ENDIF
ENDIF
pos = spawnPos
RETURN TRUE
ENDFUNC
//----------------------
// @SBA - MISC FUNCTIONS
//----------------------
/// PURPOSE:
/// Generates a ped spawn point in range of player - also uses CHECK_SPAWN_POINT_IS_OK()
/// PARAMS:
/// out - new position
/// minrange - desired minimum range
/// maxrange - desired maximum range
/// RETURNS:
/// True on success
FUNC BOOL GENERATE_ALIEN_SPAWN_POINT(VECTOR &out)
IF (bIsPlayerInBattleArea = FALSE)
RETURN FALSE
ENDIF
IF (bUseAlienSpawnPoint)
out = GET_RANDOM_POINT_IN_DISC(vAlienSpawnPoint, fAlienSpawnPointRadius, 6.0)
ELSE
out = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()),
GET_RANDOM_FLOAT_IN_RANGE(0.0, 360.0), <<0, GET_RANDOM_FLOAT_IN_RANGE(fAlienMinSpawnRadius, fAlienMaxSpawnRadius), 6.0>>)
ENDIF
RETURN CHECK_SPAWN_POINT_IS_OK(out)
ENDFUNC
/// PURPOSE:
/// @SBA - a verion of GENERATE_ALIEN_SPAWN_POINT that takes a vector and radius
/// (Added this to keep the functionality of the two distinct)
/// PARAMS:
/// vIn - Centerpoint
/// fRadius - radius of disc
/// out - new position
/// RETURNS:
/// TRUE if a useable spawn vector is found
FUNC BOOL GENERATE_ALIEN_SPAWN_POINT_NEAR_LOCATION(VECTOR vIn, FLOAT fRadius, VECTOR &out)
IF (bIsPlayerInBattleArea = FALSE)
RETURN FALSE
ENDIF
CPRINTLN(DEBUG_MISSION, "GENERATE_ALIEN_SPAWN_POINT_NEAR_LOCATION - TRYING GENERATE POINT WITHIN ", fRadius, " METERS OF [", vIn.x, ",", vIn.y, "," ,vIn.z, "]")
out = GET_RANDOM_POINT_IN_DISC(vIn, fRadius, 6.0)
RETURN CHECK_SPAWN_POINT_IS_OK(out, TRUE)
ENDFUNC
/// PURPOSE:
/// Gets which weapon the player ought to have next
/// PARAMS:
/// wtPlayerWeapon - the player's current weapon
/// RETURNS:
/// The next weapon in the list
FUNC WEAPON_TYPE GET_PLAYERS_NEXT_WEAPON(WEAPON_TYPE wtPlayerWeapon)
WEAPON_TYPE wtNextWeapon
IF wtPlayerWeapon = wtSniperRifle
wtNextWeapon = wtPistol
ELIF wtPlayerWeapon = wtPistol
wtNextWeapon = wtGrenLauncher
ELIF wtPlayerWeapon = wtGrenLauncher
wtNextWeapon = wtMiniGun //@TODO - change this to wtStunGun when I get it working
// ELIF wtPlayerWeapon = wtStunGun
// wtNextWeapon = wtMiniGun
ELSE
CPRINTLN(DEBUG_MISSION, "*** GET_PLAYERS_NEXT_WEAPON: How'd we get to DEFAULT case?! ***")
wtNextWeapon = wtMiniGun
ENDIF
CPRINTLN(DEBUG_MISSION, "GET_PLAYERS_NEXT_WEAPON: Next weapon = ", GET_WEAPON_NAME(wtNextWeapon))
RETURN wtNextWeapon
ENDFUNC
/// PURPOSE:
/// Gets the appropriate ammount of ammo depending on the weapon type
/// PARAMS:
/// wtPlayerWeapon - The weapon type to check
/// RETURNS:
/// The ammount of ammo that weapon should have
FUNC INT GET_ALLOWED_AMMO_FOR_WEAPON(WEAPON_TYPE wtPlayerWeapon)
INT iAmmoAllowed
IF wtPlayerWeapon = wtSniperRifle
iAmmoAllowed = kiSniperAmmo
ELIF wtPlayerWeapon = wtPistol
iAmmoAllowed = kiPistolAmmo
ELIF wtPlayerWeapon = wtGrenLauncher
iAmmoAllowed = kiGrenLaunchAmmo
// ELIF wtPlayerWeapon = wtStunGun
// iAmmoAllowed = INFINITE_AMMO
ELIF wtPlayerWeapon = wtMiniGun
iAmmoAllowed = kiMinigunAmmo
ELSE
CPRINTLN(DEBUG_MISSION, "*** GET_ALLOWED_AMMO_FOR_WEAPON: How'd we get to DEFAULT case?! ***")
iAmmoAllowed = INFINITE_AMMO
ENDIF
CPRINTLN(DEBUG_MISSION, "GET_ALLOWED_AMMO_FOR_WEAPON: Returning ammo ammount = ", iAmmoAllowed)
RETURN iAmmoAllowed
ENDFUNC
/// PURPOSE:
/// Checks if the player has the wepaon passed in and if it has no ammo in it
/// PARAMS:
/// wtPlayerWeapon - the weapon to check
/// RETURNS:
/// TRUE if out of ammo for this weapon; FALSE otherwise
FUNC BOOL IS_PLAYER_OUT_OF_AMMO(WEAPON_TYPE wtPlayerWeapon)
IF IS_PED_INJURED(PLAYER_PED_ID())
RETURN FALSE
ENDIF
IF NOT HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), wtPlayerWeapon)
CPRINTLN(DEBUG_MISSION, "IS_PLAYER_OUT_OF_AMMO: *** Player does not have weapon type: ", GET_WEAPON_NAME(wtPlayerWeapon))
RETURN FALSE
ENDIF
IF GET_AMMO_IN_PED_WEAPON(PLAYER_PED_ID(), wtPlayerWeapon) = 0
CPRINTLN(DEBUG_MISSION, "IS_PLAYER_OUT_OF_AMMO: Yes! Empty!")
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Give the player the next weapon he should have
/// PARAMS:
/// wtPlayerWeapon - Pass by ref the player's weapon type
PROC SWAP_THE_PLAYERS_WEAPON(WEAPON_TYPE &wtPlayerWeapon)
IF IS_PED_INJURED(PLAYER_PED_ID())
EXIT
ENDIF
// Remove existing weapon
IF NOT HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), wtPlayerWeapon)
REMOVE_WEAPON_FROM_PED(PLAYER_PED_ID(), wtPlayerWeapon)
CPRINTLN(DEBUG_MISSION, "SWAP_THE_PLAYERS_WEAPON: Removing player's weapon: ", GET_WEAPON_NAME(wtPlayerWeapon))
ENDIF
// init the next weapon and get its ammo
wtPlayerWeapon = GET_PLAYERS_NEXT_WEAPON(wtPlayerWeapon)
INT iAmmo = GET_ALLOWED_AMMO_FOR_WEAPON(wtPlayerWeapon)
// give it to the player
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), wtPlayerWeapon, iAmmo, TRUE)
IF wtPlayerWeapon = wtMiniGun
SET_PED_INFINITE_AMMO(PLAYER_PED_ID(), TRUE, wtPlayerWeapon)
ELSE
// @SBA - make sure he has the right ammount of ammo (this seems really convoluted)
SET_AMMO_IN_CLIP(PLAYER_PED_ID(), wtPlayerWeapon, 0)
SET_PED_AMMO(PLAYER_PED_ID(), wtPlayerWeapon, 0)
ADD_AMMO_TO_PED(PLAYER_PED_ID(), wtPlayerWeapon, iAmmo)
ENDIF
CPRINTLN(DEBUG_MISSION, "SWAP_THE_PLAYERS_WEAPON: Player given new weapon: ", GET_WEAPON_NAME(wtPlayerWeapon))
CPRINTLN(DEBUG_MISSION, "SWAP_THE_PLAYERS_WEAPON: Ammo in new weapon = ", GET_AMMO_IN_PED_WEAPON(PLAYER_PED_ID(), wtPlayerWeapon))
ENDPROC
/// PURPOSE:
/// Forces the players weapon
PROC FORCE_PLAYER_WEAPON(WEAPON_TYPE wtWeaponToGive)
WEAPON_TYPE wpn
//playerWeapon = wtWeaponToGive
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
IF NOT HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), wtWeaponToGive)
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), wtWeaponToGive, 10, TRUE, TRUE)
CPRINTLN(DEBUG_MISSION, "Player doesn't have a minigun lets give him one.")
ELSE
IF NOT GET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), wpn) OR (wpn <> wtWeaponToGive)
CPRINTLN(DEBUG_MISSION, "Player has a minigun but doesn't want to equip it for some reason.")
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), wtWeaponToGive, TRUE)
ELSE
CPRINTLN(DEBUG_MISSION, "Player - Should have the minigun and it should be in his hand")
ENDIF
ENDIF
// @SBA - we don't always want the weapon to have inifinite ammo now
// @SBA - COMMENTING OUT BY REQUEST
// SET_AMMO_IN_CLIP(PLAYER_PED_ID(), wtWeaponToGive, 0)
// SET_PED_AMMO(PLAYER_PED_ID(), wtWeaponToGive, 0)
ADD_AMMO_TO_PED(PLAYER_PED_ID(), wtWeaponToGive, 10000) // OLD = 10000 // 10
SET_PED_INFINITE_AMMO(PLAYER_PED_ID(), TRUE, wtWeaponToGive)
SET_PED_CURRENT_WEAPON_VISIBLE(PLAYER_PED_ID(), TRUE)
SET_PED_CAN_SWITCH_WEAPON(PLAYER_PED_ID(), FALSE)
REFILL_AMMO_INSTANTLY(PLAYER_PED_ID())
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), TRUE, -1)
//FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ACTIONMODE_IDLE, TRUE)
ENDIF
ENDPROC
//----------------------
// DIALOG FUNCTIONS
//----------------------
/// PURPOSE:
/// Returns True if God Text is on
FUNC BOOL ARE_OBJECTIVES_BEING_DISPLAYED()
IF IS_THIS_PRINT_BEING_DISPLAYED("PRIME2") // Kill the ~r~clowns.~s~
RETURN TRUE
ENDIF
IF IS_THIS_PRINT_BEING_DISPLAYED("B1_WARN") // Return to the ~r~battle.~s~
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Returns True if God Text is on
FUNC BOOL ARE_OBJECTIVES_OR_TEXT_BEING_DISPLAYED()
IF IS_THIS_PRINT_BEING_DISPLAYED("PRIME2") // Kill the ~r~clowns.~s~
RETURN TRUE
ENDIF
IF IS_THIS_PRINT_BEING_DISPLAYED("B1_WARN") // Return to the ~r~battle.~s~
RETURN TRUE
ENDIF
IF IS_ANY_TEXT_BEING_DISPLAYED(sLocateData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Initial sets up Michaels Ranting during the battle
PROC SETUP_MICHAEL_DIALOG()
ADD_PED_FOR_DIALOGUE(convoMichael, ENUM_TO_INT(CHAR_MICHAEL), PLAYER_PED_ID(), "MICHAEL")
iFirstDialogTime = GET_GAME_TIMER() + 1500
iNextFreakDialogTime = iFirstDialogTime + GET_RANDOM_INT_IN_RANGE(20000, 40000)
iNextFightDialogTime = iFirstDialogTime + GET_RANDOM_INT_IN_RANGE(12000, 18000)
iNextDamageDialogTime = GET_GAME_TIMER()
bHasInitialOutburst = FALSE
ENDPROC
/// PURPOSE:
/// Runs the fight rants Michael can shout out during the battle
PROC PLAY_MICHAEL_FREAK_DIALOG_LINES()
IF IS_SCRIPTED_CONVERSATION_ONGOING()
EXIT
ENDIF
IF (GET_GAME_TIMER() < iNextFreakDialogTime)
EXIT
ENDIF
IF (NOT bHasInitialOutburst)
EXIT
ENDIF
IF ARE_OBJECTIVES_OR_TEXT_BEING_DISPLAYED()
EXIT
ENDIF
#IF IS_DEBUG_BUILD
IF bDebugTTYSpew = TRUE
CPRINTLN(DEBUG_MISSION, "Trying to play Michael Freak Rant - Time:", (GET_GAME_TIMER() - iMissionDebugTime) / 1000)
ENDIF
#ENDIF
ADD_PED_FOR_DIALOGUE(convoMichael, ENUM_TO_INT(CHAR_MICHAEL), PLAYER_PED_ID(), "MICHAEL")
IF CREATE_CONVERSATION(convoMichael, "BARY1AU", "BARY1_FREAK", CONV_PRIORITY_LOW)
#IF IS_DEBUG_BUILD
IF bDebugTTYSpew = TRUE
CPRINTLN(DEBUG_MISSION, "Michael Freak Rant - Time:", (GET_GAME_TIMER() - iMissionDebugTime) / 1000)
ENDIF
#ENDIF
iNextFreakDialogTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(20000, 40000)
// don't let fight line play too quickly after
IF iNextFightDialogTime - GET_GAME_TIMER() < kiDialogTimeCheck
CPRINTLN(DEBUG_MISSION, "Fight Rant Time too soon: resetting.")
iNextFightDialogTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(3000, 5000)
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Runs the fight rants Michael can shout out during the battle
PROC PLAY_MICHAEL_FIGHT_DIALOG_LINES()
IF IS_SCRIPTED_CONVERSATION_ONGOING()
EXIT
ENDIF
IF (GET_GAME_TIMER() < iNextFightDialogTime)
EXIT
ENDIF
IF (NOT bHasInitialOutburst)
EXIT
ENDIF
IF ARE_OBJECTIVES_OR_TEXT_BEING_DISPLAYED()
EXIT
ENDIF
#IF IS_DEBUG_BUILD
IF bDebugTTYSpew = TRUE
CPRINTLN(DEBUG_MISSION, "Trying to play Michael Fight Rant - Time:", (GET_GAME_TIMER() - iMissionDebugTime) / 1000)
ENDIF
#ENDIF
ADD_PED_FOR_DIALOGUE(convoMichael, ENUM_TO_INT(CHAR_MICHAEL), PLAYER_PED_ID(), "MICHAEL")
IF CREATE_CONVERSATION(convoMichael, "BARY1AU", "BARY1_FIGHT", CONV_PRIORITY_LOW)
#IF IS_DEBUG_BUILD
IF bDebugTTYSpew = TRUE
CPRINTLN(DEBUG_MISSION, "Michael Fight Rant - Time:", (GET_GAME_TIMER() - iMissionDebugTime) / 1000)
ENDIF
#ENDIF
iNextFightDialogTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(10000, 20000)
// don't let freak line play too quickly after
IF iNextFreakDialogTime - GET_GAME_TIMER() < kiDialogTimeCheck
CPRINTLN(DEBUG_MISSION, "Freak Rant Time too soon: resetting.")
iNextFreakDialogTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(3000, 5000)
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Runs the one shot rants Michael can shout at mission start
PROC PLAY_MICHAEL_DIALOG_LINES()
IF (GET_GAME_TIMER() < iNextDamageDialogTime)
EXIT
ENDIF
IF IS_SCRIPTED_CONVERSATION_ONGOING()
EXIT
ENDIF
#IF IS_DEBUG_BUILD
IF bDebugTTYSpew = TRUE
CPRINTLN(DEBUG_MISSION, "Trying to play Michael Damage Rant - Time:", (GET_GAME_TIMER() - iMissionDebugTime) / 1000)
ENDIF
#ENDIF
ADD_PED_FOR_DIALOGUE(convoMichael, ENUM_TO_INT(CHAR_MICHAEL), PLAYER_PED_ID(), "MICHAEL")
IF CREATE_CONVERSATION(convoMichael, "BARY1AU", "BARY1_DAMAGE", CONV_PRIORITY_HIGH, DO_NOT_DISPLAY_SUBTITLES, DO_NOT_ADD_TO_BRIEF_SCREEN)
#IF IS_DEBUG_BUILD
IF bDebugTTYSpew = TRUE
CPRINTLN(DEBUG_MISSION, "Michael Damage Rant - Time:", (GET_GAME_TIMER() - iMissionDebugTime) / 1000)
ENDIF
#ENDIF
iNextDamageDialogTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(4000, 7000)
ENDIF
ENDPROC
/// PURPOSE:
/// Runs the one shot rants Michael can shout at mission start
PROC PLAY_MICHAEL_INITIAL_LINE()
IF (GET_GAME_TIMER() < iFirstDialogTime)
EXIT
ENDIF
IF IS_SCRIPTED_CONVERSATION_ONGOING()
EXIT
ENDIF
IF (bHasInitialOutburst)
EXIT
ENDIF
TEXT_LABEL linename = "BARY1_1SHOT_"
linename += (GET_RANDOM_INT_IN_RANGE(0, 3) + 1)
#IF IS_DEBUG_BUILD
IF bDebugTTYSpew = TRUE
CPRINTLN(DEBUG_MISSION, "Michael First Line Rant:", linename)
ENDIF
#ENDIF
ADD_PED_FOR_DIALOGUE(convoMichael, ENUM_TO_INT(CHAR_MICHAEL), PLAYER_PED_ID(), "MICHAEL")
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(convoMichael, "BARY1AU", "BARY1_1SHOT", linename, CONV_PRIORITY_MEDIUM, DO_NOT_DISPLAY_SUBTITLES)
CPRINTLN(DEBUG_MISSION, "Initial Rant Played Time:", (GET_GAME_TIMER() - iMissionDebugTime) / 1000)
bHasInitialOutburst = TRUE
ENDIF
ENDPROC
/// PURPOSE:
/// Runs the fight rants Michael can say during abduction
PROC PLAY_MICHAEL_ABDUCT_DIALOG_LINE()
IF IS_SCRIPTED_CONVERSATION_ONGOING()
EXIT
ENDIF
IF (NOT bHasInitialOutburst)
EXIT
ENDIF
IF ARE_OBJECTIVES_OR_TEXT_BEING_DISPLAYED()
EXIT
ENDIF
#IF IS_DEBUG_BUILD
IF bDebugTTYSpew = TRUE
CPRINTLN(DEBUG_MISSION, "Trying to play Michael Freak Rant - Time:", (GET_GAME_TIMER() - iMissionDebugTime) / 1000)
ENDIF
#ENDIF
ADD_PED_FOR_DIALOGUE(convoMichael, ENUM_TO_INT(CHAR_MICHAEL), PLAYER_PED_ID(), "MICHAEL")
IF CREATE_CONVERSATION(convoMichael, "BARY1AU", "BARY1_ABDUCT", CONV_PRIORITY_LOW)
#IF IS_DEBUG_BUILD
IF bDebugTTYSpew = TRUE
CPRINTLN(DEBUG_MISSION, "Michael Abduct Rant - Time:", (GET_GAME_TIMER() - iMissionDebugTime) / 1000)
ENDIF
#ENDIF
ENDIF
ENDPROC
//----------------------
// ALIEN FUNCTIONS
//----------------------
/// PURPOSE:
/// Fills the index - this wouldn't be necessary if i could store references to objects...
PROC POPULATE_ALIEN_INDEX()
INT i = 0
REPEAT COUNT_OF(alienPed) i
alienPed[i].iAlienIndex = i
ENDREPEAT
ENDPROC
/// PURPOSE:
/// Returns True if this alien can do summon
/// PARAMS:
/// rp - reference to alien ped
FUNC BOOL CAN_ALIEN_SUMMON(ALIEN_PED &rp)
IF rp.bWallSpawn
RETURN FALSE
ENDIF
IF (iAlienSummonerIndex = -1)
RETURN FALSE
ELSE
RETURN (bAllowSummoning = TRUE) AND (GET_GAME_TIMER() > iAlienNextSummonTime) AND (rp.iAlienIndex = iAlienSummonerIndex)
ENDIF
ENDFUNC
/// PURPOSE:
/// Returns True if alien ped is living
/// PARAMS:
/// rp - reference to alien ped
FUNC BOOL IS_ALIEN_PED_ALIVE(ALIEN_PED &rp)
IF NOT rp.bIsActive
RETURN FALSE
ENDIF
RETURN (rp.aState <> AS_DYING) AND (rp.aState <> AS_DEAD) AND IS_ENTITY_ALIVE(rp.pedID)
ENDFUNC
/// PURPOSE:
/// Returns True if alien ped is in dying state (or dead)
/// PARAMS:
/// rp - reference to alien ped
FUNC BOOL IS_ALIEN_DYING(ALIEN_PED &rp)
RETURN (rp.aState = AS_DYING) OR (rp.aState = AS_DEAD)
ENDFUNC
/// PURPOSE:
/// Returns True if alien ped is in dying state (or dead)
/// PARAMS:
/// rp - reference to alien ped
FUNC BOOL HAS_ALIEN_FINSHED_DYING(ALIEN_PED &rp)
IF (rp.aState <> AS_DYING)
RETURN FALSE
ENDIF
IF NOT IS_ENTITY_DEAD(rp.pedID)
RETURN FALSE
ENDIF
IF NOT ARE_VECTORS_ALMOST_EQUAL(GET_ENTITY_VELOCITY(rp.pedID), <<0, 0, 0>>, 0.125)
IF bDebugTTYSpew = TRUE
CPRINTLN(DEBUG_MISSION, "Alien ", rp.iAlienIndex, " is dying but still moving")
ENDIF
RETURN FALSE
ENDIF
IF IS_PED_RAGDOLL(rp.pedID) OR IS_PED_RUNNING_RAGDOLL_TASK(rp.pedID)
//CPRINTLN(DEBUG_MISSION, "Alien ", rp.iAlienIndex, " is dying but still doing ragdoll stuff")
RETURN FALSE
ENDIF
RETURN TRUE
ENDFUNC
/// PURPOSE:
/// Tells us if this is in summon state
/// PARAMS:
/// alien - alien reference
/// RETURNS:
/// True or False
FUNC BOOL IS_ALIEN_IN_BEAM_STATE(ALIEN_PED &alien)
RETURN (alien.aState = AS_BEAM_KNOCKDOWN) OR (alien.aState = AS_BEAM)
OR (alien.aState = AS_BEAM_START) OR (alien.aState = AS_CHARGE) OR (alien.aState = AS_CHARGE_RUSH)
ENDFUNC
/// PURPOSE:
/// Tells us if this is in summon state
/// PARAMS:
/// alien - alien reference
/// RETURNS:
/// True or False
FUNC BOOL IS_ALIEN_IN_SUMMON_STATE(ALIEN_PED &alien)
RETURN (alien.aState = AS_SUMMON_RUSH) OR (alien.aState = AS_SUMMON_START)
ENDFUNC
/// PURPOSE:
/// Tells us if this is in battle state
/// PARAMS:
/// alien - alien reference
/// RETURNS:
/// True or False
FUNC BOOL IS_ALIEN_IN_BATTLE_STATE(ALIEN_PED &alien)
INT asnum = ENUM_TO_INT(alien.aState)
RETURN (asnum >= ENUM_TO_INT(AS_ACTIVE))
ENDFUNC
/// PURPOSE:
/// Returns True if alien ped is ready to be re-used
/// PARAMS:
/// rp - reference to alien ped
FUNC BOOL IS_ALIEN_PED_FREE(ALIEN_PED &rp)
RETURN NOT rp.bIsActive
ENDFUNC
/// PURPOSE:
/// Returns active number of alien peds
FUNC INT GET_ALIVE_ALIEN_PED_COUNT()
INT i = 0
INT cnt = 0
REPEAT (COUNT_OF(alienPed)) i
IF IS_ALIEN_PED_ALIVE(alienPed[i])
cnt ++
ENDIF
ENDREPEAT
RETURN cnt
ENDFUNC
/// PURPOSE:
/// Grabs an index to the first alive alien
/// PARAMS:
/// out - index in array to next free alien (this gets overwritten)
FUNC BOOL GET_FIRST_ALIVE_ALIEN_PED_INDEX(INT &out)
INT i = 0
out = -1
REPEAT (COUNT_OF(alienPed)) i
IF IS_ALIEN_PED_ALIVE(alienPed[i])
out = i
RETURN TRUE
ENDIF
ENDREPEAT
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Returns True if a alien ped is ready to be re-used
/// PARAMS:
/// out - index in array to next free alien (this gets overwritten)
FUNC BOOL GET_FREE_ALIEN_PED_INDEX(INT &out)
INT i = 0
out = -1
REPEAT (COUNT_OF(alienPed)) i
IF (alienPed[i].bIsActive = FALSE)
out = i
RETURN TRUE
ENDIF
ENDREPEAT
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Kills all alien peds
PROC KILL_ALL_ALIEN_PEDS()
INT i = 0
REPEAT (COUNT_OF(alienPed)) i
IF IS_ALIEN_PED_ALIVE(alienPed[i]) AND NOT IS_ENTITY_DEAD(alienPed[i].pedID)
EXPLODE_PED_HEAD(alienPed[i].pedID)
ENDIF
ENDREPEAT
ENDPROC
/// PURPOSE:
/// Common things which are called in both delete and cleanup
/// PARAMS:
/// ent -
PROC REMOVE_ALIEN_PARTICLE_FX(ALIEN_PED &ent)
SAFE_REMOVE_PARTICLE_FX(ent.fxSummonID)
SAFE_REMOVE_PARTICLE_FX(ent.fxChargeID)
SAFE_REMOVE_PARTICLE_FX(ent.fxBeamID)
SAFE_REMOVE_PARTICLE_FX(ent.fxImpactID)
SAFE_REMOVE_PARTICLE_FX(ent.fxScreenImpactID)
ENDPROC
/// PURPOSE:
/// Tells all alien peds to flee
PROC FLEE_ALL_ALIEN_PEDS()
INT i = 0
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
ENDIF
REPEAT COUNT_OF(alienPed) i
IF IS_ALIEN_PED_ALIVE(alienPed[i])
REMOVE_ALIEN_PARTICLE_FX(alienPed[i])
alienPed[i].aState = AS_NULL
TASK_SMART_FLEE_COORD(alienPed[i].pedID, GET_ENTITY_COORDS(PLAYER_PED_ID()), 400.0, -1)
ENDIF
ENDREPEAT
ENDPROC
/// PURPOSE:
/// Common things which are called in both delete and cleanup
/// PARAMS:
/// ent -
PROC SHARED_DELETE_CLEANUP(ALIEN_PED &ent)
IF IS_ALIEN_IN_SUMMON_STATE(ent)
bSummonRushFlagActive = FALSE
bSummonFlagActive = FALSE
ENDIF
SAFE_REMOVE_BLIP(ent.blipID)
SAFE_DELETE_OBJECT(ent.screenImpactID)
SAFE_DELETE_OBJECT(ent.projectorID)
SAFE_DELETE_OBJECT(ent.impactID)
SAFE_STOP_AND_RELEASE_SOUND_ID(ent.mindCtrlSoundID)
REMOVE_ALIEN_PARTICLE_FX(ent)
ent.iButtonMashCount = 0
ent.sBeamLOS = NULL
ENDPROC
/// PURPOSE:
/// Force everything off for hard reset
PROC STOP_ALL_ALIEN_EVERYTHING()
INT i = 0
REPEAT COUNT_OF(alienPed) i
SHARED_DELETE_CLEANUP(alienPed[i])
ENDREPEAT
ENDPROC
/// PURPOSE:
/// Cleans up a single alien ped
/// PARAMS:
/// ent - reference to alien ped
/// keepTask - set this to keep tasks after cleanup
PROC CLEANUP_ALIEN_PED(ALIEN_PED &ent, BOOL keepTask = TRUE)
IF (ent.bIsActive = FALSE)
EXIT
ENDIF
SHARED_DELETE_CLEANUP(ent)
SAFE_RELEASE_PED(ent.pedID, keepTask, FALSE)
ent.bIsActive = FALSE
ENDPROC
/// PURPOSE:
/// Cleans up a single alien ped
/// PARAMS:
/// ent - reference to alien ped
/// keepTask - set this to keep tasks after cleanup
PROC DELETE_ALIEN_PED(ALIEN_PED &ent)
IF (ent.bIsActive = FALSE)
EXIT
ENDIF
SHARED_DELETE_CLEANUP(ent)
SAFE_DELETE_PED(ent.pedID)
ent.bIsActive = FALSE
ENDPROC
/// PURPOSE:
/// Cleans all alien peds
/// PARAMS:
/// keepTask - set this to keep tasks after cleanup
PROC CLEANUP_ALL_ALIEN_PEDS(BOOL keepTask = TRUE)
INT i = 0
REPEAT COUNT_OF(alienPed) i
CLEANUP_ALIEN_PED(alienPed[i], keepTask)
ENDREPEAT
ENDPROC
/// PURPOSE:
/// Deletes all alien peds
PROC DELETE_ALL_ALIEN_PEDS()
INT i = 0
REPEAT COUNT_OF(alienPed) i
DELETE_ALIEN_PED(alienPed[i])
ENDREPEAT
ENDPROC
PROC HANDLE_PLAYING_ALIEN_CLICKING_SOUND(ALIEN_PED &alien)
IF alien.aState != AS_ACTIVE
OR alien.bWallSpawn // so as not to interfere with attack sound
EXIT
ENDIF
IF (GET_GAME_TIMER() > alien.iClickSoundTimer)
IF alien.fDistToPlayer < kfMinClickSoundDist
alien.iClickSoundTimer = GET_GAME_TIMER() +(GET_RANDOM_INT_IN_RANGE(iAlienMinClickTime, iAlienMaxClickTime))
EXIT
ENDIF
//CPRINTLN(DEBUG_MISSION, "Playing click speech for alien ", alien.iAlienIndex)
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(alien.pedID, "ALIEN_CLICKS", "ALIENS", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
alien.iClickSoundTimer = GET_GAME_TIMER() +(GET_RANDOM_INT_IN_RANGE(iAlienMinClickTime, iAlienMaxClickTime))
ENDIF
ENDPROC
/// PURPOSE:
/// Creates one alien ped
/// PARAMS
/// alien - alien ped reference
/// pos - alien spawn point
/// rank - this dicates the order people spawn in
FUNC BOOL CREATE_ALIEN_PED(ALIEN_PED &alien, VECTOR pos, INT rank = 0, BOOL checkSpt = TRUE)
// do a safety check here
IF (checkSpt)
IF NOT CHECK_SPAWN_POINT_IS_OK(pos)
RETURN FALSE
ENDIF
ENDIF
// create the alien
alien.pedID = CREATE_PED(PEDTYPE_MISSION, alienModel, pos)
IF NOT DOES_ENTITY_EXIST(alien.pedID)
RETURN FALSE
ENDIF
CLEAR_PED_TASKS_IMMEDIATELY(alien.pedID)
SET_ENTITY_COORDS_GROUNDED(alien.pedID, pos)
SET_ENTITY_HEADING_FACE_PLAYER(alien.pedID)
SET_PED_RELATIONSHIP_GROUP_HASH(alien.pedID, RELGROUPHASH_HATES_PLAYER)
SET_PED_CONFIG_FLAG(alien.pedID, PCF_DisableMelee, TRUE)
STOP_PED_SPEAKING(alien.pedID, TRUE)
DISABLE_PED_PAIN_AUDIO(alien.pedID, TRUE)
SET_AMBIENT_VOICE_NAME(alien.pedID, "ALIENS")
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(alien.pedID, TRUE)
SET_PED_DEFAULT_COMPONENT_VARIATION(alien.pedID)
SET_PED_AS_ENEMY(alien.pedID, TRUE)
SET_PED_MONEY(alien.pedID, 0)
FREEZE_ENTITY_POSITION(alien.pedID, TRUE)
SET_ENTITY_INVINCIBLE(alien.pedID, TRUE)
SET_ENTITY_COLLISION(alien.pedID, FALSE)
SET_ENTITY_VISIBLE(alien.pedID, FALSE)
SET_ENTITY_CAN_BE_TARGETED_WITHOUT_LOS(alien.pedID, FALSE)
SET_PED_CAN_BE_TARGETTED(alien.pedID, FALSE)
SET_ENTITY_IS_TARGET_PRIORITY(alien.pedID, TRUE)
SET_ENTITY_MAX_HEALTH(alien.pedID, iAlienMaxHP)
SET_ENTITY_HEALTH(alien.pedID, iAlienMaxHP)
// create beam projector
alien.projectorID = CREATE_OBJECT_NO_OFFSET(beamDummyModel, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(alien.pedID, <<0, -5, 0>>))
IF IS_ENTITY_OK(alien.projectorID)
SET_ENTITY_COLLISION(alien.projectorID, FALSE)
SET_ENTITY_VISIBLE(alien.projectorID, FALSE)
FREEZE_ENTITY_POSITION(alien.projectorID, TRUE)
ENDIF
// create impact object
alien.impactID = CREATE_OBJECT_NO_OFFSET(beamDummyModel, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(alien.pedID, <<0, -5, 0>>))
IF IS_ENTITY_OK(alien.impactID)
SET_ENTITY_COLLISION(alien.impactID, FALSE)
SET_ENTITY_VISIBLE(alien.impactID, FALSE)
FREEZE_ENTITY_POSITION(alien.impactID, TRUE)
ENDIF
alien.screenImpactID = CREATE_OBJECT_NO_OFFSET(beamDummyModel, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(alien.pedID, <<0, 5, 0>>))
IF IS_ENTITY_OK(alien.screenImpactID)
SET_ENTITY_COLLISION(alien.screenImpactID, FALSE)
SET_ENTITY_VISIBLE(alien.screenImpactID, FALSE)
FREEZE_ENTITY_POSITION(alien.screenImpactID, TRUE)
ENDIF
// turn him on
alien.aState = AS_DELAY
alien.bIsActive = TRUE
alien.bWallSpawn = FALSE
alien.iTimer = GET_GAME_TIMER() + (rank * GENDELAY_TIME)
alien.iClickSoundTimer = GET_GAME_TIMER() + (GET_RANDOM_INT_IN_RANGE(iAlienMinClickTime, iAlienMaxClickTime))
alien.fDistToPlayer = GET_DISTANCE_BETWEEN_ENTITIES(alien.pedID, PLAYER_PED_ID())
alien.fRunRatio = GET_RANDOM_FLOAT_IN_RANGE(PEDMOVE_RUN, PEDMOVE_SPRINT)
alien.fBeamTriggerRange = fAlienBeamStartRange + (GET_RANDOM_FLOAT_IN_RANGE(fAlienMinBeamTriggerVariance, fAlienMaxBeamTriggerVariance) * fAlienBeamStartRange)
alien.fPedAlpha = 0
IF bDebugTTYSpew = TRUE
CPRINTLN(DEBUG_MISSION, "Alien ", alien.iAlienIndex, " Beam Trigger Range = ", alien.fBeamTriggerRange )
ENDIF
TASK_PLAY_ANIM(alien.pedID, sMissionAnimDictionary, sAlienTeleportAnim, INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING)
iTotalAlienSpawnCount ++
RETURN TRUE
ENDFUNC
/// PURPOSE:
/// Set the alien to be more easily killed
/// PARAMS:
/// alien - alien struct
PROC SET_ALIEN_WEAK(ALIEN_PED &alien)
IF NOT IS_PED_INJURED(alien.pedID)
CPRINTLN(DEBUG_MISSION, "SET_ALIEN_WEAK" )
SET_ENTITY_HEALTH(alien.pedID, iAlienMaxHP/4)
SET_PED_DIES_WHEN_INJURED(alien.pedID, TRUE)
SET_PED_SUFFERS_CRITICAL_HITS(alien.pedID, TRUE)
ENDIF
ENDPROC
/// PURPOSE:
/// Spawn in a new alien under certain conditions
/// PARAMS:
/// iAlienCount -
PROC SPAWN_NEXT_ALIEN_NEAR_LOCATION(VECTOR vCenterPt, FLOAT fRadius, INT iAlienCount = 5, BOOL bSetAsWeak = FALSE)
INT i
VECTOR v
// If the alien count drops low enough, spawn a new one if timer is up
IF (iAlienAliveCount < iAlienCount)
IF TIMER_DO_ONCE_WHEN_READY(tmr1stContactSpawn, f1stContactSpawnTime)
IF GET_FREE_ALIEN_PED_INDEX(i)
IF GENERATE_ALIEN_SPAWN_POINT_NEAR_LOCATION(vCenterPt, fRadius, v)
IF CREATE_ALIEN_PED(alienPed[i], v, 0, FALSE)
CPRINTLN(DEBUG_MISSION, "SPAWN_NEXT_ALIEN_NEAR_LOCATION: Alien ", alienPed[i].iAlienIndex, " Spawned!" )
IF bSetAsWeak
SET_ALIEN_WEAK(alienPed[i])
ENDIF
ELSE
CPRINTLN(DEBUG_MISSION, "SPAWN_NEXT_ALIEN_NEAR_LOCATION: Could not spawn alien: ", alienPed[i].iAlienIndex)
ENDIF
START_TIMER_NOW(tmr1stContactSpawn)
f1stContactSpawnTime = GET_RANDOM_FLOAT_IN_RANGE(1.500, 2.500)
ELSE
CPRINTLN(DEBUG_MISSION, "SPAWN_NEXT_ALIEN_NEAR_LOCATION: Could not generate a spawn point for alien: ", alienPed[i].iAlienIndex)
START_TIMER_NOW(tmr1stContactSpawn)
f1stContactSpawnTime = 1.000
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC HANDLE_AUTO_ALIEN_GENERATION()
// increase the alien auto gen delay timer as the number of allowed aliens rises
INT m = 0
IF iMaxActiveAliens > kiMaxStartingAliens
m = iMaxActiveAliens - kiMaxStartingAliens
iAlienAutoGenDeltaTime = kiAlienAutoGenDeltaTime * m
iAlienMinAutoGenTime = kiAlienMinAutoGenBaseTime + iAlienAutoGenDeltaTime
iAlienMaxAutoGenTime = kiAlienMaxAutoGenBaseTime + iAlienAutoGenDeltaTime
ENDIF
// run the gauntlet of checks, reset timer
// is auto create active
IF NOT bAutoCreateAliens
iAlienAutoGenTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(iAlienMinAutoGenTime, iAlienMaxAutoGenTime)
EXIT
ENDIF
// are we doing an abduction attempt (if so, wait a little longer before spawning new aliens)
IF bSummonFlagActive
iAlienAutoGenTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(iAlienMinAutoGenTime*3, iAlienMaxAutoGenTime*2)
EXIT
ENDIF
// do we have enough aliens already
IF (iAlienAliveCount >= iMaxActiveAliens)
iAlienAutoGenTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(iAlienMinAutoGenTime, iAlienMaxAutoGenTime)
EXIT
ENDIF
INT i
VECTOR v
// timer so we don't spawn all possible aliens ones at once
IF GET_GAME_TIMER() > iAlienAutoGenTime
IF GET_FREE_ALIEN_PED_INDEX(i)
IF GENERATE_ALIEN_WALL_SPAWN(v, 0.4)
CREATE_ALIEN_PED(alienPed[i], v, 0, FALSE)
alienPed[i].bWallSpawn = TRUE
alienPed[i].fBeamTriggerRange = 150
iAlienAutoGenTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(iAlienMinAutoGenTime, iAlienMaxAutoGenTime)
SET_ALIEN_WEAK(alienPed[i])
//CPRINTLN(DEBUG_MISSION, "HANDLE_AUTO_ALIEN_GENERATION: (Wall spawn) Time until next alien spawn = ", iAlienAutoGenTime - GET_GAME_TIMER())
ELIF GENERATE_ALIEN_SPAWN_POINT(v)
CREATE_ALIEN_PED(alienPed[i], v, 0, FALSE)
iAlienAutoGenTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(iAlienMinAutoGenTime, iAlienMaxAutoGenTime)
//CPRINTLN(DEBUG_MISSION, "HANDLE_AUTO_ALIEN_GENERATION: Time until next alien spawn = ", iAlienAutoGenTime - GET_GAME_TIMER())
ENDIF
ENDIF
ENDIF
ENDPROC
//----------------------
// ALIEN UPDATE FUNCTIONS
//----------------------
/// PURPOSE:
/// Dead Checking
/// PARAMS:
/// alien - alien reference
/// RETURNS:
/// Return true if the alien is dead
FUNC BOOL UPDATE_ALIEN_DEAD_CHECKING(ALIEN_PED &alien)
IF NOT IS_ALIEN_DYING(alien)
alien.fDistToPlayer = GET_DISTANCE_BETWEEN_ENTITIES(alien.pedID, PLAYER_PED_ID(), FALSE)
IF IS_ENTITY_DEAD(alien.pedID)
OR IS_PED_INJURED(alien.pedID)
IF IS_ALIEN_IN_SUMMON_STATE(alien)
bSummonRushFlagActive = FALSE
bSummonFlagActive = FALSE
ENDIF
IF alien.aState = AS_SUMMON_START
CPRINTLN(DEBUG_MISSION, "Alien Summon aborted because he died")
IF(GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_PERFORM_SEQUENCE) = PERFORMING_TASK)
// Because he's perfoming a sequence, stopping the intro anim can put him into the looping anim.
// Failsafe so player isn't stuck, plus he'll just straighten up rather than play his "win" anim.
CPRINTLN(DEBUG_MISSION, "Clearing player tasks, player should be free.")
CLEAR_PED_TASKS(PLAYER_PED_ID())
ENDIF
IF IS_GAMEPLAY_HINT_ACTIVE()
STOP_GAMEPLAY_HINT()
ENDIF
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
ENDIF
PLAY_AMBIENT_SPEECH_FROM_POSITION("ALIEN_DEATH", "ALIENS", GET_ENTITY_COORDS(alien.pedID), SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
REMOVE_ALIEN_PARTICLE_FX(alien)
SAFE_STOP_AND_RELEASE_SOUND_ID(alien.mindCtrlSoundID)
SAFE_DELETE_OBJECT(alien.projectorID)
SAFE_DELETE_OBJECT(alien.impactID)
SAFE_DELETE_OBJECT(alien.screenImpactID)
PLAY_MICHAEL_FIGHT_DIALOG_LINES()
SAFE_REMOVE_BLIP(alien.blipID)
alien.iTimer = GET_GAME_TIMER() + 2500
IF bDebugTTYSpew = TRUE
CPRINTLN(DEBUG_MISSION, "Alien ", alien.iAlienIndex, " is dying")
ENDIF
iTotalAlienDeadCount ++
CPRINTLN(DEBUG_MISSION, "TOTAL DEAD ALIENS = ", iTotalAlienDeadCount)
IF (iKillChain = 0)
iKillChainEndTime = GET_GAME_TIMER() + CHAIN_KILL_TIME
ENDIF
iKillChain ++
IF (iKillChain > iMaxKillChain)
iMaxKillChain = iKillChain
ENDIF
IF (iKillChain >= CHAIN_KILL_AMOUNT)
INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(BA1_KILLCHAIN)
CPRINTLN(DEBUG_MISSION, "INFORM STATS OF KILL CHAIN")
ENDIF
IF (iTotalAlienDeadCount % 5 = 0)
IF bDebugTTYSpew = TRUE
CPRINTLN(DEBUG_MISSION, "WAVE CLEAR")
ENDIF
iMaxActiveAliens ++
IF alien.aState != AS_SUMMON_START
IF (bAllowSummoning = FALSE)
CPRINTLN(DEBUG_MISSION, "UPDATE_ALIEN_DEAD_CHECKING: Reactivating Summon.")
bAllowSummoning = TRUE
ENDIF
ELSE
IF bDebugTTYSpew = TRUE
CPRINTLN(DEBUG_MISSION, "UPDATE_ALIEN_DEAD_CHECKING: Alien was summoning, don't reactivate summon this time.")
ENDIF
ENDIF
fAlienMinSpawnRadius -= 4.0
IF (fAlienMinSpawnRadius < 10.0)
fAlienMinSpawnRadius = 10.0
ENDIF
IF (iMaxActiveAliens >= COUNT_OF(alienPed))
iMaxActiveAliens = COUNT_OF(alienPed)
ENDIF
ENDIF
alien.aState = AS_DYING
RETURN TRUE
ENDIF
ELSE
alien.fDistToPlayer = -1.0
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Updates the next possible alien to be allowed to summon
PROC UPDATE_NEXT_ALIEN_SUMMONER_INDEX()
INT i = 0
FLOAT minDist = -1
IF (bAllowSummoning = FALSE)
iAlienSummonerIndex = -1
EXIT
ENDIF
REPEAT (COUNT_OF(alienPed)) i
IF IS_ALIEN_PED_ALIVE(alienPed[i]) AND (alienPed[i].aState = AS_ACTIVE)
IF (minDist = -1) OR ((alienPed[i].fDistToPlayer < minDist) AND (alienPed[i].fDistToPlayer <> -1))
iAlienSummonerIndex = i
alienPed[i].fDistToPlayer = minDist
ENDIF
ENDIF
ENDREPEAT
ENDPROC
/// PURPOSE:
/// This handles the aliens day to day stuff
/// PARAMS
/// alien - alien ped reference
//PROC UPDATE_ALIEN_PED_BEAM_EVO(ALIEN_PED &alien)
// VECTOR v
// FLOAT sx, sy
// INT side1, side2
//
// SET_ENTITY_COORDS_NO_OFFSET(alien.screenImpactID, GET_ENTITY_COORDS(alien.projectorID))
// GET_LINE_PLANE_INTERSECT(v, GET_ENTITY_COORDS(alien.projectorID), GET_ENTITY_COORDS(alien.impactID), vCameraForward, vCameraCoords + (vCameraForward * fCameraNearClip))
//
// IF NOT GET_SCREEN_COORD_FROM_WORLD_COORD(v, sx, sy)
// SAFE_REMOVE_PARTICLE_FX(alien.fxScreenImpactID)
//
// alien.fBeamEvoValue -= fAlienBeamEvoIncrease
// IF (alien.fBeamEvoValue < 0.0)
// alien.fBeamEvoValue = 0.0
// ENDIF
// ELSE
// side1 = ENUM_TO_INT(GET_PLANE_SIDE(vCameraForward, vCameraCoords, GET_ENTITY_COORDS(alien.projectorID)))
// side2 = ENUM_TO_INT(GET_PLANE_SIDE(vCameraForward, vCameraCoords, GET_ENTITY_COORDS(alien.impactID)))
//
// IF (side1 > 0) AND (side2 < 0)
// SET_ENTITY_COORDS_NO_OFFSET(alien.screenImpactID, v - (GET_ENTITY_FORWARD_VECTOR(alien.projectorID) * fAlienScreenImpactShift))
// ELIF (side1 < 0) AND (side2 > 0)
// SET_ENTITY_COORDS_NO_OFFSET(alien.screenImpactID, v + (GET_ENTITY_FORWARD_VECTOR(alien.projectorID) * fAlienScreenImpactShift))
// ENDIF
//
// alien.fBeamEvoValue = 1.0
// IF NOT DOES_PARTICLE_FX_LOOPED_EXIST(alien.fxScreenImpactID)
// alien.fxScreenImpactID = START_PARTICLE_FX_LOOPED_ON_ENTITY("scr_alien_impact", alien.screenImpactID, <<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>, fAlienImpactEffectSize / 3.0)
// ENDIF
//
// //alien.fBeamLength = GET_DISTANCE_BETWEEN_ENTITIES(alien.screenImpactID, alien.projectorID)
// ENDIF
//
// IF DOES_PARTICLE_FX_LOOPED_EXIST(alien.fxBeamID)
// SET_PARTICLE_FX_LOOPED_EVOLUTION(alien.fxBeamID, "angle", alien.fBeamEvoValue)
// ENDIF
//ENDPROC
/// PURPOSE:
/// Converts a rotation vector into a normalised direction vector (basically the direction an entity would move if it moved forward at the current rotation).
/// For example: a rotation of <<0.0, 0.0, 45.0>> gives a direction vector of <<-0.707107, 0.707107, 0.0>>
/// PARAMS:
/// v_rot - The rotation vector
/// RETURNS:
/// The direction vector
FUNC VECTOR CONVERT_ROT_TO_DIR_VECTOR(VECTOR v_rot)
RETURN <<-SIN(v_rot.z) * COS(v_rot.x), COS(v_rot.z) * COS(v_rot.x), SIN(v_rot.x)>>
ENDFUNC
PROC UPDATE_BEAM_CAMERA_IMPACT(ALIEN_PED &alien)
VECTOR camPos = GET_FINAL_RENDERED_CAM_COORD()
VECTOR camDir = CONVERT_ROT_TO_DIR_VECTOR(GET_FINAL_RENDERED_CAM_ROT())
VECTOR cameraPlanePos = camPos + (camDir * GET_FINAL_RENDERED_CAM_NEAR_CLIP())
VECTOR impactPoint
FLOAT fBeamToScreenLength
FLOAT fScreenImpactEffectSize = fAlienImpactEffectSize * 1.25
INT side1, side2
IF GET_LINE_PLANE_INTERSECT(impactPoint, GET_ENTITY_COORDS(alien.projectorID), GET_ENTITY_COORDS(alien.impactID), camDir, cameraPlanePos) // 1st param is a reference
//CPRINTLN(DEBUG_MISSION, "Alien ", alien.iAlienIndex,"'s beam is intersecting the camera plane")
IF IS_SPHERE_VISIBLE(impactPoint, 0.5)
//CPRINTLN(DEBUG_MISSION, "Impact sphere is visible for Alien ", alien.iAlienIndex)
side1 = ENUM_TO_INT(GET_PLANE_SIDE(camDir, camPos, GET_ENTITY_COORDS(alien.projectorID)))
side2 = ENUM_TO_INT(GET_PLANE_SIDE(camDir, camPos, GET_ENTITY_COORDS(alien.impactID)))
// projector side
IF (side1 > 0) AND (side2 < 0)
impactPoint = impactPoint - (GET_ENTITY_FORWARD_VECTOR(alien.projectorID) * fAlienScreenImpactShift)
// far side
ELIF (side1 < 0) AND (side2 > 0)
impactPoint = impactPoint + (GET_ENTITY_FORWARD_VECTOR(alien.projectorID) * (fAlienScreenImpactShift * 4.5))
ENDIF
// draw particles at impactpoint to hide hard edge.
IF NOT DOES_PARTICLE_FX_LOOPED_EXIST(alien.fxScreenImpactID)
alien.fxScreenImpactID = START_PARTICLE_FX_LOOPED_AT_COORD("scr_alien_impact", impactPoint, (<<0.0, 0.0, 0.0>>), fScreenImpactEffectSize) // / 3.0)
ENDIF
//set beam length to be distance from beamStart to impactPoint
fBeamToScreenLength = GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(alien.projectorID, impactPoint)
// If we've already impacted something, don't extend beam
// But if we hit the camera first, let it through to hit the player
IF alien.fBeamLength >= fBeamToScreenLength
AND (side1 > 0) AND (side2 < 0)
alien.fBeamLength = fBeamToScreenLength
ENDIF
ELSE
SAFE_REMOVE_PARTICLE_FX(alien.fxScreenImpactID)
ENDIF
ELSE
SAFE_REMOVE_PARTICLE_FX(alien.fxScreenImpactID)
ENDIF
ENDPROC
/// PURPOSE:
/// This handles summon rush
/// PARAMS
/// alien - alien ped reference
PROC UPDATE_ALIEN_SUMMON_RUSH(ALIEN_PED &alien)
REMOVE_ALIEN_PARTICLE_FX(alien)
SET_PED_RESET_FLAG(alien.pedID, PRF_InfiniteStamina, TRUE)
SET_PED_NAME_DEBUG(alien.pedID, "S-RUSH")
SET_PED_MOVE_RATE_OVERRIDE(alien.pedID, 1.15)
SET_PED_DESIRED_MOVE_BLEND_RATIO(alien.pedID, PEDMOVE_SPRINT)
IF GET_SCRIPT_TASK_STATUS(alien.pedID, SCRIPT_TASK_GO_TO_ENTITY) <> PERFORMING_TASK
TASK_GO_TO_ENTITY(alien.pedID, PLAYER_PED_ID())
ENDIF
IF (bSummonRushFlagActive)
ENDIF
IF (alien.fDistToPlayer > fAlienSummonRange)
EXIT
ENDIF
IF NOT IS_MISSION_IN_COMBAT_STAGE()
EXIT
ENDIF
IF IS_PED_FALLING(alien.pedID) OR IS_PED_GETTING_UP(alien.pedID)
OR IS_PED_RAGDOLL(alien.pedID) OR IS_PED_RUNNING_RAGDOLL_TASK(alien.pedID)
CPRINTLN(DEBUG_MISSION, "Alien ", alien.iAlienIndex, " is down - cannot start summon")
EXIT
ENDIF
IF NOT IS_PED_IN_PED_VIEW_CONE(alien.pedID, PLAYER_PED_ID())
EXIT
ENDIF
IF NOT HAS_ENTITY_CLEAR_LOS_TO_ENTITY_IN_FRONT(alien.pedID, PLAYER_PED_ID())
EXIT
ENDIF
SEQUENCE_INDEX seq
SET_ENTITY_HEADING_FACE_PLAYER(alien.pedID)
OPEN_SEQUENCE_TASK(seq)
//TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID()) // not quick enough
TASK_PLAY_ANIM(NULL, sMissionAnimDictionary, sAlienGrabIntroAnim, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_DEFAULT)
TASK_PLAY_ANIM(NULL, sMissionAnimDictionary, sAlienGrabAnim, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(alien.pedID, seq)
CLEAR_SEQUENCE_TASK(seq)
FORCE_PED_AI_AND_ANIMATION_UPDATE(alien.pedID)
SET_ENTITY_HEADING_FACE_ENTITY(PLAYER_PED_ID(), alien.pedID)
OPEN_SEQUENCE_TASK(seq)
TASK_PLAY_ANIM(NULL, sMissionAnimDictionary, sAlienGrabbedIntroAnim, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1)
TASK_PLAY_ANIM(NULL, sMissionAnimDictionary, sAlienGrabbedAnim, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING)
CLOSE_SEQUENCE_TASK(seq)
TASK_PERFORM_SEQUENCE(PLAYER_PED_ID(), seq)
CLEAR_SEQUENCE_TASK(seq)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
IF bDebugTTYSpew = TRUE
CPRINTLN(DEBUG_MISSION, "Alien ", alien.iAlienIndex, " has started summon")
ENDIF
alien.aState = AS_SUMMON_START
PLAY_MICHAEL_ABDUCT_DIALOG_LINE()
// on the first time this happens give the player more time
IF (iTotalAlienSummonCount = 0)
IF NOT IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
PRINT_HELP("BAR1_GRAB_HLP") // Michael is being abducted. Move ~INPUT_MOVE_LR~ rapidly to escape.
ELSE
PRINT_HELP("BAR1_GRAB_HPC") // Michael is being abducted. Rapidly press ~INPUT_MOVE_LR~ alternately to escape.
ENDIF
alien.iTimer = GET_GAME_TIMER() + iAlienSummonTimeLength + 2000
SET_GAMEPLAY_PED_HINT(alien.pedID, <<0, 0, 0>>, TRUE, iAlienSummonTimeLength + 2000)
ELSE
alien.iTimer = GET_GAME_TIMER() + iAlienSummonTimeLength
SET_GAMEPLAY_PED_HINT(alien.pedID, <<0, 0, 0>>, TRUE, iAlienSummonTimeLength)
ENDIF
iTotalAlienSummonCount ++
alien.iButtonMashCount = 0
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
fRegenMultiplier = 0.0
SAFE_STOP_AND_RELEASE_SOUND_ID(alien.mindCtrlSoundID)
alien.mindCtrlSoundID = GET_SOUND_ID()
PLAY_SOUND_FROM_ENTITY(alien.mindCtrlSoundID, "PLAYER_BEAMED_UP", alien.pedID, "BARRY_01_SOUNDSET")
// start fx
START_PARTICLE_FX_NON_LOOPED_ON_ENTITY("scr_alien_teleport", PLAYER_PED_ID(), <<0, 0, 0>>, <<0, 0, 0>>, fAlienTeleportEffectSize)
alien.iNextSummonEffectTime = GET_GAME_TIMER() + 2000
ENDPROC
/// PURPOSE:
/// This handles summon
/// PARAMS
/// alien - alien ped reference
PROC UPDATE_ALIEN_SUMMON(ALIEN_PED &alien)
INT sgn
// check for button mash
iAlienNextSummonTime = GET_GAME_TIMER() + iAlienNextSummonTimeOut
bSummonFlagActive = TRUE
STOP_GAMEPLAY_HINT_BEING_CANCELLED_THIS_UPDATE(TRUE)
SET_PED_NAME_DEBUG(alien.pedID, "SUMMON")
RC_PLAYER_TRIGGER_SCENE_LOCK_IN()
// Steve R - Changed from script inputs to normal move inputs to fix PC mapping issues. Controls are disabled during this section so using disabled controls check.
sgn = FSGN(GET_DISABLED_CONTROL_NORMAL(PLAYER_CONTROL, INPUT_MOVE_LR))
IF IS_DISABLED_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_MOVE_LR) OR (sgn <> alien.fOldMashSign)
alien.fOldMashSign = sgn
alien.iButtonMashCount ++
ENDIF
// start fx
IF (GET_GAME_TIMER() > alien.iNextSummonEffectTime)
START_PARTICLE_FX_NON_LOOPED_ON_ENTITY("scr_alien_teleport", PLAYER_PED_ID(), <<0, 0, 0>>, <<0, 0, 0>>, fAlienTeleportEffectSize)
alien.iNextSummonEffectTime = GET_GAME_TIMER() + 2000
ENDIF
// stop if we mash enough or if alien is interupted
IF (alien.iButtonMashCount > iAlienButtonMashLimit)
OR GET_SCRIPT_TASK_STATUS(alien.pedID, SCRIPT_TASK_PERFORM_SEQUENCE) > PERFORMING_TASK
IF IS_ENTITY_PLAYING_ANIM(alien.pedID, sMissionAnimDictionary, sAlienGrabAnim)
OR IS_ENTITY_PLAYING_ANIM(alien.pedID, sMissionAnimDictionary, sAlienGrabIntroAnim)
TASK_PLAY_ANIM(alien.pedID, sMissionAnimDictionary, sAlienGrabFailAnim)
ENDIF
IF IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), sMissionAnimDictionary, sAlienGrabbedAnim)
CPRINTLN(DEBUG_MISSION, "UPDATE_ALIEN_SUMMON: Player was playing ", sAlienGrabbedAnim)
//STOP_ANIM_TASK(PLAYER_PED_ID(), sMissionAnimDictionary, sAlienGrabbedAnim)
CLEAR_PED_TASKS(PLAYER_PED_ID())
TASK_PLAY_ANIM(PLAYER_PED_ID(), sMissionAnimDictionary, sAlienGrabbedFailAnim, NORMAL_BLEND_IN, SLOW_BLEND_OUT, -1)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
ELIF IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), sMissionAnimDictionary, sAlienGrabbedIntroAnim)
CPRINTLN(DEBUG_MISSION, "UPDATE_ALIEN_SUMMON: Player was playing ", sAlienGrabbedIntroAnim)
//STOP_ANIM_TASK(PLAYER_PED_ID(), sMissionAnimDictionary, sAlienGrabbedIntroAnim)
CLEAR_PED_TASKS(PLAYER_PED_ID())
TASK_PLAY_ANIM(PLAYER_PED_ID(), sMissionAnimDictionary, sAlienGrabbedFailAnim, NORMAL_BLEND_IN, SLOW_BLEND_OUT, -1)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
ELSE
CPRINTLN(DEBUG_MISSION, "UPDATE_ALIEN_SUMMON: Failsafe: Player was playing non-standard anim.")
CLEAR_PED_TASKS(PLAYER_PED_ID())
TASK_PLAY_ANIM(PLAYER_PED_ID(), sMissionAnimDictionary, sAlienGrabbedFailAnim, NORMAL_BLEND_IN, SLOW_BLEND_OUT, -1)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
ENDIF
IF IS_GAMEPLAY_HINT_ACTIVE()
STOP_GAMEPLAY_HINT()
ENDIF
//SET_PED_TO_RAGDOLL(alien.pedID, 6000, 6500, TASK_RELAX, FALSE, FALSE)
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
SAFE_STOP_AND_RELEASE_SOUND_ID(alien.mindCtrlSoundID)
IF bDebugTTYSpew = TRUE
CPRINTLN(DEBUG_MISSION, "Alien ", alien.iAlienIndex, " summon has failed")
ENDIF
//PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(PLAYER_PED_ID(), "CANT_LOSE_ENEMY_DRUNK", "MICHAEL_DRUNK", SPEECH_PARAMS_FORCE_NORMAL_CLEAR)
SAFE_REMOVE_PARTICLE_FX(alien.fxSummonID)
bSummonRushFlagActive = FALSE
//bSummonFlagActive = FALSE
alien.iButtonMashCount = 0
alien.aState = AS_SUMMON_FAIL
alien.iTimer = GET_GAME_TIMER() + 2000
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("BAR1_GRAB_HLP")
CLEAR_HELP()
ENDIF
// this records the player getting grabbed
IF (iSummonEscapeCount = 0)
FLOAT fRecordTime = (TO_FLOAT(iAlienSummonTimeLength + 2000) / 1000.0)
CPRINTLN(DEBUG_MISSION, "Recording the Last ", fRecordTime ," seconds of game play as player broke out of abduction")
REPLAY_RECORD_BACK_FOR_TIME(fRecordTime, 2.0, REPLAY_IMPORTANCE_LOW)
ENDIF
iSummonEscapeCount ++
EXIT
ENDIF
// else fail the mission
IF (GET_GAME_TIMER() > alien.iTimer)
TASK_PLAY_ANIM(alien.pedID, sMissionAnimDictionary, sAlienGrabWinAnim)
SAFE_STOP_AND_RELEASE_SOUND_ID(alien.mindCtrlSoundID)
SET_MISSION_FAILED_ABDUCTED()
ENDIF
ENDPROC
/// PURPOSE:
/// This handles start of charge
/// PARAMS
/// alien - alien ped reference
PROC UPDATE_ALIEN_CHARGE_START(ALIEN_PED &alien)
INT hits
SHAPETEST_STATUS st
SEQUENCE_INDEX seqTask
VECTOR v1, pos, norm
ENTITY_INDEX hitEntity
v1 = GET_ENTITY_COORDS(alien.projectorID)
IF NOT alien.bWallSpawn
IF GET_SCRIPT_TASK_STATUS(alien.pedID, SCRIPT_TASK_GO_TO_ENTITY) <> PERFORMING_TASK
TASK_GO_TO_ENTITY(alien.pedID, PLAYER_PED_ID())
ENDIF
ELSE
IF GET_SCRIPT_TASK_STATUS(alien.pedID, SCRIPT_TASK_STAND_STILL) <> PERFORMING_TASK
TASK_STAND_STILL(alien.pedID, -1)
alien.iTimer = GET_GAME_TIMER() + iAlienBeamChargeTime * 2
ENDIF
ENDIF
IF NOT IS_MISSION_IN_COMBAT_STAGE()
EXIT
ENDIF
IF (alien.sBeamLOS = NULL)
pos = GET_PED_BONE_COORDS(PLAYER_PED_ID(), BONETAG_HEAD, <<0, 0, 0>>)
alien.sBeamLOS = START_SHAPE_TEST_LOS_PROBE(v1, pos, SCRIPT_INCLUDE_ALL, PLAYER_PED_ID())
IF GET_GAME_TIMER() > alien.iTimer
AND alien.bWallSpawn
SAFE_STOP_AND_RELEASE_SOUND_ID(alien.mindCtrlSoundID)
alien.mindCtrlSoundID = GET_SOUND_ID()
PLAY_SOUND_FROM_ENTITY(alien.mindCtrlSoundID, "MIND_CONTROL", alien.pedID, "BARRY_01_SOUNDSET")
alien.aState = AS_CHARGE
ENDIF
ELSE
st = GET_SHAPE_TEST_RESULT(alien.sBeamLOS, hits, pos, norm, hitEntity)
IF (st = SHAPETEST_STATUS_RESULTS_READY)
IF (hits = 0) AND IS_MISSION_IN_COMBAT_STAGE()
OPEN_SEQUENCE_TASK(seqTask)
TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID())
TASK_PLAY_ANIM(NULL, sMissionAnimDictionary, "MIND_CONTROL_B_Enter", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_HOLD_LAST_FRAME)
CLOSE_SEQUENCE_TASK(seqTask)
TASK_PERFORM_SEQUENCE(alien.pedID, seqTask)
CLEAR_SEQUENCE_TASK(seqTask)
IF NOT DOES_PARTICLE_FX_LOOPED_EXIST(alien.fxChargeID)
alien.fxChargeID = START_PARTICLE_FX_LOOPED_ON_ENTITY("scr_alien_charging", alien.projectorID, <<0, 0, 0>>, <<0, 0, 0>>, fAlienChargeEffectSize)
ENDIF
SET_ENTITY_COORDS(alien.impactID, v1)
IF NOT DOES_PARTICLE_FX_LOOPED_EXIST(alien.fxImpactID)
alien.fxImpactID = START_PARTICLE_FX_LOOPED_ON_ENTITY("scr_alien_impact", alien.impactID, <<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>, fAlienImpactEffectSize)
ENDIF
alien.aState = AS_CHARGE
IF bDebugTTYSpew = TRUE
CPRINTLN(DEBUG_MISSION, "Alien ", alien.iAlienIndex, " has started charging")
ENDIF
alien.iTimer = GET_GAME_TIMER() + iAlienBeamChargeTime
SAFE_STOP_AND_RELEASE_SOUND_ID(alien.mindCtrlSoundID)
alien.mindCtrlSoundID = GET_SOUND_ID()
PLAY_SOUND_FROM_ENTITY(alien.mindCtrlSoundID, "MIND_CONTROL", alien.pedID, "BARRY_01_SOUNDSET")
ENDIF
alien.sBeamLOS = NULL
ELIF (st = SHAPETEST_STATUS_NONEXISTENT)
alien.sBeamLOS = NULL
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// This handles beam
/// PARAMS
/// alien - alien ped reference
PROC UPDATE_ALIEN_BEAM(ALIEN_PED &alien)
INT hits
SHAPETEST_STATUS st
VECTOR plyrPos
VECTOR v1, v2, pos, norm
ENTITY_INDEX hitEntity
SET_PED_NAME_DEBUG(alien.pedID, "BEAM")
IF (GET_GAME_TIMER() >= alien.iTimer)
SAFE_STOP_AND_RELEASE_SOUND_ID(alien.mindCtrlSoundID)
REMOVE_ALIEN_PARTICLE_FX(alien)
IF bDebugTTYSpew = TRUE
CPRINTLN(DEBUG_MISSION, "Alien ", alien.iAlienIndex, " is teleporting out")
ENDIF
alien.aState = AS_TELEPORT_OUT_START
EXIT
ENDIF
// abort entirely if summon is going on
IF (bSummonFlagActive = TRUE)
SAFE_STOP_AND_RELEASE_SOUND_ID(alien.mindCtrlSoundID)
REMOVE_ALIEN_PARTICLE_FX(alien)
alien.aState = AS_WATCH_SUMMON
EXIT
ENDIF
// update beam movement
IF (GET_FRAME_COUNT() >= alien.iLastImpactFrame + 8)
alien.fBeamLength += fAlienBeamLengthInc
IF (alien.fBeamLength > fAlienBeamMaximumLength)
alien.fBeamLength = fAlienBeamMaximumLength
ENDIF
ENDIF
// if the alien is falling over or getting up or if another alien is summoning - turn off beam
IF IS_ENTITY_ALIVE(alien.pedID)
IF IS_PED_FALLING(alien.pedID) OR IS_PED_GETTING_UP(alien.pedID)
OR IS_PED_RAGDOLL(alien.pedID) OR IS_PED_RUNNING_RAGDOLL_TASK(alien.pedID)
//SAFE_REMOVE_PARTICLE_FX(alien.fxImpactID)
REMOVE_ALIEN_PARTICLE_FX(alien)
SAFE_STOP_AND_RELEASE_SOUND_ID(alien.mindCtrlSoundID)
alien.fBeamLength = 0
alien.aState = AS_BEAM_KNOCKDOWN
ENDIF
ENDIF
// if the ped isn't playing anim - drop into beam knockdown state where we wait until he is playing the anim and re-orient the beam
IF GET_SCRIPT_TASK_STATUS(alien.pedID, SCRIPT_TASK_PLAY_ANIM) <> PERFORMING_TASK
alien.fBeamLength = 0
IF bDebugTTYSpew = TRUE
CPRINTLN(DEBUG_MISSION, "Alien ", alien.iAlienIndex, " has been knocked out of beam firing")
ENDIF
alien.sBeamLOS = NULL
alien.aState = AS_BEAM_KNOCKDOWN
alien.fBeamLength = 0
ENDIF
IF (alien.fBeamLength <= 0)
IF DOES_PARTICLE_FX_LOOPED_EXIST(alien.fxBeamID)
SET_PARTICLE_FX_LOOPED_FAR_CLIP_DIST(alien.fxBeamID, alien.fBeamLength)
ENDIF
SAFE_STOP_AND_RELEASE_SOUND_ID(alien.mindCtrlSoundID)
SAFE_REMOVE_PARTICLE_FX(alien.fxImpactID)
alien.sBeamLOS = NULL
EXIT
ELSE
//UPDATE_ALIEN_PED_BEAM_EVO(alien)
UPDATE_BEAM_CAMERA_IMPACT(alien)
ENDIF
// do collision
//SET_ENTITY_RENDER_SCORCHED(PLAYER_PED_ID(), FALSE)
v1 = GET_ENTITY_COORDS(alien.projectorID)
v2 = v1 + (GET_ENTITY_FORWARD_VECTOR(alien.projectorID) * (alien.fBeamLength + 3))
IF (alien.sBeamLOS = NULL)
alien.sBeamLOS = START_SHAPE_TEST_LOS_PROBE(v1, v2, SCRIPT_INCLUDE_ALL, alien.pedID)
ELSE
st = GET_SHAPE_TEST_RESULT(alien.sBeamLOS, hits, pos, norm, hitEntity)
IF (st = SHAPETEST_STATUS_NONEXISTENT)
alien.sBeamLOS = NULL
ELIF (st = SHAPETEST_STATUS_RESULTS_READY)
IF (hits > 0)
alien.iLastImpactFrame = GET_FRAME_COUNT()
SET_ENTITY_RENDER_SCORCHED(PLAYER_PED_ID(), TRUE)
alien.vLastHitPoint = GET_CLOSEST_POINT_ON_LINE(pos, v1, v2, FALSE)
SET_ENTITY_COORDS(alien.impactID, alien.vLastHitPoint)
alien.fBeamLength = GET_DISTANCE_BETWEEN_ENTITIES(alien.impactID, alien.projectorID)
// check for hit damage
plyrPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
IF GET_DISTANCE_BETWEEN_COORDS(alien.vLastHitPoint, plyrPos) <= 0.70
fRegenMultiplier = 0.0
IF ABSF(alien.vLastHitPoint.z - plyrPos.z) < 1.0
// fake a reaction by the player character
IF GET_FRAME_COUNT() % 20 = 0
SHOOT_SINGLE_BULLET_BETWEEN_COORDS(v1, v2, 0, TRUE, WEAPONTYPE_PISTOL, NULL, FALSE)
ENDIF
IF (bAlienBeamKnockDown = TRUE)
APPLY_FORCE_TO_ENTITY(PLAYER_PED_ID(), APPLY_TYPE_IMPULSE, fAlienBeamKnockDownForce * GET_ENTITY_FORWARD_VECTOR(alien.projectorID), <<0,0,0>>, 0, FALSE, TRUE, TRUE)
ENDIF
// B*942972
IF (bBeamArmorHelpDisplayed = FALSE)
IF (GET_PED_ARMOUR(PLAYER_PED_ID()) > 0)
PRINT_HELP("BAR1_MIND_HLP")
bBeamArmorHelpDisplayed = TRUE
ENDIF
ENDIF
// damage outpuy
IF (GET_GAME_TIMER() > alien.iNextDamageTime)
PLAY_MICHAEL_DIALOG_LINES()
hits = GET_RANDOM_INT_IN_RANGE(0, 6)
SWITCH GET_RANDOM_INT_IN_RANGE(0, 3)
CASE 0
APPLY_PED_BLOOD_SPECIFIC(PLAYER_PED_ID(),hits,0.657,0.566,126.360,0.07,1,0,"cs_trev1_blood")
BREAK
CASE 1
APPLY_PED_BLOOD_SPECIFIC(PLAYER_PED_ID(),hits,0.582,0.383,111.360,0.05,3,0,"cs_trev1_blood")
BREAK
CASE 2
APPLY_PED_BLOOD_SPECIFIC(PLAYER_PED_ID(),hits,0.709,0.396,126.360,0.00,3,0,"cs_trev1_blood")
BREAK
DEFAULT
APPLY_PED_BLOOD_SPECIFIC(PLAYER_PED_ID(),hits,0.582,0.383,200.360,0.1,2,0,"cs_trev1_blood")
BREAK
ENDSWITCH
IF ((GET_ENTITY_HEALTH(PLAYER_PED_ID()) - iAlienBeamDamage) <= 100)
FLEE_ALL_ALIEN_PEDS()
CLEANUP_ALL_ALIEN_PEDS(TRUE)
DEATH_SEQUENCE(v1, v2)// GET_ENTITY_FORWARD_VECTOR(alien.projectorID))
EXIT
ELSE
APPLY_DAMAGE_TO_PED(PLAYER_PED_ID(), iAlienBeamDamage, FALSE)
ENDIF
alien.iNextDamageTime = GET_GAME_TIMER() + ROUND(iAlienBeamDamageDelay * 1.25)
SET_CONTROL_SHAKE(PLAYER_CONTROL, iAlienBeamDamageDelay / 2, 255)
SET_CONTROL_SHAKE(PLAYER_CONTROL, iAlienBeamDamageDelay / 2, 255)
ENDIF
ENDIF
ENDIF
ENDIF
alien.sBeamLOS = NULL
ENDIF
ENDIF
IF IS_ENTITY_ALIVE(alien.impactID)
SET_ENTITY_COORDS(alien.impactID, GET_ENTITY_COORDS(alien.projectorID) + (GET_ENTITY_FORWARD_VECTOR(alien.projectorID) * alien.fBeamLength))
ENDIF
IF DOES_PARTICLE_FX_LOOPED_EXIST(alien.fxBeamID)
SET_PARTICLE_FX_LOOPED_FAR_CLIP_DIST(alien.fxBeamID, alien.fBeamLength)
ENDIF
IF NOT DOES_PARTICLE_FX_LOOPED_EXIST(alien.fxImpactID)
alien.fxImpactID = START_PARTICLE_FX_LOOPED_ON_ENTITY("scr_alien_impact", alien.impactID, <<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>, fAlienImpactEffectSize)
ENDIF
ENDPROC
/// PURPOSE:
/// This handles the aliens day to day stuff
/// PARAMS
/// alien - alien ped reference
PROC UPDATE_ALIEN_PED(ALIEN_PED &alien)
VECTOR pos
FLOAT z
// handle clean up
IF NOT DOES_ENTITY_EXIST(alien.pedID)
CLEANUP_ALIEN_PED(alien)
EXIT
ENDIF
IF UPDATE_ALIEN_DEAD_CHECKING(alien)
IF (iAlienSummonerIndex = alien.iAlienIndex)
IF bDebugTTYSpew = TRUE
CPRINTLN(DEBUG_MISSION, "Alien Summoner ", alien.iAlienIndex, " has been vanquished")
ENDIF
iAlienSummonerIndex = -1
ENDIF
ENDIF
HANDLE_PLAYING_ALIEN_CLICKING_SOUND(alien)
// update the beam projector
IF DOES_ENTITY_EXIST(alien.projectorID)
pos = GET_PED_BONE_COORDS(alien.pedID, BONETAG_HEAD, vAlienBeamEmitterOffset)
SET_ENTITY_COORDS_NO_OFFSET(alien.projectorID, pos)
SET_ENTITY_COLLISION(alien.projectorID, FALSE)
ENDIF
// if the alien is in a beam state while summon is going on kick him out of it
IF IS_ALIEN_IN_BEAM_STATE(alien) AND (bSummonFlagActive = TRUE)
IF bDebugTTYSpew = TRUE
CPRINTLN(DEBUG_MISSION, "Alien", alien.iAlienIndex, " is watching summon")
ENDIF
TASK_PLAY_ANIM(alien.pedID, sMissionAnimDictionary, sAlienWatchAnim, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING)
REMOVE_ALIEN_PARTICLE_FX(alien)
SAFE_STOP_AND_RELEASE_SOUND_ID(alien.mindCtrlSoundID)
alien.aState = AS_WATCH_SUMMON
alien.sBeamLOS = NULL
ENDIF
// shut down blip if player leaves area so we can put the direction blip back on
IF NOT (bIsPlayerInBattleArea)
IF (alien.blipID <> NULL)
SAFE_REMOVE_BLIP(alien.blipID)
ENDIF
ELIF IS_ALIEN_IN_BATTLE_STATE(alien) AND (alien.blipID = NULL)
alien.blipID = CREATE_PED_BLIP(alien.pedID)
ENDIF
// update states
SWITCH (alien.aState)
CASE AS_DELAY // delay before teleport in
IF (GET_GAME_TIMER() > alien.iTimer)
alien.bHasDamaged = FALSE
alien.sBeamLOS = NULL
alien.aState = AS_TELEPORT_FXSTART
alien.fPedAlpha = 0.0
SET_ENTITY_ALPHA(alien.pedID, FLOOR(alien.fPedAlpha), FALSE)
ENDIF
BREAK
CASE AS_TELEPORT_FXSTART // start teleport
SET_ENTITY_COLLISION(alien.pedID, FALSE)
FREEZE_ENTITY_POSITION(alien.pedID, TRUE)
SET_PED_CAN_BE_TARGETTED(alien.pedID, FALSE)
SET_ENTITY_HEADING_FACE_PLAYER(alien.pedID)
//SET_PED_RELATIONSHIP_GROUP_HASH(alien.pedID, RELGROUPHASH_PLAYER)
TASK_PLAY_ANIM(alien.pedID, sMissionAnimDictionary, sAlienTeleportAnim, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING)
START_PARTICLE_FX_NON_LOOPED_ON_ENTITY("scr_alien_teleport", alien.pedID, <<0, 0, 0>>, <<0, 0, 0>>, fAlienTeleportEffectSize)
alien.iTimer = GET_GAME_TIMER() + TELEPORT_TIME
alien.aState = AS_TELEPORT
SET_PED_NAME_DEBUG(alien.pedID, "TELEPORT ST")
PLAY_SOUND_FROM_ENTITY(-1, "SPAWN", alien.pedID, "BARRY_01_SOUNDSET")
SAFE_REMOVE_BLIP(alien.blipID)
BREAK
CASE AS_TELEPORT
alien.fPedAlpha += GET_FRAME_TIME() * 512.0
IF (alien.fPedAlpha >= 255)
alien.fPedAlpha = 255
ENDIF
IF (GET_GAME_TIMER() > alien.iTimer)
FREEZE_ENTITY_POSITION(alien.pedID, FALSE)
SET_ENTITY_INVINCIBLE(alien.pedID, FALSE)
SET_PED_CAN_BE_TARGETTED(alien.pedID, TRUE)
SET_ENTITY_COLLISION(alien.pedID, TRUE)
SET_ENTITY_VISIBLE(alien.pedID, TRUE)
alien.fPedAlpha = 255
SET_PED_RELATIONSHIP_GROUP_HASH(alien.pedID, RELGROUPHASH_HATES_PLAYER)
SET_PED_NAME_DEBUG(alien.pedID, "ACTIVE")
alien.aState = AS_ACTIVE
ENDIF
IF (alien.fPedAlpha < 255)
SET_PED_ALPHA(alien.pedID, FLOOR(alien.fPedAlpha), iAlphaCounter)
ELSE
RESET_ENTITY_ALPHA(alien.pedID)
ENDIF
BREAK
CASE AS_TELEPORT_OUT_START
FREEZE_ENTITY_POSITION(alien.pedID, TRUE)
SET_ENTITY_INVINCIBLE(alien.pedID, TRUE)
SET_ENTITY_COLLISION(alien.pedID, FALSE)
SET_PED_CAN_BE_TARGETTED(alien.pedID, FALSE)
TASK_PLAY_ANIM(alien.pedID, sMissionAnimDictionary, sAlienTeleportAnim, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING)
//SET_PED_RELATIONSHIP_GROUP_HASH(alien.pedID, RELGROUPHASH_PLAYER)
REMOVE_ALIEN_PARTICLE_FX(alien)
SAFE_REMOVE_BLIP(alien.blipID)
SAFE_STOP_AND_RELEASE_SOUND_ID(alien.mindCtrlSoundID)
START_PARTICLE_FX_NON_LOOPED_AT_COORD("scr_alien_teleport", GET_ENTITY_COORDS(alien.pedID), GET_ENTITY_ROTATION(alien.pedID), fAlienTeleportEffectSize)
PLAY_SOUND_FROM_ENTITY(-1, "SPAWN", alien.pedID, "BARRY_01_SOUNDSET")
alien.iTimer = GET_GAME_TIMER() + TELEPORT_TIME
alien.aState = AS_TELEPORT_OUT
SET_PED_NAME_DEBUG(alien.pedID, "TPORT OUT")
BREAK
CASE AS_TELEPORT_OUT
alien.fPedAlpha = ((alien.iTimer - GET_GAME_TIMER()) * 255) / TO_FLOAT(TELEPORT_TIME)
//CPRINTLN(DEBUG_MISSION, "ALIEN ALPHA", alien.fPedAlpha )
IF (alien.fPedAlpha < 0.0)
alien.fPedAlpha = 0.0
ENDIF
SET_PED_ALPHA(alien.pedID, FLOOR(alien.fPedAlpha), iAlphaCounter)
IF (GET_GAME_TIMER() > alien.iTimer) OR (alien.fPedAlpha = 0.0)
SET_PED_NAME_DEBUG(alien.pedID, "RELOCATE")
alien.aState = AS_RELOCATE
ENDIF
BREAK
CASE AS_RELOCATE
//SET_PED_RELATIONSHIP_GROUP_HASH(alien.pedID, RELGROUPHASH_PLAYER)
SET_ENTITY_VISIBLE(alien.pedID, FALSE)
SET_ENTITY_COLLISION(alien.pedID, FALSE)
SET_PED_CAN_BE_TARGETTED(alien.pedID, FALSE)
IF (bKillAliensOnTeleportOut = TRUE)
DELETE_ALIEN_PED(alien)
alien.bIsActive = FALSE
EXIT
ENDIF
// teleport to a new location
IF GENERATE_ALIEN_SPAWN_POINT(pos)
SET_ENTITY_COORDS_GROUNDED(alien.pedID, pos)
alien.iTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1250, 2000)
alien.fBeamTriggerRange = fAlienBeamStartRange + (GET_RANDOM_FLOAT_IN_RANGE(fAlienMinBeamTriggerVariance, fAlienMaxBeamTriggerVariance) * fAlienBeamStartRange)
IF bDebugTTYSpew = TRUE
CPRINTLN(DEBUG_MISSION, "Alien ", alien.iAlienIndex, " Beam Trigger Range = ", alien.fBeamTriggerRange )
ENDIF
alien.aState = AS_DELAY
ENDIF
BREAK
CASE AS_ACTIVE
SET_PED_NAME_DEBUG(alien.pedID, "ACTIVE")
IF NOT alien.bWallSpawn
IF GET_SCRIPT_TASK_STATUS(alien.pedID, SCRIPT_TASK_GO_TO_ENTITY) <> PERFORMING_TASK
TASK_GO_TO_ENTITY(alien.pedID, PLAYER_PED_ID())
ENDIF
ENDIF
IF NOT IS_MISSION_IN_COMBAT_STAGE()
EXIT
ENDIF
IF CAN_ALIEN_SUMMON(alien)
SET_PED_DESIRED_MOVE_BLEND_RATIO(alien.pedID, PEDMOVE_SPRINT)
IF (alien.fDistToPlayer < (fAlienSummonRange + 8.0))
alien.aState = AS_SUMMON_RUSH
IF bDebugTTYSpew = TRUE
CPRINTLN(DEBUG_MISSION, "Alien ", alien.iAlienIndex, " has started summon rush")
ENDIF
bSummonRushFlagActive = TRUE
ENDIF
ELIF (alien.fDistToPlayer < (alien.fBeamTriggerRange + 12.0))
IF bDebugTTYSpew = TRUE
CPRINTLN(DEBUG_MISSION, "Alien ", alien.iAlienIndex, " has started charge rush")
ENDIF
alien.aState = AS_CHARGE_RUSH
ENDIF
BREAK
CASE AS_SUMMON_RUSH
UPDATE_ALIEN_SUMMON_RUSH(alien)
BREAK
CASE AS_SUMMON_START
UPDATE_ALIEN_SUMMON(alien)
BREAK
CASE AS_SUMMON_FAIL
SET_PED_NAME_DEBUG(alien.pedID, "SUMMON FAIL")
IF (iAlienSummonerIndex = alien.iAlienIndex)
iAlienSummonerIndex = -1
ENDIF
// Speed up and shorten Michael's win anim to get back in the action faster
IF IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), sMissionAnimDictionary, sAlienGrabbedFailAnim)
//SET_ENTITY_ANIM_SPEED(PLAYER_PED_ID(), sMissionAnimDictionary, sAlienGrabbedFailAnim, 1.5)
//IF GET_ENTITY_ANIM_CURRENT_TIME(PLAYER_PED_ID(), sMissionAnimDictionary, sAlienGrabbedFailAnim) >= 0.735
// CPRINTLN(DEBUG_MISSION, "AS_SUMMON_FAIL: Stopping anim ", sAlienGrabbedFailAnim)
// STOP_ANIM_TASK(PLAYER_PED_ID(), sMissionAnimDictionary, sAlienGrabbedFailAnim, SLOW_BLEND_OUT)
//ENDIF
ELIF (GET_GAME_TIMER() > alien.iTimer)
IF bDebugTTYSpew = TRUE
CPRINTLN(DEBUG_MISSION, "AS_SUMMON_FAIL: Alien ", alien.iAlienIndex, " is teleporting out")
ENDIF
IF NOT IS_PED_USING_ACTION_MODE(PLAYER_PED_ID())
CPRINTLN(DEBUG_MISSION, "Putting Player back into action mode")
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), TRUE)
ENDIF
// @SBA - fix rare case in which player is unable to reload after an abduction attempt
IF HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), PlayerWeapon)
IF GET_AMMO_IN_PED_WEAPON(PLAYER_PED_ID(), PlayerWeapon) > 0
INT iAmmoLeft
//CPRINTLN(DEBUG_MISSION, "AS_SUMMON_FAIL: Player's weapon ", GET_WEAPON_NAME(PlayerWeapon), " has ammo.")
IF GET_AMMO_IN_CLIP(PLAYER_PED_ID(), PlayerWeapon, iAmmoLeft)
IF iAmmoLeft = 0
CPRINTLN(DEBUG_MISSION, "AS_SUMMON_FAIL: Player's clip is empty for weapon ", GET_WEAPON_NAME(PlayerWeapon), ". Refilling clip.")
REFILL_AMMO_INSTANTLY(PLAYER_PED_ID())
ENDIF
ENDIF
ENDIF
ENDIF
bSummonFlagActive = FALSE
alien.aState = AS_TELEPORT_OUT_START
EXIT
ENDIF
BREAK
CASE AS_WATCH_SUMMON
SET_PED_NAME_DEBUG(alien.pedID, "WATCH")
IF (bSummonFlagActive = TRUE)
IF GET_SCRIPT_TASK_STATUS(alien.pedID, SCRIPT_TASK_PLAY_ANIM) <> PERFORMING_TASK
TASK_PLAY_ANIM(alien.pedID, sMissionAnimDictionary, sAlienWatchAnim, SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING)
ENDIF
EXIT
ENDIF
alien.aState = AS_WATCH_SUMMON_END
alien.iTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(iAlienWatchSummonTimeOut - 1500, iAlienWatchSummonTimeOut - 500)
BREAK
CASE AS_WATCH_SUMMON_END
SET_PED_NAME_DEBUG(alien.pedID, "WATCH END")
IF (GET_GAME_TIMER() > alien.iTimer) AND NOT IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), sMissionAnimDictionary, sAlienGrabbedFailAnim)
alien.aState = AS_ACTIVE
ENDIF
BREAK
CASE AS_CHARGE_RUSH
REMOVE_ALIEN_PARTICLE_FX(alien)
SET_PED_RESET_FLAG(alien.pedID, PRF_InfiniteStamina, TRUE)
SET_PED_NAME_DEBUG(alien.pedID, "C-RUSH")
IF NOT alien.bWallSpawn
SET_PED_MOVE_RATE_OVERRIDE(alien.pedID, 1.15)
SET_PED_DESIRED_MOVE_BLEND_RATIO(alien.pedID, PEDMOVE_SPRINT)
IF GET_SCRIPT_TASK_STATUS(alien.pedID, SCRIPT_TASK_GO_TO_ENTITY) <> PERFORMING_TASK
TASK_GO_TO_ENTITY(alien.pedID, PLAYER_PED_ID())
ENDIF
ENDIF
IF (alien.fDistToPlayer < alien.fBeamTriggerRange) AND IS_MISSION_IN_COMBAT_STAGE()
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(alien.pedID, "ALIEN_HOSTILE", "ALIENS", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
alien.aState = AS_CHARGE_START
alien.sBeamLOS = NULL
ELIF bSummonFlagActive
alien.aState = AS_WATCH_SUMMON
ENDIF
BREAK
CASE AS_CHARGE
SET_ENTITY_COORDS(alien.impactID, GET_ENTITY_COORDS(alien.projectorID))
SET_PED_NAME_DEBUG(alien.pedID, "CHARGE")
IF (GET_GAME_TIMER() > alien.iTimer)
IF IS_MISSION_IN_COMBAT_STAGE()
SAFE_REMOVE_PARTICLE_FX(alien.fxSummonID)
SAFE_REMOVE_PARTICLE_FX(alien.fxChargeID)
SAFE_REMOVE_PARTICLE_FX(alien.fxBeamID)
SAFE_REMOVE_PARTICLE_FX(alien.fxImpactID)
IF bDebugTTYSpew = TRUE
CPRINTLN(DEBUG_MISSION, "Alien ", alien.iAlienIndex, " is firing")
ENDIF
alien.aState = AS_BEAM_START
ENDIF
ENDIF
BREAK
CASE AS_CHARGE_START
UPDATE_ALIEN_CHARGE_START(alien)
BREAK
CASE AS_BEAM_START
IF NOT IS_PED_RUNNING_RAGDOLL_TASK(alien.pedID)
SET_PED_NAME_DEBUG(alien.pedID, "BEAM ST")
SET_ENTITY_HEADING_FACE_PLAYER(alien.pedID)
pos = GET_PED_BONE_COORDS(PLAYER_PED_ID(), BONETAG_HEAD, <<0, 0, 0>>)
SET_ENTITY_ROTATION_FACE_COORDS(alien.projectorID, pos)
alien.iTimer = GET_GAME_TIMER() + iAlienBeamShootTime
SAFE_REMOVE_PARTICLE_FX(alien.fxSummonID)
SAFE_REMOVE_PARTICLE_FX(alien.fxChargeID)
SAFE_REMOVE_PARTICLE_FX(alien.fxBeamID)
SAFE_REMOVE_PARTICLE_FX(alien.fxImpactID)
alien.fBeamLength = 0.0
alien.fxChargeID = START_PARTICLE_FX_LOOPED_ON_ENTITY("scr_alien_impact", alien.projectorID, <<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>, fAlienImpactEffectSize / 3.0)
alien.fxBeamID = START_PARTICLE_FX_LOOPED_ON_ENTITY("scr_alien_beam", alien.projectorID, <<0.0, 0.0, 0.0>>, vAlienBeamRotationVector, fAlienBeamEffectSize)
SET_PARTICLE_FX_LOOPED_FAR_CLIP_DIST(alien.fxBeamID, alien.fBeamLength)
TASK_PLAY_ANIM(alien.pedID, sMissionAnimDictionary, "MIND_CONTROL_B_Loop", SLOW_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING)
alien.aState = AS_BEAM
ENDIF
BREAK
CASE AS_BEAM
UPDATE_ALIEN_BEAM(alien)
BREAK
CASE AS_BEAM_KNOCKDOWN
alien.fBeamLength = 0
IF IS_ENTITY_ALIVE(alien.pedID)
IF IS_PED_FALLING(alien.pedID) OR IS_PED_GETTING_UP(alien.pedID) OR
IS_PED_RAGDOLL(alien.pedID) OR IS_PED_RUNNING_RAGDOLL_TASK(alien.pedID)
EXIT
ENDIF
ENDIF
IF GET_SCRIPT_TASK_STATUS(alien.pedID, SCRIPT_TASK_PLAY_ANIM) <> PERFORMING_TASK
TASK_PLAY_ANIM(alien.pedID, sMissionAnimDictionary, "MIND_CONTROL_B_LOOP", REALLY_SLOW_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING)
ENDIF
IF GET_SCRIPT_TASK_STATUS(alien.pedID, SCRIPT_TASK_PLAY_ANIM) = PERFORMING_TASK
SET_ENTITY_HEADING(alien.projectorID, GET_ENTITY_HEADING(alien.pedID))
IF NOT DOES_PARTICLE_FX_LOOPED_EXIST(alien.fxChargeID)
alien.fxChargeID = START_PARTICLE_FX_LOOPED_ON_ENTITY("scr_alien_charging", alien.projectorID, <<0, 0, 0>>, <<0, 0, 0>>, fAlienChargeEffectSize)
ENDIF
IF bDebugTTYSpew = TRUE
CPRINTLN(DEBUG_MISSION, "Alien ", alien.iAlienIndex, " has resumed beam firing")
ENDIF
alien.aState = AS_BEAM
ENDIF
BREAK
CASE AS_DYING
IF HAS_ALIEN_FINSHED_DYING(alien) OR (GET_GAME_TIMER() > alien.iTimer)
pos = GET_ENTITY_COORDS(alien.pedID)
IF GET_GROUND_Z_FOR_3D_COORD(pos, z)
pos.z = z
ENDIF
START_PARTICLE_FX_NON_LOOPED_ON_ENTITY("scr_alien_disintegrate", alien.pedID, <<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>, fAlienDeathEffectSize)
PLAY_SOUND_FROM_COORD(-1, "DESPAWN", pos, "BARRY_01_SOUNDSET")
IF bDebugTTYSpew = TRUE
CPRINTLN(DEBUG_MISSION, "Alien ", alien.iAlienIndex, " is started dead")
ENDIF
alien.aState = AS_DEAD
SET_PED_NAME_DEBUG(alien.pedID, "DEAD")
alien.iTimer = GET_GAME_TIMER() + ALIEN_FADE_TIME
ENDIF
BREAK
CASE AS_DEAD
alien.fPedAlpha = ((alien.iTimer - GET_GAME_TIMER()) * 255) / TO_FLOAT(ALIEN_FADE_TIME)
//CPRINTLN(DEBUG_MISSION, "ALIEN ALPHA", alien.fPedAlpha )
IF (alien.fPedAlpha < 0.0)
alien.fPedAlpha = 0.0
ENDIF
IF IS_ENTITY_ON_SCREEN(alien.pedID)
SET_PED_ALPHA(alien.pedID, FLOOR(alien.fPedAlpha), iAlphaCounter)
ELSE
RESET_ENTITY_ALPHA(alien.pedID)
ENDIF
IF (GET_GAME_TIMER() > alien.iTimer) OR (alien.fPedAlpha <= 0.0)
IF bDebugTTYSpew = TRUE
CPRINTLN(DEBUG_MISSION, "Alien ", alien.iAlienIndex, " is dead")
ENDIF
RESET_ENTITY_ALPHA(alien.pedID)
DELETE_ALIEN_PED(alien)
alien.bIsActive = FALSE
EXIT
ENDIF
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// This handles all aliens day to day stuff
PROC UPDATE_ALIEN_PEDS()
INT i = 0
iAlienAliveCount = 0
REPEAT (COUNT_OF(alienPed)) i
IF (alienPed[i].bIsActive)
UPDATE_ALIEN_PED(alienPed[i])
iAlienAliveCount ++
ENDIF
ENDREPEAT
// clear the summoner index if time out is active
IF (GET_GAME_TIMER() < iAlienNextSummonTime)
iAlienSummonerIndex = -1
ELIF (iAlienSummonerIndex = -1)
UPDATE_NEXT_ALIEN_SUMMONER_INDEX()
ENDIF
ENDPROC
/// PURPOSE:
/// This teleports out all aliens
/// PARAMS:
/// tWait - If this is set pause script for 2000ms while aliens teleport out
PROC TELEPORT_OUT_ALL_ALIEN_PEDS(BOOL tWait = FALSE)
INT i = 0
INT n = 0
bKillAliensOnTeleportOut = TRUE
REPEAT COUNT_OF(alienPed) i
IF IS_ALIEN_PED_ALIVE(alienPed[i])
alienPed[i].aState = AS_TELEPORT_OUT_START
n ++
ENDIF
ENDREPEAT
IF (tWait = FALSE) OR (n = 0)
EXIT
ENDIF
i = GET_GAME_TIMER() + 2000
WHILE (GET_GAME_TIMER() < i)
UPDATE_ALIEN_PEDS()
WAIT(0)
ENDWHILE
ENDPROC
//----------------------
// DEBUG FUNCTIONS
//----------------------
#IF IS_DEBUG_BUILD
/// PURPOSE:
/// Initializes Debug Widgets
PROC SETUP_DEBUG_WIDGETS()
SET_PROFILING_OF_THIS_SCRIPT(TRUE)
m_WidgetGroup = START_WIDGET_GROUP("Barry 1 Config")
START_WIDGET_GROUP("Test Options")
ADD_WIDGET_BOOL("Show Debug Stuff", bDebugTTYSpew)
ADD_WIDGET_BOOL("Show Mission Timer", bShowDebugMissionTime)
ADD_WIDGET_BOOL("Update Widgets", bUpdateWidgets)
ADD_WIDGET_BOOL("Show Alien Pos", bShowAlienPos)
ADD_WIDGET_BOOL("bUseIsAreaOccupied", bUseIsAreaOccupied)
ADD_WIDGET_FLOAT_READ_ONLY("Player Regen Muliplier", fRegenMultiplier)
ADD_WIDGET_FLOAT_SLIDER("Player Damage Muliplier", fPlayerWeaponDamageModifier, 0.0, 5.0, 0.05)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Spawn Options")
ADD_WIDGET_INT_SLIDER("Max Active Aliens", iMaxActiveAliens, 0, COUNT_OF(alienPed) - 1, 1)
ADD_WIDGET_FLOAT_SLIDER("Minimum Spawn Range", fAlienMinSpawnRadius, 5.0, 100.0, 0.5)
ADD_WIDGET_FLOAT_SLIDER("Maximum Spawn Range", fAlienMaxSpawnRadius, 10.0, 150.0, 0.5)
ADD_WIDGET_INT_SLIDER("Aliens Kill Limit", iTotalAlienDeadRequired, 1, 100, 1)
ADD_WIDGET_INT_SLIDER("Alien Max HP", iAlienMaxHP, 200, 20000, 125)
ADD_WIDGET_BOOL("Use Custom Spawn Point", bUseAlienSpawnPoint)
ADD_WIDGET_VECTOR_SLIDER("Spawn Point Position", vAlienSpawnPoint, -6000.0, 6000.0, 0.5)
ADD_WIDGET_FLOAT_SLIDER("Spawn Point Radius", fAlienSpawnPointRadius, 5.0, 100.0, 0.5)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Area Options")
ADD_WIDGET_BOOL("Player In Battle Area", bIsPlayerInBattleArea)
ADD_WIDGET_VECTOR_SLIDER("Battle Center", vBattleCenter, -6000.0, 6000.0, 0.5)
ADD_WIDGET_FLOAT_SLIDER("Battle Range", fBattleRadius, 5.0, 1000.0, 0.5)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Beam Special Attack")
START_WIDGET_GROUP("Parameters")
ADD_WIDGET_FLOAT_SLIDER("Attack Range", fAlienBeamStartRange, 1, 40.0, 0.5)
ADD_WIDGET_INT_SLIDER("Charge Time", iAlienBeamChargeTime, 500, 20000, 500)
ADD_WIDGET_INT_SLIDER("Duration", iAlienBeamShootTime, 3000, 60000, 500)
ADD_WIDGET_FLOAT_SLIDER("Maximum Length", fAlienBeamMaximumLength, 0, 200.0, 0.5)
ADD_WIDGET_FLOAT_SLIDER("Length Increase", fAlienBeamLengthInc, 0.1, 20.0, 0.5)
ADD_WIDGET_FLOAT_SLIDER("Min Trigger Variance", fAlienMinBeamTriggerVariance, -1.0, 0.0, 0.05)
ADD_WIDGET_FLOAT_SLIDER("Max Trigger Variance", fAlienMaxBeamTriggerVariance, 0.0, 1.0, 0.05)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Damage Options")
ADD_WIDGET_BOOL("Apply Pushback Force", bAlienBeamKnockDown)
ADD_WIDGET_FLOAT_SLIDER("Force Scalar", fAlienBeamKnockDownForce, 0, 20.0, 0.25)
ADD_WIDGET_INT_SLIDER("Damage", iAlienBeamDamage, 0, 100, 1)
ADD_WIDGET_INT_SLIDER("Damage Rate", iAlienBeamDamageDelay, 1, 2000, 25)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Emitter Options")
ADD_WIDGET_VECTOR_SLIDER("Beam Rotation", vAlienBeamRotationVector, -360.0, 360.0, 0.5)
ADD_WIDGET_VECTOR_SLIDER("Beam Offset", vAlienBeamEmitterOffset, -10.0, 10.0, 0.5)
ADD_WIDGET_FLOAT_SLIDER("Radius", fAlienBeamEffectSize, 0.001, 10.0, 0.025)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("FX Options")
ADD_WIDGET_FLOAT_SLIDER("Charge Effect Scale", fAlienChargeEffectSize, 0, 5.0, 0.025)
ADD_WIDGET_FLOAT_SLIDER("Death Effect Scale", fAlienDeathEffectSize, 0, 5.0, 0.025)
ADD_WIDGET_FLOAT_SLIDER("Impact Effect Scale", fAlienImpactEffectSize, 0, 5.0, 0.025)
ADD_WIDGET_FLOAT_SLIDER("Teleport Effect Scale", fAlienTeleportEffectSize, 0, 5.0, 0.025)
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Summon Special Attack")
ADD_WIDGET_BOOL("Allow Summoning", bAllowSummoning)
START_WIDGET_GROUP("Parameters")
ADD_WIDGET_FLOAT_SLIDER("Attack Range", fAlienSummonRange, 1, 20.0, 0.5)
ADD_WIDGET_INT_SLIDER("Mash Limit", iAlienButtonMashLimit, 1, 20, 1)
ADD_WIDGET_INT_SLIDER("Duration", iAlienSummonTimeLength, 3000, 20000, 500)
ADD_WIDGET_INT_SLIDER("Time Out", iAlienNextSummonTimeOut, 3000, 60000, 500)
ADD_WIDGET_INT_SLIDER("Watch Time Out", iAlienWatchSummonTimeOut, 1000, 8000, 500)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Read Only Values")
ADD_WIDGET_INT_READ_ONLY("Current Game Time", iCurrentGameTime)
ADD_WIDGET_INT_READ_ONLY("Next Summon Time", iAlienNextSummonTime)
ADD_WIDGET_INT_READ_ONLY("Summoner Index", iAlienSummonerIndex)
ADD_WIDGET_BOOL("Is Summon Rush Active", bSummonRushFlagActive)
ADD_WIDGET_BOOL("Is Summon Active", bSummonFlagActive)
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Read Only Values")
ADD_WIDGET_INT_READ_ONLY("Current Game Time", iCurrentGameTime)
START_WIDGET_GROUP("Dialog Stats")
ADD_WIDGET_BOOL("Has First Outburst", bHasInitialOutburst)
ADD_WIDGET_INT_READ_ONLY("Initial Speech Time", iFirstDialogTime)
ADD_WIDGET_INT_READ_ONLY("Next Fight Dialog Time", iNextFightDialogTime)
ADD_WIDGET_INT_READ_ONLY("Next Freak Dialog Time", iNextFreakDialogTime)
ADD_WIDGET_INT_READ_ONLY("Next Damage Dialog Time", iNextDamageDialogTime)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Mission Stats")
ADD_WIDGET_INT_READ_ONLY("Total Aliens Spawned", iTotalAlienSpawnCount)
ADD_WIDGET_INT_READ_ONLY("Total Aliens Killed", iTotalAlienDeadCount)
ADD_WIDGET_INT_READ_ONLY("Total Summon Attempts", iTotalAlienSummonCount)
ADD_WIDGET_INT_READ_ONLY("Current Kill Chain", iKillChain)
ADD_WIDGET_INT_READ_ONLY("Maximum Kill Chain", iMaxKillChain)
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
ENDPROC
/// PURPOSE:
/// Removes Debug Widgets
PROC CLEANUP_DEBUG_WIDGETS()
IF DOES_WIDGET_GROUP_EXIST(m_WidgetGroup)
DELETE_WIDGET_GROUP(m_WidgetGroup)
ENDIF
ENDPROC
#ENDIF
//----------------------
// SCRIPT FLOW
//----------------------
/// PURPOSE:
/// Handles the Pass Out Sequence, it's animations and dialog
/// PARAMS:
/// pWait - Do we wait 2.5 seconds
FUNC BOOL PASS_OUT_SEQUENCE(BOOL bPass = FALSE)
VECTOR v
BOOL bOK = FALSE
SEQUENCE_INDEX seqTask
CAMERA_INDEX cCamera
// do global stuff here
UPDATE_ALIEN_PEDS()
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Michael", PLAYER_PED_ID(), GET_ENTITY_MODEL(PLAYER_PED_ID()))
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), FALSE)
ENDIF
SET_CUTSCENE_PED_PROP_VARIATION(sSceneHandleBarry, ANCHOR_EYES, 0)
CPRINTLN(DEBUG_MISSION, "PED CUTSCENE VARIATIONS SET")
ENDIF
// flow of the pass out sequence
SWITCH ePassOutStage
CASE POS_SETUP
// -----setup--------------------------------
IF (bPass = TRUE)
RC_REQUEST_CUTSCENE("bar_2_rcm")
REQUEST_SCRIPT("postRC_Barry1and2")
ENDIF
// make player tired [B*540333]
//FLEE_ALL_ALIEN_PEDS()
PREPARE_MUSIC_EVENT("RC18A_END_OS")
CPRINTLN(DEBUG_MISSION, "Interactive Music Event: RC18A_COLLAPSE Prepared")
CPRINTLN(DEBUG_MISSION, "Pass Out - 2.5 Second Warm Up")
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
ePassOutStage = POS_WAIT_FOR_TIRED
STOP_FIRE_IN_RANGE(GET_ENTITY_COORDS(PLAYER_PED_ID()), 2.0)
BREAK
CASE POS_WAIT_FOR_TIRED
// -----wait for tired--------------------------------
IF (bPass = FALSE)
IF IS_ENTITY_OK(gunObject)
DETACH_ENTITY(gunObject, DEFAULT, FALSE)
ENDIF
CPRINTLN(DEBUG_MISSION, "Pass Out - Should be playing the tired anim here")
OPEN_SEQUENCE_TASK(seqTask)
TASK_PLAY_ANIM(NULL, sMissionAnimDictionary, sExhaustedAnimEnter, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1)
TASK_PLAY_ANIM(NULL, sMissionAnimDictionary, sExhaustedAnim, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING)
CLOSE_SEQUENCE_TASK(seqTask)
TASK_PERFORM_SEQUENCE(PLAYER_PED_ID(), seqTask)
CLEAR_SEQUENCE_TASK(seqTask)
ENDIF
cCamera = CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", GET_GAMEPLAY_CAM_COORD(), GET_GAMEPLAY_CAM_ROT(), GET_GAMEPLAY_CAM_FOV(), TRUE)
v = GET_ENTITY_COORDS(PLAYER_PED_ID()) - GET_GAMEPLAY_CAM_COORD()
ATTACH_CAM_TO_ENTITY(cCamera, PLAYER_PED_ID(), -v)
IF DOES_CAM_EXIST(cCamera)
SET_CAM_ACTIVE(cCamera, TRUE)
ENDIF
// fail safe
iFailTimer = GET_GAME_TIMER() + 6000
ADD_PED_FOR_DIALOGUE(convoMichael, ENUM_TO_INT(CHAR_MICHAEL), PLAYER_PED_ID(), "MICHAEL")
CPRINTLN(DEBUG_MISSION, "Pass Out - Start Dialog - Going to Start Dialog State")
ePassOutStage = POS_START_DIALOG
BREAK
CASE POS_START_DIALOG
// -----start dialog--------------------------------
bOK = FALSE
IF (bPass = TRUE)
IF CREATE_CONVERSATION(convoMichael, "BARY1AU", "BARY1_PREOUT", CONV_PRIORITY_HIGH)
OR (GET_GAME_TIMER() > iFailTimer)
IF (GET_GAME_TIMER() < iFailTimer)
CPRINTLN(DEBUG_MISSION, "Pass Out - Start Dialog - Conversation Created")
ELSE
CPRINTLN(DEBUG_MISSION, "Pass Out - Start Dialog - Conversation Not Created - Emergency Abort")
ENDIF
iFailTimer = GET_GAME_TIMER() + 4500
bOK = TRUE
ENDIF
ELSE
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(convoMichael, "BARY1AU", "BARY1_PREOUT", "BARY1_PREOUT_2", CONV_PRIORITY_HIGH)
OR (GET_GAME_TIMER() > iFailTimer)
iFailTimer = GET_GAME_TIMER() + 2000
IF (GET_GAME_TIMER() < iFailTimer)
CPRINTLN(DEBUG_MISSION, "Pass Out - Start Dialog - Conversation Created")
ELSE
CPRINTLN(DEBUG_MISSION, "Pass Out - Start Dialog - Conversation Not Created - Emergency Abort")
ENDIF
bOK = TRUE
ENDIF
ENDIF
IF (bOK = TRUE)
CPRINTLN(DEBUG_MISSION, "Pass Out - Start Dialog - We should be ready to play line now")
ePassOutStage = POS_TRANSITION_FX
ENDIF
BREAK
CASE POS_TRANSITION_FX
bOK = FALSE
IF (bPass = TRUE)
IF (GET_GAME_TIMER() > iFailTimer)
// @SBA - filter for passing out
CLEANUP_SCREEN_FX()
ANIMPOSTFX_PLAY(FX_DrugsOut, 0, FALSE)
// wait for FX white out
iFailTimer = GET_GAME_TIMER() + 3500
bOK = TRUE
ENDIF
ELSE
bOK = TRUE
ENDIF
IF (bOK = TRUE)
CPRINTLN(DEBUG_MISSION, "Pass Out - FX should be transitioning")
ePassOutStage = POS_WAIT_DIALOGUE
ENDIF
BREAK
CASE POS_WAIT_DIALOGUE
IF (bPass = TRUE)
bOK = (GET_GAME_TIMER() > iFailTimer)
ELSE
IF (GET_GAME_TIMER() < iFailTimer)
CPRINTLN(DEBUG_MISSION, "Pass Out - Start Dialog - Conversation Finished")
ELSE
CPRINTLN(DEBUG_MISSION, "Pass Out - Start Dialog - Conversation Not Finished - Emergency Abort")
ENDIF
CPRINTLN(DEBUG_MISSION, "Pass Out - Setting Player To Rag Doll")
CPRINTLN(DEBUG_MISSION, "Interactive Music Event: RC18A_COLLAPSE")
// To slow down his ragdoll fall
SET_TIME_SCALE(0.6)
// make the player pass out
gunObject = CREATE_FAKE_WEAPON_FOR_PLAYER(playerWeapon)
IF IS_ENTITY_OK(PLAYER_PED_ID())
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
SET_PED_TO_RAGDOLL(PLAYER_PED_ID(), 7000, 7500, TASK_RELAX, FALSE, FALSE)
// if for any reason the gun hasn't detached...
IF IS_ENTITY_OK(gunObject) AND IS_ENTITY_ATTACHED(gunObject)
DETACH_ENTITY(gunObject, DEFAULT, FALSE)
ENDIF
ENDIF
bOK = TRUE
ENDIF
IF (bOK = TRUE)
CPRINTLN(DEBUG_MISSION, "IM Trigger - RC18A_END_OS")
TRIGGER_MUSIC_EVENT("RC18A_END_OS")
iFailTimer = GET_GAME_TIMER() + 1000 //3500
ePassOutStage = POS_WAIT_PASS_OUT
ENDIF
BREAK
CASE POS_WAIT_PASS_OUT
// ----wait for player to pass out--------------------------------
IF GET_GAME_TIMER() > iFailTimer
IF (bPass = TRUE)
// put this in a proc and call in fail too???
//CLEANUP_ALL_ALIEN_PEDS(FALSE)
SAFE_DELETE_OBJECT(gunObject)
IF DOES_CAM_EXIST(cCamera)
SET_CAM_ACTIVE(cCamera, FALSE)
DESTROY_CAM(cCamera)
ENDIF
SHAKE_GAMEPLAY_CAM("DRUNK_SHAKE", 0)
SET_TIME_SCALE(1.0)
DEACTIVATE_AUDIO_SLOWMO_MODE("BARRY_01_SLOWMO")
SET_AUDIO_FLAG("AllowScriptedSpeechInSlowMo", FALSE)
SET_AUDIO_FLAG("AllowAmbientSpeechInSlowMo", FALSE)
CLEAR_AREA_OF_VEHICLES(vMissionStart, 200.0)
REMOVE_DECALS_IN_RANGE(vMissionStart, 500.0)
CLEAR_AMBIENT_ZONE_STATE(sAmbientZone, TRUE)
IF IS_ENTITY_OK(PLAYER_PED_ID())
RESET_PED_VISIBLE_DAMAGE(PLAYER_PED_ID())
CLEAR_PED_BLOOD_DAMAGE(PLAYER_PED_ID())
ENDIF
ENDIF
CPRINTLN(DEBUG_MISSION, "Pass Out - Complete")
RETURN TRUE // completed the pass out sequence
ENDIF
BREAK
ENDSWITCH
RETURN FALSE // not completed the pass out sequence
ENDFUNC
/// PURPOSE:
/// Loads Mission Assets
/// PARAMS:
/// loadWait - if this is true pause script until all assets are loaded
PROC REQUEST_MISSION_ASSETS()
ADD_ASSET_REQUEST_FOR_WEAPON(assetRequester, 0, wtMiniGun)
ADD_ASSET_REQUEST_FROM_STRING(assetRequester, 1, ASSET_AUDIOBANK, "SCRIPT\\BARRY_01_ALIEN_A")
ADD_ASSET_REQUEST_FROM_STRING(assetRequester, 2, ASSET_AUDIOBANK, "SCRIPT\\BARRY_01_ALIEN_B")
ADD_ASSET_REQUEST_FROM_STRING(assetRequester, 3, ASSET_AUDIOBANK, "SCRIPT\\BARRY_01_ALIEN_C")
ADD_ASSET_REQUEST_FOR_MODEL(assetRequester, 4, alienModel)
ADD_ASSET_REQUEST_FOR_MODEL(assetRequester, 5, beamDummyModel)
ADD_ASSET_REQUEST_FOR_TEXT(assetRequester, 6, "BARY1", MISSION_TEXT_SLOT)
ADD_ASSET_REQUEST_FOR_PTFX(assetRequester, 7)
ADD_ASSET_REQUEST_FROM_STRING(assetRequester, 8, ASSET_ANIMDICT, sMissionAnimDictionary)
// @SBA - adding new assests below here
ADD_ASSET_REQUEST_FOR_MODEL(assetRequester, 9, mnProtestSign)
//ADD_ASSET_REQUEST_FOR_WEAPON(assetRequester, 9, wtSniperRifle)
//ADD_ASSET_REQUEST_FOR_WEAPON(assetRequester, 10, wtPistol)
//ADD_ASSET_REQUEST_FOR_WEAPON(assetRequester, 11, wtGrenLauncher)
ENDPROC
/// PURPOSE:
/// Unloads all current mission assets - marks models as not needed etc
PROC UNLOAD_MISSION_ASSETS()
UNLOAD_REQUESTED_ASSETS(assetRequester)
//CLEAR_ADDITIONAL_TEXT(MISSION_DIALOGUE_TEXT_SLOT, FALSE)
ENDPROC
/// PURPOSE:
/// Cleans mission
PROC MISSION_SETUP()
// my mission setup - these things are only done once
CPRINTLN(DEBUG_MISSION, " ")
CPRINTLN(DEBUG_MISSION, "BARRY 1 - VERSION:", MISSION_VERSION)
// setup z skip menu
#IF IS_DEBUG_BUILD
sSkipMenu[Z_SKIP_INTRO].sTxtLabel = "INTRO"
sSkipMenu[Z_SKIP_BATTLE].sTxtLabel = "BATTLE"
sSkipMenu[Z_SKIP_BATTLE_2].sTxtLabel = "BATTLE P.2"
sSkipMenu[Z_SKIP_PASSOUT].sTxtLabel = "COLLAPSE"
sSkipMenu[Z_SKIP_OUTRO].sTxtLabel = "OUTRO"
SETUP_DEBUG_WIDGETS()
#ENDIF
// turn off debug lines just in case i forget and shops
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(FALSE)
SET_ALL_SHOPS_TEMPORARILY_UNAVAILABLE(TRUE)
// stop police bothering me
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
SET_MAX_WANTED_LEVEL(0)
SET_PLAYER_WANTED_LEVEL(GET_PLAYER_INDEX(), 0)
SET_PLAYER_WANTED_LEVEL_NOW(GET_PLAYER_INDEX())
ENDIF
ENABLE_ALL_DISPATCH_SERVICES(FALSE)
DISABLE_CELLPHONE(TRUE)
// set weather transition
SET_WEATHER_TYPE_OVERTIME_PERSIST("extrasunny", 10.000)
SET_ANGLED_AREA(missionBoundary, <<126.585876,-903.245178,87.535141>>, <<266.423584,-956.580627,27.452606>>, 230.000000)
// @SBA - set a lager area to cover most of the battle zone
//SET_ANGLED_AREA(respotVehicleArea, <<176.729996,-969.593384,37.092262>>, <<195.129456,-941.357605,27.191963>>, 21.500000)
SET_ANGLED_AREA(respotVehicleArea, <<168.850021,-1001.023804,23.091291>>, <<225.904175,-862.596924,34.092327>>, 55.000000)
// if you don't call this line summmoning will fail
POPULATE_ALIEN_INDEX()
RESET_MISSION_PARAMETERS()
POPULATE_ALIEN_WALL_SPAWN_DATA()
SPECIAL_ABILITY_LOCK(GET_PLAYER_PED_MODEL(CHAR_MICHAEL))
SPECIAL_ABILITY_RESET(PLAYER_ID())
DISABLE_CHEAT(CHEAT_TYPE_GIVE_WEAPONS, TRUE)
DISABLE_TAXI_HAILING(TRUE)
IF IS_REPLAY_IN_PROGRESS()= TRUE // Set up the initial scene for replays
CPRINTLN(DEBUG_MISSION, "REPLAY IN PROGRESS", MISSION_VERSION)
g_bSceneAutoTrigger = TRUE
eInitialSceneStage = IS_REQUEST_SCENE
WHILE NOT SetupScene_BARRY_1(sRCLauncherDataLocal)
WAIT(0)
ENDWHILE
g_bSceneAutoTrigger = FALSE
ENABLE_AMBIENT_PEDS_AND_VEHICLES(FALSE, FALSE, TRUE, TRUE)
BLOCK_SCENARIOS_AND_AMBIENT(scenarioBlock)
SET_AMBIENT_ZONE_STATE(sAmbientZone, TRUE)
REQUEST_MISSION_ASSETS()
WHILE NOT HAVE_ASSET_REQUESTS_LOADED(assetRequester)
WAIT(0)
ENDWHILE
START_REPLAY_SETUP(vPlayerStartPos, kfPlayerStartHead, FALSE)
CPRINTLN(DEBUG_MISSION, "IM Trigger - RC18A_RESTART")
TRIGGER_MUSIC_EVENT("RC18A_RESTART")
stageEnum = SE_FIRSTCONTACT
stageProgress = SP_LOADING
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
CPRINTLN(DEBUG_MISSION, "Please Stop T-Posing...")
IF IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), sMissionAnimDictionary, sAlienGrabbedAnim)
STOP_ANIM_TASK(PLAYER_PED_ID(), sMissionAnimDictionary, sAlienGrabbedAnim)
ENDIF
IF IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), sMissionAnimDictionary, sAlienGrabbedIntroAnim)
STOP_ANIM_TASK(PLAYER_PED_ID(), sMissionAnimDictionary, sAlienGrabbedIntroAnim)
ENDIF
SET_ENTITY_VISIBLE(PLAYER_PED_ID(), TRUE)
// store weapons on replay
CPRINTLN(DEBUG_MISSION, "REPLAY: STORING PLAYER'S WEAPONS")
STORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT(PLAYER_PED_ID())
REMOVE_ALL_PED_WEAPONS(PLAYER_PED_ID())
CPRINTLN(DEBUG_MISSION, "Wait for it...")
ENDIF
// @SBA - Adding in replay stuff (put back in if we want it)
// INT iReplayStage = GET_REPLAY_MID_MISSION_STAGE()
//
// IF g_bShitskipAccepted = TRUE
// iReplayStage++ // player is skipping this stage
// ENDIF
//
// SWITCH iReplayStage
// CASE CP_MISSION_START
// Do_Z_Skip(Z_SKIP_BATTLE) // skip to the inital wave
// BREAK
// CASE CP_MID_STAGE
// SETUP_MICHAEL_DIALOG()
// Do_Z_Skip(Z_SKIP_BATTLE_2) // skip to part 2 of the battle
// PRINT_NOW("PRIME2", DEFAULT_GOD_TEXT_TIME, 1) // Kill the aliens
// BREAK
// CASE CP_OUTRO
// SAFE_FADE_SCREEN_OUT_TO_BLACK()
// Do_Z_Skip(Z_SKIP_OUTRO) // skip to the end
// BREAK
//
// DEFAULT
// SCRIPT_ASSERT("Replay in progress: Unknown checkpoint selected")
// BREAK
// ENDSWITCH
END_REPLAY_SETUP()
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
IF NOT ANIMPOSTFX_IS_RUNNING(FX_DrugsSkip)
ANIMPOSTFX_PLAY(FX_DrugsSkip, 0, TRUE)
ENDIF
SET_TIME_SCALE(fTimeScale)
ACTIVATE_AUDIO_SLOWMO_MODE("BARRY_01_SLOWMO")
SET_AUDIO_FLAG("AllowScriptedSpeechInSlowMo", TRUE)
SET_AUDIO_FLAG("AllowAmbientSpeechInSlowMo", TRUE)
ENDIF
ENABLE_ALIEN_BLOOD_VFX(TRUE)
CPRINTLN(DEBUG_MISSION, "SETUP DONE")
ENDPROC
// PURPOSE:
/// Cleans mission
PROC MISSION_CLEANUP()
IF IS_AUDIO_SCENE_ACTIVE(sndAlienAmbientScene)
STOP_AUDIO_SCENE(sndAlienAmbientScene)
ENDIF
CLEAR_AMBIENT_ZONE_STATE(sAmbientZone, TRUE)
IF DOES_ENTITY_EXIST(sRCLauncherDataLocal.pedID[0])
DELETE_PED(sRCLauncherDataLocal.pedID[0])
ENDIF
SET_PLAYER_HEALTH_RECHARGE_MULTIPLIER(PLAYER_ID(), 1.0)
SET_PLAYER_WEAPON_DAMAGE_MODIFIER(GET_PLAYER_INDEX(), 1.0)
SET_PED_CAN_SWITCH_WEAPON(PLAYER_PED_ID(), TRUE)
SPECIAL_ABILITY_UNLOCK(GET_PLAYER_PED_MODEL(CHAR_MICHAEL))
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), FALSE)
DELETE_ALL_ALIEN_PEDS()
ENABLE_ALIEN_BLOOD_VFX(FALSE)
//SAFE_REMOVE_BLIP(locationBlip)
ENDPROC
/// PURPOSE:
/// Cleanups Script and terminates thread - this should be the last function called
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())
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_MISSION, "Random Character Script was triggered so additional cleanup required")
#ENDIF
ENDIF
SET_PLAYER_HEALTH_RECHARGE_MULTIPLIER(GET_PLAYER_INDEX(), 1.0)
SET_PLAYER_WEAPON_DAMAGE_MODIFIER(GET_PLAYER_INDEX(), 1.0)
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
IF IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), sMissionAnimDictionary, sAlienGrabbedAnim)
STOP_ANIM_TASK(PLAYER_PED_ID(), sMissionAnimDictionary, sAlienGrabbedAnim)
ENDIF
IF IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), sMissionAnimDictionary, sAlienGrabbedIntroAnim)
STOP_ANIM_TASK(PLAYER_PED_ID(), sMissionAnimDictionary, sAlienGrabbedIntroAnim)
ENDIF
ENDIF
// @SBA - reset for minigun
IF playerWeapon = wtMiniGun
AND HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), playerWeapon)
SET_PED_INFINITE_AMMO(PLAYER_PED_ID(), FALSE, playerWeapon)
ENDIF
g_RestoreStoredWeaponsOnDeath = TRUE
DISABLE_CHEAT(CHEAT_TYPE_GIVE_WEAPONS, FALSE)
CLEANUP_SCREEN_FX()
STOP_ALL_ALIEN_EVERYTHING()
MISSION_CLEANUP()
UNLOAD_REQUESTED_ASSETS(assetRequester)
SET_ALL_SHOPS_TEMPORARILY_UNAVAILABLE(FALSE)
SET_CONTROL_SHAKE(PLAYER_CONTROL, 0, 0)
DISABLE_TAXI_HAILING(FALSE)
#IF IS_DEBUG_BUILD
CLEANUP_DEBUG_WIDGETS()
#ENDIF
// restore world based things
SHAKE_GAMEPLAY_CAM("DRUNK_SHAKE", 0)
SAFE_REMOVE_BLIP(locationBlip)
CLEAR_PED_BLOOD_DAMAGE(PLAYER_PED_ID())
//CLEAR_AREA_OF_VEHICLES(vMainLocation, 30.0)
REMOVE_DECALS_IN_RANGE(vMissionStart, 500.0)
SET_TIME_SCALE(1.0)
DEACTIVATE_AUDIO_SLOWMO_MODE("BARRY_01_SLOWMO")
SET_AUDIO_FLAG("AllowScriptedSpeechInSlowMo", FALSE)
SET_AUDIO_FLAG("AllowAmbientSpeechInSlowMo", FALSE)
ENABLE_ALL_DISPATCH_SERVICES(TRUE)
CLEAR_ALL_PICKUP_REWARD_TYPE_SUPPRESSION()
DISABLE_CELLPHONE(FALSE)
ENABLE_AMBIENT_PEDS_AND_VEHICLES(TRUE, TRUE)
UNBLOCK_SCENARIOS_AND_AMBIENT(scenarioBlock)
CLEAR_WEATHER_TYPE_PERSIST()
MOVE_PLAYERS_VEHICLE()
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
CLEAR_AMBIENT_ZONE_STATE(sAmbientZone, TRUE)
RC_CleanupSceneEntities(sRCLauncherDataLocal, FALSE)
TERMINATE_THIS_THREAD()
ENDPROC
/// PURPOSE:
/// Handles Mission Passed
PROC SCRIPT_PASSED()
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_MISSION, "Mission Passed")
#ENDIF
//FLEE_ALL_ALIEN_PEDS()
// @SBA - reset for minigun
IF playerWeapon = wtMiniGun
AND HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), playerWeapon)
SET_PED_INFINITE_AMMO(PLAYER_PED_ID(), FALSE, playerWeapon)
ENDIF
// ADD_CONTACT_TO_PHONEBOOK(CHAR_BARRY, MICHAEL_BOOK)
// This needs to be done before random character passed as the replay values are reset
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
CPRINTLN(DEBUG_MISSION, "Barry1 passed: weapons restored")
RESTORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT(PLAYER_PED_ID(), TRUE)
STORE_PLAYER_PED_WEAPONS(PLAYER_PED_ID())
ENDIF
CPRINTLN(DEBUG_MISSION, "Starting postRC_Barry1and2")
START_NEW_SCRIPT("postRC_Barry1and2", DEFAULT_STACK_SIZE)
SET_SCRIPT_AS_NO_LONGER_NEEDED("postRC_Barry1and2")
Random_Character_Passed(CP_RAND_C_BAR1)
SCRIPT_CLEANUP()
ENDPROC
//----------------------
// STATE FUNCTIONS
//----------------------
FUNC BOOL HAS_LEADIN_ANIM_FINISHED(PED_INDEX ped, STRING str)
IF NOT IS_ENTITY_PLAYING_ANIM(ped, sLeadInAnimDictionary, str)
RETURN TRUE
ENDIF
IF HAS_ENTITY_ANIM_FINISHED(ped, sLeadInAnimDictionary, str)
RETURN TRUE
ENDIF
IF (GET_ENTITY_ANIM_CURRENT_TIME(ped, sLeadInAnimDictionary, str) >= 1.0)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Updates Leading Sequence
/// PARAMS:
/// prog - stage progress enum, tells us what state we are in
PROC UPDATE_STAGE_LEADIN(STAGE_PROGRESS &prog)
RC_PLAYER_TRIGGER_SCENE_LOCK_IN()
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_DETONATE)
SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID())
HANDLE_LOCK_PLAYER_IN_FRONT_OF_TABLE()
SWITCH (prog)
CASE SP_LOADING
REQUEST_MISSION_ASSETS()
SECURE_REQUEST_AND_LOAD_ANIM_DICT(sLeadInAnimDictionary, FALSE)
prog = SP_SETUP
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[0])
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_FOOT) = CAM_VIEW_MODE_FIRST_PERSON
SET_GAMEPLAY_ENTITY_HINT(sRCLauncherDataLocal.pedID[0], (<<0.0, 0, 0.8>>), TRUE, -1, 3000)
SET_GAMEPLAY_HINT_CAMERA_RELATIVE_SIDE_OFFSET(0.0)
ELSE
SET_GAMEPLAY_ENTITY_HINT(sRCLauncherDataLocal.pedID[0], (<<0.5, 0, 0.8>>), TRUE, -1, 3000)
SET_GAMEPLAY_HINT_CAMERA_RELATIVE_SIDE_OFFSET(-0.04)
ENDIF
SET_GAMEPLAY_HINT_FOLLOW_DISTANCE_SCALAR(0.43)
//SET_GAMEPLAY_HINT_BASE_ORBIT_PITCH_OFFSET(1.0)
SET_GAMEPLAY_HINT_CAMERA_RELATIVE_VERTICAL_OFFSET(0.02)
SET_GAMEPLAY_HINT_FOV(30.00)
SET_GAMEPLAY_HINT_CAMERA_BLEND_TO_FOLLOW_PED_MEDIUM_VIEW_MODE(TRUE)
ENDIF
// IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
// SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON)
// TASK_FOLLOW_NAV_MESH_TO_COORD(PLAYER_PED_ID(), (<<187.2756, -954.7941, 29.0919>>), PEDMOVE_WALK, -1, DEFAULT_NAVMESH_RADIUS, ENAV_DEFAULT, 242.2959)
// TASK_LOOK_AT_ENTITY(PLAYER_PED_ID(), sRCLauncherDataLocal.ped[0], 4000)
// ENDIF
/*
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[0])
IF GET_PLANE_SIDE(GET_ENTITY_FORWARD_VECTOR(sRCLauncherDataLocal.pedID[0]), GET_ENTITY_COORDS(sRCLauncherDataLocal.pedID[0]), GET_ENTITY_COORDS(PLAYER_PED_ID())) = BEHIND_PLANE
stageEnum = SE_INTRO
prog = SP_LOADING
ELSE
SECURE_REQUEST_AND_LOAD_ANIM_DICT(sLeadInAnimDictionary, FALSE)
CPRINTLN(DEBUG_MISSION, "LEAD IN - STARTED - PLAYER IS ON WRONG SIDE")
prog = SP_SETUP
ENDIF
ENDIF
*/
BREAK
CASE SP_SETUP
IF HAS_ANIM_DICT_LOADED(sLeadInAnimDictionary)
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
CPRINTLN(DEBUG_MISSION, "LEAD-IN ANIMS LOADED")
structPedsForConversation sConversation
ADD_PED_FOR_DIALOGUE(sConversation, 0, PLAYER_PED_ID(), "MICHAEL")
ADD_PED_FOR_DIALOGUE(sConversation, 5, sRCLauncherDataLocal.pedID[0], "BARRY")
IF CREATE_CONVERSATION(sConversation ,"BARY1AU", "BARY1_LEADIN", CONV_PRIORITY_MEDIUM, DISPLAY_SUBTITLES)
TASK_PLAY_ANIM(sRCLauncherDataLocal.pedID[0], sLeadInAnimDictionary, "leadin", NORMAL_BLEND_IN, SLOW_BLEND_OUT, -1, AF_HOLD_LAST_FRAME)
TASK_LOOK_AT_ENTITY(sRCLauncherDataLocal.pedID[0], PLAYER_PED_ID(), INFINITE_TASK_TIME, SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH)
CPRINTLN(DEBUG_MISSION, "STARTED PLAYING LEAD-IN CONVERSATION")
prog = SP_RUNNING
iStateTimeOut = GET_GAME_TIMER() + 30000
ENDIF
ENDIF
BREAK
CASE SP_RUNNING
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[0])
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() OR (GET_GAME_TIMER() > iStateTimeOut )
prog = SP_CLEANUP
ENDIF
ENDIF
BREAK
CASE SP_CSKIPPED
BREAK
CASE SP_CLEANUP
IF IS_GAMEPLAY_HINT_ACTIVE()
STOP_GAMEPLAY_HINT()
ENDIF
CPRINTLN(DEBUG_MISSION, "LEAD IN FINISHED")
stageEnum = SE_INTRO
prog = SP_LOADING
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Updates Intro Sequence
/// PARAMS:
/// prog - stage progress enum, tells us what state we are in
PROC UPDATE_STAGE_INTRO(STAGE_PROGRESS &prog)
SWITCH (prog)
CASE SP_LOADING
//DELETE_ALL_ALIEN_PEDS()
CPRINTLN(DEBUG_MISSION, "REQUESTED CUTSCENE")
RC_REQUEST_CUTSCENE("bar_1_rcm_p2")
stageProgress = SP_SETUP
START_MISSION_DEBUG_TIMER()
bHasPlayerCameraExitState = FALSE
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
CLEAR_PED_BLOOD_DAMAGE(PLAYER_PED_ID())
// store weapons
CPRINTLN(DEBUG_MISSION, "STORING PLAYER'S WEAPONS")
STORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT(PLAYER_PED_ID())
REMOVE_ALL_PED_WEAPONS(PLAYER_PED_ID())
ENDIF
BREAK
CASE SP_SETUP
CPRINTLN(DEBUG_MISSION, "CHECKING TO SEE IF CUTSCENE IS OK TO START")
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Michael", PLAYER_PED_ID(), GET_ENTITY_MODEL(PLAYER_PED_ID()))
ENDIF
SET_CUTSCENE_PED_PROP_VARIATION(sSceneHandleBarry, ANCHOR_EYES, 0)
CPRINTLN(DEBUG_MISSION, "PED CUTSCENE VARIATIONS SET")
ENDIF
IF RC_IS_CUTSCENE_OK_TO_START()
CPRINTLN(DEBUG_MISSION, "CUTSCENE IS OK TO START")
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[0])
REGISTER_ENTITY_FOR_CUTSCENE(sRCLauncherDataLocal.pedID[0], sSceneHandleBarry, CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
CPRINTLN(DEBUG_MISSION, "REGISTERED BARRY")
ELSE
REGISTER_ENTITY_FOR_CUTSCENE(sRCLauncherDataLocal.pedID[0], sSceneHandleBarry, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, GET_NPC_PED_MODEL(CHAR_BARRY))
CPRINTLN(DEBUG_MISSION, "REGISTERED NEW BARRY")
ENDIF
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.objID[OBJ_TABLE])
REGISTER_ENTITY_FOR_CUTSCENE(sRCLauncherDataLocal.objID[OBJ_TABLE], sSceneHandleTable, CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
CPRINTLN(DEBUG_MISSION, "REGISTERED TABLE")
ELSE
REGISTER_ENTITY_FOR_CUTSCENE(sRCLauncherDataLocal.objID[OBJ_TABLE], sSceneHandleTable, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, PROP_PROTEST_TABLE_01)
CPRINTLN(DEBUG_MISSION, "REGISTERED NEW TABLE")
ENDIF
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.objID[OBJ_CHAIR])
REGISTER_ENTITY_FOR_CUTSCENE(sRCLauncherDataLocal.objID[OBJ_CHAIR], sSceneHandleChair, CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
CPRINTLN(DEBUG_MISSION, "REGISTERED CHAIR")
ELSE
REGISTER_ENTITY_FOR_CUTSCENE(sRCLauncherDataLocal.objID[OBJ_CHAIR], sSceneHandleChair, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, PROP_CHAIR_08)
CPRINTLN(DEBUG_MISSION, "REGISTERED NEW CHAIR")
ENDIF
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.objID[OBJ_PAPERS])
REGISTER_ENTITY_FOR_CUTSCENE(sRCLauncherDataLocal.objID[OBJ_PAPERS], sSceneHandlePapers, CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
CPRINTLN(DEBUG_MISSION, "REGISTERED PAPERS")
ELSE
REGISTER_ENTITY_FOR_CUTSCENE(sRCLauncherDataLocal.objID[OBJ_PAPERS], sSceneHandlePapers, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, P_A4_Sheets_S)
CPRINTLN(DEBUG_MISSION, "REGISTERED NEW PAPERS")
ENDIF
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.objID[OBJ_LIGHTER])
REGISTER_ENTITY_FOR_CUTSCENE(sRCLauncherDataLocal.objID[OBJ_LIGHTER], sSceneHandleLighter, CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
CPRINTLN(DEBUG_MISSION, "REGISTERED LIGHTER")
ELSE
REGISTER_ENTITY_FOR_CUTSCENE(sRCLauncherDataLocal.objID[OBJ_LIGHTER], sSceneHandleLighter, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, P_CS_Lighter_01)
CPRINTLN(DEBUG_MISSION, "REGISTERED NEW LIGHTER")
ENDIF
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.objID[OBJ_JOINT])
REGISTER_ENTITY_FOR_CUTSCENE(sRCLauncherDataLocal.objID[OBJ_JOINT], sSceneHandleJoint, CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
CPRINTLN(DEBUG_MISSION, "REGISTERED JOINT")
ELSE
REGISTER_ENTITY_FOR_CUTSCENE(sRCLauncherDataLocal.objID[OBJ_JOINT], sSceneHandleJoint, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, P_CS_JOINT_01)
CPRINTLN(DEBUG_MISSION, "REGISTERED NEW JOINT")
ENDIF
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
REGISTER_ENTITY_FOR_CUTSCENE(PLAYER_PED_ID(), "Michael", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
CPRINTLN(DEBUG_MISSION, "REGISTERED MICHAEL")
ENDIF
// mini-gun
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), playerWeapon, INFINITE_AMMO, FALSE, FALSE)
oiMichaelsWeapon = CREATE_WEAPON_OBJECT_FROM_PED_WEAPON_WITH_COMPONENTS(PLAYER_PED_ID(), playerWeapon)
REGISTER_ENTITY_FOR_CUTSCENE(oiMichaelsWeapon, sSceneHandleWeapon, CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
// Cleanup launcher which will remove mission blip
RC_CLEANUP_LAUNCHER()
START_CUTSCENE()
REPLAY_START_EVENT(REPLAY_IMPORTANCE_LOW)
SET_CUTSCENE_CAN_BE_SKIPPED(FALSE)
bHasPlayerCameraExitState = FALSE
WAIT(0)
// @SBA - assert fix
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.objID[OBJ_JOINT])
IF IS_ENTITY_ATTACHED(sRCLauncherDataLocal.objID[OBJ_JOINT])
DETACH_ENTITY(sRCLauncherDataLocal.objID[OBJ_JOINT])
ENDIF
ENDIF
ENABLE_AMBIENT_PEDS_AND_VEHICLES(FALSE, FALSE, TRUE, FALSE)
RESOLVE_MISSION_VEHICLES_FOR_CUTSCENE()
RC_START_CUTSCENE_MODE(vMissionStart, TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE)
BLOCK_SCENARIOS_AND_AMBIENT(scenarioBlock)
CLEANUP_SCREEN_FX()
bSkipAllowed = FALSE
CREATE_STANDING_SIGN(sRCLauncherDataLocal.objID[OBJ_SIGN], mnProtestSign)
SAFE_FADE_SCREEN_IN_FROM_BLACK(500, FALSE)
REQUEST_MISSION_ASSETS()
stageProgress = SP_RUNNING
ENDIF
BREAK
CASE SP_RUNNING
INT iCutTime
IF NOT IS_CUTSCENE_PLAYING()
REPLAY_STOP_EVENT()
RC_END_CUTSCENE_MODE(TRUE, FALSE)
FORCE_PLAYER_WEAPON(playerWeapon)
stageProgress = SP_CLEANUP
ELSE
iCutTime = GET_CUTSCENE_TIME()
CPRINTLN(DEBUG_MISSION, "Cutscene Time = ", iCutTime)
IF (bShowDebugMissionTime)
SET_TEXT_SCALE(0.5, 0.5)
DISPLAY_TEXT_WITH_NUMBER(0.1, 0.1, "NUMBER", GET_CUTSCENE_TIME())
ENDIF
IF HAVE_ASSET_REQUESTS_LOADED(assetRequester)
IF NOT bSkipAllowed
SET_CUTSCENE_CAN_BE_SKIPPED(TRUE)
bSkipAllowed = TRUE
ENDIF
// not sure this is really used - skipping seems built in
IF (iCutTime < 68000)
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
stageProgress = SP_CSKIPPED
CPRINTLN(DEBUG_MISSION, "Cutscene Skipped - Assets Loaded")
EXIT
ENDIF
ENDIF
ENDIF
IF NOT bHasPlayerCameraExitState
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael")
CPRINTLN(DEBUG_MISSION, "EXIT STATE FOR PLAYER SET")
bHasPlayerCameraExitState = TRUE
ENDIF
IF IS_ENTITY_ALIVE(oiMichaelsWeapon)
REQUEST_WEAPON_HIGH_DETAIL_MODEL(oiMichaelsWeapon)
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY(sSceneHandleWeapon)
GIVE_WEAPON_OBJECT_TO_PED(oiMichaelsWeapon, PLAYER_PED_ID())
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY(sSceneHandlePapers)
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.objID[OBJ_PAPERS])
CPRINTLN(DEBUG_MISSION, "EXIT STATE FOR PAPERS - DELETING")
DELETE_OBJECT(sRCLauncherDataLocal.objID[OBJ_PAPERS])
ENDIF
ENDIF
// B*750704 - Interactive Music Event
IF (bHasMusicStarted = FALSE)
IF (iCutTime >= MUSICEVENT_RC18A_START_DELAY)
bHasMusicStarted = TRUE
STRING FXname
FXname = FX_DrugsIn
IF WAS_CUTSCENE_SKIPPED()
CPRINTLN(DEBUG_MISSION, "Starting screen effect (cs skipped)")
FXname = FX_DrugsSkip
ENDIF
ANIMPOSTFX_PLAY(FXname, 0, TRUE)
CPRINTLN(DEBUG_MISSION, "IM Trigger - RC18A_START")
TRIGGER_MUSIC_EVENT("RC18A_START")
ENDIF
ENDIF
IF (bHasMusicIncreased = FALSE)
IF (iCutTime >= MUSICEVENT_RC18A_INCREASE_DELAY)
bHasMusicIncreased = TRUE
CPRINTLN(DEBUG_MISSION, "IM Trigger - RC18A_INCREASE")
TRIGGER_MUSIC_EVENT("RC18A_INCREASE")
ENDIF
ENDIF
ENDIF
BREAK
CASE SP_CSKIPPED
SET_CUTSCENE_FADE_VALUES(false, false, FALSE, false)
SAFE_FADE_SCREEN_OUT_TO_BLACK(250, FALSE)
IF IS_CUTSCENE_PLAYING()
WAIT_FOR_CUTSCENE_TO_STOP()
ENDIF
RC_END_CUTSCENE_MODE(TRUE, FALSE)
// just in case the player skips the cutscene we still need to play the event
IF (bHasMusicStarted = FALSE)
bHasMusicStarted = TRUE
CPRINTLN(DEBUG_MISSION, "IM Trigger - RC18A_CS_SKIP_BEFORE - Cutscene Skip")
TRIGGER_MUSIC_EVENT("RC18A_CS_SKIP_BEFORE")
IF NOT ANIMPOSTFX_IS_RUNNING(FX_DrugsSkip)
ANIMPOSTFX_PLAY(FX_DrugsSkip, 0, TRUE)
ENDIF
ELSE
CPRINTLN(DEBUG_MISSION, "IM Trigger - RC18A_CS_SKIP_AFTER - Cutscene Skip")
TRIGGER_MUSIC_EVENT("RC18A_CS_SKIP_AFTER")
bHasMusicIncreased = TRUE
ENDIF
IF IS_ENTITY_ALIVE(oiMichaelsWeapon)
SAFE_DELETE_OBJECT(oiMichaelsWeapon)
ENDIF
CPRINTLN(DEBUG_MISSION, "Cutscene skipped - player's heading: ", kfPlayerStartHead)
SET_ENTITY_COORDS_GROUNDED(PLAYER_PED_ID(), vMissionStart)
SET_ENTITY_HEADING(PLAYER_PED_ID(), kfPlayerStartHead)// @SBA OLD = fMissionStart
FORCE_PLAYER_WEAPON(playerWeapon)
// SET_GAMEPLAY_CAM_RELATIVE_PITCH()
// SET_GAMEPLAY_CAM_RELATIVE_HEADING()
WAIT(500)
stageProgress = SP_CLEANUP
BREAK
CASE SP_CLEANUP
stageProgress = SP_LOADING
stageEnum = SE_FIRSTCONTACT
IF WAS_CUTSCENE_SKIPPED()
IF (bHasMusicStarted = FALSE)
bHasMusicStarted = TRUE
CPRINTLN(DEBUG_MISSION, "IM Trigger - RC18A_CS_SKIP_BEFORE - Cutscene Skip")
TRIGGER_MUSIC_EVENT("RC18A_CS_SKIP_BEFORE")
ELIF (bHasMusicIncreased = FALSE)
CPRINTLN(DEBUG_MISSION, "IM Trigger - RC18A_CS_SKIP_AFTER - Cutscene Skip")
TRIGGER_MUSIC_EVENT("RC18A_CS_SKIP_AFTER")
bHasMusicIncreased = TRUE
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Updates First Contact (Initial wave of 3 aliens)
/// PARAMS:
/// prog - stage progress enum, tells us what state we are in
PROC UPDATE_STAGE_FIRSTCONTACT(STAGE_PROGRESS &prog)
INT ind
SWITCH (prog)
CASE SP_LOADING
SET_TIME_SCALE(fTimeScale)
DEACTIVATE_AUDIO_SLOWMO_MODE("BARRY_01_SLOWMO") // assert fix
ACTIVATE_AUDIO_SLOWMO_MODE("BARRY_01_SLOWMO")
SET_AUDIO_FLAG("AllowScriptedSpeechInSlowMo", TRUE)
SET_AUDIO_FLAG("AllowAmbientSpeechInSlowMo", TRUE)
IF NOT HAVE_ASSET_REQUESTS_LOADED(assetRequester)
REQUEST_MISSION_ASSETS()
ENDIF
prog = SP_SETUP
SETUP_MICHAEL_DIALOG()
RC_SET_ENTITY_PROOFS_FOR_CUTSCENE(sRCLauncherDataLocal, FALSE, FALSE)
RC_CleanupSceneEntities(sRCLauncherDataLocal, TRUE, TRUE, FALSE)
START_MISSION_DEBUG_TIMER()
FORCE_PLAYER_WEAPON(playerWeapon)
SET_AMBIENT_ZONE_STATE(sAmbientZone, TRUE)
BREAK
CASE SP_SETUP
CLEAR_PRINTS()
START_AUDIO_SCENE(sndAlienAmbientScene)
CLEAR_PED_BLOOD_DAMAGE(PLAYER_PED_ID())
// reset summon flags and counters
iTotalAlienSpawnCount = 0
iTotalAlienDeadCount = 0
iAlienNextSummonTime = 0
bSummonRushFlagActive = FALSE
bSummonFlagActive = FALSE
bAllowSummoning = FALSE
iAlienSummonerIndex = -1
iMaxActiveAliens = kiMaxStartingAliens
fAlienMinSpawnRadius = 40.0
fAlienMaxSpawnRadius = 60.0
// @SBA - updating these first aliens
IF GET_FREE_ALIEN_PED_INDEX(ind)
CREATE_ALIEN_PED(alienPed[ind], <<212.9178, -920.5014, 30.6922>>, 0, FALSE) //<<181.1, -951.9, 30.1>>
alienPed[ind].fBeamTriggerRange = 15
SET_ALIEN_WEAK(alienPed[ind])
ENDIF
IF GET_FREE_ALIEN_PED_INDEX(ind)
CREATE_ALIEN_PED(alienPed[ind], <<213.2008, -917.9012, 30.6923>>, 2, FALSE) // <<173.0, -956.9, 30.1>>
alienPed[ind].fBeamTriggerRange = 15
SET_ALIEN_WEAK(alienPed[ind])
ENDIF
IF GET_FREE_ALIEN_PED_INDEX(ind)
CREATE_ALIEN_PED(alienPed[ind], <<217.8108, -916.8170, 30.6923>>, 4, FALSE) // <<174.7, -948.1, 30.1>>
alienPed[ind].fBeamTriggerRange = 15
SET_ALIEN_WEAK(alienPed[ind])
ENDIF
// @SBA - adding some more to this wave
IF GET_FREE_ALIEN_PED_INDEX(ind)
CREATE_ALIEN_PED(alienPed[ind], <<211.0789, -912.2070, 30.6923>>, 8, FALSE)
alienPed[ind].fBeamTriggerRange = 15
SET_ALIEN_WEAK(alienPed[ind])
ENDIF
SAFE_FADE_SCREEN_IN_FROM_BLACK(500, FALSE)
PRINT_NOW("PRIME2", DEFAULT_GOD_TEXT_TIME, 1) // Kill the Aliens
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(PLAYER_PED_ID())
// @SBA - spawn timer
START_TIMER_NOW(tmr1stContactSpawn)
f1stContactSpawnTime = 5.000
prog = SP_RUNNING
BREAK
CASE SP_RUNNING
PLAY_MICHAEL_INITIAL_LINE()
SPAWN_NEXT_ALIEN_NEAR_LOCATION(v1stContactStartCtr, f1stContactStartRadius, 5, TRUE)
// update kill chain
IF (iKillChainEndTime <> 0)
AND (GET_GAME_TIMER() > iKillChainEndTime)
CPRINTLN(DEBUG_MISSION, "KILL CHAIN FAIL!!")
iKillChainEndTime = 0
iKillChain = 0
ENDIF
// @SBA - CHANGING BY REQUEST
// IF (iAlienAliveCount = 0)
// OR IS_PLAYER_OUT_OF_AMMO(PlayerWeapon)
IF (iTotalAlienDeadCount >= 10)
CPRINTLN(DEBUG_MISSION, "GOING TO FIRST CONTACT CLEANUP")
// @SBA - CHANGING BY REQUEST
//SWAP_THE_PLAYERS_WEAPON(PlayerWeapon)
prog = SP_CLEANUP
ENDIF
BREAK
CASE SP_CLEANUP
prog = SP_LOADING
stageEnum = SE_WAVE1
//prog = SP_LOADING
//stageEnum = SE_PASSOUT
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Updates first wave
/// PARAMS:
/// prog - stage progress enum, tells us what state we are in
PROC UPDATE_STAGE_WAVE_1(STAGE_PROGRESS &prog)
SWITCH (prog)
CASE SP_LOADING
CPRINTLN(DEBUG_MISSION, "LOADING FIRST WAVE")
START_TIMER_NOW(tmrStageTimer)
prog = SP_SETUP
BREAK
CASE SP_SETUP
// @SBA - give a little space before new aliens start spawning in
IF TIMER_DO_ONCE_WHEN_READY(tmrStageTimer, 5.000)
CPRINTLN(DEBUG_MISSION, "FIRST WAVE TIMER IS UP")
bAutoCreateAliens = TRUE
bAllowSummoning = TRUE
iMaxActiveAliens = kiMaxStartingAliens
iAlienAutoGenTime = 0
prog = SP_RUNNING
ENDIF
BREAK
CASE SP_RUNNING
// update kill chain
IF (iKillChainEndTime <> 0)
AND (GET_GAME_TIMER() > iKillChainEndTime)
CPRINTLN(DEBUG_MISSION, "KILL CHAIN FAIL!!")
iKillChainEndTime = 0
iKillChain = 0
ENDIF
// drugs effect and other thing
IF IS_AUDIO_SCENE_ACTIVE(sndAlienAmbientScene)
SET_AUDIO_SCENE_VARIABLE(sndAlienAmbientScene, "DrugsEffect", (SIN(((TO_FLOAT(GET_GAME_TIMER())/1000)*45)%360))*0.25+0.25)
ENDIF
// @SBA - advance through the weapons we want the player to use
IF IS_PLAYER_OUT_OF_AMMO(PlayerWeapon)
SWAP_THE_PLAYERS_WEAPON(PlayerWeapon)
ENDIF
// auto create aliens as supplies run low
HANDLE_AUTO_ALIEN_GENERATION()
PLAY_MICHAEL_FREAK_DIALOG_LINES()
//SET_TIME_SCALE(fTimeScale)
// @SBA - conditions to end wave 1
IF (iTotalAlienDeadCount >= iTotalAlienDeadRequired - kiAliensLeftToKill)
bAutoCreateAliens = FALSE
CPRINTLN(DEBUG_MISSION, "GOING TO FIRST WAVE CLEANUP")
prog = SP_CLEANUP
ENDIF
BREAK
CASE SP_CLEANUP
prog = SP_LOADING
stageEnum = SE_WAVE2
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Updates first wave
/// PARAMS:
/// prog - stage progress enum, tells us what state we are in
PROC UPDATE_STAGE_WAVE_2(STAGE_PROGRESS &prog)
SWITCH (prog)
CASE SP_LOADING
CASE SP_SETUP
CPRINTLN(DEBUG_MISSION, "LOADING SECOND WAVE")
bAutoCreateAliens = TRUE
prog = SP_RUNNING
BREAK
CASE SP_RUNNING
// update kill chain
IF (iKillChainEndTime <> 0)
AND (GET_GAME_TIMER() > iKillChainEndTime)
CPRINTLN(DEBUG_MISSION, "KILL CHAIN FAIL!!")
iKillChainEndTime = 0
iKillChain = 0
ENDIF
// drugs effect and other thing
IF IS_AUDIO_SCENE_ACTIVE(sndAlienAmbientScene)
SET_AUDIO_SCENE_VARIABLE(sndAlienAmbientScene, "DrugsEffect", (SIN(((TO_FLOAT(GET_GAME_TIMER())/1000)*45)%360))*0.25+0.25)
ENDIF
// @SBA - advance through the weapons we want the player to use
// Note Mini-gun (last weapon) gets infinite ammo
IF IS_PLAYER_OUT_OF_AMMO(PlayerWeapon)
SWAP_THE_PLAYERS_WEAPON(PlayerWeapon)
IF PlayerWeapon = wtMiniGun
AND iTotalAlienDeadCount >= iTotalAlienDeadRequired
CPRINTLN(DEBUG_MISSION, "UPDATE_STAGE_WAVE_2: Player just got minigun, adding ",iAliensToAdd, " more aliens to the required kill total." )
iTotalAlienDeadRequired += iAliensToAdd
ENDIF
ENDIF
// auto create aliens as supplies run low
HANDLE_AUTO_ALIEN_GENERATION()
PLAY_MICHAEL_FREAK_DIALOG_LINES()
//SET_TIME_SCALE(fTimeScale)
// @SBA - make sure the player has gotten the mini-gun first
IF PlayerWeapon = wtMiniGun
// then check dead count
IF (iTotalAlienDeadCount > iTotalAlienDeadRequired)
bAutoCreateAliens = FALSE
IF (iAlienAliveCount = 0)
CPRINTLN(DEBUG_MISSION, "GOING TO FIRST WAVE CLEANUP")
prog = SP_CLEANUP
ENDIF
ENDIF
ENDIF
BREAK
CASE SP_CLEANUP
prog = SP_LOADING
stageEnum = SE_PASSOUT
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Updates The Pass Out Sequence
/// PARAMS:
/// prog - stage progress enum, tells us what state we are in
PROC UPDATE_STAGE_PASSOUT(STAGE_PROGRESS &prog)
SWITCH (prog)
CASE SP_LOADING
CASE SP_SETUP
//TELEPORT_OUT_ALL_ALIEN_PEDS()
SAFE_FADE_SCREEN_IN_FROM_BLACK(500, FALSE)
CPRINTLN(DEBUG_MISSION, "ENTERING UPDATE STAGE PASSOUT")
CLEAR_PRINTS()
CLEAR_HELP()
prog = SP_RUNNING
BREAK
CASE SP_RUNNING
IF PASS_OUT_SEQUENCE(TRUE)
prog = SP_CLEANUP
ENDIF
BREAK
CASE SP_CLEANUP
prog = SP_LOADING
stageEnum = SE_OUTRO
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Updates Outro
/// PARAMS:
/// prog - stage progress enum, tells us what state we are in
PROC UPDATE_STAGE_OUTRO(STAGE_PROGRESS &prog)
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Michael", PLAYER_PED_ID(), GET_ENTITY_MODEL(PLAYER_PED_ID()))
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), FALSE)
ENDIF
SET_CUTSCENE_PED_PROP_VARIATION(sSceneHandleBarry, ANCHOR_EYES, 0)
CPRINTLN(DEBUG_MISSION, "PED CUTSCENE VARIATIONS SET")
ENDIF
SWITCH (prog)
CASE SP_LOADING
CPRINTLN(DEBUG_MISSION, "REQUESTING CUTSCENE - bar_2_rcm")
RC_REQUEST_CUTSCENE("bar_2_rcm")
WAIT_FOR_WORLD_TO_LOAD(vMissionStart)
IF NOT HAS_SCRIPT_LOADED("postRC_Barry1and2")
REQUEST_SCRIPT("postRC_Barry1and2")
ENDIF
prog = SP_SETUP
BREAK
CASE SP_SETUP
IF RC_IS_CUTSCENE_OK_TO_START()
AND HAS_SCRIPT_LOADED("postRC_Barry1and2")
bHasPlayerCameraExitState = FALSE
IF IS_ENTITY_OK(PLAYER_PED_ID())
RESET_PED_VISIBLE_DAMAGE(PLAYER_PED_ID())
CLEAR_PED_BLOOD_DAMAGE(PLAYER_PED_ID())
ENDIF
MISSION_CLEANUP()
CLEAR_AREA_OF_VEHICLES(vMissionStart, 250.0)
CLEAR_AREA_OF_PEDS(vMissionStart, 50.0)
CLEAR_AREA_OF_OBJECTS(vMissionStart, 30.0)
REMOVE_DECALS_IN_RANGE(vMissionStart, 500.0)
CLEAR_PLAYER_WANTED_LEVEL(PLAYER_ID())
MOVE_PLAYERS_VEHICLE()
REGISTER_ENTITY_FOR_CUTSCENE(NULL, sSceneHandleBarry, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, GET_NPC_PED_MODEL(CHAR_BARRY))
REGISTER_ENTITY_FOR_CUTSCENE(NULL, sSceneHandleTable, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, PROP_PROTEST_TABLE_01)
REGISTER_ENTITY_FOR_CUTSCENE(NULL, sSceneHandleChair, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, PROP_CHAIR_08)
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
REGISTER_ENTITY_FOR_CUTSCENE(PLAYER_PED_ID(), "Michael", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, PLAYER_ZERO)
CPRINTLN(DEBUG_MISSION, "REGISTERED MICHAEL")
ENDIF
REPLAY_START_EVENT(REPLAY_IMPORTANCE_LOW)
START_CUTSCENE()
WAIT(0)
SAFE_FADE_SCREEN_IN_FROM_BLACK(1000, FALSE)
// RESOLVE_MISSION_VEHICLES_FOR_CUTSCENE()
RC_START_CUTSCENE_MODE(<<0, 0, 0>>, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE)
CPRINTLN(DEBUG_MISSION, "IM Trigger - RC18A_STOP")
TRIGGER_MUSIC_EVENT("RC18A_STOP")
//SET_CUTSCENE_CAN_BE_SKIPPED(FALSE)
prog = SP_RUNNING
ENDIF
BREAK
CASE SP_RUNNING
// Don't look back
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
ENDIF
IF NOT IS_CUTSCENE_PLAYING()
CPRINTLN(DEBUG_MISSION, "PRE RC_END_CUTSCENE_MODE")
RC_END_CUTSCENE_MODE()
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
ENDIF
REPLAY_STOP_EVENT()
CPRINTLN(DEBUG_MISSION, "POST RC_END_CUTSCENE_MODE")
prog = SP_CLEANUP
ELSE
IF NOT bHasPlayerCameraExitState
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
ENDIF
IF NOT IS_ENTITY_ALIVE(sRCLauncherDataLocal.objID[OBJ_SIGN])
CREATE_STANDING_SIGN(sRCLauncherDataLocal.objID[OBJ_SIGN], mnProtestSign)
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael")
CPRINTLN(DEBUG_MISSION, "SET EXIT STATE FOR MICHAEL")
FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_WALK, FALSE, FAUS_CUTSCENE_EXIT)
SIMULATE_PLAYER_INPUT_GAIT(player_id(), pedmove_walk, 2000)
bHasPlayerCameraExitState = TRUE
ENDIF
// register things as we exit
IF NOT IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[0])
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY(sSceneHandleBarry))
sRCLauncherDataLocal.pedID[0] = GET_PED_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY(sSceneHandleBarry))
SET_PED_PROP_INDEX(sRCLauncherDataLocal.pedID[0], ANCHOR_EYES, 0) //Glasses prop.
ENDIF
ENDIF
IF NOT IS_ENTITY_ALIVE(sRCLauncherDataLocal.objID[OBJ_TABLE])
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY(sSceneHandleTable))
sRCLauncherDataLocal.objID[OBJ_TABLE] = GET_OBJECT_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY(sSceneHandleTable))
ENDIF
ENDIF
IF NOT IS_ENTITY_ALIVE(sRCLauncherDataLocal.objID[OBJ_CHAIR])
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY(sSceneHandleChair))
sRCLauncherDataLocal.objID[OBJ_CHAIR] = GET_OBJECT_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY(sSceneHandleChair))
ENDIF
ENDIF
IF CAN_SET_ENTER_STATE_FOR_REGISTERED_ENTITY(sSceneHandleTable)
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.objID[OBJ_TABLE]) AND IS_ENTITY_ALIVE(sRCLauncherDataLocal.objID[OBJ_PAPERS])
ATTACH_ENTITY_TO_ENTITY(sRCLauncherDataLocal.objID[OBJ_PAPERS], sRCLauncherDataLocal.objID[OBJ_TABLE], 0, <<0, -0.25, 0>>, <<0, 0, 0>>)
CPRINTLN(DEBUG_MISSION, "PAPERS REATTACHED TO TABLE")
ENDIF
ENDIF
/*
SET_CUTSCENE_CAN_BE_SKIPPED(TRUE)
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
stageProgress = SP_CSKIPPED
ENDIF
*/
ENDIF
BREAK
CASE SP_CSKIPPED
SET_CUTSCENE_FADE_VALUES(false, false, FALSE, false)
SAFE_FADE_SCREEN_OUT_TO_BLACK(250, FALSE)
IF IS_CUTSCENE_PLAYING()
WAIT_FOR_CUTSCENE_TO_STOP()
ENDIF
RC_END_CUTSCENE_MODE()
SET_ENTITY_COORDS_GROUNDED(PLAYER_PED_ID(), vMissionStart)
SET_ENTITY_HEADING(PLAYER_PED_ID(), fMissionStart)
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
WAIT(250)
SAFE_FADE_SCREEN_IN_FROM_BLACK(250, FALSE)
SCRIPT_PASSED()
BREAK
CASE SP_CLEANUP
CPRINTLN(DEBUG_MISSION, "SP_CLEANUP")
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
ENDIF
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_BEHIND)
SCRIPT_PASSED()
BREAK
ENDSWITCH
ENDPROC
// @SBA - Quick and dirty prototype of pulling camera into the sky and dropping Michael from there
CAMERA_INDEX ciDropCam
SELECTOR_CAM_STRUCT scsCamDetails
INT iTest = 0
INT iTimeFadeOut
VECTOR vSkyCam = <<184.8, -961.5, 200.0>>
VECTOR vSkyCamRot = <<-90, 0.0, -109.6>>
FUNC BOOL OPERATION_DROP_MICHAEL()
SWITCH iTest
// set up
CASE 0
ciDropCam = CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", vSkyCam, vSkyCamRot, 50.0)
scsCamDetails.camSky = ciDropCam
iTimeFadeOut = GET_GAME_TIMER() + 400
iTest ++
BREAK
// sky cam and fade
CASE 1
IF GET_GAME_TIMER() > iTimeFadeOut
IF NOT IS_SCREEN_FADED_OUT()
AND NOT IS_SCREEN_FADING_OUT()
DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME)
ENDIF
ENDIF
IF NOT RUN_CAM_SPLINE_FROM_PLAYER_TO_SKY_CAM(scsCamDetails, 0.8)
iTest ++
ENDIF
BREAK
// start black screen timer
CASE 2
IF IS_SCREEN_FADED_OUT()
// reusing timer
iTimeFadeOut = GET_GAME_TIMER() + 500
iTest ++
ENDIF
BREAK
// Drop player
CASE 3
IF GET_GAME_TIMER() > iTimeFadeOut
SET_ENTITY_COORDS(PLAYER_PED_ID(), vSkyCam)
//SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
SET_ENTITY_INVINCIBLE(PLAYER_PED_ID(), FALSE)
SET_ENTITY_VISIBLE(PLAYER_PED_ID(), TRUE)
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_FOOT) <> CAM_VIEW_MODE_FIRST_PERSON
IF DOES_CAM_EXIST(ciDropCam)
SET_CAM_ROT(ciDropCam, vSkyCamRot)
SET_CAM_ACTIVE(ciDropCam, TRUE)
ATTACH_CAM_TO_ENTITY(ciDropCam, PLAYER_PED_ID(), <<0,0,4>>, FALSE)
ENDIF
ELSE
RENDER_SCRIPT_CAMS(FALSE, FALSE)
ENDIF
DELETE_ALL_ALIEN_PEDS()
iTest ++
ENDIF
BREAK
// fade in
CASE 4
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
sFailString = "B1_FAIL3"
iTest ++
BREAK
// return camera near impact
CASE 5
VECTOR vPlayerCoord
vPlayerCoord = GET_ENTITY_COORDS(PLAYER_PED_ID())
IF vPlayerCoord.z < 32.0 // be sure to alter this according to ground height
RENDER_SCRIPT_CAMS(FALSE, TRUE)
iTest ++
ENDIF
BREAK
// clean up
CASE 6
IF IS_GAMEPLAY_CAM_RENDERING()
IF DOES_CAM_EXIST(ciDropCam)
SET_CAM_ACTIVE(ciDropCam, FALSE)
DESTROY_CAM(ciDropCam)
ENDIF
RETURN TRUE
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Updates failed stage
/// PARAMS:
/// prog - stage progress enum, tells us what state we are in
PROC UPDATE_STAGE_ABDUCT(STAGE_PROGRESS &prog)
SEQUENCE_INDEX seqTask
SWITCH (prog)
CASE SP_LOADING
CASE SP_SETUP
CPRINTLN(DEBUG_MISSION, "Player Abducted")
iTest = 0
//RC_START_CUTSCENE_MODE(<<0.0,0.0,0.0>>, <<0.0,0.0,0.0>>, 0.0, FALSE, FALSE)
gunObject = CREATE_FAKE_WEAPON_FOR_PLAYER(playerWeapon)
IF IS_ENTITY_OK(gunObject) AND IS_ENTITY_ATTACHED(gunObject)
DETACH_ENTITY(gunObject)
ENDIF
OPEN_SEQUENCE_TASK(seqTask)
TASK_PLAY_ANIM(NULL, sMissionAnimDictionary, sAlienGrabbedWinAnim)
TASK_PLAY_ANIM(NULL, sMissionAnimDictionary, sMichaelTeleportAnim, NORMAL_BLEND_IN, REALLY_SLOW_BLEND_OUT)
CLOSE_SEQUENCE_TASK(seqTask)
TASK_PERFORM_SEQUENCE(PLAYER_PED_ID(), seqTask)
CLEAR_SEQUENCE_TASK(seqTask)
prog = SP_RUNNING
BREAK
CASE SP_RUNNING
IF GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_PERFORM_SEQUENCE) = FINISHED_TASK
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
SET_ENTITY_INVINCIBLE(PLAYER_PED_ID(), TRUE)
START_PARTICLE_FX_NON_LOOPED_AT_COORD("scr_alien_teleport", GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_ROTATION(PLAYER_PED_ID()), fAlienTeleportEffectSize)
PLAY_SOUND_FROM_ENTITY(-1, "SPAWN", PLAYER_PED_ID(), "BARRY_01_SOUNDSET")
fPlayerAlpha = 255.0
prog = SP_CLEANUP
ENDIF
BREAK
CASE SP_CLEANUP
fPlayerAlpha -= (GET_FRAME_TIME() * 512.0)
CPRINTLN(DEBUG_MISSION, "PLAYER GETTING TELEPORTED OUT - ALPHA:", fPlayerAlpha)
IF (fPlayerAlpha <= 0.0)
fPlayerAlpha = 0.0
RESET_ENTITY_ALPHA(PLAYER_PED_ID())
SET_ENTITY_VISIBLE(PLAYER_PED_ID(), FALSE)
prog = SP_CSKIPPED
EXIT
ENDIF
SET_PED_ALPHA(PLAYER_PED_ID(), FLOOR(fPlayerAlpha), iAlphaCounter)
BREAK
// @SBA - prototyping case
CASE SP_CSKIPPED
IF OPERATION_DROP_MICHAEL()
SET_MISSION_FAILED("B1_FAIL3")
iFailTimer = GET_GAME_TIMER() + 50
ENDIF
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Updates failed stage
/// PARAMS:
/// prog - stage progress enum, tells us what state we are in
PROC UPDATE_STAGE_FAILED(STAGE_PROGRESS &prog)
SWITCH (prog)
CASE SP_LOADING
CASE SP_SETUP
CPRINTLN(DEBUG_MISSION, "Mission Failed")
CLEAR_PRINTS()
CLEAR_HELP()
// Remove all blips here
// Make all aliens flee
STOP_ALL_ALIEN_EVERYTHING()
FLEE_ALL_ALIEN_PEDS()
CLEANUP_ALL_ALIEN_PEDS(TRUE)
// stop mission music
CPRINTLN(DEBUG_MISSION, "FAIL STRING = ", sFailString)
CPRINTLN(DEBUG_MISSION, "IM Trigger - RC18A_STOP")
TRIGGER_MUSIC_EVENT("RC18A_STOP")
// B*938802 - No more delay fades
IF IS_STRING_NULL_OR_EMPTY(sFailString)
Random_Character_Failed()
ELSE
Random_Character_Failed_With_Reason(sFailString, TRUE) ///, bDelayFade)
ENDIF
prog = SP_RUNNING
BREAK
CASE SP_RUNNING
IF GET_MISSION_FLOW_SAFE_TO_CLEANUP()
// Set warp locations
MISSION_FLOW_SET_FAIL_WARP_LOCATION(<<165.4821, -990.5140, 29.0923>>, 166.7554)
SET_REPLAY_DECLINED_VEHICLE_WARP_LOCATION(vPlayerVehicleLoc, fPlayerVehicleHead)
// delete everything here!
//DeleteEverything()?
//CLEANUP_ALL_ALIEN_PEDS(TRUE)?
// script_cleanup should terminate the thread
RC_END_CUTSCENE_MODE(TRUE, FALSE)
CPRINTLN(DEBUG_MISSION, "Barry1 fail stage: Restore weapons on fail")
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
RESTORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT(PLAYER_PED_ID(), TRUE)
STORE_PLAYER_PED_WEAPONS(PLAYER_PED_ID())
ENDIF
Script_Cleanup()
ELSE
// not finished fading out
// you may want to handle dialogue etc here.
IF ARE_STRINGS_EQUAL(sFailString, "B1_FAIL") // Fled the battle
IF PASS_OUT_SEQUENCE() AND IS_REPEAT_PLAY_ACTIVE()
CPRINTLN(DEBUG_MISSION, "Repeat Play - Emergency Exit")
Script_Cleanup()
ENDIF
ELIF ARE_STRINGS_EQUAL(sFailString, "B1_FAIL2") // Abducted
ABDUCT_SEQUENCE_END()
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
//----------------------
// CHECKPNT FUNCTIONS
//----------------------
/// PURPOSE:
/// Performs Z Skip
/// PARAMS:
/// iTargetStage - which stage to jump to
PROC DO_Z_SKIP(INT iTargetStage)
DO_SCREEN_FADE_OUT(0)
RC_START_Z_SKIP()
SWITCH iTargetStage
CASE Z_SKIP_INTRO
CPRINTLN(DEBUG_MISSION, "IM Trigger - RC18A_STOP")
TRIGGER_MUSIC_EVENT("RC18A_STOP")
CPRINTLN(DEBUG_MISSION, "Skip to intro - player heading set to: ", kfPlayerStartHead)
SET_ENTITY_COORDS_GROUNDED(PLAYER_PED_ID(), vMissionStart)
SET_ENTITY_HEADING(PLAYER_PED_ID(), kfPlayerStartHead) // @SBA OLD = fMissionStart
iDbgStageJump = 0
BREAK
CASE Z_SKIP_BATTLE
RESET_MISSION_COUNTERS()
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_MISSION, "Z-Skip or Replay: Start Music")
#ENDIF
CPRINTLN(DEBUG_MISSION, "Skip to battle - player heading set to: ", kfPlayerStartHead)
SET_ENTITY_COORDS_GROUNDED(PLAYER_PED_ID(), vMissionStart)
SET_ENTITY_HEADING(PLAYER_PED_ID(), kfPlayerStartHead) // @SBA OLD = fMissionStart
iDbgStageJump = ENUM_TO_INT(SE_FIRSTCONTACT)
BREAK
// @SBA - adding case (will need to update weapon, dead count, etc. if ever used for a checkpoint!)
CASE Z_SKIP_BATTLE_2
RESET_MISSION_COUNTERS()
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_MISSION, "Z-Skip or Replay: Battle2")
#ENDIF
// Set number of dead aliens
iTotalAlienDeadCount = kiDeadAliensStartingWave2
PlayerWeapon = wtGrenLauncher//wtPistol // @TODO - should be wtGrenLauncher, to swap to mini gaun
SWAP_THE_PLAYERS_WEAPON(PlayerWeapon)
SET_ENTITY_COORDS_GROUNDED(PLAYER_PED_ID(), vMissionStart)
SET_ENTITY_HEADING(PLAYER_PED_ID(), fMissionStart)
iDbgStageJump = ENUM_TO_INT(SE_WAVE2)
BREAK
CASE Z_SKIP_PASSOUT
iDbgStageJump = ENUM_TO_INT(SE_PASSOUT)
BREAK
CASE Z_SKIP_OUTRO
iDbgStageJump = ENUM_TO_INT(SE_OUTRO)
BREAK
ENDSWITCH
// delete and unload everything
stageEnum = INT_TO_ENUM(STAGE_ENUM, iDbgStageJump)
stageProgress = SP_LOADING
DELETE_ALL_ALIEN_PEDS()
ENABLE_AMBIENT_PEDS_AND_VEHICLES(FALSE, FALSE, TRUE, TRUE)
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
SET_TIME_SCALE(fTimeScale)
DEACTIVATE_AUDIO_SLOWMO_MODE("BARRY_01_SLOWMO")
ACTIVATE_AUDIO_SLOWMO_MODE("BARRY_01_SLOWMO")
SET_AUDIO_FLAG("AllowScriptedSpeechInSlowMo", TRUE)
SET_AUDIO_FLAG("AllowAmbientSpeechInSlowMo", TRUE)
RC_END_Z_SKIP()
ENDPROC
//----------------------
// DEBUG FUNCTIONS
//----------------------
#IF IS_DEBUG_BUILD
/// PURPOSE:
/// Operates S, F, J and Z keys
PROC UPDATE_DEBUG_KEYS()
UPDATE_MISSION_DEBUG_TIMER()
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S)
IF IS_CUTSCENE_PLAYING()
WAIT_FOR_CUTSCENE_TO_STOP(TRUE, FALSE)
ENDIF
WHILE NOT HAS_SCRIPT_LOADED("postRC_Barry1and2")
REQUEST_SCRIPT("postRC_Barry1and2")
WAIT(0)
ENDWHILE
IF IS_GAMEPLAY_HINT_ACTIVE()
STOP_GAMEPLAY_HINT()
ENDIF
CLEANUP_SCREEN_FX()
CPRINTLN(DEBUG_MISSION, "IM Trigger - RC18A_STOP")
TRIGGER_MUSIC_EVENT("RC18A_STOP")
TELEPORT_OUT_ALL_ALIEN_PEDS(TRUE)
SCRIPT_PASSED()
ENDIF
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F)
IF IS_CUTSCENE_PLAYING()
WAIT_FOR_CUTSCENE_TO_STOP(TRUE, FALSE)
ENDIF
SET_MISSION_FAILED("")
ENDIF
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P)
IF IS_CUTSCENE_PLAYING()
WAIT_FOR_CUTSCENE_TO_STOP(TRUE, FALSE)
ENDIF
IF (stageEnum = SE_INTRO) OR (stageEnum = SE_FIRSTCONTACT)
DO_Z_SKIP(Z_SKIP_INTRO)
ELSE
DO_Z_SKIP(Z_SKIP_BATTLE)
ENDIF
ENDIF
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J)
IF IS_CUTSCENE_PLAYING()
WAIT_FOR_CUTSCENE_TO_STOP(TRUE, FALSE)
ENDIF
IF (stageEnum = SE_INTRO)
DO_Z_SKIP(Z_SKIP_BATTLE)
ELIF (stageEnum = SE_OUTRO)
CLEANUP_SCREEN_FX()
CPRINTLN(DEBUG_MISSION, "IM Trigger - RC18A_STOP")
TRIGGER_MUSIC_EVENT("RC18A_STOP")
SCRIPT_PASSED()
ELSE
DO_Z_SKIP(Z_SKIP_OUTRO)
ENDIF
ENDIF
IF LAUNCH_MISSION_STAGE_MENU(sSkipMenu, iDbgStageJump)
DO_Z_SKIP(iDbgStageJump)
ENDIF
ENDPROC
/// PURPOSE:
/// Updates Debug Widgets and draw debug stuff
PROC UPDATE_DEBUG_WIDGETS()
INT i
VECTOR v = GET_ENTITY_COORDS(PLAYER_PED_ID())
DEBUG_DRAW_ANGLED_AREA_EX(respotVehicleArea, 255, 128, 0)
IF (bUseAlienSpawnPoint)
DRAW_DEBUG_CIRCLE(vAlienSpawnPoint, fAlienSpawnPointRadius, 255, 0, 0, 255, 32)
ELSE
DRAW_DEBUG_CIRCLE(v, fAlienMinSpawnRadius, 255, 0, 0, 255, 32)
DRAW_DEBUG_CIRCLE(v, fAlienMaxSpawnRadius, 0, 255, 0, 255, 32)
ENDIF
IF (bShowAlienPos)
REPEAT COUNT_OF(alienPed) i
IF IS_ALIEN_PED_ALIVE(alienPed[i])
DRAW_DEBUG_LINE(v, GET_ENTITY_COORDS(alienPed[i].pedID))
ENDIF
ENDREPEAT
ENDIF
DRAW_DEBUG_CIRCLE(vBattleCenter, fBattleRadius)
ENDPROC
#ENDIF
/// PURPOSE:
/// Check to see if player has left battle area if so handle failure
PROC UPDATE_PLAYER_AREA_CHECK()
BOOL chk = (GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), vBattleCenter) < (fBattleRadius + 10.0))
IF (bIsPlayerInBattleArea)
IF (chk = FALSE) AND (bSummonFlagActive = FALSE)
PRINT_NOW("B1_WARN", DEFAULT_GOD_TEXT_TIME, 1) // Return to the ~y~battleground.~s~
SAFE_REMOVE_BLIP(locationBlip)
locationBlip = CREATE_COORD_BLIP(vBattleCenter)
iMissionAbandonedTimer = GET_GAME_TIMER() + FAIL_WARNING_TIME
TELEPORT_OUT_ALL_ALIEN_PEDS()
bIsPlayerInBattleArea = FALSE
ENDIF
ELSE
IF (GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), vBattleCenter) > fBattleRadius)
IF (GET_GAME_TIMER() > iMissionAbandonedTimer) AND (bSummonFlagActive = FALSE)
SET_MISSION_FAILED("B1_FAIL") // ~r~You fled the battle. The aliens took over.~s~
ENDIF
ELSE
PRINT_NOW("PRIME2", DEFAULT_GOD_TEXT_TIME, 1) // Kill the ~r~aliens.~s~
SAFE_REMOVE_BLIP(locationBlip)
bIsPlayerInBattleArea = TRUE
ENDIF
ENDIF
ENDPROC
//----------------------
// MAIN SCRIPT
//----------------------
SCRIPT(g_structRCScriptArgs sRCLauncherDataIn)
VECTOR amin, amax
sRCLauncherDataLocal = sRCLauncherDataIn
RC_TakeEntityOwnership(sRCLauncherDataLocal)
SET_MISSION_FLAG(TRUE)
sFailString = ""
// clean up any live projectiles near Barry
CLEAR_AREA_OF_PROJECTILES((<<190.2424, -956.3790, 28.63>>), 6.0)
//BREAK_ON_NATIVE_COMMAND("CLEAR_AREA_OF_OBJECTS", FALSE)
// 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)
CPRINTLN(DEBUG_MISSION, "IM Trigger - RC18A_STOP")
TRIGGER_MUSIC_EVENT("RC18A_STOP")
CPRINTLN(DEBUG_MISSION, "Barry1 Force Cleanup: Restore weapons on fail")
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
RESTORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT(PLAYER_PED_ID())
STORE_PLAYER_PED_WEAPONS(PLAYER_PED_ID())
ELSE
RESTORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT_FOR_CHAR(CHAR_MICHAEL)
ENDIF
PRINT_LAUNCHER_DEBUG("Force cleanup [TERMINATING]")
// abduction
IF ARE_STRINGS_EQUAL(sFailString, "B1_FAIL3")
Random_Character_Failed_With_Reason("B1_FAIL3")
// death (custom text)
ELIF IS_PLAYER_DEAD(PLAYER_ID())
Random_Character_Failed_With_Reason("B1_FAIL2")
ELSE
Random_Character_Failed()
ENDIF
SCRIPT_CLEANUP()
ENDIF
// setup areas
MISSION_SETUP()
// @SBA
SECURE_REQUEST_AND_LOAD_WEAPON_ASSET(wtMiniGun, TRUE)
//SECURE_REQUEST_AND_LOAD_WEAPON_ASSET(wtSniperRifle, TRUE)
CALCULATE_MIN_MAX_FROM_POSITION_AND_RADIUS(<<181.3, -969.1, 30.3>>, 200.0, amin, amax)
DUMMY_REFERENCE_INT(iTotalAlienSpawnCount)
IF IS_REPEAT_PLAY_ACTIVE()
if not is_screen_faded_in()
if not is_screen_fading_in()
do_screen_fade_in(default_fade_time)
endif
endif
ENDIF
// main loop
WHILE (TRUE)
REPLAY_CHECK_FOR_EVENT_THIS_FRAME("SF_GRM")
UPDATE_MISSION_NAME_DISPLAYING(sRCLauncherDataLocal.sIntroCutscene)
// globals
fRegenMultiplier = 1.0
iAlphaCounter = 0
NO_AMBIENT_MALARKY_THIS_FRAME()
// for beam FX evo
// vCameraForward = GET_FINAL_RENDERED_CAM_ROT()
// vCameraCoords = GET_FINAL_RENDERED_CAM_COORD()
// fCameraNearClip = GET_FINAL_RENDERED_CAM_NEAR_CLIP()
SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID())
SET_PED_NON_CREATION_AREA(amin, amax)
SET_PLAYER_MAY_NOT_ENTER_ANY_VEHICLE(GET_PLAYER_INDEX())
// update aliens
DISABLE_CELLPHONE_THIS_FRAME_ONLY()
UPDATE_ALIEN_PEDS()
/* B*1182105
IF IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), sMissionAnimDictionary, sAlienGrabbedFailAnim)
RC_PLAYER_TRIGGER_SCENE_LOCK_IN()
ENDIF
*/
// main switch
SWITCH (stageEnum)
CASE SE_LEAD_IN
UPDATE_STAGE_LEADIN(stageProgress)
BREAK
CASE SE_INTRO
UPDATE_STAGE_INTRO(stageProgress)
BREAK
CASE SE_FIRSTCONTACT
UPDATE_STAGE_FIRSTCONTACT(stageProgress)
BREAK
CASE SE_WAVE1
UPDATE_STAGE_WAVE_1(stageProgress)
BREAK
CASE SE_WAVE2
UPDATE_STAGE_WAVE_2(stageProgress)
BREAK
CASE SE_PASSOUT
UPDATE_STAGE_PASSOUT(stageProgress)
BREAK
CASE SE_OUTRO
UPDATE_STAGE_OUTRO(stageProgress)
BREAK
CASE SE_ABDUCT
UPDATE_STAGE_ABDUCT(stageProgress)
BREAK
CASE SE_FAILED
UPDATE_STAGE_FAILED(stageProgress)
BREAK
ENDSWITCH
SET_PLAYER_HEALTH_RECHARGE_MULTIPLIER(GET_PLAYER_INDEX(), fRegenMultiplier)
SET_PLAYER_WEAPON_DAMAGE_MODIFIER(GET_PLAYER_INDEX(), fPlayerWeaponDamageModifier)
IF IS_MISSION_IN_COMBAT_STAGE()
UPDATE_PLAYER_AREA_CHECK()
ENDIF
WAIT(0)
#IF IS_DEBUG_BUILD
IF (stageEnum <> SE_FAILED)
UPDATE_DEBUG_KEYS()
ENDIF
IF (bUpdateWidgets)
UPDATE_DEBUG_WIDGETS()
ENDIF
#ENDIF
ENDWHILE
// Script should never reach here. Always terminate with cleanup function.
ENDSCRIPT