573 lines
20 KiB
Python
Executable File
573 lines
20 KiB
Python
Executable File
USING "rage_builtins.sch"
|
|
USING "globals.sch"
|
|
USING "commands_script.sch"
|
|
USING "drunkNoticeboard_private.sch"
|
|
USING "drunk_public.sch"
|
|
USING "net_include.sch"
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
USING "drunk_debug.sch"
|
|
#ENDIF
|
|
|
|
|
|
// *****************************************************************************************
|
|
// *****************************************************************************************
|
|
// *****************************************************************************************
|
|
//
|
|
// MISSION NAME : drunk_controller.sc
|
|
// AUTHOR : Keith / Alwyn
|
|
// DESCRIPTION : The always-active control script to control drunk peds.
|
|
//
|
|
// *****************************************************************************************
|
|
// *****************************************************************************************
|
|
// *****************************************************************************************
|
|
|
|
BOOL bQuit_Drunk_Camera_Called = FALSE
|
|
|
|
INT iDrunkNotices = 0
|
|
INT iDrunkPeds = 0
|
|
INT iDrunkRequest = 0
|
|
|
|
FLOAT fDrunkCameraTimeCycleModifier = -99.0
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
BOOL bDrawDebugDrunkInfo
|
|
#ENDIF
|
|
|
|
|
|
|
|
// ===========================================================================================================
|
|
// Cleanup
|
|
// ===========================================================================================================
|
|
|
|
// PURPOSE: Ensures that the script gets a chance to cleanup under specific circumstances (ie: moving from SP to MP)
|
|
//
|
|
PROC Drunk_Controller_Cleanup()
|
|
|
|
// Reset prior to launching script
|
|
Reset_All_Drunk_Variables_And_Terminate_All_Unneeded_Scripts()
|
|
|
|
IF NOT bQuit_Drunk_Camera_Called
|
|
Quit_Drunk_Camera_Immediately()
|
|
ENDIF
|
|
|
|
// CURRENTLY NOTHING TO CLEANUP
|
|
TERMINATE_THIS_THREAD()
|
|
|
|
ENDPROC
|
|
// PURPOSE: Converts any notices posted by the public functions to instead be posted by the Control
|
|
// Script. This ensures that that the notice will remain active for one frame, but then
|
|
// get cleaned up by the standard Control Script notices cleanup in the next frame.
|
|
PROC Convert_Public_Function_Posts_To_Be_Control_Script_Posts()
|
|
|
|
//REPEAT MAX_NUMBER_OF_DRUNK_NOTICES iDrunkNotices
|
|
IF (g_drunkNotices[iDrunkNotices].poster = UNIQUE_ID_PUBLIC_FUNCTIONS)
|
|
g_drunkNotices[iDrunkNotices].poster = UNIQUE_ID_CONTROL_SCRIPT
|
|
ENDIF
|
|
//ENDREPEAT
|
|
|
|
ENDPROC
|
|
|
|
|
|
// PURPOSE: The controller expects each drunk script to post a 'still drunk' notice each frame to
|
|
// ensure it hasn't terminated. If it has terminated then clean up the control variables.
|
|
// Check each ped in turn for a 'still drunk' notice.
|
|
PROC Maintain_Still_Drunk_Notices()
|
|
|
|
|
|
INT noticeArrayPos = NO_DRUNK_NOTICES
|
|
//REPEAT MAX_NUMBER_OF_DRUNK_PEDS iDrunkPeds
|
|
IF NOT (g_drunkPeds[iDrunkPeds].uniqueID = NO_UNIQUE_DRUNK_PED_ID)
|
|
// ...found a drunk ped, so expect a 'still drunk' notice
|
|
noticeArrayPos = Find_Position_Of_This_Drunk_Notice_From_Poster(g_drunkPeds[iDrunkPeds].uniqueID, DNID_STILL_DRUNK)
|
|
|
|
IF (noticeArrayPos = NO_DRUNK_NOTICES)
|
|
// ...message not found, so clear up the variables for this drunk ped
|
|
#IF IS_DEBUG_BUILD
|
|
CPRINTLN(DEBUG_DRUNK, "<DRUNK> this unique ped ID has not reported that it still exists: ", g_drunkPeds[iDrunkPeds].uniqueID)
|
|
#ENDIF
|
|
|
|
Clear_All_Drunk_Ped_Details_For_This_ID(g_drunkPeds[iDrunkPeds].uniqueID)
|
|
ELSE
|
|
// ...received the message, so remove it
|
|
Clear_One_Drunk_Notice(noticeArrayPos)
|
|
ENDIF
|
|
ENDIF
|
|
//ENDREPEAT
|
|
|
|
ENDPROC
|
|
|
|
|
|
// PURPOSE: Act on this Drunk Notice directed at the Drunk COntroller
|
|
//
|
|
// INPUT PARAMS: paramArrayIndex Array Index into the Drunk Notices array
|
|
PROC Read_This_Drunk_Controller_Notice(INT paramArrayIndex)
|
|
|
|
g_eDrunkNoticeIDs thisNoticeID = g_drunkNotices[paramArrayIndex].notice
|
|
|
|
SWITCH (thisNoticeID)
|
|
// Ignore these
|
|
CASE DNID_STILL_DRUNK // already handled by a special function
|
|
CASE DNID_BECOME_SOBER // aimed at 'drunk' scripts
|
|
CASE DNID_EXTENDED_TIME // aimed at 'drunk' scripts
|
|
CASE DNID_HIT_ALCOHOL // aimed at 'drunk' scripts
|
|
CASE DNID_HIT_WEED // aimed at 'drunk' scripts
|
|
CASE DNID_IN_VEHICLE // aimed at 'drunk' scripts
|
|
CASE DNID_NO_DRUNK_NOTICE // no message ID
|
|
BREAK
|
|
|
|
DEFAULT
|
|
SCRIPT_ASSERT("drunk: Read_This_Drunk_Controller_Notice - Unknown Drunk Notice ID. Tell Alwyn.")
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
ENDPROC
|
|
|
|
|
|
// PURPOSE: Check to see if any drunk notices are directed at the Drunk Controller and deal with them.
|
|
// Delete any that are specifically directed at the Drunk Controller.
|
|
PROC Read_All_Drunk_Notices_Directed_At_Drunk_Controller()
|
|
|
|
|
|
//REPEAT MAX_NUMBER_OF_DRUNK_NOTICES iDrunkNotices
|
|
IF NOT (g_drunkNotices[iDrunkNotices].notice = DNID_NO_DRUNK_NOTICE)
|
|
// Is this notice directed specifically at the Drunk Controller?
|
|
IF (g_drunkNotices[iDrunkNotices].reader = UNIQUE_ID_CONTROL_SCRIPT)
|
|
Read_This_Drunk_Controller_Notice(iDrunkNotices)
|
|
Clear_One_Drunk_Notice(iDrunkNotices)
|
|
ENDIF
|
|
ENDIF
|
|
//ENDREPEAT
|
|
|
|
ENDPROC
|
|
|
|
|
|
// PURPOSE: Maintains the Drunk Request at the specified Drunk Request array position.
|
|
// Involves: error checks; requesting, loading, running 'drunk' script; setting/clearing details.
|
|
//
|
|
// INPUT PARAMS: paramArrayIndex Index into drunk requests array
|
|
PROC Maintain_One_Drunk_Request(INT paramArrayIndex)
|
|
|
|
IF (paramArrayindex < 0)
|
|
OR (paramArrayIndex >= MAX_NUMBER_OF_DRUNK_REQUESTS)
|
|
SCRIPT_ASSERT("Maintain_One_Drunk_Request: array index out of bounds")
|
|
EXIT
|
|
ENDIF
|
|
|
|
// Make sure the ped is still alive
|
|
IF (IS_ENTITY_DEAD(g_drunkRequests[paramArrayIndex].ped))
|
|
// ...ped is dead, so clear out this request
|
|
Clear_One_Drunk_Request(paramArrayIndex)
|
|
EXIT
|
|
ENDIF
|
|
|
|
// Make sure this ped isn't already drunk
|
|
IF (Is_Ped_Drunk(g_drunkRequests[paramArrayIndex].ped))
|
|
// ...ped is already drunk, so clear out this request
|
|
Clear_One_Drunk_Request(paramArrayIndex)
|
|
EXIT
|
|
ENDIF
|
|
|
|
// Request the script
|
|
IF NOT (HAS_SCRIPT_LOADED("drunk"))
|
|
REQUEST_SCRIPT("drunk")
|
|
EXIT
|
|
ENDIF
|
|
|
|
// Make sure there is free space for this drunk ped
|
|
INT freeDrunkPedSlot = Get_An_Empty_Drunk_Ped_Slot()
|
|
IF (freeDrunkPedSlot = UNKNOWN_DRUNK_ARRAY_INDEX)
|
|
// ...there are already the maximum number of drunk peds, so clear out the details of this request
|
|
Clear_One_Drunk_Request(paramArrayIndex)
|
|
SCRIPT_ASSERT("All drunk ped slots are full - Tell Alwyn to increase MAX_NUMBER_OF_DRUNK_PEDS")
|
|
EXIT
|
|
ENDIF
|
|
|
|
// Store the control details for the new drunk ped
|
|
g_drunkPeds[freeDrunkPedSlot].uniqueID = Get_Next_Unique_Drunk_Ped_ID()
|
|
g_drunkPeds[freeDrunkPedSlot].myPedIndex = g_drunkRequests[paramArrayIndex].ped
|
|
g_drunkPeds[freeDrunkPedSlot].eDrunkLevel = DL_verydrunk
|
|
|
|
// g_drunkPeds[freeDrunkPedSlot].iAlcoholHit = 0
|
|
// g_drunkPeds[freeDrunkPedSlot].iWeedHit = 0
|
|
|
|
// Launch the new drunk script
|
|
g_sDrunkRequests drunkActivationDetails = g_drunkRequests[paramArrayIndex]
|
|
START_NEW_SCRIPT_WITH_ARGS("drunk", drunkActivationDetails, SIZE_OF(drunkActivationDetails), DEFAULT_STACK_SIZE)
|
|
SET_SCRIPT_AS_NO_LONGER_NEEDED("drunk")
|
|
|
|
Clear_One_Drunk_Request(paramArrayIndex)
|
|
|
|
ENDPROC
|
|
|
|
|
|
// PURPOSE: Maintains all drunk requests still outstanding
|
|
PROC Maintain_All_Drunk_Requests()
|
|
|
|
//REPEAT MAX_NUMBER_OF_DRUNK_REQUESTS iDrunkRequest
|
|
IF (g_drunkRequests[iDrunkRequest].status = DS_REQUEST_SCRIPT)
|
|
Maintain_One_Drunk_Request(iDrunkRequest)
|
|
ENDIF
|
|
//ENDREPEAT
|
|
|
|
ENDPROC
|
|
|
|
|
|
FLOAT fSavedDrunkCamTimeoutMult[8]
|
|
FLOAT fPrevDrunkCamTimeoutMult = -1
|
|
|
|
// PURPOSE: Maintain the globals associated with the drunk camera
|
|
PROC Maintain_Drunk_Camera()
|
|
|
|
IF NOT (g_drunkCameraActive)
|
|
EXIT
|
|
ENDIF
|
|
|
|
INT i
|
|
INT gameTimer = GET_GAME_TIMER()
|
|
IF (g_drunkCameraTimeout > gameTimer)
|
|
OR (g_drunkCameraTimeout = DRUNK_LEVEL_CONSTANT)
|
|
|
|
IF IS_PLAYER_SWITCH_IN_PROGRESS()
|
|
#IF IS_DEBUG_BUILD
|
|
CPRINTLN(DEBUG_DRUNK, "<Maintain_Drunk_Camera> IS_PLAYER_SWITCH_IN_PROGRESS is true, delay starting ")
|
|
#ENDIF
|
|
EXIT
|
|
ENDIF
|
|
|
|
// timeout multiplier
|
|
FLOAT fCurrentDrunkCamTimeoutMult = Get_Drunk_Cam_Timeout_Multiplier()
|
|
|
|
FOR i = COUNT_OF(fSavedDrunkCamTimeoutMult)-1 TO 1 STEP -1
|
|
fSavedDrunkCamTimeoutMult[i] = fSavedDrunkCamTimeoutMult[i-1]
|
|
ENDFOR
|
|
fSavedDrunkCamTimeoutMult[0] = fCurrentDrunkCamTimeoutMult
|
|
FLOAT fAverageDrunkCamTimeoutMult
|
|
|
|
INT iCount = 0
|
|
REPEAT COUNT_OF(fSavedDrunkCamTimeoutMult) i
|
|
fAverageDrunkCamTimeoutMult += fSavedDrunkCamTimeoutMult[i]
|
|
iCount++
|
|
ENDREPEAT
|
|
fAverageDrunkCamTimeoutMult /= iCount
|
|
|
|
// hit count multiplier
|
|
FLOAT fDrunkCamHitMult = Get_Drunk_Cam_Hit_Count_Multiplier()
|
|
|
|
IF (g_drunkCameraActualAmplitudeScalar <> g_drunkCameraDesiredAmplitudeScalar)
|
|
FLOAT diff = g_drunkCameraDesiredAmplitudeScalar - g_drunkCameraActualAmplitudeScalar
|
|
g_drunkCameraActualAmplitudeScalar += diff*0.1
|
|
|
|
IF ABSF(g_drunkCameraActualAmplitudeScalar-g_drunkCameraDesiredAmplitudeScalar) < 0.01
|
|
g_drunkCameraActualAmplitudeScalar = g_drunkCameraDesiredAmplitudeScalar
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_GAMEPLAY_CAM_SHAKING() AND NOT IS_PLAYER_DANCING(PLAYER_ID())
|
|
SHAKE_GAMEPLAY_CAM("DRUNK_SHAKE", g_drunkCameraActualAmplitudeScalar * fAverageDrunkCamTimeoutMult * fDrunkCamHitMult)
|
|
ENDIF
|
|
|
|
IF (GET_GAME_TIMER() % 100) = 0
|
|
IF (g_drunkCameraTimeout = DRUNK_LEVEL_CONSTANT)
|
|
//
|
|
ELSE
|
|
IF fPrevDrunkCamTimeoutMult = -1
|
|
fPrevDrunkCamTimeoutMult = fAverageDrunkCamTimeoutMult
|
|
ENDIF
|
|
|
|
SET_GAMEPLAY_CAM_SHAKE_AMPLITUDE(g_drunkCameraActualAmplitudeScalar * fAverageDrunkCamTimeoutMult * fDrunkCamHitMult)
|
|
SET_GAMEPLAY_CAM_MOTION_BLUR_SCALING_THIS_UPDATE(g_drunkCameraMotionBlur * fAverageDrunkCamTimeoutMult * fDrunkCamHitMult)
|
|
|
|
CDEBUG1LN(DEBUG_DRUNK, "<Maintain_Drunk_Camera> SET_GAMEPLAY_CAM_SHAKE_AMPLITUDE(", g_drunkCameraActualAmplitudeScalar, " * ", fAverageDrunkCamTimeoutMult, "[", fPrevDrunkCamTimeoutMult, "] ", fDrunkCamHitMult, ")")
|
|
fPrevDrunkCamTimeoutMult = fAverageDrunkCamTimeoutMult
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF g_drunkCameraMotionBlur * fAverageDrunkCamTimeoutMult * fDrunkCamHitMult < 1.0
|
|
SET_GAMEPLAY_CAM_MAX_MOTION_BLUR_STRENGTH_THIS_UPDATE(g_drunkCameraMotionBlur * fAverageDrunkCamTimeoutMult * fDrunkCamHitMult)
|
|
ELSE
|
|
SET_GAMEPLAY_CAM_MAX_MOTION_BLUR_STRENGTH_THIS_UPDATE(1.0)
|
|
ENDIF
|
|
|
|
IF NOT IS_CINEMATIC_CAM_SHAKING()
|
|
SHAKE_CINEMATIC_CAM("DRUNK_SHAKE", g_drunkCameraActualAmplitudeScalar * g_drunkenCinematicCamMultiplier * fAverageDrunkCamTimeoutMult * fDrunkCamHitMult)
|
|
ENDIF
|
|
|
|
SET_CINEMATIC_CAM_SHAKE_AMPLITUDE(g_drunkCameraActualAmplitudeScalar * g_drunkenCinematicCamMultiplier * fAverageDrunkCamTimeoutMult * fDrunkCamHitMult)
|
|
|
|
IF DOES_CAM_EXIST(g_drunkCameraIndex)
|
|
IF IS_CAM_SHAKING(g_drunkCameraIndex)
|
|
SET_CAM_SHAKE_AMPLITUDE(g_drunkCameraIndex, g_drunkCameraActualAmplitudeScalar * fAverageDrunkCamTimeoutMult * fDrunkCamHitMult)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(g_drunkAudioSceneScript)
|
|
AND NOT IS_STRING_NULL_OR_EMPTY(g_drunkAudioSceneName)
|
|
START_AUDIO_SCENE(g_drunkAudioSceneName)
|
|
g_drunkAudioSceneScript = ""
|
|
ENDIF
|
|
|
|
INVALIDATE_IDLE_CAM()
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
TEXT_LABEL_63 sDrunkTimerBoost = ""
|
|
#ENDIF
|
|
|
|
IF g_drunkCameraTimeCycleModifier > 0
|
|
IF (fDrunkCameraTimeCycleModifier <> g_drunkCameraTimeCycleModifier)
|
|
|
|
IF GET_TIMECYCLE_TRANSITION_MODIFIER_INDEX() <> -1
|
|
#IF IS_DEBUG_BUILD
|
|
CPRINTLN(DEBUG_DRUNK, "<Maintain_Drunk_Camera> GET_TIMECYCLE_TRANSITION_MODIFIER_INDEX(): ", GET_TIMECYCLE_TRANSITION_MODIFIER_INDEX(), ") - delay calling SET_TRANSITION_TIMECYCLE_MODIFIER")
|
|
#ENDIF
|
|
|
|
ELSE
|
|
IF NOT GET_IS_TIMECYCLE_TRANSITIONING_OUT()
|
|
#IF IS_DEBUG_BUILD
|
|
CPRINTLN(DEBUG_DRUNK, "<Maintain_Drunk_Camera> SET_TRANSITION_TIMECYCLE_MODIFIER(\"", g_drunkCameraTimeCycleName, "\", 5.0, ", g_drunkCameraTimeCycleModifier, ")")
|
|
#ENDIF
|
|
|
|
SET_TRANSITION_TIMECYCLE_MODIFIER(g_drunkCameraTimeCycleName, 15.0)
|
|
fDrunkCameraTimeCycleModifier = g_drunkCameraTimeCycleModifier
|
|
|
|
IF g_drunkCameraEffectStrength != 1.0
|
|
SET_TIMECYCLE_MODIFIER_STRENGTH(g_drunkCameraEffectStrength)
|
|
ENDIF
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD
|
|
CPRINTLN(DEBUG_DRUNK, "<Maintain_Drunk_Camera> SET_TRANSITION_TIMECYCLE_MODIFIER transitioning out (", fDrunkCameraTimeCycleModifier, " <> ", g_drunkCameraTimeCycleModifier, ", \"", g_drunkCameraTimeCycleName, "\")... ")
|
|
#ENDIF
|
|
|
|
// IF NOT GET_IS_TIMECYCLE_TRANSITIONING_OUT()
|
|
// SET_TRANSITION_TIMECYCLE_MODIFIER(g_drunkCameraTimeCycleName, 15.0)
|
|
// ENDIF
|
|
// fDrunkCameraTimeCycleModifier = g_drunkCameraTimeCycleModifier
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF GET_TIMECYCLE_TRANSITION_MODIFIER_INDEX() <> -1 AND GET_TIMECYCLE_MODIFIER_INDEX() <> -1
|
|
#IF IS_DEBUG_BUILD
|
|
CPRINTLN(DEBUG_DRUNK, "<Maintain_Drunk_Camera> <RESET LOCAL TCM> GET_TIMECYCLE_TRANSITION_MODIFIER_INDEX(): ", GET_TIMECYCLE_TRANSITION_MODIFIER_INDEX(), ")")
|
|
CPRINTLN(DEBUG_DRUNK, "<Maintain_Drunk_Camera> <RESET LOCAL TCM> GET_TIMECYCLE_MODIFIER_INDEX(): ", GET_TIMECYCLE_MODIFIER_INDEX(), ")")
|
|
#ENDIF
|
|
fDrunkCameraTimeCycleModifier = -99.0
|
|
ENDIF
|
|
|
|
SET_AUDIO_SPECIAL_EFFECT_MODE(AUDIO_SPECIAL_EFFECT_MODE_STONED)
|
|
INT iDrunkCameraTimeoutRemaining = g_drunkCameraTimeout - gameTimer
|
|
IF iDrunkCameraTimeoutRemaining <= (g_drunkCameraTimeoutDuration/2)
|
|
AND g_drunkCameraTimeout != DRUNK_LEVEL_CONSTANT
|
|
|
|
BOOL bPlayerHasSpeechPlaying = FALSE
|
|
IF IS_PLAYER_PLAYING(PLAYER_ID())
|
|
IF IS_ANY_SPEECH_PLAYING(PLAYER_PED_ID())
|
|
bPlayerHasSpeechPlaying = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF Is_Ped_Drunk(PLAYER_PED_ID())
|
|
g_drunkCameraTimeout += 1000
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
INT drunkPedArrayIndex = Get_Drunk_Ped_Array_Index_For_This_Ped_Index(PLAYER_PED_ID())
|
|
|
|
sDrunkTimerBoost = "player drunk ["
|
|
IF NOT (drunkPedArrayIndex = UNKNOWN_DRUNK_ARRAY_INDEX)
|
|
sDrunkTimerBoost += drunkPedArrayIndex
|
|
sDrunkTimerBoost += ", "
|
|
sDrunkTimerBoost += g_drunkRequests[drunkPedArrayIndex].overall_msec
|
|
sDrunkTimerBoost += "s"
|
|
ELSE
|
|
sDrunkTimerBoost += "invalid"
|
|
ENDIF
|
|
sDrunkTimerBoost += "]"
|
|
#ENDIF
|
|
ELIF bPlayerHasSpeechPlaying
|
|
g_drunkCameraTimeout += 1000
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
sDrunkTimerBoost = "speech playing"
|
|
#ENDIF
|
|
ELIF GET_TIMECYCLE_TRANSITION_MODIFIER_INDEX() <> -1
|
|
g_drunkCameraTimeout += 1000
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
sDrunkTimerBoost = "TCM transition ["
|
|
sDrunkTimerBoost += GET_TIMECYCLE_TRANSITION_MODIFIER_INDEX()
|
|
sDrunkTimerBoost += "]"
|
|
#ENDIF
|
|
ELIF IS_LOCAL_PLAYER_VIEWING_CCTV()
|
|
g_drunkCameraTimeout += 1000
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
sDrunkTimerBoost = "using CCTV"
|
|
#ENDIF
|
|
ELSE
|
|
IF GET_TIMECYCLE_MODIFIER_INDEX() <> -1
|
|
SET_TRANSITION_OUT_OF_TIMECYCLE_MODIFIER(TO_FLOAT(g_drunkCameraTimeoutDuration/2) / 1000.0)
|
|
ENDIF
|
|
|
|
fDrunkCameraTimeCycleModifier = -99.0
|
|
g_drunkCameraTimeCycleModifier = 0.0
|
|
g_drunkCameraTimeCycleName = ""
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
INT iColumn = 0
|
|
HUD_COLOURS eTimeoutColour = HUD_COLOUR_PURE_WHITE
|
|
IF NOT (fCurrentDrunkCamTimeoutMult = 1.0)
|
|
eTimeoutColour = HUD_COLOUR_RED
|
|
ENDIF
|
|
HUD_COLOURS eHitColour = HUD_COLOUR_PURE_WHITE
|
|
IF NOT (fDrunkCamHitMult = 1.0)
|
|
eHitColour = HUD_COLOUR_RED
|
|
ENDIF
|
|
|
|
DrawLiteralDrunkString("Maintain_Drunk_Camera()", iColumn, HUD_COLOUR_PURE_WHITE) iColumn++
|
|
|
|
IF (g_drunkCameraTimeout <> DRUNK_LEVEL_CONSTANT)
|
|
INT iDrunkCameraTimeoutRemaining = g_drunkCameraTimeout - gameTimer
|
|
DrawLiteralDrunkStringFloat("time: ", TO_FLOAT(iDrunkCameraTimeoutRemaining) / 1000.0, iColumn, HUD_COLOUR_PURE_WHITE) iColumn++
|
|
ELSE
|
|
DrawLiteralDrunkString("time: LEVEL_CONSTANT", iColumn, HUD_COLOUR_GREYLIGHT) iColumn++
|
|
ENDIF
|
|
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(sDrunkTimerBoost)
|
|
CPRINTLN(DEBUG_DRUNK, "<Maintain_Drunk_Camera> sDrunkTimerBoost: \"", sDrunkTimerBoost, "\"")
|
|
DrawLiteralDrunkString(sDrunkTimerBoost, iColumn, HUD_COLOUR_GREYLIGHT) iColumn++
|
|
ENDIF
|
|
|
|
IF (g_drunkCameraActualAmplitudeScalar <> g_drunkCameraDesiredAmplitudeScalar)
|
|
DrawLiteralDrunkStringFloat("desiredAmplitudeScalar: ", g_drunkCameraDesiredAmplitudeScalar, iColumn, HUD_COLOUR_GREENDARK) iColumn++
|
|
DrawLiteralDrunkStringFloat("actualAmplitudeScalar: ", g_drunkCameraActualAmplitudeScalar, iColumn, HUD_COLOUR_GREENDARK) iColumn++
|
|
ELSE
|
|
DrawLiteralDrunkStringFloat("amplitudeScalar: ", g_drunkCameraActualAmplitudeScalar, iColumn, HUD_COLOUR_GREEN) iColumn++
|
|
ENDIF
|
|
DrawLiteralDrunkStringFloat("motionBlur: ", g_drunkCameraMotionBlur, iColumn, HUD_COLOUR_GREEN) iColumn++
|
|
DrawLiteralDrunkStringInt("timeoutDuration: ", g_drunkCameraTimeoutDuration, iColumn, HUD_COLOUR_PURE_WHITE) iColumn++
|
|
DrawLiteralDrunkStringFloat("timeoutMult : ", fCurrentDrunkCamTimeoutMult, iColumn, eTimeoutColour) iColumn++
|
|
DrawLiteralDrunkStringFloat("hitMult: ", fDrunkCamHitMult, iColumn, eHitColour) iColumn++
|
|
|
|
|
|
TEXT_LABEL_63 sLiteral = "\""
|
|
sLiteral += g_drunkCameraTimeCycleName
|
|
sLiteral += "\" tcm: "
|
|
DrawLiteralDrunkStringFloat(sLiteral, g_drunkCameraTimeCycleModifier, iColumn, HUD_COLOUR_PURPLE) iColumn++
|
|
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(g_drunkAudioSceneScript)
|
|
OR NOT IS_STRING_NULL_OR_EMPTY(g_drunkAudioSceneName)
|
|
|
|
TEXT_LABEL_63 sNewLiteral = "scene: "
|
|
sNewLiteral += g_drunkAudioSceneScript
|
|
sNewLiteral += ", "
|
|
sNewLiteral += g_drunkAudioSceneName
|
|
|
|
DrawLiteralDrunkString(sNewLiteral, iColumn, eHitColour) iColumn++
|
|
ENDIF
|
|
|
|
|
|
#ENDIF
|
|
|
|
EXIT
|
|
ENDIF
|
|
|
|
CPRINTLN(DEBUG_DRUNK, "<Maintain_Drunk_Camera> end drunk cam - g_drunkCameraTimeout: ", g_drunkCameraTimeout, "[gameTimer: ", gameTimer, "]")
|
|
|
|
REPEAT COUNT_OF(fSavedDrunkCamTimeoutMult) i
|
|
fSavedDrunkCamTimeoutMult[i] = 0
|
|
ENDREPEAT
|
|
fPrevDrunkCamTimeoutMult = -1
|
|
fDrunkCameraTimeCycleModifier = -99
|
|
|
|
Quit_Drunk_Camera_Immediately()
|
|
bQuit_Drunk_Camera_Called= TRUE
|
|
ENDPROC
|
|
|
|
|
|
SCRIPT
|
|
CPRINTLN(DEBUG_DRUNK, "Starting drunk_controller.sc")
|
|
|
|
NETWORK_SET_SCRIPT_IS_SAFE_FOR_NETWORK_GAME()
|
|
|
|
// This script needs to cleanup only when the game runs the magdemo
|
|
IF (HAS_FORCE_CLEANUP_OCCURRED(FORCE_CLEANUP_FLAG_MAGDEMO))
|
|
CPRINTLN(DEBUG_DRUNK, "...drunk_controller.sc has been forced to cleanup (MAGDEMO)")
|
|
Drunk_Controller_Cleanup()
|
|
ENDIF
|
|
|
|
// Additional debug items
|
|
#IF IS_DEBUG_BUILD
|
|
Drunk_Debug_Initialise()
|
|
#ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF GET_COMMANDLINE_PARAM_EXISTS("sc_DrawDebugDrunkInfo")
|
|
CPRINTLN(DEBUG_DRUNK, "...drunk_controller.sc has activated g_bDrawDebugDrunkInfo = TRUE (command line param)")
|
|
g_bDrawDebugDrunkInfo = TRUE
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
WHILE (TRUE)
|
|
WAIT(0)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
Update_Drunk_Widget_Variables()
|
|
|
|
IF (bDrawDebugDrunkInfo <> g_bDrawDebugDrunkInfo)
|
|
IF g_bDrawDebugDrunkInfo
|
|
bDrawDebugDrunkInfo = g_bDrawDebugDrunkInfo
|
|
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
// Clear out any previously sent notices by the drunk controller
|
|
Clear_All_Notices_From_This_Unique_Drunk_Ped_ID(UNIQUE_ID_CONTROL_SCRIPT)
|
|
|
|
// PUBLIC_FUNCTION poster notices get converted to be CONTROL_SCRIPT
|
|
Convert_Public_Function_Posts_To_Be_Control_Script_Posts()
|
|
|
|
// Check each drunk ped to make sure they have sent a 'still drunk' notice
|
|
Maintain_Still_Drunk_Notices()
|
|
|
|
// Read and act on any other notices directed at the drunk controller
|
|
Read_All_Drunk_Notices_Directed_At_Drunk_Controller()
|
|
|
|
// Maintain peds that have requested to be drunk
|
|
Maintain_All_Drunk_Requests()
|
|
|
|
// Maintain the Drunk Camera
|
|
Maintain_Drunk_Camera()
|
|
|
|
iDrunkNotices++
|
|
IF iDrunkNotices >= MAX_NUMBER_OF_DRUNK_NOTICES
|
|
iDrunkNotices = 0
|
|
ENDIF
|
|
iDrunkPeds++
|
|
IF iDrunkPeds >= MAX_NUMBER_OF_DRUNK_PEDS
|
|
iDrunkPeds = 0
|
|
ENDIF
|
|
iDrunkRequest++
|
|
IF iDrunkRequest >= MAX_NUMBER_OF_DRUNK_REQUESTS
|
|
iDrunkRequest = 0
|
|
ENDIF
|
|
|
|
IF NOT Should_Drunk_Controller_Be_Running()
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
AND NOT g_bDebug_KeepDrunkControllerRunning
|
|
#ENDIF
|
|
|
|
CPRINTLN(DEBUG_DRUNK, "...drunk_controller.sc has been forced to cleanup (not running)")
|
|
Drunk_Controller_Cleanup()
|
|
ENDIF
|
|
ENDWHILE
|
|
|
|
ENDSCRIPT
|
|
|