854 lines
28 KiB
Scheme
Executable File
854 lines
28 KiB
Scheme
Executable File
// _________________________________________________________________________________________
|
|
// _________________________________________________________________________________________
|
|
// ___ ___
|
|
// ___ Author: Alwyn Roberts Date: 04/10/2010 ___
|
|
//- commands headers -//
|
|
|
|
//- script headers -//
|
|
|
|
//- public headers -//
|
|
USING "cutscene_public.sch"
|
|
USING "rc_helper_functions.sch"
|
|
USING "friendActivity_public.sch"
|
|
|
|
//- private headers -//
|
|
USING "friendActivity_private.sch"
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
//- debug headers -//
|
|
#ENDIF
|
|
|
|
///private cutscene header for friend activity scripts
|
|
/// sam.hackett@rockstarleeds.com
|
|
///
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------------------------------
|
|
// VARIABLES
|
|
//-------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
// Constants
|
|
//CONST_INT CONST_iCutsceneStartPanDuration 5000//5000//DEFAULT_GOD_TEXT_TIME
|
|
CONST_INT CONST_iCutsceneTimeshiftDuration 2500
|
|
CONST_INT CONST_iCutsceneEndPanDuration 5000//5000//DEFAULT_GOD_TEXT_TIME
|
|
CONST_INT CONST_iCutsceneSkipDuration 500
|
|
|
|
// Vars
|
|
CAMERA_INDEX hBarCams[2]
|
|
BOOL bAddedDrunkTime = FALSE
|
|
|
|
structTimelapse sTimelapse
|
|
|
|
INT iTOD_DestHour
|
|
INT iTOD_DestMin
|
|
INT iTOD_SkipTotalHours
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------------------------------
|
|
// UTILS
|
|
//-------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
FUNC BOOL RC_IS_CUTSCENE_OK_TO_START_NO_DIALOGUE_WAIT(FLOAT stopping_distance = 10.0)
|
|
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
IF NOT BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()), stopping_distance, 1)
|
|
RETURN FALSE
|
|
ENDIF
|
|
IF NOT IS_VEHICLE_ON_ALL_WHEELS(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))
|
|
RETURN FALSE
|
|
ENDIF
|
|
ELSE
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ACCELERATE)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_BRAKE)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_HANDBRAKE)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_DUCK)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_LR)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_UD)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_CIN_CAM)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK2)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_HEADLIGHT)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_HORN)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_NEXT_RADIO)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_PREV_RADIO)
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDFUNC
|
|
|
|
PROC Private_GetActivityScenePedPosBoundingBox(structFActivityScene& scene, VECTOR& vMin, VECTOR& vMax)
|
|
|
|
vMin = scene.vPedPPos[0]
|
|
vMax = scene.vPedPPos[0]
|
|
|
|
INT i
|
|
REPEAT 9 i
|
|
VECTOR vPos
|
|
IF i = 0 vPos = scene.vPedPPos[0]
|
|
ELIF i = 1 vPos = scene.vPedPPos[1]
|
|
ELIF i = 2 vPos = scene.vPedPPos[2]
|
|
ELIF i = 3 vPos = scene.vPedAPos[0]
|
|
ELIF i = 4 vPos = scene.vPedAPos[1]
|
|
ELIF i = 5 vPos = scene.vPedAPos[2]
|
|
ELIF i = 6 vPos = scene.vPedBPos[0]
|
|
ELIF i = 7 vPos = scene.vPedBPos[1]
|
|
ELIF i = 8 vPos = scene.vPedBPos[2]
|
|
ENDIF
|
|
|
|
IF scene.bIsCinema = FALSE OR ((i % 3) <> 2)
|
|
IF vPos.x < vMin.x vMin.x = vPos.x ENDIF
|
|
IF vPos.y < vMin.y vMin.y = vPos.y ENDIF
|
|
IF vPos.z < vMin.z vMin.z = vPos.z ENDIF
|
|
|
|
IF vPos.x > vMax.x vMax.x = vPos.x ENDIF
|
|
IF vPos.y > vMax.y vMax.y = vPos.y ENDIF
|
|
IF vPos.z > vMax.z vMax.z = vPos.z ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
vMin -= << 0.5, 0.5, 2.5 >>
|
|
vMax += << 0.5, 0.5, 2.5 >>
|
|
|
|
ENDPROC
|
|
|
|
PROC Private_SetCinemaCatchupCam(enumActivityLocation eLoc)
|
|
|
|
// Set timeshift cam
|
|
CAMERA_INDEX hNewCam = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", TRUE)
|
|
IF DOES_CAM_EXIST(hNewCam)
|
|
SWITCH eLoc
|
|
CASE ALOC_cinema_downtown
|
|
SET_CAM_COORD(hNewCam, <<397.2, -716.2, 29.9>>)
|
|
SET_CAM_ROT(hNewCam, <<-4.0, 0.0, -9.3>>)
|
|
SET_CAM_FOV(hNewCam, 50.0)
|
|
BREAK
|
|
CASE ALOC_cinema_morningwood
|
|
SET_CAM_COORD(hNewCam, <<-1411.5, -200.6, 47.8>>)
|
|
SET_CAM_ROT(hNewCam, <<-3.8, 0.0, 19.7>>)
|
|
SET_CAM_FOV(hNewCam, 50.0)
|
|
BREAK
|
|
CASE ALOC_cinema_vinewood
|
|
SET_CAM_COORD(hNewCam, <<298.9, 200.8, 105.0>>)
|
|
SET_CAM_ROT(hNewCam, <<-7.6, 0.0, 161.6>>)
|
|
SET_CAM_FOV(hNewCam, 50.0)
|
|
BREAK
|
|
DEFAULT
|
|
EXIT
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF DOES_CAM_EXIST(hBarCams[0])
|
|
DESTROY_CAM(hBarCams[0])
|
|
ENDIF
|
|
IF DOES_CAM_EXIST(hBarCams[1])
|
|
DESTROY_CAM(hBarCams[1])
|
|
ENDIF
|
|
|
|
SET_CAM_ACTIVE(hNewCam, TRUE)
|
|
hBarCams[0] = hNewCam
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC Private_ChargePedForBar(PED_INDEX hPed, enumActivityLocation eLoc, INT iDebitAmount)
|
|
|
|
BANK_ACCOUNT_ACTION_SOURCE_BAAC eDebitor = BAAC_UNLOGGED_SMALL_ACTION
|
|
|
|
SWITCH eLoc
|
|
CASE ALOC_bar_bahamas eDebitor = BAAC_BAHAMAMAMAS BREAK
|
|
CASE ALOC_bar_baybar eDebitor = BAAC_BAY_BAR BREAK
|
|
CASE ALOC_bar_biker eDebitor = BAAC_BIKER_BAR BREAK
|
|
CASE ALOC_bar_downtown eDebitor = BAAC_SHENANIGANS_BAR BREAK
|
|
CASE ALOC_bar_himen eDebitor = BAAC_HIMEN_BAR BREAK
|
|
CASE ALOC_bar_mojitos eDebitor = BAAC_MOJITOS_BAR BREAK
|
|
CASE ALOC_bar_singletons eDebitor = BAAC_SINGLETONS_BAR BREAK
|
|
ENDSWITCH
|
|
|
|
enumCharacterList eChar = Private_GetCharFromPed(hPed)
|
|
|
|
IF eChar = CHAR_MICHAEL
|
|
OR eChar = CHAR_FRANKLIN
|
|
OR eChar = CHAR_TREVOR
|
|
|
|
INT iCash = GET_TOTAL_CASH(eChar)
|
|
IF iCash > iDebitAmount
|
|
DEBIT_BANK_ACCOUNT(eChar, eDebitor, iDebitAmount)
|
|
ELIF iCash > 0
|
|
DEBIT_BANK_ACCOUNT(eChar, eDebitor, iCash)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC Private_UpdateStockExchange(enumActivityLocation eLoc)
|
|
IF eLoc = ALOC_bar_bahamas
|
|
OR eLoc = ALOC_bar_himen
|
|
OR eLoc = ALOC_bar_singletons
|
|
BAWSAQ_INCREMENT_MODIFIER(BSMF_SM_PUBCLUB) //call on taking friends to a club
|
|
ELSE
|
|
BAWSAQ_INCREMENT_MODIFIER(BSMF_SM_FRNPUB) //call on taking friends to a pub
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------------------------------
|
|
// BAR SCENE
|
|
//-------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
FUNC BOOL Private_ProcessActivityScene(enumActivityLocation eLoc, structFActivityScene& scene, INT& iStage, PED_INDEX hFriendA, PED_INDEX hFriendB, structPedsForConversation& convPeds)
|
|
|
|
//-- Fade out if skip is pressed --
|
|
CPRINTLN(DEBUG_FRIENDS, "Private_ProcessActivityScene() A - ", iStage)
|
|
|
|
IF scene.bIsCinema = FALSE
|
|
|
|
IF iStage > 0
|
|
AND iStage < 4
|
|
IF IS_SCREEN_FADED_OUT()
|
|
ADD_TO_CLOCK_TIME(iTOD_SkipTotalHours, 0, 0)
|
|
|
|
iStage = 98
|
|
RETURN FALSE
|
|
|
|
ELIF NOT IS_SCREEN_FADING_IN()
|
|
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
|
|
DO_SCREEN_FADE_OUT(CONST_iCutsceneSkipDuration)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF iStage < 3
|
|
REQUEST_SCRIPT_AUDIO_BANK("TIME_LAPSE")
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
// IF iStage >= 0
|
|
// AND iStage < 100
|
|
// SET_EVERYONE_IGNORE_PLAYER(PLAYER_ID(), TRUE)
|
|
// ENDIF
|
|
|
|
|
|
CPRINTLN(DEBUG_FRIENDS, "Private_ProcessActivityScene() B - ", iStage)
|
|
|
|
// Disable player pressing PS4 touchpad during cutscene (for some reason that can cause problem during this scene)
|
|
IF iStage != -1
|
|
DISABLE_CAMERA_VIEW_MODE_CYCLE(PLAYER_ID())
|
|
// DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_NEXT_CAMERA)
|
|
ENDIF
|
|
|
|
//------------------------------------------------------------------------
|
|
IF iStage = 0
|
|
IF RC_IS_CUTSCENE_OK_TO_START_NO_DIALOGUE_WAIT(5.0)
|
|
RC_START_CUTSCENE_MODE(scene.vPedPPos[0], TRUE, TRUE, FALSE, FALSE, FALSE)
|
|
bAddedDrunkTime = FALSE
|
|
|
|
// Clear larger area of vehicles (for camera)
|
|
CLEAR_ANGLED_AREA_OF_VEHICLES(scene.vClearA, scene.vClearB, scene.fClearW, TRUE)
|
|
SET_ROADS_IN_ANGLED_AREA(scene.vClearA, scene.vClearB, scene.fClearW, FALSE, FALSE)
|
|
|
|
// Clear smaller area of peds (for walking)
|
|
VECTOR vPedPosMin, vPedPosMax
|
|
Private_GetActivityScenePedPosBoundingBox(scene, vPedPosMin, vPedPosMax)
|
|
SET_PED_PATHS_IN_AREA(vPedPosMin, vPedPosMax, FALSE)
|
|
CLEAR_AREA((vPedPosMin+vPedPosMax)*0.5, VDIST(vPedPosMax, vPedPosMin)*0.5, TRUE)
|
|
|
|
SEQUENCE_INDEX seq
|
|
SETTIMERA(0)
|
|
|
|
INT iDebitAmount = GET_RANDOM_INT_IN_RANGE(25, 35)
|
|
iTOD_SkipTotalHours = GET_RANDOM_INT_IN_RANGE(2, 4)
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
// Set car position
|
|
Private_RespotVehicleForActivity(GET_PLAYERS_LAST_VEHICLE(), eLoc)
|
|
|
|
//-- Set ped positions + tasks
|
|
IF IS_PED_UNINJURED(hFriendA)
|
|
// Set player pos + tasks
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), scene.vPedPPos[0])
|
|
SET_ENTITY_FACING(PLAYER_PED_ID(), scene.vPedPPos[1])
|
|
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
|
SET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID(), FALSE)
|
|
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE)
|
|
STOP_PED_SPEAKING(PLAYER_PED_ID(), TRUE)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(null, scene.vPedPPos[1], PEDMOVE_WALK, DEFAULT_TIME_NEVER_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_ACCURATE_WALKRUN_START)
|
|
IF scene.bIsCinema AND NOT IS_PED_DRUNK(PLAYER_PED_ID())
|
|
TASK_TURN_PED_TO_FACE_ENTITY(null, hFriendA)
|
|
ENDIF
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(PLAYER_PED_ID(), seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
// Set friend A pos + tasks
|
|
SET_ENTITY_COORDS(hFriendA, scene.vPedAPos[0])
|
|
SET_ENTITY_FACING(hFriendA, scene.vPedAPos[1])
|
|
CLEAR_PED_TASKS_IMMEDIATELY(hFriendA)
|
|
SET_PED_STEALTH_MOVEMENT(hFriendA, FALSE)
|
|
SET_CURRENT_PED_WEAPON(hFriendA, WEAPONTYPE_UNARMED, TRUE)
|
|
STOP_PED_SPEAKING(hFriendA, TRUE)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(null, scene.vPedAPos[1], PEDMOVE_WALK, DEFAULT_TIME_NEVER_WARP)
|
|
IF scene.bIsCinema AND NOT IS_PED_DRUNK(hFriendA)
|
|
TASK_TURN_PED_TO_FACE_ENTITY(null, PLAYER_PED_ID())
|
|
ENDIF
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(hFriendA, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
ENDIF
|
|
|
|
IF IS_PED_UNINJURED(hFriendB)
|
|
SET_ENTITY_COORDS(hFriendB, scene.vPedBPos[0])
|
|
SET_ENTITY_FACING(hFriendB, scene.vPedBPos[1])
|
|
CLEAR_PED_TASKS_IMMEDIATELY(hFriendB)
|
|
SET_PED_STEALTH_MOVEMENT(hFriendB, FALSE)
|
|
SET_CURRENT_PED_WEAPON(hFriendB, WEAPONTYPE_UNARMED, TRUE)
|
|
STOP_PED_SPEAKING(hFriendB, TRUE)
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(null, scene.vPedBPos[1], PEDMOVE_WALK, DEFAULT_TIME_NEVER_WARP)
|
|
IF scene.bIsCinema AND NOT IS_PED_DRUNK(hFriendB)
|
|
TASK_TURN_PED_TO_FACE_ENTITY(null, PLAYER_PED_ID())
|
|
ENDIF
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(hFriendB, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
ENDIF
|
|
|
|
// Charge player/friends
|
|
IF scene.bIsCinema = FALSE
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
Private_ChargePedForBar(PLAYER_PED_ID(), eLoc, iDebitAmount)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(hFriendA)
|
|
Private_ChargePedForBar(hFriendA, eLoc, iDebitAmount)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(hFriendB)
|
|
Private_ChargePedForBar(hFriendB, eLoc, iDebitAmount)
|
|
ENDIF
|
|
Private_UpdateStockExchange(eLoc)
|
|
ENDIF
|
|
|
|
//-- Start first cam pan
|
|
hBarCams[0] = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", TRUE)
|
|
SET_CAM_COORD(hBarCams[0], scene.mCamPanA[0].vPos)
|
|
SET_CAM_ROT(hBarCams[0], scene.mCamPanA[0].vRot)
|
|
SET_CAM_FOV(hBarCams[0], scene.fCamPanAFov)
|
|
|
|
hBarCams[1] = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", TRUE)
|
|
SET_CAM_COORD(hBarCams[1], scene.mCamPanA[1].vPos)
|
|
SET_CAM_ROT(hBarCams[1], scene.mCamPanA[1].vRot)
|
|
SET_CAM_FOV(hBarCams[1], scene.fCamPanAFov)
|
|
|
|
// Start camera pan
|
|
FLOAT fPanADuration = scene.fPanADurationNormal
|
|
IF IS_PED_UNINJURED(PLAYER_PED_ID()) AND IS_PED_DRUNK(PLAYER_PED_ID())
|
|
fPanADuration = scene.fPanADurationDrunk
|
|
ENDIF
|
|
|
|
SET_CAM_ACTIVE_WITH_INTERP(hBarCams[1], hBarCams[0], FLOOR(fPanADuration * 1000.0))
|
|
// SHAKE_CAM(hBarCams[0], "HAND_SHAKE", 1.0)
|
|
// SHAKE_CAM(hBarCams[1], "HAND_SHAKE", 1.0)
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
ENDIF
|
|
|
|
IF NOT IS_SCREEN_FADED_IN()
|
|
DO_SCREEN_FADE_IN(1000)
|
|
ENDIF
|
|
|
|
iStage++
|
|
ENDIF
|
|
|
|
ELIF iStage = 1
|
|
|
|
IF scene.bIsCinema
|
|
AND NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
AND NOT IS_PED_INJURED(hFriendA)
|
|
|
|
IF TIMERA() > 1000
|
|
TEXT_LABEL tBlock, tRoot
|
|
enumCharacterList ePlayerChar, eFriendChar
|
|
ePlayerChar = GET_CURRENT_PLAYER_PED_ENUM()
|
|
eFriendChar = Private_GetCharFromPed(hFriendA)
|
|
|
|
// Try to do special Michael/Franklin Meltdown dialogue
|
|
IF g_ePreviousActivityResult = AR_playerDraw
|
|
AND ePlayerChar = CHAR_FRANKLIN
|
|
AND eFriendChar = CHAR_MICHAEL
|
|
AND NOT Is_Ped_Drunk(PLAYER_PED_ID())
|
|
AND Private_GetFriendActivityPhrase(ePlayerChar, eFriendChar, FAP_COMMENT_MELTDOWN, tBlock, tRoot)
|
|
|
|
IF TIMERA() > FLOOR(scene.fPanADurationNormal * 1000.0)
|
|
OR CREATE_CONVERSATION(convPeds, tBlock, tRoot, CONV_PRIORITY_AMBIENT_HIGH, DISPLAY_SUBTITLES)
|
|
iStage++
|
|
ENDIF
|
|
|
|
// Otherwise do normal dialogue
|
|
ELSE
|
|
IF g_ePreviousActivityResult = AR_playerDraw
|
|
g_ePreviousActivityResult = AR_playerWon
|
|
ENDIF
|
|
IF NOT Private_GetFriendActivityResult(ePlayerChar, eFriendChar, ALOC_cinema_downtown, g_ePreviousActivityResult, Is_Ped_Drunk(PLAYER_PED_ID()), tBlock, tRoot)
|
|
OR CREATE_CONVERSATION(convPeds, tBlock, tRoot, CONV_PRIORITY_AMBIENT_HIGH, DISPLAY_SUBTITLES)
|
|
OR TIMERA() > FLOOR(scene.fPanADurationNormal * 1000.0)
|
|
iStage++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ELSE
|
|
iStage++
|
|
ENDIF
|
|
|
|
ELIF iStage = 2
|
|
// Wait for a few seconds (or for skip button)
|
|
FLOAT fPanADuration = scene.fPanADurationNormal
|
|
IF IS_PED_UNINJURED(PLAYER_PED_ID()) AND IS_PED_DRUNK(PLAYER_PED_ID())
|
|
fPanADuration = scene.fPanADurationDrunk
|
|
ENDIF
|
|
|
|
IF TIMERA() > FLOOR(fPanADuration * 1000.0)
|
|
IF scene.bIsCinema
|
|
IF GET_FOLLOW_PED_CAM_VIEW_MODE() = CAM_VIEW_MODE_FIRST_PERSON
|
|
iStage = 50
|
|
ELSE
|
|
Private_SetCinemaCatchupCam(eLoc)
|
|
iStage = 100
|
|
ENDIF
|
|
ELSE
|
|
IF DOES_CAM_EXIST(hBarCams[0])
|
|
DESTROY_CAM(hBarCams[0])
|
|
ENDIF
|
|
|
|
// Set timeshift cam
|
|
hBarCams[0] = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", TRUE)
|
|
SET_CAM_COORD(hBarCams[0], scene.mCamTime.vPos)
|
|
SET_CAM_ROT(hBarCams[0], scene.mCamTime.vRot)
|
|
SET_CAM_FOV(hBarCams[0], scene.fCamTimeFov)
|
|
// SHAKE_CAM(hBarCams[0], "HAND_SHAKE", 1.0)
|
|
SET_CAM_ACTIVE(hBarCams[0], TRUE)
|
|
|
|
// Clear dialogue/prints
|
|
STOP_SCRIPTED_CONVERSATION(FALSE)
|
|
CLEAR_PRINTS()
|
|
|
|
// Make peds drunk
|
|
INT iDrunkTime = 55
|
|
IF (NOT IS_PED_INJURED(PLAYER_PED_ID()) AND Private_GetCharFromPed(PLAYER_PED_ID()) = CHAR_TREVOR)
|
|
OR (NOT IS_PED_INJURED(hFriendA) AND Private_GetCharFromPed(hFriendA) = CHAR_TREVOR)
|
|
OR (NOT IS_PED_INJURED(hFriendB) AND Private_GetCharFromPed(hFriendB) = CHAR_TREVOR)
|
|
iDrunkTime = 75
|
|
ENDIF
|
|
iDrunkTime += (CONST_iCutsceneTimeshiftDuration / 1000)
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
|
IF NOT IS_PED_DRUNK(PLAYER_PED_ID())
|
|
MAKE_PED_DRUNK(PLAYER_PED_ID(), iDrunkTime*1000)
|
|
ELSE
|
|
EXTEND_OVERALL_DRUNK_TIME(PLAYER_PED_ID(), iDrunkTime*1000)
|
|
ENDIF
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(hFriendA)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(hFriendA)
|
|
IF NOT IS_PED_DRUNK(hFriendA)
|
|
MAKE_PED_DRUNK(hFriendA, iDrunkTime*1000)
|
|
ELSE
|
|
EXTEND_OVERALL_DRUNK_TIME(hFriendA, iDrunkTime*1000)
|
|
ENDIF
|
|
ENDIF
|
|
IF IS_PED_UNINJURED(hFriendB)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(hFriendB)
|
|
IF NOT IS_PED_DRUNK(hFriendB)
|
|
MAKE_PED_DRUNK(hFriendB, iDrunkTime*1000)
|
|
ELSE
|
|
EXTEND_OVERALL_DRUNK_TIME(hFriendB, iDrunkTime*1000)
|
|
ENDIF
|
|
ENDIF
|
|
bAddedDrunkTime = TRUE
|
|
|
|
SETTIMERA(0)
|
|
|
|
iStage++
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ELIF iStage = 3
|
|
IF REQUEST_SCRIPT_AUDIO_BANK("TIME_LAPSE")
|
|
sTimelapse.splineCamera = CREATE_CAM("DEFAULT_SPLINE_CAMERA")
|
|
|
|
ADD_CAM_SPLINE_NODE(sTimelapse.splineCamera, scene.mCamTime.vPos, scene.mCamTime.vRot, CONST_iCutsceneTimeshiftDuration)
|
|
ADD_CAM_SPLINE_NODE(sTimelapse.splineCamera, scene.mCamTime.vPos, scene.mCamTime.vRot, CONST_iCutsceneTimeshiftDuration)
|
|
SET_CAM_FOV(sTimelapse.splineCamera, scene.fCamTimeFov)
|
|
SET_CAM_ACTIVE(sTimelapse.splineCamera, TRUE)
|
|
|
|
sTimelapse.sStartTimeOfDay = GET_CURRENT_TIMEOFDAY()
|
|
sTimelapse.currentTimeOfDay = GET_CURRENT_TIMEOFDAY()
|
|
SET_TODS_CUTSCENE_RUNNING(sTimelapse, TRUE)
|
|
|
|
iTOD_DestHour = (GET_CLOCK_HOURS() + iTOD_SkipTotalHours) % 24
|
|
iTOD_DestMin = GET_CLOCK_MINUTES()
|
|
|
|
iStage++
|
|
ENDIF
|
|
|
|
ELIF iStage = 4
|
|
IF SKIP_TO_TIME_DURING_SPLINE_CAMERA(iTOD_DestHour, iTOD_DestMin, "", "", sTimelapse)
|
|
iStage++
|
|
ENDIF
|
|
|
|
ELIF iStage = 5
|
|
SEQUENCE_INDEX seq
|
|
SETTIMERA(0)
|
|
|
|
//-- Set ped positions + tasks
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
|
|
// Set player pos + tasks
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), scene.vPedPPos[1])
|
|
SET_ENTITY_FACING(PLAYER_PED_ID(), scene.vPedPPos[2])
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(null, scene.vPedPPos[2], PEDMOVE_WALK, DEFAULT_TIME_NEVER_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_SUPPRESS_EXACT_STOP)
|
|
// TASK_TURN_PED_TO_FACE_ENTITY(null, hFriendA)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(PLAYER_PED_ID(), seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
|
|
// Walk out of bar
|
|
IF NOT IS_PED_INJURED(hFriendA)
|
|
SET_ENTITY_COORDS(hFriendA, scene.vPedAPos[1])
|
|
SET_ENTITY_FACING(hFriendA, scene.vPedAPos[2])
|
|
|
|
IF IS_PED_GROUP_MEMBER(hFriendA, PLAYER_GROUP_ID())
|
|
REMOVE_PED_FROM_GROUP(hFriendA)
|
|
ENDIF
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_PAUSE(null, 250)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(null, scene.vPedAPos[2], PEDMOVE_WALK, DEFAULT_TIME_NEVER_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_SUPPRESS_EXACT_STOP)
|
|
// TASK_TURN_PED_TO_FACE_ENTITY(null, PLAYER_PED_ID())
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(hFriendA, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
ENDIF
|
|
|
|
IF IS_PED_UNINJURED(hFriendB)
|
|
SET_ENTITY_COORDS(hFriendB, scene.vPedBPos[1])
|
|
SET_ENTITY_FACING(hFriendB, scene.vPedBPos[2])
|
|
|
|
IF IS_PED_GROUP_MEMBER(hFriendB, PLAYER_GROUP_ID())
|
|
REMOVE_PED_FROM_GROUP(hFriendB)
|
|
ENDIF
|
|
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_PAUSE(null, 1200)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(null, scene.vPedBPos[2], PEDMOVE_WALK, DEFAULT_TIME_NEVER_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_SUPPRESS_EXACT_STOP)
|
|
// TASK_TURN_PED_TO_FACE_ENTITY(null, PLAYER_PED_ID())
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(hFriendB, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
ENDIF
|
|
|
|
//-- Start end cam pan
|
|
IF DOES_CAM_EXIST(hBarCams[0])
|
|
DESTROY_CAM(hBarCams[0])
|
|
ENDIF
|
|
IF DOES_CAM_EXIST(hBarCams[1])
|
|
DESTROY_CAM(hBarCams[1])
|
|
ENDIF
|
|
|
|
// SET_TODS_CUTSCENE_RUNNING(sTimelapse, FALSE)
|
|
SET_TODS_CUTSCENE_RUNNING(sTimelapse, FALSE, FALSE, DEFAULT, TRUE, FALSE)
|
|
|
|
hBarCams[0] = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", TRUE)
|
|
SET_CAM_COORD(hBarCams[0], scene.mCamPanB[0].vPos)
|
|
SET_CAM_ROT(hBarCams[0], scene.mCamPanB[0].vRot)
|
|
SET_CAM_FOV(hBarCams[0], scene.fCamPanBFov)
|
|
|
|
hBarCams[1] = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", TRUE)
|
|
SET_CAM_COORD(hBarCams[1], scene.mCamPanB[1].vPos)
|
|
SET_CAM_ROT(hBarCams[1], scene.mCamPanB[1].vRot)
|
|
SET_CAM_FOV(hBarCams[1], scene.fCamPanBFov)
|
|
|
|
// Start camera pan
|
|
// SHAKE_CAM(hBarCams[0], "HAND_SHAKE", 1.0)
|
|
// SHAKE_CAM(hBarCams[1], "HAND_SHAKE", 1.0)
|
|
SET_CAM_ACTIVE_WITH_INTERP(hBarCams[1], hBarCams[0], CONST_iCutsceneEndPanDuration)
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
ENDIF
|
|
|
|
IF eLoc = ALOC_bar_biker
|
|
CLEAR_AREA_OF_PEDS(scene.vPedPPos[0], 300.0)
|
|
CLEAR_AREA_OF_PROJECTILES(scene.vPedPPos[0], 300.0)
|
|
ENDIF
|
|
|
|
iStage++
|
|
|
|
ELIF iStage = 6
|
|
// Wait for a few seconds (or for skip button)
|
|
IF TIMERA() > CONST_iCutsceneEndPanDuration
|
|
|
|
// Set drunk cam
|
|
INT iDrunkTime = 55
|
|
IF (NOT IS_PED_INJURED(PLAYER_PED_ID()) AND Private_GetCharFromPed(PLAYER_PED_ID()) = CHAR_TREVOR)
|
|
OR (NOT IS_PED_INJURED(hFriendA) AND Private_GetCharFromPed(hFriendA) = CHAR_TREVOR)
|
|
OR (NOT IS_PED_INJURED(hFriendB) AND Private_GetCharFromPed(hFriendB) = CHAR_TREVOR)
|
|
iDrunkTime = 75
|
|
ENDIF
|
|
Activate_Drunk_Camera(iDrunkTime*1000)
|
|
g_drunkCameraTimeCycleModifier = 0.25
|
|
g_drunkCameraTimeCycleName = "DRUNK"
|
|
|
|
IF GET_FOLLOW_PED_CAM_VIEW_MODE() = CAM_VIEW_MODE_FIRST_PERSON
|
|
iStage = 50
|
|
ELSE
|
|
// Execute extra catchup cam if included
|
|
IF scene.bExtraCatchupCam
|
|
IF DOES_CAM_EXIST(hBarCams[1])
|
|
DESTROY_CAM(hBarCams[1])
|
|
ENDIF
|
|
hBarCams[1] = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", TRUE)
|
|
|
|
SET_CAM_COORD(hBarCams[1], scene.mCamCatch.vPos)
|
|
SET_CAM_ROT(hBarCams[1], scene.mCamCatch.vRot)
|
|
SET_CAM_FOV(hBarCams[1], scene.fCamCatchFov)
|
|
SET_CAM_ACTIVE(hBarCams[1], TRUE)
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
ENDIF
|
|
|
|
iStage = 100
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
|
|
//-- 1st person end transition
|
|
ELIF iStage = 50
|
|
ANIMPOSTFX_PLAY("CamPushInNeutral", 0, FALSE)
|
|
PLAY_SOUND_FRONTEND(-1, "1st_Person_Transition", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
|
|
SETTIMERA(0)
|
|
iStage++
|
|
|
|
ELIF iStage = 51
|
|
IF TIMERA() > 300
|
|
iStage = 100
|
|
ENDIF
|
|
|
|
//-- Skip scene
|
|
|
|
ELIF iStage = 98
|
|
|
|
// Set camera
|
|
IF DOES_CAM_EXIST(hBarCams[0])
|
|
DESTROY_CAM(hBarCams[0])
|
|
ENDIF
|
|
IF DOES_CAM_EXIST(hBarCams[1])
|
|
DESTROY_CAM(hBarCams[1])
|
|
ENDIF
|
|
|
|
hBarCams[1] = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", TRUE)
|
|
IF scene.bExtraCatchupCam = FALSE
|
|
SET_CAM_COORD(hBarCams[1], scene.mCamPanB[1].vPos)
|
|
SET_CAM_ROT(hBarCams[1], scene.mCamPanB[1].vRot)
|
|
SET_CAM_FOV(hBarCams[1], scene.fCamPanBFov)
|
|
ELSE
|
|
SET_CAM_COORD(hBarCams[1], scene.mCamCatch.vPos)
|
|
SET_CAM_ROT(hBarCams[1], scene.mCamCatch.vRot)
|
|
SET_CAM_FOV(hBarCams[1], scene.fCamCatchFov)
|
|
ENDIF
|
|
|
|
SET_CAM_ACTIVE(hBarCams[1], TRUE)
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
|
|
//-- Set ped positions to end of scene
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), scene.vPedPPos[2])
|
|
SET_ENTITY_FACING(PLAYER_PED_ID(), scene.vPedPPos[2] + (scene.vPedPPos[2] - scene.vPedPPos[1]))
|
|
ENDIF
|
|
|
|
// Set friend A pos
|
|
IF NOT IS_PED_INJURED(hFriendA)
|
|
SET_ENTITY_COORDS(hFriendA, scene.vPedAPos[2])
|
|
SET_ENTITY_FACING(hFriendA, scene.vPedAPos[2] + (scene.vPedAPos[2] - scene.vPedAPos[1]))
|
|
|
|
IF IS_PED_GROUP_MEMBER(hFriendA, PLAYER_GROUP_ID())
|
|
REMOVE_PED_FROM_GROUP(hFriendA)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// Set friend B pos
|
|
IF IS_PED_UNINJURED(hFriendB)
|
|
SET_ENTITY_COORDS(hFriendB, scene.vPedBPos[2])
|
|
SET_ENTITY_FACING(hFriendB, scene.vPedBPos[2] + (scene.vPedBPos[2] - scene.vPedBPos[1]))
|
|
|
|
IF IS_PED_GROUP_MEMBER(hFriendB, PLAYER_GROUP_ID())
|
|
REMOVE_PED_FROM_GROUP(hFriendB)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// Make peds drunk
|
|
INT iDrunkTime = 55
|
|
IF (NOT IS_PED_INJURED(PLAYER_PED_ID()) AND Private_GetCharFromPed(PLAYER_PED_ID()) = CHAR_TREVOR)
|
|
OR (NOT IS_PED_INJURED(hFriendA) AND Private_GetCharFromPed(hFriendA) = CHAR_TREVOR)
|
|
OR (NOT IS_PED_INJURED(hFriendB) AND Private_GetCharFromPed(hFriendB) = CHAR_TREVOR)
|
|
iDrunkTime = 75
|
|
ENDIF
|
|
Activate_Drunk_Camera(iDrunkTime*1000)
|
|
g_drunkCameraTimeCycleModifier = 0.25
|
|
g_drunkCameraTimeCycleName = "DRUNK"
|
|
iDrunkTime += 1
|
|
|
|
IF bAddedDrunkTime = FALSE
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
|
IF NOT IS_PED_DRUNK(PLAYER_PED_ID())
|
|
MAKE_PED_DRUNK(PLAYER_PED_ID(), iDrunkTime*1000)
|
|
ELSE
|
|
EXTEND_OVERALL_DRUNK_TIME(PLAYER_PED_ID(), iDrunkTime*1000)
|
|
ENDIF
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(hFriendA)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(hFriendA)
|
|
IF NOT IS_PED_DRUNK(hFriendA)
|
|
MAKE_PED_DRUNK(hFriendA, iDrunkTime*1000)
|
|
ELSE
|
|
EXTEND_OVERALL_DRUNK_TIME(hFriendA, iDrunkTime*1000)
|
|
ENDIF
|
|
ENDIF
|
|
IF IS_PED_UNINJURED(hFriendB)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(hFriendB)
|
|
IF NOT IS_PED_DRUNK(hFriendA)
|
|
MAKE_PED_DRUNK(hFriendB, iDrunkTime*1000)
|
|
ELSE
|
|
EXTEND_OVERALL_DRUNK_TIME(hFriendB, iDrunkTime*1000)
|
|
ENDIF
|
|
ENDIF
|
|
bAddedDrunkTime = TRUE
|
|
ENDIF
|
|
|
|
SETTIMERA(0)
|
|
iStage++
|
|
|
|
ELIF iStage = 99
|
|
|
|
IF TIMERA() > 2000
|
|
// Fade in
|
|
DO_SCREEN_FADE_IN(1000)
|
|
iStage++
|
|
ENDIF
|
|
|
|
|
|
//-- Fade out and re-spot
|
|
|
|
ELIF iStage = 100
|
|
// Destroy cameras (if in first person, just cut back to gameplay cam)
|
|
IF GET_FOLLOW_PED_CAM_VIEW_MODE() = CAM_VIEW_MODE_FIRST_PERSON
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
ELSE
|
|
STOP_RENDERING_SCRIPT_CAMS_USING_CATCH_UP()
|
|
ENDIF
|
|
|
|
INT iCamera
|
|
REPEAT COUNT_OF(hBarCams) iCamera
|
|
IF DOES_CAM_EXIST(hBarCams[iCamera])
|
|
DESTROY_CAM(hBarCams[iCamera])
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
STOP_PED_SPEAKING(PLAYER_PED_ID(), FALSE)
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(hFriendA)
|
|
STOP_PED_SPEAKING(hFriendA, FALSE)
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(hFriendB)
|
|
STOP_PED_SPEAKING(hFriendB, FALSE)
|
|
ENDIF
|
|
|
|
// Unblock ped and road paths
|
|
VECTOR vPedPosMin, vPedPosMax
|
|
Private_GetActivityScenePedPosBoundingBox(scene, vPedPosMin, vPedPosMax)
|
|
SET_PED_PATHS_BACK_TO_ORIGINAL(vPedPosMin, vPedPosMax)
|
|
SET_ROADS_BACK_TO_ORIGINAL_IN_ANGLED_AREA(scene.vClearA, scene.vClearB, scene.fClearW)
|
|
|
|
RC_END_CUTSCENE_MODE(TRUE, FALSE)
|
|
iStage = -1
|
|
ENDIF
|
|
|
|
IF iStage = -1
|
|
// If peds are ok, put buddy back in players group
|
|
IF DOES_ENTITY_EXIST(PLAYER_PED_ID()) AND NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
IF DOES_ENTITY_EXIST(hFriendA) AND NOT IS_PED_INJURED(hFriendA)
|
|
IF NOT IS_PED_GROUP_MEMBER(hFriendA, PLAYER_GROUP_ID())
|
|
SET_PED_AS_GROUP_MEMBER(hFriendA, PLAYER_GROUP_ID())
|
|
SET_PED_GROUP_MEMBER_PASSENGER_INDEX(hFriendA, VS_FRONT_RIGHT)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(hFriendB) AND NOT IS_PED_INJURED(hFriendB)
|
|
IF NOT IS_PED_GROUP_MEMBER(hFriendB, PLAYER_GROUP_ID())
|
|
SET_PED_AS_GROUP_MEMBER(hFriendB, PLAYER_GROUP_ID())
|
|
SET_PED_GROUP_MEMBER_PASSENGER_INDEX(hFriendB, VS_FRONT_RIGHT)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ADVANCE_FRIEND_TIMERS(TO_FLOAT(iTOD_SkipTotalHours))
|
|
DO_SCREEN_FADE_IN(1000)
|
|
|
|
RETURN TRUE
|
|
ELSE
|
|
RETURN FALSE
|
|
ENDIF
|
|
|
|
ENDFUNC
|
|
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------------------------------
|
|
// INTERFACE - BAR
|
|
//-------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
FUNC BOOL PROCESS_BAR_STATE()
|
|
|
|
structFActivityScene scene
|
|
Private_ALOC_GetActivityScene(g_eCurrentActivityLoc, scene)
|
|
|
|
IF Private_ProcessActivityScene(g_eCurrentActivityLoc, scene, gActivity.iStateProgress, gActivity.mFriendA.hPed, gActivity.mFriendB.hPed, gActivity.convPedsDefault)
|
|
finishActivity(g_eCurrentActivityLoc, AR_playerWon)
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------------------------------
|
|
// INTERFACE - CINEMA
|
|
//-------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
FUNC BOOL PROCESS_CINEMA_STATE()
|
|
|
|
structFActivityScene scene
|
|
Private_ALOC_GetActivityScene(g_ePreviousActivityLoc, scene)
|
|
|
|
IF Private_ProcessActivityScene(g_ePreviousActivityLoc, scene, gActivity.iStateProgress, gActivity.mFriendA.hPed, gActivity.mFriendB.hPed, gActivity.convPedsDefault)
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
PROC END_CINEMA_STATE()
|
|
|
|
//-- Return to journey state --
|
|
Private_SetActivityState(ACTIVITY_STATE_Journey)
|
|
|
|
ENDPROC
|
|
|