//╒═════════════════════════════════════════════════════════════════════════════╕ //│ Author: Adam Westwood & Colin Considine │ //│ Date: 01/08/10 │ //╞═════════════════════════════════════════════════════════════════════════════╡ //│ │ //│ Hacking Public │ //│ │ //│ Hacking for both singleplayer and multiplayer │ //| │ //│ │ //╘═════════════════════════════════════════════════════════════════════════════╛ /* One shots: HACKING_MOVE_CURSOR - Moving cursor around HACKING_CLICK - Generic clicking on something HACKING_CLICK_BAD - Mis-click HACKING_CLICK_GOOD - Find IP / lock password letter HACKING_DOWNLOADED - Finish downloading the documents HACKING_FAILURE - Out of time HACKING_SUCCESS - Succesfully crack password Loops: HACKING_COUNTDOWN_CRACK_PASS - Background loop for the password crack section HACKING_COUNTDOWN_IP_FIND - Background loop for the IP finding section HACKING_DOWNLOADING - Loop to play while downloading files. */ USING "timer_public.sch" USING "rage_builtins.sch" USING "globals.sch" USING "commands_audio.sch" USING "commands_camera.sch" USING "commands_clock.sch" USING "commands_debug.sch" USING "commands_fire.sch" USING "commands_graphics.sch" USING "commands_hud.sch" USING "commands_misc.sch" USING "commands_object.sch" USING "commands_pad.sch" USING "commands_ped.sch" USING "commands_player.sch" USING "commands_script.sch" USING "commands_streaming.sch" USING "commands_task.sch" USING "commands_vehicle.sch" USING "commands_interiors.sch" USING "net_include.sch" USING "freemode_header.sch" USING "model_enums.sch" USING "script_player.sch" USING "script_misc.sch" USING "selector_public.sch" USING "timer_public.sch" USING "LineActivation.sch" #IF IS_DEBUG_BUILD USING "shared_debug.sch" USING "script_debug.sch" #ENDIF INT iHackMinutes INT iHackSeconds INT iHackMilliseconds INT i_clock_start BOOL bStartHackTimer BOOL bHelpText BOOL bDoMoreHelpText FLOAT FPCMouseMoveDebounce = 0.0 CONST_INT MAX_CONNECT_NUMBERS_HC 80 CONST_INT MAX_SCREEN_ELEMENTS 30 CONST_INT MAX_COLUMN_LENGTH_BF 8 CONST_INT MAX_CHARACTERS_FOR_BF 26 CONST_INT MAX_RANDOM_WORDS 15 CONST_INT NUMBER_OF_LINE_ELEMENTS 300 CONST_INT MAX_SOUNDS 5 CONST_INT i_Minute_Val 1 CONST_INT i_Second_Val 60 CONST_INT i_MiliSecond_Val 1000 INT sHacking[MAX_SOUNDS] TWEAK_FLOAT fSensitivity 8.0 FLOAT fPCMouseAverageX = 0.0 FLOAT fPCMouseAverageY = 0.0 FLOAT fPCMouseAverageCount = 0 CAMERA_INDEX cam_temp SCALEFORM_RETURN_INDEX minigame_return_index //STRUCT WORLD_HACK_LINE // BOOL b_visible // BOOL b_diverted // INT i_last_node_entered // FLOAT x_pos // FLOAT y_pos //ENDSTRUCT CONST_INT BS_IS_HACKING 0 CONST_INT BS_QUIT_HACKING 1 CONST_INT BS_MY_COMPUTER_OPEN 2 CONST_INT BS_MOBILE_OPEN 3 CONST_INT BS_HACK_CONNECT_OPEN 4 CONST_INT BS_BRUTE_FORCE_OPEN 5 CONST_INT BS_SECURITY_DEF_OPEN 6 CONST_INT BS_GENERATE_IP 7 CONST_INT BS_GENERATE_BRUTE_FORCE_DATA 8 CONST_INT BS_BRUTE_FORCE_GAME_SOLVED 9 CONST_INT BS_DRAW_MOUSE 10 CONST_INT BS_ACCESSED_DENIED_OPEN 11 CONST_INT BS_HACKING_SUCCESSFUL 12 CONST_INT BS_NODE_INCREMENTED_X 13 CONST_INT BS_NODE_DECREMENTED_X 14 CONST_INT BS_NODE_INCREMENTED_Y 15 CONST_INT BS_NODE_DECREMENTED_Y 16 CONST_INT BS_HACK_CONNECT_FAIL_TRIGGERED 17 CONST_INT BS_HACK_CONNECT_GAME_SOLVED 18 CONST_INT BS_HACK_CONNECT_GAME_END 19 CONST_INT BS_FIRST_RUN 20 CONST_INT BS_SHOW_FAIL 21 CONST_INT BS_TXD_HACK_LOADED 22 CONST_INT BS_GOT_COLUMN_WRONG 23 CONST_INT BS_FORCE_START_HACKING 24 CONST_INT BS_MP_HACK_FAIL 25 CONST_INT BS_NEW_HACKING_GAME_SOLVED 26 CONST_INT BS_DOWNLOAD_ICON_DISPLAYED 27 CONST_INT BS_DOWNLOAD_OPEN 28 CONST_INT BS_WALLPAPER_INITIALISED 29 CONST_INT BS_BRUTE_FORCE_FAIL_TRIGGER 30 CONST_INT BS_BRUTE_FORCE_INCREASE_FAIL_TELEMETRY 31 CONST_INT BS2_LAUNCH_MG_IMMEDIATIALY 0 CONST_INT BS2_QUIT_MG_IMMEDIATIALY 1 CONST_INT BS2_MAP_SHOWN 2 // ################################# CIRCUIT HACKING MINIGAME VARIABLES - START ################################# // CONST_FLOAT DEFAULT_ASPECT_RATIO_MODIFIER 1.778 // CIRCUIT HACKING MINIGAME BIT SET BOOL VALUES CONST_INT BIT_SET_CIRCUIT_MINIGAME_SOLVED 0 // BOOL: Handles completion flag - Initialises as FALSE CONST_INT BIT_SET_CIRCUIT_MOVE_HEAD 1 // BOOL: Starts/stops Head moving - Initialises as FALSE CONST_INT BIT_SET_CIRCUIT_ENTRY_COLLISION 2 // BOOL: Handles collision on start port so player doesn't die when inside rect, activates port collision when the player is outside the rect - Intialises as FALSE CONST_INT BIT_SET_CIRCUIT_DISABLE_VERTICAL_TURNING 3 // BOOL: Stops player turning up/down when starting level so exits start port properly - Initialises as TRUE (see INIT FUNC) CONST_INT BIT_SET_CIRCUIT_CHANGE_DIRECTION 4 // BOOL: Handles delay on turning so player cant turn into self - Initialises as FALSE CONST_INT BIT_SET_CIRCUIT_LEVEL_PASSED 5 // BOOL: Tells us if we have finished the gameplay part of a level - Initialises as FALSE CONST_INT BIT_SET_CIRCUIT_LEVEL_FAILED 6 // BOOL: Tells us if we have finished the gameplay part of a level - Initialises as FALSE CONST_INT BIT_SET_CIRCUIT_REMOVE_HEAD 7 // BOOL: Tells when to remove the head sprite on level completion - Initialises as FALSE CONST_INT BIT_SET_CIRCUIT_KILL_SCREEN 8 // BOOL: Handles if we should do the kill anim on the snake - Initialises as FALSE CONST_INT BIT_SET_CIRCUIT_DRAW_SYS_UNLOCKED 9 // BOOL: Tells when to draw the system unlocked sprites - Initialses as FALSE CONST_INT BIT_SET_CIRCUIT_DRAWN_SYS_UNLOCKED_BKGROUND 10 // BOOL: Tells when the System Unlocked Background has been drawn - Initialses as FALSE CONST_INT BIT_SET_CIRCUIT_DRAW_UNLOCKED_LOCK 11 // BOOL: Tells when the closed lock has finished rotating so can draw the open lock - Initialses as FALSE CONST_INT BIT_SET_CIRCUIT_START_PHONE_UNLOCK 12 // BOOL: Tells when the player has pressed button to start unlock sequence - Initialses as FALSE CONST_INT BIT_SET_CIRCUIT_GAME_RUNNING 13 // BOOL: Tells if game is currently running - Initialses as TRUE (see INIT FUNC) CONST_INT BIT_SET_CIRCUIT_PULSE_END_PORT_LIGHTS 14 // BOOL: Tells when to stop flashing start port lights to swap to end port lights - Initialises as FASLE CONST_INT BIT_SET_CIRCUIT_PULSE_UP 15 // BOOL: Tells when to swap between the alpha fade in and fade out - Initialises as FASLE CONST_INT BIT_SET_CIRCUIT_PLAY_PASS_AUDIO 16 // BOOL: Signifies if the pass audio has been played - Initialises as FASLE CONST_INT BIT_SET_CIRCUIT_PLAY_FAIL_AUDIO 17 // BOOL: Signifies if the fail audio has been played - Initialises as FASLE CONST_INT BIT_SET_CIRCUIT_WAIT_TIME_PICKED 18 // BOOL: Signifies if we have a wait time selected for the period between debug output spews - Initialises as FALSE CONST_INT BIT_SET_CIRCUIT_RECYCLE_DEBUG_OUTPUT 19 // BOOL: Signifies if we have a reached the end of the debug output array, so we can override from the begining - Initialises as FALSE CONST_INT BIT_SET_CIRCUIT_BLOCK_DEBUG_OUTPUT_SPEW 20 // BOOL: Controls if scaleform reset has finished - Initialises as FALSE CONST_INT BIT_SET_CIRCUIT_DROP_CORE_LIGHTS 21 // BOOL: Signifies when to drop the core lights - Initialises as FALSE CONST_INT BIT_SET_CIRCUIT_AUDIO_ONESHOT 22 // BOOL: Controls if a oneshot audio has been fired - Initialises as FALSE CONST_INT BIT_SET_CIRCUIT_SCALEFORM_SET_UP 23 // BOOL: Controls if scaleform setup has finished - Initialises as FALSE CONST_INT BIT_SET_CIRCUIT_SCALEFORM_RESET 24 // BOOL: Controls if scaleform reset has finished - Initialises as FALSE CONST_INT BIT_SET_CIRCUIT_START_TIMER 25 // BOOL: Tells if timer has starter for heist telemetry - Initialises as FALSE CONST_INT BIT_SET_CIRCUIT_SAFE_TO_USE_PHONE 26 // BOOL: Tells if launching stage is finished and safe to task ped to use phone - Initialises as FALSE CONST_INT BIT_SET_CIRCUIT_ALLOW_DAMAGE 27 // BOOL: Allow player damage #IF IS_DEBUG_BUILD CONST_INT BIT_SET_CIRCUIT_DRAW_WALLS 30 // BOOL: DEBUG ONLY - Controls if we should draw the numbered collision rect boxes for the level's walls - Initialises as FALSE CONST_INT BIT_SET_CIRCUIT_DRAW_ASPECT_TEST 31 // BOOL: DEBUG ONLY - Controls if we should be drawing with the Widescreen Aspect Ratio test state - Initialises as FALSE #ENDIF // Moved data structs to x:\gta5\script\dev_ng\multiplayer\globals\mp_globals_ambience_definitions.sch to prevent stack overflows from size of struct //For multiplayer displaying help text CONST_INT bsClickMyComputer 0 CONST_INT bsConnectViaMobile 1 CONST_INT bsStartHackConnect 2 CONST_INT bsUseHackConnect 3 CONST_INT bsCloseHackConnect 4 CONST_INT bsStartBruteForce 5 CONST_INT bsUseBruteForce 6 CONST_INT bsLogOff 7 /* 888 .d888 888 d88P" 888 888 .d8888b .d8888b 8888b. 888 .d88b. 888888 .d88b. 888d888 88888b.d88b. 88K d88P" "88b 888 d8P Y8b 888 d88""88b 888P" 888 "888 "88b "Y8888b. 888 .d888888 888 88888888 888 888 888 888 888 888 888 X88 Y88b. 888 888 888 Y8b. 888 Y88..88P 888 888 888 888 88888P' "Y8888P "Y888888 888 "Y8888 888 "Y88P" 888 888 888 888 */ SCALEFORM_INDEX sfHacking //anim to be updated with actual hacking anim //STRING sAnimHacking = "amb@computer@hacking@" INT iThisHacking INT iHackTimer CONST_INT cPopUpTime 2500 CONST_INT cPopUpMinTime 500 INT iErrorPopupTimer = 0 BOOL WarningPopup = false //BOOL bTestMiniGame = true // List of minigame feedback flags //ENUM minigame_scaleform_flags // mgsf_nothing = 0, // mgsf_pc_window = 40, // mgsf_av_open = 2, // mgsf_av_start_clean = 50, // mgsf_av_exterminate = 51, // mgsf_av_popup_close = 60 //ENDENUM ENUM DESKTOP_WALLPAPER WALL_FBI = 0, WALL_BANK, WALL_HUMANE, WALL_GOVERMENT, WALL_GENERIC, WALL_MERRYWEATHER, WALL_DUGGAN ENDENUM ENUM UNLOCK_SOUND UNLOCK_SOUND_NONE, UNLOCK_SOUND_VAULT, UNLOCK_SOUND_STANDARD_DOOR, UNLOCK_SOUND_METAL_BAR_DOOR, UNLOCK_SOUND_GARAGE, UNLOCK_SOUND_METAL_GATE, UNLOCK_SOUND_CHAINLINK_FENCE ENDENUM /// REQUEST_HACKING_MINI_GAME /// NOTES: called in the hacking script but can be precalled and checked by the scripter if necessary /// PURPOSE: /// requests assets. /// PARAMS: /// PROC REQUEST_HACKING_MINI_GAME(BOOL bRequestMPAssets = TRUE) //REQUEST_ANIM_DICT(sAnimHacking) IF bRequestMPAssets REQUEST_STREAMED_TEXTURE_DICT("HACKING_PC_desktop_0") REQUEST_STREAMED_TEXTURE_DICT("HACKING_PC_desktop_1") REQUEST_STREAMED_TEXTURE_DICT("HACKING_PC_desktop_2") REQUEST_STREAMED_TEXTURE_DICT("HACKING_PC_desktop_3") REQUEST_STREAMED_TEXTURE_DICT("HACKING_PC_desktop_4") REQUEST_STREAMED_TEXTURE_DICT("HACKING_PC_desktop_5") REQUEST_STREAMED_TEXTURE_DICT("HACKING_PC_desktop_6") ENDIF // bug 2051842, changed to skip render while paused sfHacking = REQUEST_SCALEFORM_MOVIE_SKIP_RENDER_WHILE_PAUSED("Hacking_PC") //sfHacking = REQUEST_SCALEFORM_MOVIE("Hacking_PC") ENDPROC /// HAVE_HACKING_ASSETS_LOADED() /// NOTES: called in the hacking script but can be precalled and checked by the scripter if necessary /// PURPOSE: /// checking assets are loaded /// PARAMS: /// RETURNS: FUNC BOOL HAVE_HACKING_ASSETS_LOADED(BOOL bCheckMPAssets = TRUE) //REQUEST_ANIM_DICT(sAnimHacking) //sfHacking = REQUEST_SCALEFORM_MOVIE("Hacking_PC") //REQUEST_STREAMED_TEXTURE_DICT IF HAS_SCALEFORM_MOVIE_LOADED(sfHacking) AND ( NOT bCheckMPAssets OR ( HAS_STREAMED_TEXTURE_DICT_LOADED("HACKING_PC_desktop_0") AND HAS_STREAMED_TEXTURE_DICT_LOADED("HACKING_PC_desktop_1") AND HAS_STREAMED_TEXTURE_DICT_LOADED("HACKING_PC_desktop_2") AND HAS_STREAMED_TEXTURE_DICT_LOADED("HACKING_PC_desktop_3") AND HAS_STREAMED_TEXTURE_DICT_LOADED("HACKING_PC_desktop_4") AND HAS_STREAMED_TEXTURE_DICT_LOADED("HACKING_PC_desktop_5") AND HAS_STREAMED_TEXTURE_DICT_LOADED("HACKING_PC_desktop_6") ) ) //AND HAS_ANIM_DICT_LOADED(sAnimHacking) RETURN TRUE ENDIF RETURN FALSE ENDFUNC FUNC BOOL MANAGE_HACKING_TIMER(INT&start_time, INT time) INT current_time current_time = GET_GAME_TIMER() PRINTLN("[AW_MISSIONDEBUG] Manage Hacking Timer - ", current_time - start_time, "of " , time, " remaining.") IF ((current_time - start_time) > time) RETURN TRUE ENDIF RETURN FALSE ENDFUNC PROC GET_TIME_AS_MINUTES_SECONDS_MILLISECONDS(INT raw_time, INT &mins, INT &secs, INT &millisecs) mins = (raw_time % (1000*60*60)) / (1000*60) secs = ((raw_time % (1000*60*60)) % (1000*60)) / 1000 millisecs = ((raw_time % (1000*60*60)) % (1000*60) % 1000) ENDPROC // POPUP_MSG() // NOTES: opens a custom error message popup, used thoughout the UI // PARAMS: errorStr PROC POPUP_MSG(BOOL show = TRUE, STRING errorStr = NULL) PRINTSTRING(errorStr) IF show CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER_AND_STRING(sfHacking,"OPEN_ERROR_POPUP", TO_FLOAT(1),INVALID_SCALEFORM_PARAM,INVALID_SCALEFORM_PARAM,INVALID_SCALEFORM_PARAM,INVALID_SCALEFORM_PARAM, errorStr) iErrorPopupTimer = GET_GAME_TIMER() WarningPopup = TRUE ELSE CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER_AND_STRING(sfHacking,"OPEN_ERROR_POPUP", TO_FLOAT(0),INVALID_SCALEFORM_PARAM,INVALID_SCALEFORM_PARAM,INVALID_SCALEFORM_PARAM,INVALID_SCALEFORM_PARAM, errorStr) WarningPopup = FALSE ENDIF ENDPROC PROC MANAGE_SOUNDS() IF iThisHacking < 5 IF IS_CONTROL_JUST_PRESSED (FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT) OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_ACCEPT) PLAY_SOUND_FRONTEND(-1,"HACKING_CLICK") ENDIF ENDIF ENDPROC PROC RANDOMISE_PASSWORD(S_HACKING_DATA &hacking_data, BOOL bUseNewPasswords = FALSE, BOOL bDugganPassword = FALSE) INT iRand IF bUseNewPasswords iRand = GET_RANDOM_INT_IN_RANGE(0,15) IF iRand = 0 hacking_data.sPassword = "GR_PWD_RA" ELIF iRand = 1 hacking_data.sPassword = "GR_PWD_PA" ELIF iRand = 2 hacking_data.sPassword = "GR_PWD_PE" ELIF iRand = 3 hacking_data.sPassword = "GR_PWD_GE" ELIF iRand = 4 hacking_data.sPassword = "GR_PWD_CH" ELIF iRand = 5 hacking_data.sPassword = "GR_PWD_FI" ELIF iRand = 6 hacking_data.sPassword = "GR_PWD_PR" ELIF iRand = 7 hacking_data.sPassword = "GR_PWD_UN" ELIF iRand = 8 hacking_data.sPassword = "GR_PWD_DE" ELIF iRand = 9 hacking_data.sPassword = "GR_PWD_FO" ELIF iRand = 10 hacking_data.sPassword = "GR_PWD_AR" ELIF iRand = 11 hacking_data.sPassword = "GR_PWD_TO" ELIF iRand = 12 hacking_data.sPassword = "GR_PWD_IN" ELIF iRand = 13 hacking_data.sPassword = "GR_PWD_PRI" ELIF iRand = 14 hacking_data.sPassword = "GR_PWD_LA" ELSE hacking_data.sPassword = "GR_PWD_PA" ENDIF ELIF bDugganPassword iRand = GET_RANDOM_INT_IN_RANGE(0,4) IF iRand = 0 hacking_data.sPassword = "DG_PWD_0" ELIF iRand = 1 hacking_data.sPassword = "DG_PWD_1" ELIF iRand = 2 hacking_data.sPassword = "DG_PWD_2" ELIF iRand = 3 hacking_data.sPassword = "DG_PWD_3" ENDIF ELSE iRand = GET_RANDOM_INT_IN_RANGE(0,8) IF iRand = 0 hacking_data.sPassword = "PASSWORD" ELIF iRand = 1 hacking_data.sPassword = "PETSNAME" ELIF iRand = 2 hacking_data.sPassword = "DYNAMITE" ELIF iRand = 3 hacking_data.sPassword = "BACKDOOR" ELIF iRand = 4 hacking_data.sPassword = "MORPHEUS" ELIF iRand = 5 hacking_data.sPassword = "CREAMPIE" ELIF iRand = 6 hacking_data.sPassword = "WORMSIGN" ELIF iRand = 7 hacking_data.sPassword = "UNLOCKED" ELIF iRand = 8 hacking_data.sPassword = "BLUEBOOK" ELIF iRand = 9 hacking_data.sPassword = "DECIPHER" ELIF iRand = 10 hacking_data.sPassword = "JUNKYARD" ELSE hacking_data.sPassword = "PASSWORD" ENDIF ENDIF ENDPROC //RESET_HACKING_DATA //run once to reset the data as though the machine had not been hacked PROC INIT_HACKING_DATA(S_HACKING_DATA &hacking_data) INT HackingInt = 0 FOR HackingInt = (MAX_SOUNDS - 1) to 0 sHacking[HackingInt] = -1 ENDFOR hacking_data.i_hacking_sound = -1 ENDPROC PROC RESET_HACKING_DATA(S_HACKING_DATA &hacking_data,BOOL bRemoveScaleForm = TRUE, BOOL bAllData = TRUE, BOOL bBlockAudioRelease = FALSE) int HackingInt = 0 IF NOT bBlockAudioRelease FOR HackingInt = (MAX_SOUNDS - 1) to 0 IF sHacking[HackingInt] != -1 IF NOT HAS_SOUND_FINISHED(sHacking[HackingInt]) STOP_SOUND(sHacking[HackingInt]) PRINTLN("STOPPING SOUND sHacking[HackingInt]") RELEASE_SOUND_ID(sHacking[HackingInt]) sHacking[HackingInt] = -1 ENDIF ENDIF ENDFOR IF hacking_data.i_hacking_sound > -1 IF NOT HAS_SOUND_FINISHED(hacking_data.i_hacking_sound) PRINTLN("RESET_NEW_HACKING_MINIGAME_DATA - Releasing hacking_data.i_hacking_sound (", hacking_data.i_hacking_sound, ")") STOP_SOUND(hacking_data.i_hacking_sound) RELEASE_SOUND_ID(hacking_data.i_hacking_sound) hacking_data.i_hacking_sound = -1 ENDIF ENDIF ENDIF CLEAR_BIT(hacking_data.bsHacking,BS_MP_HACK_FAIL) CLEAR_BIT(hacking_data.bsHacking,BS_BRUTE_FORCE_OPEN) IF bAllData = TRUE CLEAR_BIT(hacking_data.bsHacking,BS_HACKING_SUCCESSFUL) CLEAR_BIT(hacking_data.bsHacking,BS_BRUTE_FORCE_GAME_SOLVED) CLEAR_BIT(hacking_data.bsHacking,BS_HACK_CONNECT_GAME_SOLVED) CLEAR_BIT(hacking_data.iBS2Hacking, BS2_MAP_SHOWN) //Agency CLEAR_BIT(hacking_data.bsHacking,BS_DOWNLOAD_ICON_DISPLAYED) CLEAR_BIT(hacking_data.bsHacking,BS_DOWNLOAD_OPEN) ENDIF hacking_data.iBS2Hacking = 0 hacking_data.i_lives = hacking_data.i_max_lives iThisHacking = 0 //REMOVE_ANIM_DICT(sAnimHacking) IF bRemoveScaleForm SET_SCALEFORM_MOVIE_AS_NO_LONGER_NEEDED(sfHacking) ENDIF CLEAR_BIT(hacking_data.bsHacking,BS_WALLPAPER_INITIALISED) SET_MULTIHEAD_SAFE(FALSE, TRUE) // SET_SPRITES_DRAW_BEFORE_FADE(FALSE) // SET_SCRIPT_GFX_DRAW_ORDER(FALSE) ENDPROC /// FORCE_QUIT_FAIL_HACKING_MINIGAME_KEEP_DATA (pass in your own hacking data struct) /// NOTES: Force the termination of the hacking minigame and cause the player to fail but preserves variable data. /// PURPOSE: /// Force the termination of the hacking minigame and cause the player to fail. /// PARAMS: /// S_HACKING_DATA &hacking_data - hacking data /// RETURNS: /// No Returns /// PROC FORCE_QUIT_FAIL_HACKING_MINIGAME_KEEP_DATA(S_HACKING_DATA &hacking_data) // SET_SPRITES_DRAW_BEFORE_FADE(FALSE) // SET_SCRIPT_GFX_DRAW_ORDER(FALSE) SET_PED_CURRENT_WEAPON_VISIBLE(PLAYER_PED_ID(),TRUE) IF IS_MINIGAME_IN_PROGRESS() SET_MINIGAME_IN_PROGRESS(FALSE) ENDIF CLEAR_HELP() SET_PLAYER_CONTROL(PLAYER_ID(),TRUE) DESTROY_CAM(cam_temp) DISABLE_CELLPHONE(FALSE) DISABLE_SCRIPT_HUD_THIS_FRAME_RESET() SET_BIT(hacking_data.bsHacking,BS_QUIT_HACKING) FORCE_POSTFX_BULLET_IMPACTS_AFTER_HUD(FALSE) RESET_HACKING_DATA(hacking_data,TRUE,FALSE) #IF IS_NEXTGEN_BUILD // DISABLE MULTIPLE DISPLAYS/BLINDERS SET_MULTIHEAD_SAFE(FALSE, TRUE) PRINTLN( "Hacking mini game RENDER_PC()Disable SET_MULTIHEAD_SAFE") #ENDIF ENDPROC FUNC BOOL HAS_PLAYER_QUIT_THE_HACKING(S_HACKING_DATA &hacking_data) IF IS_BIT_SET(hacking_data.bsHacking,BS_QUIT_HACKING) CLEAR_BIT(hacking_data.bsHacking,BS_QUIT_HACKING) FORCE_POSTFX_BULLET_IMPACTS_AFTER_HUD(FALSE) RETURN TRUE ELSE RETURN FALSE ENDIF ENDFUNC // FORCE_PASSWORD_TO_BE_STRING() // NOTES: ensure you call this if you have set the random password flag to false. // checking assets are loaded // PARAMS: // RETURNS: PROC FORCE_PASSWORD_TO_BE_STRING(S_HACKING_DATA &hacking_data,STRING sYourString) hacking_data.sPassword = sYourString ENDPROC /// PURPOSE: /// Initialises the wallpaper of the hacking scaleform and icon labels /// PARAMS: /// wall - the wall paper to use PROC INITIALISE_HACKING_WALLPAPER_AND_ICONS(S_HACKING_DATA &hacking_data, DESKTOP_WALLPAPER wall = WALL_BANK, BOOL bHideMyComputer = FALSE) IF NOT IS_BIT_SET(hacking_data.bsHacking,BS_WALLPAPER_INITIALISED) //IF NOT hacking_data.b_wallpaper_initialised // initialise wall paper PRINTLN("[AW_HACKING] DESKTOP_WALLPAPER selected as : ", ENUM_TO_INT(wall)) PRINTLN("[AW_HACKING] bHideMyComputer : ", bHideMyComputer) CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"SET_BACKGROUND",TO_FLOAT(ENUM_TO_INT(wall))) IF (!bHideMyComputer) // Intialise icons and labels IF GET_IS_WIDESCREEN() CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER_AND_STRING(sfHacking,"ADD_PROGRAM",TO_FLOAT(7),TO_FLOAT(4),INVALID_SCALEFORM_PARAM,INVALID_SCALEFORM_PARAM,INVALID_SCALEFORM_PARAM,"MyComputer") ELSE CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER_AND_STRING(sfHacking,"ADD_PROGRAM",TO_FLOAT(8),TO_FLOAT(4),INVALID_SCALEFORM_PARAM,INVALID_SCALEFORM_PARAM,INVALID_SCALEFORM_PARAM,"MyComputer") ENDIF ENDIF BEGIN_SCALEFORM_MOVIE_METHOD(sfHacking, "SET_LABELS") SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("H_ICON_1") IF wall = WALL_FBI SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("H_ICON_2a") ELSE SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("H_ICON_2") ENDIF SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("H_ICON_3") SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("H_ICON_4") SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("H_ICON_5") SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("H_ICON_6") END_SCALEFORM_MOVIE_METHOD() SET_BIT(hacking_data.bsHacking,BS_WALLPAPER_INITIALISED) //hacking_data.b_wallpaper_initialised = TRUE ENDIF ENDPROC STRUCT S_SPRITE_DATA FLOAT fCentreX FLOAT fCentreY // FLOAT fWidth // FLOAT fHeight //FLOAT fRotation ENDSTRUCT STRUCT S_DC_MINIGAME_DATA INT iCurrentlySelectedColumn INT iIncrementFailCount ENDSTRUCT STRUCT S_DC_COLUMN_DATA BOOL bRowLocked FLOAT fSpeed FLOAT fPosition BOOL bGoUP //FLOAT fSoundValue ENDSTRUCT S_SPRITE_DATA sMainWindowData S_SPRITE_DATA sMainComponentData[8] S_DC_MINIGAME_DATA sThisDCHacking S_DC_COLUMN_DATA sColumnData[8] FLOAT fSoundValue //0.568 //0.574 //next gen only tolerance change //FLOAT UpperTol = 0.59 //FLOAT LowerTol = 0.54 FLOAT UpperTol = 0.62 FLOAT LowerTol = 0.51 FLOAT fScaleDifficulty = 0.55 #IF IS_DEBUG_BUILD WIDGET_GROUP_ID wgThisMissionsWidget PROC CREATE_HACK_WIDGETS() wgThisMissionsWidget = START_WIDGET_GROUP("Hacking MiniGame") SET_CURRENT_WIDGET_GROUP(wgThisMissionsWidget) START_WIDGET_GROUP("Hacking Minigame") ADD_WIDGET_FLOAT_SLIDER("sMainWindowData.fCentreX",sMainWindowData.fCentreX,0.0,1.0,0.001) ADD_WIDGET_FLOAT_SLIDER("sMainWindowData.fCentreY", sMainWindowData.fCentreY,0.0,1.0,0.001) ADD_WIDGET_FLOAT_SLIDER("sMainComponentData[0].fCentreX", sMainComponentData[0].fCentreX,0.0,1.0,0.001) ADD_WIDGET_FLOAT_SLIDER("sMainComponentData[0].fCentreY", sMainComponentData[0].fCentreY,0.0,1.0,0.001) ADD_WIDGET_FLOAT_SLIDER("sMainComponentData[1].fCentreX", sMainComponentData[1].fCentreX,0.0,1.0,0.001) ADD_WIDGET_FLOAT_SLIDER("sMainComponentData[1].fCentreY", sMainComponentData[1].fCentreY,0.0,1.0,0.001) ADD_WIDGET_FLOAT_SLIDER("sMainComponentData[2].fCentreX", sMainComponentData[2].fCentreX,0.0,1.0,0.001) ADD_WIDGET_FLOAT_SLIDER("sMainComponentData[2].fCentreY", sMainComponentData[2].fCentreY,0.0,1.0,0.001) ADD_WIDGET_FLOAT_SLIDER("sMainComponentData[3].fCentreX", sMainComponentData[3].fCentreX,0.0,1.0,0.001) ADD_WIDGET_FLOAT_SLIDER("sMainComponentData[3].fCentreY", sMainComponentData[3].fCentreY,0.0,1.0,0.001) ADD_WIDGET_FLOAT_SLIDER("sMainComponentData[4].fCentreX", sMainComponentData[4].fCentreX,0.0,1.0,0.001) ADD_WIDGET_FLOAT_SLIDER("sMainComponentData[4].fCentreY", sMainComponentData[4].fCentreY,0.0,1.0,0.001) ADD_WIDGET_FLOAT_SLIDER("sMainComponentData[5].fCentreX", sMainComponentData[5].fCentreX,0.0,1.0,0.001) ADD_WIDGET_FLOAT_SLIDER("sMainComponentData[5].fCentreY", sMainComponentData[5].fCentreY,0.0,1.0,0.001) ADD_WIDGET_FLOAT_SLIDER("sMainComponentData[6].fCentreX", sMainComponentData[6].fCentreX,0.0,1.0,0.001) ADD_WIDGET_FLOAT_SLIDER("sMainComponentData[6].fCentreY", sMainComponentData[6].fCentreY,0.0,1.0,0.001) ADD_WIDGET_FLOAT_SLIDER("sMainComponentData[7].fCentreX", sMainComponentData[7].fCentreX,0.0,1.0,0.001) ADD_WIDGET_FLOAT_SLIDER("sMainComponentData[7].fCentreY", sMainComponentData[7].fCentreY,0.0,1.0,0.001) //ADD_WIDGET_FLOAT_SLIDER("sMainComponentData[7].fWidth", sMainComponentData[7].fWidth,-10.0,10.0,0.001) //ADD_WIDGET_FLOAT_SLIDER("sMainComponentData[7].fHeight", sMainComponentData[7].fHeight,-10.0,10.0,0.001) //ADD_WIDGET_FLOAT_SLIDER("sMainComponentData[7].fRotation", sMainComponentData[7].fRotation,-360,360,0.001) ADD_WIDGET_FLOAT_SLIDER("fColumnSpeed", sColumnData[0].fSpeed,-360,360,0.0001) ADD_WIDGET_FLOAT_SLIDER("fColumnSpeed", sColumnData[1].fSpeed,-360,360,0.0001) ADD_WIDGET_FLOAT_SLIDER("fColumnSpeed", sColumnData[2].fSpeed,-360,360,0.0001) ADD_WIDGET_FLOAT_SLIDER("fColumnSpeed", sColumnData[3].fSpeed,-360,360,0.0001) ADD_WIDGET_FLOAT_SLIDER("fColumnSpeed", sColumnData[4].fSpeed,-360,360,0.0001) ADD_WIDGET_FLOAT_SLIDER("fColumnSpeed", sColumnData[5].fSpeed,-360,360,0.0001) ADD_WIDGET_FLOAT_SLIDER("fColumnSpeed", sColumnData[6].fSpeed,-360,360,0.0001) ADD_WIDGET_FLOAT_SLIDER("fColumnSpeed", sColumnData[7].fSpeed,-360,360,0.0001) ADD_WIDGET_FLOAT_SLIDER("UpperTol", UpperTol,0.0,1.0,0.001) ADD_WIDGET_FLOAT_SLIDER("LowerTol", LowerTol,0.0,1.0,0.001) ADD_WIDGET_FLOAT_SLIDER("fScaleDifficulty ", fScaleDifficulty ,0.0,10.0,0.001) STOP_WIDGET_GROUP() ENDPROC #ENDIF PROC INITIALISE_MINI_GAME_VALUES() UpperTol = 0.6 LowerTol = 0.53 sColumnData[0].fSpeed = 0.02 * fScaleDifficulty sColumnData[1].fSpeed = 0.025 * fScaleDifficulty sColumnData[2].fSpeed = 0.03 * fScaleDifficulty sColumnData[3].fSpeed = 0.035 * fScaleDifficulty sColumnData[4].fSpeed = 0.04 * fScaleDifficulty sColumnData[5].fSpeed = 0.045 * fScaleDifficulty sColumnData[6].fSpeed = 0.048 * fScaleDifficulty sColumnData[7].fSpeed = 0.05 * fScaleDifficulty sColumnData[0].bRowLocked = FALSE sColumnData[1].bRowLocked = FALSE sColumnData[2].bRowLocked = FALSE sColumnData[3].bRowLocked = FALSE sColumnData[4].bRowLocked = FALSE sColumnData[5].bRowLocked = FALSE sColumnData[6].bRowLocked = FALSE sColumnData[7].bRowLocked = FALSE sMainWindowData.fCentreX = 0.5 sMainWindowData.fCentreY = 0.5 sMainComponentData[0].fCentreX = 0.350 sMainComponentData[0].fCentreY = 0.4 //0.572 centre sMainComponentData[1].fCentreX = 0.390 sMainComponentData[1].fCentreY = 0.4 sMainComponentData[2].fCentreX = 0.430 sMainComponentData[2].fCentreY = 0.4 sMainComponentData[3].fCentreX = 0.470 sMainComponentData[3].fCentreY = 0.4 sMainComponentData[4].fCentreX = 0.510 sMainComponentData[4].fCentreY = 0.740 sMainComponentData[5].fCentreX = 0.550 sMainComponentData[5].fCentreY = 0.740 sMainComponentData[6].fCentreX = 0.590 sMainComponentData[6].fCentreY = 0.740 sMainComponentData[7].fCentreX = 0.630 sMainComponentData[7].fCentreY = 0.740 ENDPROC FUNC BOOL IS_COLUMN_IN_POSITION(INT iColumnNum) IF sMainComponentData[iColumnNum].fCentreY >= LowerTol AND sMainComponentData[iColumnNum].fCentreY <= UpperTol RETURN TRUE ENDIF RETURN FALSE ENDFUNC FUNC BOOL IS_COLUMN_PERFECTLY_IN_POSITION(INT iColumnNum) IF sMainComponentData[iColumnNum].fCentreY = 0.5 RETURN TRUE ENDIF RETURN FALSE ENDFUNC //Safe zone //0.568 //0.574 //Movement //0.4 //0.744 FLOAT fNormalisingValue = 25 CONST_INT ciNUMBER_OF_NEW_MINI_GAME_SOUND_IDS 8 INT iLockOutTimer INT iNewMiniGameSoundID[ciNUMBER_OF_NEW_MINI_GAME_SOUND_IDS] INT iNewMiniGameSoundBitSet PROC RUN_NEW_MINIGAME(S_HACKING_DATA &hacking_data) INT iDCColumn = 0 //PRINTLN("iThisHackingNG")PRINTLN(iThisHackingNG)PRINTNL() IF hacking_data.iThisHackingNG > 0 IF IS_BIT_SET(hacking_data.bsHacking,BS_TXD_HACK_LOADED) IF HAS_STREAMED_TEXTURE_DICT_LOADED("hackingNG") IF NOT IS_PAUSE_MENU_ACTIVE() DRAW_SPRITE("hackingNG", "DHMain", sMainWindowData.fCentreX, sMainWindowData.fCentreY, 0.731, 1.306 , 0, 255, 255, 255, 255) ENDIF ENDIF ENDIF ENDIF IF sColumnData[0].bRowLocked = TRUE AND sColumnData[1].bRowLocked = TRUE AND sColumnData[2].bRowLocked = TRUE AND sColumnData[3].bRowLocked = TRUE AND sColumnData[4].bRowLocked = TRUE AND sColumnData[5].bRowLocked = TRUE AND sColumnData[6].bRowLocked = TRUE AND sColumnData[7].bRowLocked = TRUE PLAY_SOUND_FRONTEND(-1,"Hack_Success" ,"DLC_HEIST_BIOLAB_PREP_HACKING_SOUNDS") IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("H1_HNG") CLEAR_HELP() ENDIF IF IS_PC_VERSION() IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("H1_HNG_KM") CLEAR_HELP() ENDIF ENDIF SET_BIT(hacking_data.bsHacking,BS_NEW_HACKING_GAME_SOLVED) //hacking_data.b_new_hacking_game_solved = TRUE ELSE // Different help on PC keyboard and mouse IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL) IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("H1_HNG_KM") PRINT_HELP_FOREVER("H1_HNG_KM") ENDIF ELSE IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("H1_HNG") PRINT_HELP_FOREVER("H1_HNG") ENDIF ENDIF ENDIF SWITCH hacking_data.iThisHackingNG CASE 0 #IF IS_DEBUG_BUILD PRINTLN("RUN_NEW_MINIGAME - SCALING WITH FRAMERATE ") #ENDIF REQUEST_STREAMED_TEXTURE_DICT("hackingNG") CLEAR_BIT(hacking_data.bsHacking,BS_TXD_HACK_LOADED) PRINTLN("RUN_NEW_MINIGAME()")PRINTNL() INITIALISE_MINI_GAME_VALUES() iLockOutTimer = GET_GAME_TIMER() sThisDCHacking.iCurrentlySelectedColumn = 0 CLEAR_BIT(iNewMiniGameSoundBitSet,0) CLEAR_BIT(iNewMiniGameSoundBitSet,1) CLEAR_BIT(iNewMiniGameSoundBitSet,2) CLEAR_BIT(iNewMiniGameSoundBitSet,3) CLEAR_BIT(iNewMiniGameSoundBitSet,4) CLEAR_BIT(iNewMiniGameSoundBitSet,5) CLEAR_BIT(iNewMiniGameSoundBitSet,6) CLEAR_BIT(iNewMiniGameSoundBitSet,7) hacking_data.iThisHackingNG ++ BREAK CASE 1 IF HAS_STREAMED_TEXTURE_DICT_LOADED("hackingNG") SET_BIT(hacking_data.bsHacking,BS_TXD_HACK_LOADED) #IF IS_DEBUG_BUILD //CREATE_HACK_WIDGETS() #ENDIF BEGIN_SCALEFORM_MOVIE_METHOD(sfHacking, "SET_CURSOR_VISIBILITY") SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(FALSE) END_SCALEFORM_MOVIE_METHOD() hacking_data.iThisHackingNG ++ ENDIF BREAK CASE 2 #IF IS_DEBUG_BUILD // Reset IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_0) sThisDCHacking.iCurrentlySelectedColumn = 0 sColumnData[0].bRowLocked = FALSE sColumnData[1].bRowLocked = FALSE sColumnData[2].bRowLocked = FALSE sColumnData[3].bRowLocked = FALSE sColumnData[4].bRowLocked = FALSE sColumnData[5].bRowLocked = FALSE sColumnData[6].bRowLocked = FALSE sColumnData[7].bRowLocked = FALSE hacking_data.iThisHackingNG = 0 ENDIF IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD4) fNormalisingValue = fNormalisingValue - 1 PRINTLN("fNormalisingValue: ",fNormalisingValue) ENDIF IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD6) fNormalisingValue = fNormalisingValue + 1 PRINTLN("fNormalisingValue: ",fNormalisingValue) ENDIF #ENDIF FOR iDCColumn = 0 TO ( 7 ) IF sColumnData[iDCColumn].bGoUP = TRUE IF sColumnData[iDCColumn].fPosition < 1 sColumnData[iDCColumn].fPosition = sColumnData[iDCColumn].fPosition + (sColumnData[iDCColumn].fSpeed *(TIMESTEP()) * fNormalisingValue) ELSE sColumnData[iDCColumn].bGoUP = FALSE ENDIF ELSE IF sColumnData[iDCColumn].fPosition > 0 sColumnData[iDCColumn].fPosition = sColumnData[iDCColumn].fPosition - (sColumnData[iDCColumn].fSpeed *(TIMESTEP()) * fNormalisingValue) ELSE sColumnData[iDCColumn].bGoUP = TRUE ENDIF ENDIF IF sColumnData[iDCColumn].bRowLocked = FALSE sMainComponentData[iDCColumn].fCentreY = COSINE_INTERP_FLOAT(0.744,0.4,sColumnData[iDCColumn].fPosition) //*TIMESTEP() ENDIF ENDFOR //Position Sound FOR iDCColumn = 0 TO ( 7 ) IF sColumnData[iDCColumn].bRowLocked = FALSE IF sThisDCHacking.iCurrentlySelectedColumn = iDCColumn IF NOT IS_BIT_SET(iNewMiniGameSoundBitSet,iDCColumn) iNewMiniGameSoundID[iDCColumn] = GET_SOUND_ID() PLAY_SOUND_FRONTEND(iNewMiniGameSoundID[iDCColumn],"Pin_Movement","DLC_HEIST_BIOLAB_PREP_HACKING_SOUNDS") SET_BIT(iNewMiniGameSoundBitSet,iDCColumn) PRINTLN("iNewMiniGameSoundID: for column : ",iDCColumn) ELSE IF sColumnData[iDCColumn].fPosition >= 0.5 fSoundValue = 2 * (1- sColumnData[iDCColumn].fPosition) ELSE fSoundValue = 2 * sColumnData[iDCColumn].fPosition ENDIF SET_VARIABLE_ON_SOUND(iNewMiniGameSoundID[iDCColumn],"PinMovementY",fSoundValue) PRINTLN("iNewMiniGameSoundID: setting variable sound on column: ",iDCColumn, "with the following value: ", fSoundValue) ENDIF ENDIF ELSE IF IS_BIT_SET(iNewMiniGameSoundBitSet,iDCColumn) STOP_SOUND(iNewMiniGameSoundID[iDCColumn]) RELEASE_SOUND_ID(iNewMiniGameSoundID[iDCColumn]) CLEAR_BIT(iNewMiniGameSoundBitSet,iDCColumn) iNewMiniGameSoundID[iDCColumn] = -1 ENDIF ENDIF ENDFOR IF IS_COLUMN_PERFECTLY_IN_POSITION(sThisDCHacking.iCurrentlySelectedColumn) PLAY_SOUND_FRONTEND(-1,"Pin_Centred" ,"DLC_HEIST_BIOLAB_PREP_HACKING_SOUNDS") ENDIF IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT) OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_ACCEPT) IF MANAGE_HACKING_TIMER(iLockOutTimer,300) PRINTLN("sThisDCHacking.iCurrentlySelectedColumn:")PRINTLN(sThisDCHacking.iCurrentlySelectedColumn)PRINTNL() PRINTLN("fCentreY:")PRINTLN(sMainComponentData[sThisDCHacking.iCurrentlySelectedColumn].fCentreY)PRINTNL() IF IS_COLUMN_IN_POSITION(sThisDCHacking.iCurrentlySelectedColumn) sColumnData[sThisDCHacking.iCurrentlySelectedColumn].bRowLocked = TRUE sMainComponentData[sThisDCHacking.iCurrentlySelectedColumn].fCentreY = 0.572 PLAY_SOUND_FRONTEND(-1,"Pin_Good" ,"DLC_HEIST_BIOLAB_PREP_HACKING_SOUNDS") IF sThisDCHacking.iCurrentlySelectedColumn != 7 sThisDCHacking.iCurrentlySelectedColumn ++ ENDIF ELSE IF sThisDCHacking.iCurrentlySelectedColumn != 0 IF IS_BIT_SET(iNewMiniGameSoundBitSet,sThisDCHacking.iCurrentlySelectedColumn) PRINTLN("Column:", sThisDCHacking.iCurrentlySelectedColumn, " is not in position - stopping sound.") STOP_SOUND(iNewMiniGameSoundID[sThisDCHacking.iCurrentlySelectedColumn]) RELEASE_SOUND_ID(iNewMiniGameSoundID[sThisDCHacking.iCurrentlySelectedColumn]) CLEAR_BIT(iNewMiniGameSoundBitSet,sThisDCHacking.iCurrentlySelectedColumn) iNewMiniGameSoundID[sThisDCHacking.iCurrentlySelectedColumn] = -1 ENDIF PRINTLN("!!!Failed ")PRINTLN() PRINTLN("Column number ")PRINTLN(sThisDCHacking.iCurrentlySelectedColumn - 1)PRINTLN(" unlocked.")PRINTNL() sColumnData[sThisDCHacking.iCurrentlySelectedColumn - 1].bRowLocked = FALSE sThisDCHacking.iCurrentlySelectedColumn = sThisDCHacking.iCurrentlySelectedColumn - 1 ENDIF IF NOT IS_PAUSE_MENU_ACTIVE() DRAW_RECT(0.5, 0.5, 4.0, 4.0, 255, 0, 0, 100) ENDIF iLockOutTimer = GET_GAME_TIMER() SET_CONTROL_SHAKE(PLAYER_CONTROL,100,100) PLAY_SOUND_FRONTEND(-1,"Pin_Bad" ,"DLC_HEIST_BIOLAB_PREP_HACKING_SOUNDS") sThisDCHacking.iIncrementFailCount = 1 ENDIF ELSE IF NOT IS_PAUSE_MENU_ACTIVE() //Bug Change: 2226859 DRAW_SPRITE("hackingNG", "DHMain", sMainWindowData.fCentreX, sMainWindowData.fCentreY, 0.731, 1.306 , 0, 255, 0, 0, 100) //DRAW_RECT(0.5, 0.5, 4.0, 4.0, 255, 0, 0, 200) ENDIF iLockOutTimer = GET_GAME_TIMER() SET_CONTROL_SHAKE(PLAYER_CONTROL,100,100) ENDIF ENDIF IF NOT IS_PAUSE_MENU_ACTIVE() IF sThisDCHacking.iCurrentlySelectedColumn = 0 DRAW_SPRITE("hackingNG", "DHCompHi", sMainComponentData[0].fCentreX, sMainComponentData[0].fCentreY, 0.4, 0.4, 0, 255, 255, 255, 255) ELSE DRAW_SPRITE("hackingNG", "DHComp", sMainComponentData[0].fCentreX, sMainComponentData[0].fCentreY, 0.4, 0.4, 0, 255, 255, 255, 255) ENDIF IF sThisDCHacking.iCurrentlySelectedColumn = 1 DRAW_SPRITE("hackingNG", "DHCompHi", sMainComponentData[1].fCentreX, sMainComponentData[1].fCentreY, 0.4, 0.4, 0, 255, 255, 255, 255) ELSE DRAW_SPRITE("hackingNG", "DHComp", sMainComponentData[1].fCentreX, sMainComponentData[1].fCentreY, 0.4, 0.4, 0, 255, 255, 255, 255) ENDIF IF sThisDCHacking.iCurrentlySelectedColumn = 2 DRAW_SPRITE("hackingNG", "DHCompHi", sMainComponentData[2].fCentreX, sMainComponentData[2].fCentreY, 0.4, 0.4, 0, 255, 255, 255, 255) ELSE DRAW_SPRITE("hackingNG", "DHComp", sMainComponentData[2].fCentreX, sMainComponentData[2].fCentreY, 0.4, 0.4, 0, 255, 255, 255, 255) ENDIF IF sThisDCHacking.iCurrentlySelectedColumn = 3 DRAW_SPRITE("hackingNG", "DHCompHi", sMainComponentData[3].fCentreX, sMainComponentData[3].fCentreY, 0.4, 0.4, 0, 255, 255, 255, 255) ELSE DRAW_SPRITE("hackingNG", "DHComp", sMainComponentData[3].fCentreX, sMainComponentData[3].fCentreY, 0.4, 0.4, 0, 255, 255, 255, 255) ENDIF IF sThisDCHacking.iCurrentlySelectedColumn = 4 DRAW_SPRITE("hackingNG", "DHCompHi", sMainComponentData[4].fCentreX, sMainComponentData[4].fCentreY, 0.4, 0.4, 0, 255, 255, 255, 255) ELSE DRAW_SPRITE("hackingNG", "DHComp", sMainComponentData[4].fCentreX, sMainComponentData[4].fCentreY, 0.4, 0.4, 0, 255, 255, 255, 255) ENDIF IF sThisDCHacking.iCurrentlySelectedColumn = 5 DRAW_SPRITE("hackingNG", "DHCompHi", sMainComponentData[5].fCentreX, sMainComponentData[5].fCentreY, 0.4, 0.4, 0, 255, 255, 255, 255) ELSE DRAW_SPRITE("hackingNG", "DHComp", sMainComponentData[5].fCentreX, sMainComponentData[5].fCentreY, 0.4, 0.4, 0, 255, 255, 255, 255) ENDIF IF sThisDCHacking.iCurrentlySelectedColumn = 6 DRAW_SPRITE("hackingNG", "DHCompHi", sMainComponentData[6].fCentreX, sMainComponentData[6].fCentreY, 0.4, 0.4, 0, 255, 255, 255, 255) ELSE DRAW_SPRITE("hackingNG", "DHComp", sMainComponentData[6].fCentreX, sMainComponentData[6].fCentreY, 0.4, 0.4, 0, 255, 255, 255, 255) ENDIF IF sThisDCHacking.iCurrentlySelectedColumn = 7 DRAW_SPRITE("hackingNG", "DHCompHi", sMainComponentData[7].fCentreX, sMainComponentData[7].fCentreY, 0.4, 0.4, 0, 255, 255, 255, 255) ELSE DRAW_SPRITE("hackingNG", "DHComp", sMainComponentData[7].fCentreX, sMainComponentData[7].fCentreY, 0.4, 0.4, 0, 255, 255, 255, 255) ENDIF IF IS_BIT_SET(hacking_data.iBS2Hacking, BS2_LAUNCH_MG_IMMEDIATIALY) IF NOT IS_BIT_SET(hacking_data.iBS2Hacking, BS2_QUIT_MG_IMMEDIATIALY) IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL) SET_BIT(hacking_data.iBS2Hacking, BS2_QUIT_MG_IMMEDIATIALY) CLEAR_HELP() ENDIF ENDIF ENDIF ENDIF BREAK ENDSWITCH ENDPROC PROC RESET_NEW_HACKING_MINIGAME_DATA(S_HACKING_DATA &hacking_data) RESET_HACKING_DATA(hacking_data) hacking_data.bsHacking = 0 hacking_data.iThisHackingNG = 0 sThisDCHacking.iCurrentlySelectedColumn = 0 sThisDCHacking.iIncrementFailCount = 0 CLEAR_BIT(hacking_data.bsHacking,BS_NEW_HACKING_GAME_SOLVED) //Unlock collumns sColumnData[0].bRowLocked = FALSE sColumnData[1].bRowLocked = FALSE sColumnData[2].bRowLocked = FALSE sColumnData[3].bRowLocked = FALSE sColumnData[4].bRowLocked = FALSE sColumnData[5].bRowLocked = FALSE sColumnData[6].bRowLocked = FALSE sColumnData[7].bRowLocked = FALSE ENDPROC BOOL bDownAndOutHelp BOOL bPlaySuccessBeep = FALSE // RENDER_PC() // NOTES: called in the hacking script but can be precalled and checked by the scripter if necessary // checking assets are loaded // PARAMS: // RETURNS: PROC RENDER_PC(S_HACKING_DATA &hacking_data, INT iStartLives = 5, INT iMaxLives = 5, INT iStartingSpeed = 100, INT iSpeedDecayRate = 10, INT iBruteForceColumns = 8, INT iChanceOfRedHerrings = 10,BOOL bDoTutorial = FALSE,BOOL bJustHackConnect = FALSE,BOOL bJustBruteForce = FALSE,BOOL bRandomPassword = TRUE, BOOL bHackConnectBeforeBrute = FALSE, BOOL bExitButton = FALSE, BOOL bDoDownloadOpen = FALSE, desktop_wallpaper wall = WALL_FBI,INT iHackingStartTime = 60000, BOOL bMP = TRUE, BOOL bSetInstructionalButtonsUnderHud = TRUE, BOOL bUseNewPasswords = FALSE, BOOL bUseNewSound = FALSE, BOOL bHideMyComputer = FALSE, BOOL bDoMapOpen = FALSE, BOOL bDugganPassword = FALSE) ALLOW_ALTERNATIVE_SCRIPT_CONTROLS_LAYOUT(PLAYER_CONTROL) ALLOW_ALTERNATIVE_SCRIPT_CONTROLS_LAYOUT(FRONTEND_CONTROL) SET_SCRIPT_GFX_DRAW_BEHIND_PAUSEMENU(TRUE) IF bSetInstructionalButtonsUnderHud SET_INSTRUCTIONAL_BUTTONS_UNDER_HUD_THIS_FRAME() ENDIF DISABLE_SCRIPT_HUD_THIS_FRAME(HUDPART_ALL_OVERHEADS) DISABLE_CELLPHONE_THIS_FRAME_ONLY() //PRINTLN("iThisHacking")PRINTLN(iThisHacking)PRINTNL() INT iClick INT rawTime INT iPadLeftX, iPadLeftY, iPadRightX, iPadRightY //SCALEFORM_RETURN_INDEX iClick //IF iThisHacking > 1 IF HAVE_HACKING_ASSETS_LOADED(bMP) IF NOT IS_PAUSE_MENU_ACTIVE() HIDE_HUD_AND_RADAR_THIS_FRAME() SET_SCRIPT_GFX_DRAW_ORDER(GFX_ORDER_BEFORE_HUD) IF GET_PAUSE_MENU_STATE() = PM_INACTIVE AND NOT IS_PAUSE_MENU_ACTIVE() DRAW_SCALEFORM_MOVIE_FULLSCREEN(sfHacking,255,255,255,0) ENDIF ENDIF IF IS_USING_CURSOR( FRONTEND_CONTROL ) //FLOAT f_PCMousePosX, f_PCMousePosY //GET_MOUSE_POSITION( f_PCMousePosX, f_PCMousePosY ) hacking_data.f_PCMousePosX = GET_CONTROL_UNBOUND_NORMAL( FRONTEND_CONTROL, INPUT_CURSOR_X ) hacking_data.f_PCMousePosY = GET_CONTROL_UNBOUND_NORMAL( FRONTEND_CONTROL, INPUT_CURSOR_Y ) IF hacking_data.f_PCMousePosPrevX != hacking_data.f_PCMousePosX OR hacking_data.f_PCMousePosPrevY != hacking_data.f_PCMousePosY BEGIN_SCALEFORM_MOVIE_METHOD(sfHacking, "SET_CURSOR") SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT( hacking_data.f_PCMousePosX ) SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT( hacking_data.f_PCMousePosY ) END_SCALEFORM_MOVIE_METHOD() ENDIF hacking_data.f_PCMousePosPrevX = hacking_data.f_PCMousePosX hacking_data.f_PCMousePosPrevY = hacking_data.f_PCMousePosY ELSE GET_CONTROL_VALUE_OF_ANALOGUE_STICKS(iPadLeftX,iPadLeftY,iPadRightX,iPadRightY) //Fix for unref IF iPadRightX < 0 OR iPadRightY < 0 ENDIF FLOAT fXMove FLOAT fYMove fXMove = TO_FLOAT(iPadLeftX)*fSensitivity*TIMESTEP() fYMove = TO_FLOAT(iPadLeftY)*fSensitivity*TIMESTEP() // PRINTSTRING("fXMove:")PRINTFLOAT(fXMove)PRINTNL() // PRINTSTRING("fYMove:")PRINTFLOAT(fYMove)PRINTNL() // PRINTSTRING("Sensitivity")PRINTFLOAT(fSensitivity)PRINTNL() IF iThisHacking != 8 IF fXMove > 1 OR fYMove > 1 OR fXMove < -1 OR fYMove < -1 BEGIN_SCALEFORM_MOVIE_METHOD(sfHacking, "MOVE_CURSOR") SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fXMove) SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fYMove) END_SCALEFORM_MOVIE_METHOD() ENDIF ENDIF ENDIF IF iThisHacking > 4 IF IS_USING_CURSOR(FRONTEND_CONTROL) hacking_data.f_PCMousePosX = GET_CONTROL_NORMAL( FRONTEND_CONTROL, INPUT_CURSOR_X ) hacking_data.f_PCMousePosY = GET_CONTROL_NORMAL( FRONTEND_CONTROL, INPUT_CURSOR_Y ) PRINTLN("hacking_data.f_PCMousePosX")PRINTLN(hacking_data.f_PCMousePosX) PRINTLN("hacking_data.f_PCMousePosY")PRINTLN(hacking_data.f_PCMousePosY) IF IS_PLAYSTATION_PLATFORM() IF hacking_data.f_PCMousePosPrevX != hacking_data.f_PCMousePosX IF hacking_data.f_PCMousePosX < 0.49 PRINTLN("SCALEFORM_INPUT_EVENT_LEFT") PLAY_SOUND_FRONTEND(-1,"HACKING_MOVE_CURSOR") BEGIN_SCALEFORM_MOVIE_METHOD(sfHacking, "SET_INPUT_EVENT") SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(SCALEFORM_INPUT_EVENT_LEFT)) END_SCALEFORM_MOVIE_METHOD() ELIF hacking_data.f_PCMousePosX > 0.51 PRINTLN("SCALEFORM_INPUT_EVENT_RIGHT") PLAY_SOUND_FRONTEND(-1,"HACKING_MOVE_CURSOR") BEGIN_SCALEFORM_MOVIE_METHOD(sfHacking, "SET_INPUT_EVENT") SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(SCALEFORM_INPUT_EVENT_RIGHT)) END_SCALEFORM_MOVIE_METHOD() ENDIF ENDIF ENDIF hacking_data.f_PCMousePosPrevX = hacking_data.f_PCMousePosX hacking_data.f_PCMousePosPrevY = hacking_data.f_PCMousePosY ENDIF // PC Mouse support handled differently from PS4 trackpad for hacking minigame cursor movement - Steve R. LDS. IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL) FLOAT fPCMouseMoveDistX = GET_DISABLED_CONTROL_NORMAL( FRONTEND_CONTROL, INPUT_LOOK_LR ) FLOAT fPCMouseMoveDistY = GET_DISABLED_CONTROL_NORMAL( FRONTEND_CONTROL, INPUT_LOOK_UD ) BOOL bMouseMoved = FALSE // Mouse movement is too fast by default, so we only allow to move when a certain time has passed, based on the game timestep. fPCMouseMoveDebounce = fPCMouseMoveDebounce + TIMESTEP() //PRINTLN("fPCMouseMoveDebounce")PRINTLN(fPCMouseMoveDebounce) // As we're not checking mouse movement every frame we work out an average value over the frames we don't check. fPCMouseAverageX += fPCMouseMoveDistX fPCMouseAverageY += fPCMouseMoveDistY fPCMouseAverageCount ++ IF fPCMouseMoveDebounce > 0.15 fPCMouseMoveDebounce = 0.0 // Work out average of mouse since last debounce fPCMouseAverageX = fPCMouseAverageX / fPCMouseAverageCount fPCMouseAverageY = fPCMouseAverageY / fPCMouseAverageCount IF ABSF(fPCMouseAverageY) <0.2 IF fPCMouseAverageX < 0 PRINTLN("SCALEFORM_INPUT_EVENT_LEFT - MOUSE") bMouseMoved = TRUE BEGIN_SCALEFORM_MOVIE_METHOD(sfHacking, "SET_INPUT_EVENT") SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(SCALEFORM_INPUT_EVENT_LEFT)) END_SCALEFORM_MOVIE_METHOD() ELIF fPCMouseAverageX > 0 PRINTLN("SCALEFORM_INPUT_EVENT_RIGHT - MOUSE") bMouseMoved = TRUE BEGIN_SCALEFORM_MOVIE_METHOD(sfHacking, "SET_INPUT_EVENT") SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(SCALEFORM_INPUT_EVENT_RIGHT)) END_SCALEFORM_MOVIE_METHOD() ENDIF ENDIF IF ABSF(fPCMouseAverageX) < 0.2 IF fPCMouseAverageY < 0 PRINTLN("SCALEFORM_INPUT_EVENT_UP - MOUSE") bMouseMoved = TRUE BEGIN_SCALEFORM_MOVIE_METHOD(sfHacking, "SET_INPUT_EVENT") SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(SCALEFORM_INPUT_EVENT_UP)) END_SCALEFORM_MOVIE_METHOD() ELIF fPCMouseAverageY > 0 PRINTLN("SCALEFORM_INPUT_EVENT_DOWN - MOUSE") bMouseMoved = TRUE BEGIN_SCALEFORM_MOVIE_METHOD(sfHacking, "SET_INPUT_EVENT") SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(SCALEFORM_INPUT_EVENT_DOWN)) END_SCALEFORM_MOVIE_METHOD() ENDIF ENDIF IF bMouseMoved PLAY_SOUND_FRONTEND(-1,"HACKING_MOVE_CURSOR") ENDIF fPCMouseAverageX = 0.0 fPCMouseAverageY = 0.0 fPCMouseAverageCount = 0.0 ENDIF ENDIF INT fAnalogue[4] INT iTemp GET_CONTROL_VALUE_OF_ANALOGUE_STICKS_UNBOUND(fAnalogue[0], fAnalogue[1], fAnalogue[2], fAnalogue[3]) REPEAT COUNT_OF(fAnalogue) iTemp IF ABSI(fAnalogue[iTemp]) > 0 IF iTemp = 0 OR iTemp = 1 IF HAS_SOUND_FINISHED(hacking_data.i_hacking_sound) IF iThisHacking != 8 PLAY_SOUND_FRONTEND(hacking_data.i_hacking_sound,"HACKING_MOVE_CURSOR") ENDIF ENDIF ENDIF ENDIF ENDREPEAT IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL,INPUT_FRONTEND_AXIS_X) OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL,INPUT_FRONTEND_AXIS_Y) OR IS_CONTROL_PRESSED(FRONTEND_CONTROL,INPUT_FRONTEND_AXIS_X) OR IS_CONTROL_PRESSED(FRONTEND_CONTROL,INPUT_FRONTEND_AXIS_Y) ENDIF IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL) IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL,INPUT_MOVE_UP_ONLY) OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CELLPHONE_UP) PLAY_SOUND_FRONTEND(-1,"HACKING_MOVE_CURSOR") BEGIN_SCALEFORM_MOVIE_METHOD(sfHacking, "SET_INPUT_EVENT") SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(SCALEFORM_INPUT_EVENT_UP)) END_SCALEFORM_MOVIE_METHOD() ELIF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL,INPUT_MOVE_DOWN_ONLY) OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CELLPHONE_DOWN) PLAY_SOUND_FRONTEND(-1,"HACKING_MOVE_CURSOR") BEGIN_SCALEFORM_MOVIE_METHOD(sfHacking, "SET_INPUT_EVENT") SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(SCALEFORM_INPUT_EVENT_DOWN)) END_SCALEFORM_MOVIE_METHOD() ELIF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL,INPUT_MOVE_LEFT_ONLY) OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CELLPHONE_LEFT) PLAY_SOUND_FRONTEND(-1,"HACKING_MOVE_CURSOR") BEGIN_SCALEFORM_MOVIE_METHOD(sfHacking, "SET_INPUT_EVENT") SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(SCALEFORM_INPUT_EVENT_LEFT)) END_SCALEFORM_MOVIE_METHOD() ELIF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL,INPUT_MOVE_RIGHT_ONLY) OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CELLPHONE_RIGHT) PLAY_SOUND_FRONTEND(-1,"HACKING_MOVE_CURSOR") BEGIN_SCALEFORM_MOVIE_METHOD(sfHacking, "SET_INPUT_EVENT") SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(SCALEFORM_INPUT_EVENT_RIGHT)) END_SCALEFORM_MOVIE_METHOD() ENDIF ELSE IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL,INPUT_FRONTEND_UP) PLAY_SOUND_FRONTEND(-1,"HACKING_MOVE_CURSOR") BEGIN_SCALEFORM_MOVIE_METHOD(sfHacking, "SET_INPUT_EVENT") SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(SCALEFORM_INPUT_EVENT_UP)) END_SCALEFORM_MOVIE_METHOD() ELIF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL,INPUT_FRONTEND_DOWN) PLAY_SOUND_FRONTEND(-1,"HACKING_MOVE_CURSOR") BEGIN_SCALEFORM_MOVIE_METHOD(sfHacking, "SET_INPUT_EVENT") SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(SCALEFORM_INPUT_EVENT_DOWN)) END_SCALEFORM_MOVIE_METHOD() ELIF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL,INPUT_FRONTEND_LEFT) PLAY_SOUND_FRONTEND(-1,"HACKING_MOVE_CURSOR") BEGIN_SCALEFORM_MOVIE_METHOD(sfHacking, "SET_INPUT_EVENT") SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(SCALEFORM_INPUT_EVENT_LEFT)) END_SCALEFORM_MOVIE_METHOD() ELIF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL,INPUT_FRONTEND_RIGHT) PLAY_SOUND_FRONTEND(-1,"HACKING_MOVE_CURSOR") BEGIN_SCALEFORM_MOVIE_METHOD(sfHacking, "SET_INPUT_EVENT") SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(SCALEFORM_INPUT_EVENT_RIGHT)) END_SCALEFORM_MOVIE_METHOD() ENDIF ENDIF ENDIF IF bExitButton IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT) OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_ACCEPT) //CALL_SCALEFORM_MOVIE_METHOD(sfHacking, "SET_INPUT_EVENT_SELECT") BEGIN_SCALEFORM_MOVIE_METHOD(sfHacking, "SET_INPUT_EVENT_SELECT") //SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(SCALEFORM_INPUT_EVENT_CROSS)) minigame_return_index = END_SCALEFORM_MOVIE_METHOD_RETURN_VALUE() ENDIF IF IS_SCALEFORM_MOVIE_METHOD_RETURN_VALUE_READY(minigame_return_index) iClick = GET_SCALEFORM_MOVIE_METHOD_RETURN_VALUE_INT(minigame_return_index) IF iClick = 6 FORCE_QUIT_FAIL_HACKING_MINIGAME_KEEP_DATA(hacking_data) ENDIF ENDIF ENDIF MANAGE_SOUNDS() ENDIF //REQUEST_HACKING_MINI_GAME() //ENDIF // fix for negative time - 489549 IF iThisHacking = 5 OR iThisHacking = 6 IF bStartHackTimer GET_TIME_AS_MINUTES_SECONDS_MILLISECONDS(iHackingStartTime - (GET_GAME_TIMER() - i_clock_start), iHackMinutes,iHackSeconds,iHackMilliseconds) IF iHackMinutes >= 0 AND iHackSeconds >= 0 AND iHackMilliseconds >= 0 CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"SET_COUNTDOWN",to_float(iHackMinutes),to_float(iHackSeconds),to_float(iHackMilliseconds)) ELSE iHackMinutes = 0 iHackSeconds = 0 iHackMilliseconds = 0 CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"SET_COUNTDOWN",to_float(iHackMinutes),to_float(iHackSeconds),to_float(iHackMilliseconds)) ENDIF ENDIF ENDIF //hack connect IF iThisHacking = 5 IF MANAGE_HACKING_TIMER(iHackTimer, 10000 / iSpeedDecayRate) IF hacking_data.f_speed > 20 hacking_data.f_speed = hacking_data.f_speed - 1 PRINTSTRING("&&&&&&&&&&&&&&&&Speed:")PRINTFLOAT(hacking_data.f_speed)PRINTNL() CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"SET_SPEED",hacking_data.f_speed) iHackTimer = GET_GAME_TIMER() ENDIF ENDIF ENDIF //brute force IF iThisHacking = 6 IF MANAGE_HACKING_TIMER(iHackTimer, 10000 / iSpeedDecayRate) IF hacking_data.f_speed > 20 hacking_data.f_speed = hacking_data.f_speed - 1 PRINTSTRING("&&&&&&&&&&&&&&&&Speed:")PRINTFLOAT(hacking_data.f_speed)PRINTNL() CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"SET_COLUMN_SPEED",0,hacking_data.f_speed) CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"SET_COLUMN_SPEED",1,hacking_data.f_speed) CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"SET_COLUMN_SPEED",2,hacking_data.f_speed) CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"SET_COLUMN_SPEED",3,hacking_data.f_speed) CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"SET_COLUMN_SPEED",4,hacking_data.f_speed) CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"SET_COLUMN_SPEED",5,hacking_data.f_speed) CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"SET_COLUMN_SPEED",6,hacking_data.f_speed) CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"SET_COLUMN_SPEED",7,hacking_data.f_speed) iHackTimer = GET_GAME_TIMER() ENDIF ENDIF ENDIF //PRINTSTRING("iThisHacking:")PRINTINT(iThisHacking)PRINTNL() IF IS_BIT_SET(hacking_data.iBS2Hacking, BS2_LAUNCH_MG_IMMEDIATIALY) // Going to skip the sequence where you have to click 'my computer' / 'external device' etc IF iThisHacking = 2 //iClick = 4 iThisHacking = 3 ELIF iThisHacking = 3 iClick = 81 ELIF iThisHacking = 4 IF bJustHackConnect iClick = 82 ELIF bJustBruteForce iClick = 83 ENDIF ENDIF ENDIF SWITCH iThisHacking //LOAD ASSETS CASE 0 //IF NOT hacking_data.b_wallpaper_initialised IF NOT IS_BIT_SET(hacking_data.bsHacking,BS_WALLPAPER_INITIALISED) INITIALISE_HACKING_WALLPAPER_AND_ICONS(hacking_data, wall, bHideMyComputer) ENDIF REQUEST_HACKING_MINI_GAME() FORCE_POSTFX_BULLET_IMPACTS_AFTER_HUD(TRUE) hacking_data.i_hacking_sound = GET_SOUND_ID() //FORCE_POSTFX_BULLET_IMPACTS_AFTER_HUD(TRUE) bDownAndOutHelp = FALSE bPlaySuccessBeep = FALSE hacking_data.iThisHackingNG = 0 iThisHacking ++ BREAK //INITIALISE DATA CASE 1 INT iInitLoop REPEAT MAX_SOUNDS iInitLoop sHacking[iInitLoop] = -1 ENDREPEAT //DISABLE_CELLPHONE(TRUE) CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"SET_LIVES",TO_FLOAT(iStartLives),TO_FLOAT(iMaxLives)) CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"SET_SPEED",TO_FLOAT(iStartingSpeed)) IF bExitButton = TRUE CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER_AND_STRING(sfHacking,"ADD_PROGRAM",TO_FLOAT(7),TO_FLOAT(6),INVALID_SCALEFORM_PARAM,INVALID_SCALEFORM_PARAM,INVALID_SCALEFORM_PARAM,"EXIT") ENDIF //Sort iBruteForceColumns = iBruteForceColumns iChanceOfRedHerrings = iChanceOfRedHerrings hacking_data.i_lives = iStartLives hacking_data.f_speed = TO_FLOAT(iStartingSpeed) CLEAR_BIT(hacking_data.bsHacking,BS_QUIT_HACKING) fPCMouseAverageX = 0.0 fPCMouseAverageY = 0.0 fPCMouseAverageCount = 0.0 sHacking[0] = GET_SOUND_ID() sHacking[1] = GET_SOUND_ID() #IF IS_NEXTGEN_BUILD // ENABLE MULTIPLE DISPLAYS/BLINDERS SET_MULTIHEAD_SAFE(TRUE, TRUE) PRINTLN( "Hacking mini game RENDER_PC()Enabled SET_MULTIHEAD_SAFE") #ENDIF bHelpText = FALSE IF hacking_data.bTestHacking iThisHacking = 8 ELSE iThisHacking ++ ENDIF BREAK //CHECK IF PLAYER HAS CLICKED MY COMPUTER CASE 2 IF bDoTutorial = TRUE IF bHelpText = FALSE IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("H_EXIT_PROMPT") IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("HACKOBJ1") PRINT_HELP_FOREVER("HACKOBJ1") bHelpText = TRUE ENDIF ENDIF ENDIF ENDIF IF NOT IS_PAUSE_MENU_ACTIVE() IF IS_USING_CURSOR(FRONTEND_CONTROL) IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT) OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_ACCEPT) BEGIN_SCALEFORM_MOVIE_METHOD(sfHacking, "SET_INPUT_EVENT_SELECT") //SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(SCALEFORM_INPUT_EVENT_CROSS)) minigame_return_index = END_SCALEFORM_MOVIE_METHOD_RETURN_VALUE() ENDIF ELSE IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT) OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_ACCEPT) BEGIN_SCALEFORM_MOVIE_METHOD(sfHacking, "SET_INPUT_EVENT_SELECT") //SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(SCALEFORM_INPUT_EVENT_CROSS)) minigame_return_index = END_SCALEFORM_MOVIE_METHOD_RETURN_VALUE() ENDIF ENDIF ENDIF //MY COMPUTER IF IS_SCALEFORM_MOVIE_METHOD_RETURN_VALUE_READY(minigame_return_index) iClick = GET_SCALEFORM_MOVIE_METHOD_RETURN_VALUE_INT(minigame_return_index) IF iClick = 4 IF bDoTutorial = TRUE IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("H_EXIT_PROMPT") CLEAR_HELP() ENDIF ENDIF bHelpText = FALSE iThisHacking ++ ENDIF ENDIF IF WarningPopup = TRUE IF GET_GAME_TIMER()-iErrorPopupTimer > cPopUpMinTime IF GET_GAME_TIMER()-iErrorPopupTimer > cPopUpTime OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT) OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_ACCEPT) PRINTSTRING("CLOSING") POPUP_MSG(FALSE, "") ENDIF ENDIF ENDIF IF IS_SCALEFORM_MOVIE_METHOD_RETURN_VALUE_READY(minigame_return_index) iClick = GET_SCALEFORM_MOVIE_METHOD_RETURN_VALUE_INT(minigame_return_index) IF iClick = 80 IF WarningPopup = FALSE PLAY_SOUND_FRONTEND(-1,"HACKING_CLICK_BAD") POPUP_MSG(TRUE, "ACCESSD") ENDIF ENDIF ENDIF BREAK //CHECK IF PLAYER HAS CLICKED OPEN THE PHONE CASE 3 IF bDoTutorial = TRUE IF iThisHacking = 3 IF bHelpText = FALSE IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("HACKOBJ2") PRINT_HELP_FOREVER("HACKOBJ2") bHelpText = TRUE ENDIF ENDIF ENDIF ENDIF IF NOT IS_PAUSE_MENU_ACTIVE() IF NOT IS_SCALEFORM_MOVIE_METHOD_RETURN_VALUE_READY(minigame_return_index) IF IS_USING_CURSOR(FRONTEND_CONTROL) IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT) OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_ACCEPT) BEGIN_SCALEFORM_MOVIE_METHOD(sfHacking, "SET_INPUT_EVENT_SELECT") //SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(SCALEFORM_INPUT_EVENT_CROSS)) minigame_return_index = END_SCALEFORM_MOVIE_METHOD_RETURN_VALUE() ENDIF ELSE IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT) OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_ACCEPT) BEGIN_SCALEFORM_MOVIE_METHOD(sfHacking, "SET_INPUT_EVENT_SELECT") //SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(SCALEFORM_INPUT_EVENT_CROSS)) minigame_return_index = END_SCALEFORM_MOVIE_METHOD_RETURN_VALUE() ENDIF ENDIF ENDIF ENDIF IF NOT IS_PAUSE_MENU_ACTIVE() IF WarningPopup = FALSE IF NOT IS_SCALEFORM_MOVIE_METHOD_RETURN_VALUE_READY(minigame_return_index) IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL) BEGIN_SCALEFORM_MOVIE_METHOD(sfHacking, "SET_INPUT_EVENT_BACK") //SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(SCALEFORM_INPUT_EVENT_CIRCLE)) minigame_return_index = END_SCALEFORM_MOVIE_METHOD_RETURN_VALUE() IF bDoTutorial = TRUE IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("HACKOBJ2") CLEAR_HELP() ENDIF PRINT_HELP_FOREVER("H_EXIT_PROMPT") bHelpText = FALSE iThisHacking -- ENDIF ENDIF ENDIF ENDIF ENDIF IF WarningPopup = TRUE IF GET_GAME_TIMER()-iErrorPopupTimer > cPopUpMinTime IF GET_GAME_TIMER()-iErrorPopupTimer > cPopUpTime OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT) OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_ACCEPT) PRINTSTRING("CLOSING") POPUP_MSG(FALSE, "") ENDIF ENDIF ENDIF IF WarningPopup = FALSE IF IS_SCALEFORM_MOVIE_METHOD_RETURN_VALUE_READY(minigame_return_index) iClick = GET_SCALEFORM_MOVIE_METHOD_RETURN_VALUE_INT(minigame_return_index) PRINTSTRING("*********iClick")PRINTINT(iClick)PRINTNL() ENDIF ENDIF //IF IS_SCALEFORM_MOVIE_METHOD_RETURN_VALUE_READY(minigame_return_index) //iClick = GET_SCALEFORM_MOVIE_METHOD_RETURN_VALUE_INT(minigame_return_index) IF iClick = 80 IF WarningPopup = FALSE PLAY_SOUND_FRONTEND(-1,"HACKING_CLICK_BAD") POPUP_MSG(TRUE, "ACCESSD") ENDIF ENDIF //ENDIF //IF IS_SCALEFORM_MOVIE_METHOD_RETURN_VALUE_READY(minigame_return_index) //iClick = GET_SCALEFORM_MOVIE_METHOD_RETURN_VALUE_INT(minigame_return_index) //PRINTSTRING("*********iClick")PRINTINT(iClick)PRINTNL() //OPEN THE PHONE IF iClick = 81 bHelpText = FALSE iThisHacking ++ ENDIF //ENDIF BREAK //CHECK IF AN APP HAS BEEN CLICKED CASE 4 IF sHacking[1] != -1 IF NOT HAS_SOUND_FINISHED(sHacking[1]) STOP_SOUND(sHacking[1]) sHacking[1] = -1 ENDIF ENDIF IF sHacking[0] != -1 IF NOT HAS_SOUND_FINISHED(sHacking[0]) STOP_SOUND(sHacking[0]) sHacking[0] = -1 ENDIF ENDIF IF sHacking[1] != -1 IF NOT HAS_SOUND_FINISHED(sHacking[1]) STOP_SOUND(sHacking[1]) sHacking[1] = -1 ENDIF ENDIF IF bDoTutorial = TRUE IF iThisHacking = 4 IF bJustBruteForce = TRUE //IF hacking_data.b_brute_force_open = FALSE IF NOT IS_BIT_SET(hacking_data.bsHacking,BS_BRUTE_FORCE_OPEN) IF bHelpText = FALSE //RUN BRUTEFORCE.EXE IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("HACKOBJ5") PRINT_HELP_FOREVER("HACKOBJ5") bHelpText = TRUE ENDIF ENDIF ENDIF ELSE //IF hacking_data.b_hack_connect_game_solved = FALSE IF NOT IS_BIT_SET(hacking_data.bsHacking,BS_HACK_CONNECT_GAME_SOLVED) IF bHelpText = FALSE //RUN HACKCONNECT.EXE IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("HACKOBJ3") PRINT_HELP_FOREVER("HACKOBJ3") bHelpText = TRUE ENDIF ENDIF ELSE //IF hacking_data.b_brute_force_open = FALSE IF NOT IS_BIT_SET(hacking_data.bsHacking,BS_BRUTE_FORCE_OPEN) IF bHelpText = FALSE //RUN BRUTEFORCE.EXE IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("HACKOBJ5") PRINT_HELP_FOREVER("HACKOBJ5") bHelpText = TRUE ENDIF ENDIF ELSE IF bHelpText = TRUE IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("HACKOBJ5") CLEAR_HELP() bHelpText = FALSE ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF IF NOT IS_PAUSE_MENU_ACTIVE() IF WarningPopup = FALSE IF NOT IS_SCALEFORM_MOVIE_METHOD_RETURN_VALUE_READY(minigame_return_index) IF IS_USING_CURSOR(FRONTEND_CONTROL) IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT) OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_ACCEPT) BEGIN_SCALEFORM_MOVIE_METHOD(sfHacking, "SET_INPUT_EVENT_SELECT") //SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(SCALEFORM_INPUT_EVENT_CROSS)) minigame_return_index = END_SCALEFORM_MOVIE_METHOD_RETURN_VALUE() //PRINTSTRING("*********iClick")PRINTINT(iClick)PRINTNL() ENDIF ELSE IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT) OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_ACCEPT) BEGIN_SCALEFORM_MOVIE_METHOD(sfHacking, "SET_INPUT_EVENT_SELECT") //SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(SCALEFORM_INPUT_EVENT_CROSS)) minigame_return_index = END_SCALEFORM_MOVIE_METHOD_RETURN_VALUE() //PRINTSTRING("*********iClick")PRINTINT(iClick)PRINTNL() ENDIF ENDIF ENDIF ENDIF ENDIF IF WarningPopup = FALSE IF NOT IS_SCALEFORM_MOVIE_METHOD_RETURN_VALUE_READY(minigame_return_index) IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL) BEGIN_SCALEFORM_MOVIE_METHOD(sfHacking, "SET_INPUT_EVENT_BACK") //SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(SCALEFORM_INPUT_EVENT_CIRCLE)) minigame_return_index = END_SCALEFORM_MOVIE_METHOD_RETURN_VALUE() //PRINTSTRING("*********iClick")PRINTINT(iClick)PRINTNL() IF bDoTutorial = TRUE IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("HACKOBJ5") OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("HACKOBJ3") CLEAR_HELP() ENDIF bHelpText = FALSE iThisHacking -- ENDIF ENDIF ENDIF ENDIF IF WarningPopup = TRUE IF GET_GAME_TIMER()-iErrorPopupTimer > cPopUpMinTime IF GET_GAME_TIMER()-iErrorPopupTimer > cPopUpTime OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT) OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_ACCEPT) PRINTSTRING("CLOSING") POPUP_MSG(FALSE, "") ENDIF ENDIF ENDIF IF NOT IS_PAUSE_MENU_ACTIVE() IF IS_SCALEFORM_MOVIE_METHOD_RETURN_VALUE_READY(minigame_return_index) iClick = GET_SCALEFORM_MOVIE_METHOD_RETURN_VALUE_INT(minigame_return_index) PRINTSTRING("@@@@@iClick")PRINTINT(iClick)PRINTNL() ENDIF ENDIF //IF minigame_return_index != NULL IF iClick = 80 IF WarningPopup = FALSE PLAY_SOUND_FRONTEND(-1,"HACKING_CLICK_BAD") POPUP_MSG(TRUE, "ACCESSD") ENDIF ENDIF //ENDIF //APP1 - HACK CONNECT //IF minigame_return_index != NULL IF iClick = 82 IF bJustBruteForce = FALSE IF bJustHackConnect = TRUE iHackTimer = GET_GAME_TIMER() hacking_data.f_speed = TO_FLOAT(iStartingSpeed) IF NOT IS_BIT_SET(hacking_data.iBS2Hacking, BS2_LAUNCH_MG_IMMEDIATIALY) CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"SET_LIVES",TO_FLOAT(iStartLives)) CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"SET_SPEED",hacking_data.f_speed) CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"OPEN_APP",TO_FLOAT(0)) ELSE CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"SET_LIVES",TO_FLOAT(iStartLives)) CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"SET_SPEED",hacking_data.f_speed) CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"RUN_PROGRAM",TO_FLOAT(4)) CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"OPEN_APP",TO_FLOAT(0)) ENDIF i_clock_start = GET_GAME_TIMER() bStartHackTimer = TRUE bHelpText = FALSE //Get a sound ID reference sHacking[0] = GET_SOUND_ID() PLAY_SOUND_FRONTEND(sHacking[0],"HACKING_COUNTDOWN_IP_FIND") iThisHacking ++ ELSE //IF hacking_data.b_hack_connect_game_solved = FALSE IF NOT IS_BIT_SET(hacking_data.bsHacking,BS_HACK_CONNECT_GAME_SOLVED) iHackTimer = GET_GAME_TIMER() hacking_data.f_speed = TO_FLOAT(iStartingSpeed) CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"SET_LIVES",TO_FLOAT(iStartLives)) CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"SET_SPEED",hacking_data.f_speed) CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"OPEN_APP",TO_FLOAT(0)) i_clock_start = GET_GAME_TIMER() bStartHackTimer = TRUE bHelpText = FALSE //Get a sound ID reference sHacking[0] = GET_SOUND_ID() PLAY_SOUND_FRONTEND(sHacking[0],"HACKING_COUNTDOWN_IP_FIND") iThisHacking ++ ELSE IF WarningPopup = TRUE IF GET_GAME_TIMER()-iErrorPopupTimer > cPopUpMinTime IF GET_GAME_TIMER()-iErrorPopupTimer > cPopUpTime OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT) OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_ACCEPT) PRINTSTRING("CLOSING") POPUP_MSG(FALSE, "") ENDIF ENDIF ENDIF IF WarningPopup = FALSE PLAY_SOUND_FRONTEND(-1,"HACKING_CLICK_BAD") IF bDoDownloadOpen AND IS_BIT_SET(hacking_data.bsHacking,BS_BRUTE_FORCE_GAME_SOLVED) //hacking_data.b_brute_force_game_solved = TRUE POPUP_MSG(TRUE, "TRYDL") ELSE POPUP_MSG(TRUE, "TRYBRUTE") CPRINTLN( DEBUG_MIKE, "HACK MINIGAME() - TRYBRUTE 0" ) ENDIF ENDIF ENDIF ENDIF ELSE IF WarningPopup = TRUE IF GET_GAME_TIMER()-iErrorPopupTimer > cPopUpMinTime IF GET_GAME_TIMER()-iErrorPopupTimer > cPopUpTime OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT) OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_ACCEPT) PRINTSTRING("CLOSING") POPUP_MSG(FALSE, "") ENDIF ENDIF ENDIF IF WarningPopup = FALSE PLAY_SOUND_FRONTEND(-1,"HACKING_CLICK_BAD") IF bDoDownloadOpen AND IS_BIT_SET(hacking_data.bsHacking,BS_BRUTE_FORCE_GAME_SOLVED) //hacking_data.b_brute_force_game_solved = TRUE POPUP_MSG(TRUE, "TRYDL") ELSE POPUP_MSG(TRUE, "TRYBRUTE") CPRINTLN( DEBUG_MIKE, "HACK MINIGAME() - TRYBRUTE 1" ) ENDIF ENDIF ENDIF ENDIF //ENDIF //APP2 - BRUTEFORCE //IF minigame_return_index != NULL //iClick = GET_SCALEFORM_MOVIE_METHOD_RETURN_VALUE_INT(minigame_return_index) IF iClick = 83 IF bJustHackConnect = FALSE //TRUE IF bJustBruteForce = TRUE iHackTimer = GET_GAME_TIMER() hacking_data.f_speed = TO_FLOAT(iStartingSpeed) CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"SET_LIVES",TO_FLOAT(iStartLives)) CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"SET_SPEED",TO_FLOAT(iStartingSpeed)) CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"SET_COLUMN_SPEED",0,hacking_data.f_speed) CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"SET_COLUMN_SPEED",1,hacking_data.f_speed) CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"SET_COLUMN_SPEED",2,hacking_data.f_speed) CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"SET_COLUMN_SPEED",3,hacking_data.f_speed) CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"SET_COLUMN_SPEED",4,hacking_data.f_speed) CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"SET_COLUMN_SPEED",5,hacking_data.f_speed) CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"SET_COLUMN_SPEED",6,hacking_data.f_speed) CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"SET_COLUMN_SPEED",7,hacking_data.f_speed) IF NOT IS_BIT_SET(hacking_data.iBS2Hacking, BS2_LAUNCH_MG_IMMEDIATIALY) CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"OPEN_APP",TO_FLOAT(1)) ELSE CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"RUN_PROGRAM",TO_FLOAT(4)) CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"OPEN_APP",TO_FLOAT(1)) ENDIF i_clock_start = GET_GAME_TIMER() bStartHackTimer = TRUE bHelpText = FALSE sHacking[1] = GET_SOUND_ID() IF bRandomPassword RANDOMISE_PASSWORD(hacking_data, bUseNewPasswords, bDugganPassword) ENDIF CALL_SCALEFORM_MOVIE_METHOD_WITH_STRING(sfHacking,"SET_ROULETTE_WORD",hacking_data.sPassword) PLAY_SOUND_FRONTEND(sHacking[1],"HACKING_COUNTDOWN_CRACK_PASS") CPRINTLN( DEBUG_MIKE, "HACK MINIGAME() - PLAY_SOUND_FRONTEND - HACKING_COUNTDOWN_CRACK_PASS 1" ) iThisHacking = 6 ELSE //IF hacking_data.b_hack_connect_game_solved = TRUE IF (NOT bHackConnectBeforeBrute OR IS_BIT_SET(hacking_data.bsHacking,BS_HACK_CONNECT_GAME_SOLVED)) //hacking_data.b_hack_connect_game_solved = TRUE) AND NOT IS_BIT_SET(hacking_data.bsHacking,BS_BRUTE_FORCE_GAME_SOLVED) //hacking_data.b_brute_force_game_solved = FALSE iHackTimer = GET_GAME_TIMER() hacking_data.f_speed = TO_FLOAT(iStartingSpeed) CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"SET_LIVES",TO_FLOAT(iStartLives)) CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"SET_SPEED",TO_FLOAT(iStartingSpeed)) CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"SET_COLUMN_SPEED",0,hacking_data.f_speed) CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"SET_COLUMN_SPEED",1,hacking_data.f_speed) CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"SET_COLUMN_SPEED",2,hacking_data.f_speed) CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"SET_COLUMN_SPEED",3,hacking_data.f_speed) CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"SET_COLUMN_SPEED",4,hacking_data.f_speed) CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"SET_COLUMN_SPEED",5,hacking_data.f_speed) CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"SET_COLUMN_SPEED",6,hacking_data.f_speed) CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"SET_COLUMN_SPEED",7,hacking_data.f_speed) CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"OPEN_APP",TO_FLOAT(1)) i_clock_start = GET_GAME_TIMER() bStartHackTimer = TRUE bHelpText = FALSE sHacking[1] = GET_SOUND_ID() IF bRandomPassword RANDOMISE_PASSWORD(hacking_data, bUseNewPasswords, bDugganPassword) ENDIF IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("HACKOBJ5") CLEAR_HELP() ENDIF CALL_SCALEFORM_MOVIE_METHOD_WITH_STRING(sfHacking,"SET_ROULETTE_WORD",hacking_data.sPassword) PLAY_SOUND_FRONTEND(sHacking[1],"HACKING_COUNTDOWN_CRACK_PASS") CPRINTLN( DEBUG_MIKE, "HACK MINIGAME() - PLAY_SOUND_FRONTEND - HACKING_COUNTDOWN_CRACK_PASS 2" ) iThisHacking = 6 ELSE IF WarningPopup = TRUE IF GET_GAME_TIMER()-iErrorPopupTimer > cPopUpMinTime IF GET_GAME_TIMER()-iErrorPopupTimer > cPopUpTime OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT) OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_ACCEPT) PRINTSTRING("CLOSING") POPUP_MSG(FALSE, "") ENDIF ENDIF ENDIF IF WarningPopup = FALSE PLAY_SOUND_FRONTEND(-1,"HACKING_CLICK_BAD") IF bDoDownloadOpen AND IS_BIT_SET(hacking_data.bsHacking,BS_HACK_CONNECT_GAME_SOLVED)//hacking_data.b_hack_connect_game_solved = TRUE POPUP_MSG(TRUE, "TRYDL") ELSE POPUP_MSG(TRUE, "TRYHACK") ENDIF ENDIF ENDIF ENDIF ELSE IF WarningPopup = TRUE IF GET_GAME_TIMER()-iErrorPopupTimer > cPopUpMinTime IF GET_GAME_TIMER()-iErrorPopupTimer > cPopUpTime OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT) OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_ACCEPT) PRINTSTRING("CLOSING") POPUP_MSG(FALSE, "") ENDIF ENDIF ENDIF IF WarningPopup = FALSE PLAY_SOUND_FRONTEND(-1,"HACKING_CLICK_BAD") IF bDoDownloadOpen AND IS_BIT_SET(hacking_data.bsHacking,BS_HACK_CONNECT_GAME_SOLVED)//AND hacking_data.b_hack_connect_game_solved = TRUE POPUP_MSG(TRUE, "TRYDL") ELSE POPUP_MSG(TRUE, "TRYHACK") ENDIF ENDIF ENDIF ENDIF IF bDoDownloadOpen IF IS_BIT_SET(hacking_data.bsHacking,BS_HACK_CONNECT_GAME_SOLVED)//hacking_data.b_download_icon_displayed IF iClick = 93 IF IS_BIT_SET(hacking_data.bsHacking,BS_HACK_CONNECT_GAME_SOLVED) //hacking_data.b_hack_connect_game_solved AND IS_BIT_SET(hacking_data.bsHacking,BS_BRUTE_FORCE_GAME_SOLVED) //hacking_data.b_brute_force_game_solved IF NOT IS_BIT_SET(hacking_data.bsHacking,BS_DOWNLOAD_OPEN) //hacking_data.b_download_open // the actual opening of the window will be done by the script //hacking_data.b_download_open = TRUE SET_BIT(hacking_data.bsHacking,BS_DOWNLOAD_OPEN) iThisHacking = 8 ENDIF ELSE IF WarningPopup = TRUE IF GET_GAME_TIMER()-iErrorPopupTimer > cPopUpMinTime IF GET_GAME_TIMER()-iErrorPopupTimer > cPopUpTime OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT) OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_ACCEPT) PRINTSTRING("CLOSING") POPUP_MSG(FALSE, "") ENDIF ENDIF ENDIF IF WarningPopup = FALSE PLAY_SOUND_FRONTEND(-1,"HACKING_CLICK_BAD") //IF hacking_data.b_hack_connect_game_solved = TRUE IF IS_BIT_SET(hacking_data.bsHacking,BS_HACK_CONNECT_GAME_SOLVED) POPUP_MSG(TRUE, "TRYBRUTE") CPRINTLN( DEBUG_MIKE, "HACK MINIGAME() - TRYBRUTE 2" ) ELSE POPUP_MSG(TRUE, "TRYHACK") ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF //ENDIF BREAK //MANAGE IP CONNECT CASE 5 IF bDoTutorial = TRUE IF bHelpText = FALSE PRINT_HELP("H_USE_PC6") bHelpText = TRUE ELSE IF bDoMoreHelpText = TRUE PRINT_HELP("H_USE_PC7") bDoMoreHelpText = FALSE ENDIF ENDIF ENDIF IF NOT IS_PAUSE_MENU_ACTIVE() IF NOT IS_BIT_SET(hacking_data.iBS2Hacking, BS2_QUIT_MG_IMMEDIATIALY) IF NOT IS_SCALEFORM_MOVIE_METHOD_RETURN_VALUE_READY(minigame_return_index) IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL) hacking_data.i_lives = iStartLives CALL_SCALEFORM_MOVIE_METHOD(sfHacking,"CLOSE_APP") IF sHacking[1] != -1 IF NOT HAS_SOUND_FINISHED(sHacking[1]) STOP_SOUND(sHacking[1]) sHacking[1] = -1 ENDIF ENDIF IF sHacking[0] != -1 IF NOT HAS_SOUND_FINISHED(sHacking[0]) STOP_SOUND(sHacking[0]) sHacking[0] = -1 ENDIF ENDIF IF NOT IS_BIT_SET(hacking_data.iBS2Hacking, BS2_LAUNCH_MG_IMMEDIATIALY) iThisHacking = 4 ELSE SET_BIT(hacking_data.iBS2Hacking, BS2_QUIT_MG_IMMEDIATIALY) ENDIF // BEGIN_SCALEFORM_MOVIE_METHOD(sfHacking, "SET_INPUT_EVENT_BACK") // //SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(SCALEFORM_INPUT_EVENT_CIRCLE)) // minigame_return_index = END_SCALEFORM_MOVIE_METHOD_RETURN_VALUE() ENDIF ENDIF ENDIF ENDIF //IF MANAGE_HACKING_TIMER(iHackTimer, 2000) IF NOT IS_PAUSE_MENU_ACTIVE() IF NOT IS_SCALEFORM_MOVIE_METHOD_RETURN_VALUE_READY(minigame_return_index) IF IS_USING_CURSOR(FRONTEND_CONTROL) IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT) OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_ACCEPT) BEGIN_SCALEFORM_MOVIE_METHOD(sfHacking, "SET_INPUT_EVENT_SELECT") //SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(SCALEFORM_INPUT_EVENT_CROSS)) minigame_return_index = END_SCALEFORM_MOVIE_METHOD_RETURN_VALUE() ENDIF ELSE IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT) OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_ACCEPT) BEGIN_SCALEFORM_MOVIE_METHOD(sfHacking, "SET_INPUT_EVENT_SELECT") //SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(SCALEFORM_INPUT_EVENT_CROSS)) minigame_return_index = END_SCALEFORM_MOVIE_METHOD_RETURN_VALUE() ENDIF ENDIF ENDIF IF IS_SCALEFORM_MOVIE_METHOD_RETURN_VALUE_READY(minigame_return_index) iClick = GET_SCALEFORM_MOVIE_METHOD_RETURN_VALUE_INT(minigame_return_index) ENDIF ENDIF //LOSE A LIFE IF iClick = 85 PRINTSTRING("************************************YOU HAVE THIS MANY LIVES:")PRINTINT(hacking_data.i_lives)PRINTNL() IF hacking_data.i_lives > 1 PRINTSTRING("*******************Lost a Life******************YOU HAVE THIS MANY LIVES:")PRINTINT(hacking_data.i_lives)PRINTNL() hacking_data.i_lives -- CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"SET_LIVES",TO_FLOAT(hacking_data.i_lives)) PLAY_SOUND_FRONTEND(-1,"HACKING_CLICK_BAD") ELSE IF NOT HAS_SOUND_FINISHED(sHacking[0]) STOP_SOUND(sHacking[0]) ENDIF //hacking_data.b_MP_Hack_fail = TRUE SET_BIT(hacking_data.bsHacking,BS_MP_HACK_FAIL) PRINTSTRING("*******************Dead******************")PRINTNL() bStartHackTimer = FALSE bDoMoreHelpText = TRUE PLAY_SOUND_FRONTEND(-1,"HACKING_FAILURE") CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER_AND_STRING(sfHacking,"SET_IP_OUTCOME",0 ,INVALID_SCALEFORM_PARAM,INVALID_SCALEFORM_PARAM,INVALID_SCALEFORM_PARAM,INVALID_SCALEFORM_PARAM,"LOSTIP") ENDIF ENDIF IF iClick = 90 hacking_data.i_lives = iStartLives PRINTSTRING("*******************RETRY****************\n") PRINTINT(iStartLives) PRINTNL() CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"SET_LIVES",TO_FLOAT(iStartLives)) hacking_data.f_speed = TO_FLOAT(iStartingSpeed) i_clock_start = GET_GAME_TIMER() sHacking[0] = GET_SOUND_ID() PLAY_SOUND_FRONTEND(sHacking[0],"HACKING_COUNTDOWN_IP_FIND") //hacking_data.b_MP_Hack_fail = TRUE SET_BIT(hacking_data.bsHacking,BS_MP_HACK_FAIL) bStartHackTimer = TRUE ENDIF //RETRY - NO //IF minigame_return_index != NULL IF iClick = 91 hacking_data.i_lives = iStartLives CALL_SCALEFORM_MOVIE_METHOD(sfHacking,"CLOSE_APP") IF sHacking[0] != -1 IF NOT HAS_SOUND_FINISHED(sHacking[0]) STOP_SOUND(sHacking[0]) sHacking[0] = -1 ENDIF ENDIF //hacking_data.b_MP_Hack_fail = TRUE SET_BIT(hacking_data.bsHacking,BS_MP_HACK_FAIL) iThisHacking = 4 ENDIF //ENDIF //HAS THE PLAYER RUN OUT OF TIME IF bStartHackTimer = TRUE rawTime = 60000 - (GET_GAME_TIMER() - i_clock_start) IF rawTime < 1 //hacking_data.b_MP_Hack_fail = TRUE SET_BIT(hacking_data.bsHacking,BS_MP_HACK_FAIL) hacking_data.i_lives = iStartLives CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"SET_LIVES",TO_FLOAT(iStartLives)) hacking_data.f_speed = TO_FLOAT(iStartingSpeed) i_clock_start = GET_GAME_TIMER() bStartHackTimer = FALSE bDoMoreHelpText = TRUE PLAY_SOUND_FRONTEND(-1,"HACKING_FAILURE") IF sHacking[0] != -1 IF NOT HAS_SOUND_FINISHED(sHacking[0]) STOP_SOUND(sHacking[0]) sHacking[0] = -1 ENDIF ENDIF CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER_AND_STRING(sfHacking,"SET_IP_OUTCOME",0 ,INVALID_SCALEFORM_PARAM,INVALID_SCALEFORM_PARAM,INVALID_SCALEFORM_PARAM,INVALID_SCALEFORM_PARAM,"LOSTIP") ENDIF ENDIF //WIN IF iClick = 84 CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER_AND_STRING(sfHacking,"SET_IP_OUTCOME",1 ,INVALID_SCALEFORM_PARAM,INVALID_SCALEFORM_PARAM,INVALID_SCALEFORM_PARAM,INVALID_SCALEFORM_PARAM,"WINIP") iHackTimer = GET_GAME_TIMER() //hacking_data.b_hack_connect_game_solved = TRUE SET_BIT(hacking_data.bsHacking,BS_HACK_CONNECT_GAME_SOLVED) bStartHackTimer = FALSE bHelpText = FALSE PLAY_SOUND_FRONTEND(-1,"HACKING_CLICK_GOOD") IF sHacking[0] != -1 IF NOT HAS_SOUND_FINISHED(sHacking[0]) STOP_SOUND(sHacking[0]) sHacking[0] = -1 ENDIF ENDIF iThisHacking = 7 ENDIF BREAK //MANAGE BRUTEFORCE CASE 6 IF bDoTutorial = TRUE IF bHelpText = FALSE PRINT_HELP("H_USE_PC8") bHelpText = TRUE ELSE IF bDoMoreHelpText = TRUE PRINT_HELP("H_USE_PC9") bDoMoreHelpText = FALSE ENDIF ENDIF ENDIF IF NOT IS_PAUSE_MENU_ACTIVE() IF NOT IS_SCALEFORM_MOVIE_METHOD_RETURN_VALUE_READY(minigame_return_index) IF NOT IS_BIT_SET(hacking_data.iBS2Hacking, BS2_QUIT_MG_IMMEDIATIALY) IF NOT IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL) IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL) hacking_data.i_lives = iStartLives CALL_SCALEFORM_MOVIE_METHOD(sfHacking,"CLOSE_APP") IF NOT HAS_SOUND_FINISHED(sHacking[0]) STOP_SOUND(sHacking[0]) ENDIF IF NOT IS_BIT_SET(hacking_data.iBS2Hacking, BS2_LAUNCH_MG_IMMEDIATIALY) iThisHacking = 4 ELSE SET_BIT(hacking_data.iBS2Hacking, BS2_QUIT_MG_IMMEDIATIALY) ENDIF ENDIF ELSE IF IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_DELETE) OR (IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL) AND bDugganPassword) //Limiting this to the ULP version to be safe hacking_data.i_lives = iStartLives CALL_SCALEFORM_MOVIE_METHOD(sfHacking,"CLOSE_APP") IF NOT HAS_SOUND_FINISHED(sHacking[0]) STOP_SOUND(sHacking[0]) ENDIF IF NOT IS_BIT_SET(hacking_data.iBS2Hacking, BS2_LAUNCH_MG_IMMEDIATIALY) iThisHacking = 4 ELSE SET_BIT(hacking_data.iBS2Hacking, BS2_QUIT_MG_IMMEDIATIALY) ENDIF ENDIF ENDIF ENDIF ENDIF IF NOT IS_SCALEFORM_MOVIE_METHOD_RETURN_VALUE_READY(minigame_return_index) IF IS_USING_CURSOR(FRONTEND_CONTROL) IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT) OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_ACCEPT) BEGIN_SCALEFORM_MOVIE_METHOD(sfHacking, "SET_INPUT_EVENT_SELECT") //SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(SCALEFORM_INPUT_EVENT_CROSS)) minigame_return_index = END_SCALEFORM_MOVIE_METHOD_RETURN_VALUE() ENDIF ELSE IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT) OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_ACCEPT) BEGIN_SCALEFORM_MOVIE_METHOD(sfHacking, "SET_INPUT_EVENT_SELECT") //SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(SCALEFORM_INPUT_EVENT_CROSS)) minigame_return_index = END_SCALEFORM_MOVIE_METHOD_RETURN_VALUE() ENDIF ENDIF ENDIF IF IS_SCALEFORM_MOVIE_METHOD_RETURN_VALUE_READY(minigame_return_index) iClick = GET_SCALEFORM_MOVIE_METHOD_RETURN_VALUE_INT(minigame_return_index) PRINTSTRING("*********************iClick")PRINTINT(iClick)PRINTNL() ENDIF ENDIF //ROULETTE SUCCESS IF iClick = 86 PLAY_SOUND_FRONTEND(-1,"HACKING_CLICK_GOOD") ENDIF IF iClick = 92 PLAY_SOUND_FRONTEND(-1,"HACKING_CLICK") ENDIF //IF hacking_data.bGotColumnWrong IF IS_BIT_SET(hacking_data.bsHacking,BS_GOT_COLUMN_WRONG) IF MANAGE_HACKING_TIMER(hacking_data.i_BF_Timer,500) CALL_SCALEFORM_MOVIE_METHOD(sfHacking,"RESET_ROULETTE") CLEAR_BIT(hacking_data.bsHacking,BS_GOT_COLUMN_WRONG) //hacking_data.bGotColumnWrong = FALSE ENDIF ENDIF //LOSE A LIFE IF iClick = 87 IF hacking_data.i_lives > 1 PLAY_SOUND_FRONTEND(-1,"HACKING_CLICK_BAD") CALL_SCALEFORM_MOVIE_METHOD(sfHacking,"STOP_ROULETTE") hacking_data.i_BF_Timer = GET_GAME_TIMER() //hacking_data.bGotColumnWrong = TRUE SET_BIT(hacking_data.bsHacking,BS_GOT_COLUMN_WRONG) SET_BIT(hacking_data.bsHacking,BS_BRUTE_FORCE_INCREASE_FAIL_TELEMETRY) PRINTSTRING("[HACKING]hacking_data.bsHacking,BS_BRUTE_FORCE_INCREASE_FAIL_TELEMETRY SET") IF GET_CURRENT_GAMEMODE() = GAMEMODE_FM hacking_data.i_lives -- PRINTSTRING("*********************Lose a life")PRINTINT(iClick)PRINTNL() CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"SET_LIVES",TO_FLOAT(hacking_data.i_lives)) ENDIF ELSE //hacking_data.b_MP_Hack_fail = TRUE SET_BIT(hacking_data.bsHacking,BS_MP_HACK_FAIL) SET_BIT(hacking_data.bsHacking,BS_BRUTE_FORCE_INCREASE_FAIL_TELEMETRY) PLAY_SOUND_FRONTEND(-1,"HACKING_FAILURE") hacking_data.i_lives = iStartLives CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"SET_LIVES",TO_FLOAT(iStartLives)) hacking_data.f_speed = TO_FLOAT(iStartingSpeed) i_clock_start = GET_GAME_TIMER() IF sHacking[1] != -1 IF NOT HAS_SOUND_FINISHED(sHacking[1]) STOP_SOUND(sHacking[1]) sHacking[1] = -1 ENDIF ENDIF IF GET_CURRENT_GAMEMODE() = GAMEMODE_FM PRINTSTRING("*********************Lost all lives")PRINTINT(iClick)PRINTNL() CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER_AND_STRING(sfHacking,"SET_ROULETTE_OUTCOME",0 ,INVALID_SCALEFORM_PARAM,INVALID_SCALEFORM_PARAM,INVALID_SCALEFORM_PARAM,INVALID_SCALEFORM_PARAM,"LOSEBRUTE") ENDIF ENDIF ENDIF //HAS THE PLAYER RUN OUT OF TIME IF bStartHackTimer = TRUE rawTime = 60000 - (GET_GAME_TIMER() - i_clock_start) IF rawTime < 1 hacking_data.i_lives = iStartLives //hacking_data.b_MP_Hack_fail = TRUE SET_BIT(hacking_data.bsHacking,BS_MP_HACK_FAIL) CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"SET_LIVES",TO_FLOAT(iStartLives)) hacking_data.f_speed = TO_FLOAT(iStartingSpeed) i_clock_start = GET_GAME_TIMER() bStartHackTimer = FALSE bDoMoreHelpText = TRUE PLAY_SOUND_FRONTEND(-1,"HACKING_FAILURE") CLEAR_HELP() IF sHacking[1] != -1 IF NOT HAS_SOUND_FINISHED(sHacking[1]) STOP_SOUND(sHacking[1]) sHacking[1] = -1 ENDIF ENDIF CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER_AND_STRING(sfHacking,"SET_ROULETTE_OUTCOME",0 ,INVALID_SCALEFORM_PARAM,INVALID_SCALEFORM_PARAM,INVALID_SCALEFORM_PARAM,INVALID_SCALEFORM_PARAM,"LOSEBRUTE") ENDIF ENDIF //RETRY - YES IF iClick = 88 hacking_data.i_lives = iStartLives //hacking_data.b_MP_Hack_fail = TRUE SET_BIT(hacking_data.bsHacking,BS_MP_HACK_FAIL) CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(sfHacking,"SET_LIVES",TO_FLOAT(iStartLives)) hacking_data.f_speed = TO_FLOAT(iStartingSpeed) i_clock_start = GET_GAME_TIMER() sHacking[1] = GET_SOUND_ID() PLAY_SOUND_FRONTEND(sHacking[1],"HACKING_COUNTDOWN_CRACK_PASS") bStartHackTimer = TRUE ENDIF //ENDIF //RETRY - NO IF iClick = 89 hacking_data.i_lives = iStartLives //hacking_data.b_MP_Hack_fail = TRUE SET_BIT(hacking_data.bsHacking,BS_MP_HACK_FAIL) CALL_SCALEFORM_MOVIE_METHOD(sfHacking,"CLOSE_APP") IF sHacking[1] != -1 IF NOT HAS_SOUND_FINISHED(sHacking[1]) STOP_SOUND(sHacking[1]) sHacking[1] = -1 ENDIF ENDIF iThisHacking = 4 ENDIF //WIN IF iClick = 86 CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER_AND_STRING(sfHacking,"SET_ROULETTE_OUTCOME",1 ,INVALID_SCALEFORM_PARAM,INVALID_SCALEFORM_PARAM,INVALID_SCALEFORM_PARAM,INVALID_SCALEFORM_PARAM,"WINBRUTE") iHackTimer = GET_GAME_TIMER() //hacking_data.b_brute_force_game_solved = TRUE SET_BIT(hacking_data.bsHacking,BS_BRUTE_FORCE_GAME_SOLVED) IF bUseNewSound PLAY_SOUND_FRONTEND(-1,"Hack_Success","DLC_GR_Steal_Railguns_Sounds") CPRINTLN( DEBUG_MIKE, "HACK MINIGAME() - PLAY_SOUND_FRONTEND - Hack_Success" ) ELSE PLAY_SOUND_FRONTEND(-1,"HACKING_SUCCESS") CPRINTLN( DEBUG_MIKE, "HACK MINIGAME() - PLAY_SOUND_FRONTEND - HACKING_SUCCESS" ) ENDIF IF sHacking[1] != -1 IF NOT HAS_SOUND_FINISHED(sHacking[1]) STOP_SOUND(sHacking[1]) sHacking[1] = -1 ENDIF ENDIF iThisHacking = 7 ENDIF //ENDIF BREAK //CHECKS IF THE PLAYER IS SUCCESSFUL CASE 7 IF bDoTutorial = TRUE // IF hacking_data.b_brute_force_game_solved = TRUE // AND hacking_data.b_hack_connect_game_solved = TRUE IF IS_BIT_SET(hacking_data.bsHacking,BS_BRUTE_FORCE_GAME_SOLVED) AND IS_BIT_SET(hacking_data.bsHacking,BS_HACK_CONNECT_GAME_SOLVED) IF bDownAndOutHelp = FALSE IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("HACKOBJ7") PRINT_HELP_FOREVER("HACKOBJ7") bDownAndOutHelp = TRUE ENDIF ENDIF ENDIF IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("H_USE_PC6") OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("H_USE_PC7") OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("H_USE_PC8") OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("H_USE_PC9") CLEAR_HELP(TRUE) ENDIF ENDIF // // IF hacking_data.b_brute_force_game_solved = TRUE // AND hacking_data.b_hack_connect_game_solved = TRUE // AND (NOT bDoDownloadOpen OR (bDoDownloadOpen AND hacking_data.b_download_open)) IF IS_BIT_SET(hacking_data.bsHacking,BS_BRUTE_FORCE_GAME_SOLVED) AND IS_BIT_SET(hacking_data.bsHacking,BS_HACK_CONNECT_GAME_SOLVED) AND (NOT bDoDownloadOpen OR (bDoDownloadOpen AND IS_BIT_SET(hacking_data.bsHacking,BS_DOWNLOAD_OPEN) )) AND (NOT bDoMapOpen OR (bDoMapOpen AND IS_BIT_SET(hacking_data.iBS2Hacking, BS2_MAP_SHOWN))) IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("HACKOBJ7") CLEAR_HELP(TRUE) ENDIF IF NOT bPlaySuccessBeep PLAY_SOUND_FROM_ENTITY(-1,"unlocked_bleep",PLAYER_PED_ID(),"HACKING_DOOR_UNLOCK_SOUNDS") bPlaySuccessBeep = TRUE ENDIF IF MANAGE_HACKING_TIMER(iHackTimer, 3000) CLEAR_BIT(hacking_data.bsHacking,BS_IS_HACKING) SET_BIT(hacking_data.bsHacking,BS_HACKING_SUCCESSFUL) //hacking_data.b_is_hacking = FALSE //hacking_data.b_hacking_successful = TRUE FORCE_POSTFX_BULLET_IMPACTS_AFTER_HUD(FALSE) ENDIF ELIF bDoMapOpen AND IS_BIT_SET(hacking_data.bsHacking, BS_BRUTE_FORCE_GAME_SOLVED) IF NOT IS_BIT_SET(hacking_data.iBS2Hacking, BS2_MAP_SHOWN) PRINTLN("RENDER_PC - Setting BS2_MAP_SHOWN") SET_BIT(hacking_data.iBS2Hacking, BS2_MAP_SHOWN) CALL_SCALEFORM_MOVIE_METHOD(sfHacking, "SHOW_MAP") ENDIF IF MANAGE_HACKING_TIMER(iHackTimer, 7000) CLEAR_BIT(hacking_data.bsHacking, BS_IS_HACKING) SET_BIT(hacking_data.bsHacking, BS_HACKING_SUCCESSFUL) FORCE_POSTFX_BULLET_IMPACTS_AFTER_HUD(FALSE) ENDIF ELSE // Display the download app icon if needed and only after the hack connect has been established IF bDoDownloadOpen AND NOT IS_BIT_SET(hacking_data.bsHacking,BS_DOWNLOAD_ICON_DISPLAYED) AND IS_BIT_SET(hacking_data.bsHacking,BS_BRUTE_FORCE_GAME_SOLVED) AND IS_BIT_SET(hacking_data.bsHacking,BS_HACK_CONNECT_GAME_SOLVED) // AND NOT hacking_data.b_download_icon_displayed // AND hacking_data.b_brute_force_game_solved = TRUE // AND hacking_data.b_hack_connect_game_solved = TRUE BEGIN_SCALEFORM_MOVIE_METHOD(sfHacking, "OPEN_DOWNLOAD") SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(TRUE) END_SCALEFORM_MOVIE_METHOD() SET_BIT(hacking_data.bsHacking,BS_DOWNLOAD_ICON_DISPLAYED) //hacking_data.b_download_icon_displayed = TRUE ENDIF IF MANAGE_HACKING_TIMER(iHackTimer, 2000) CALL_SCALEFORM_MOVIE_METHOD(sfHacking,"CLOSE_APP") iThisHacking = 4 ENDIF ENDIF BREAK CASE 8 RUN_NEW_MINIGAME(hacking_data) BREAK ENDSWITCH ENDPROC /// RUN_HACKING_MINIGAME (pass in your own hacking data struct) /// NOTES: run every frame, initalise local hacking data struct and pass this through. /// PURPOSE: /// Runs necessary hacking scripts, launched through IS_PED_HACKING_AT_TERMINAL or by setting .b_is_hacking to TRUE /// PARAMS: /// S_HACKING_DATA &hacking_data - hacking data /// RETURNS: /// No returns /// PROC RUN_HACKING_MINIGAME(S_HACKING_DATA &hacking_data, BOOL bDoTutorial = FALSE, BOOL bJustHackConnect = FALSE, BOOL bJustBruteForce = FALSE, BOOL bDoDownloadOpen = FALSE #IF USE_TU_CHANGES , BOOL bMP = TRUE #ENDIF ) //IF hacking_data.b_is_hacking = TRUE IF IS_BIT_SET(hacking_data.bsHacking,BS_IS_HACKING) RENDER_PC(hacking_data,5,5,100,10,8,10,bDoTutorial,bJustHackConnect,bJustBruteForce, bDoDownloadOpen, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT #IF USE_TU_CHANGES , bMP #ENDIF ) ENDIF ENDPROC //INT iMaxLives = 5 //INT iStartLives = 5 //INT iStartingSpeed = 10 /// RUN_HACKING_MINIGAME (pass in your own hacking data struct) /// NOTES: run every frame, initalise local hacking data struct and pass this through. /// PURPOSE: /// Runs necessary hacking scripts, launched through IS_PED_HACKING_AT_TERMINAL or by setting .b_is_hacking to TRUE /// PARAMS: /// S_HACKING_DATA &hacking_data - hacking data /// RETURNS: /// No returns /// PROC RUN_HACKING_MINIGAME_WITH_PARAMETERS(S_HACKING_DATA &hacking_data, INT iStartLives = 5, INT iMaxLives = 5, INT iStartingSpeed = 10, INT iSpeedDecayRate = 10, INT iBruteForceColumns = 8, INT iChanceOfRedHerrings = 10,BOOL bDoTutorial = FALSE, BOOL bJustHackConnect = FALSE, BOOL bJustBruteForce = FALSE, BOOL bRandomPassword = TRUE, BOOL bHackConnectBeforeBrute = TRUE, BOOL bExitButton = FALSE, BOOL bDoDownloadOpen = FALSE, INT iTotalTime = 60000 , BOOL bMP = TRUE , BOOL bSetInstructionalButtonsUnderHud = TRUE, BOOL bUseNewPasswords = FALSE, BOOL bUseNewSound = FALSE, BOOL bHideMyComputerIcon = FALSE, BOOL bShowMap = FALSE, BOOL bDugganPassword = FALSE) //IF hacking_data.b_is_hacking = TRUE IF IS_BIT_SET(hacking_data.bsHacking, BS_IS_HACKING) RENDER_PC(hacking_data,iStartLives,iMaxLives,iStartingSpeed,iSpeedDecayRate,iBruteForceColumns,iChanceOfRedHerrings,bDoTutorial,bJustHackConnect,bJustBruteForce,bRandomPassword, bHackConnectBeforeBrute,bExitButton, bDoDownloadOpen,WALL_FBI,iTotalTime , bMP , bSetInstructionalButtonsUnderHud, bUseNewPasswords, bUseNewSound, bHideMyComputerIcon, bShowMap, bDugganPassword) ENDIF ENDPROC PROC GENERATE_HACKING_DATA_FROM_PLAYER_LEVEL(S_HACKING_DATA &hacking_data,INT iHackingLevel = 0, INT iTerminalLevel = 0,BOOL bDoTutorial = FALSE,BOOL bJustHackConnect = FALSE,BOOL bHackConnectBeforeBrute = FALSE,BOOL bRandomPassword = TRUE, BOOL bJustBruteForce = FALSE, BOOL bExitButton = FALSE) //defaults for now INT iStartLives = 5 INT iMaxLives = 5 INT iStartingSpeed = 10 INT iSpeedDecayRate = 10 INT iBruteForceColumns = 8 INT iChanceOfRedHerrings = 10 iStartLives = ROUND((iHackingLevel / 10)-(iTerminalLevel / 10)) IF iStartLives > 7 iStartLives = 7 ELSE IF iStartLives < 1 iStartLives = 1 ENDIF ENDIF RUN_HACKING_MINIGAME_WITH_PARAMETERS(hacking_data,iStartLives,iMaxLives,iStartingSpeed,iSpeedDecayRate,iBruteForceColumns,iChanceOfRedHerrings,bDoTutorial,bJustHackConnect,bJustBruteForce, bRandomPassword,bHackConnectBeforeBrute,bExitButton) ENDPROC /// RUN_HACKING_MINIGAME_BASED_ON_PLAYER_SKILL (pass in your own hacking data struct) /// NOTES: run every frame, initalise local hacking data struct and pass this through. /// PURPOSE: /// Runs necessary hacking scripts, launched through IS_PED_HACKING_AT_TERMINAL or by setting .b_is_hacking to TRUE /// PARAMS: /// S_HACKING_DATA &hacking_data - hacking data /// RETURNS: /// No returns /// PROC RUN_HACKING_MINIGAME_BASED_ON_PLAYER_SKILL(S_HACKING_DATA &hacking_data, INT iHackingLevel, INT iTerminalLevel,BOOL bDoTutorial = FALSE, BOOL bJustHackConnect = FALSE, BOOL bJustBruteForce = FALSE) //IF hacking_data.b_is_hacking = TRUE IF IS_BIT_SET(hacking_data.bsHacking,BS_IS_HACKING) //PC_CHECKS(hacking_data) GENERATE_HACKING_DATA_FROM_PLAYER_LEVEL(hacking_data,iHackingLevel, iTerminalLevel,bDoTutorial,bJustHackConnect,bJustBruteForce) ENDIF ENDPROC /// PURPOSE: /// Determines whether the player is at a hacking terminal /// PARAMS: /// S_HACKING_DATA &hacking_data - hacking data /// VECTOR v_terminal - the vector of the terminal /// FLOAT f_heading - the heading of the terminal /// ECOMPASS e_compass - the compass heading of the terminal /// FLOAT f_locate_size - locate size of terminal /// EACTIVATIONEASE - possible points of activation /// RETURNS: /// True if the player is activating the terminal FUNC BOOL IS_PED_AT_HACKING_TERMINAL(S_HACKING_DATA &hacking_data ,VECTOR v_terminal,FLOAT f_terminal_heading,ECOMPASS e_compass,FLOAT f_locate_size = 0.4, BOOL bAllowPlayerDamage = FALSE,EACTIVATIONEASE eEase =EACTIVATIONEASE_MEDIUM) VECTOR v_temp IF IS_PLAYER_ACTIVATING_COORD(v_terminal,f_terminal_heading, e_compass, f_locate_size, EACTIVESIDE_ONEWAY,eEase) //OR hacking_data.bForceStartHacking OR IS_BIT_SET(hacking_data.bsHacking,BS_FORCE_START_HACKING) //IF hacking_data.b_hacking_successful = FALSE IF NOT IS_BIT_SET(hacking_data.bsHacking,BS_HACKING_SUCCESSFUL) //sfHacking = REQUEST_SCALEFORM_MOVIE("hacking_pc") IF HAS_SCALEFORM_MOVIE_LOADED(sfHacking) IF NOT IS_BIT_SET(hacking_data.bsHacking,BS_IS_HACKING) //IF hacking_data.b_is_hacking = FALSE IF bAllowPlayerDamage = TRUE SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_ALLOW_PLAYER_DAMAGE) ELSE SET_PLAYER_CONTROL(PLAYER_ID(), FALSE) ENDIF // IF hacking_data.bForceStartHacking=TRUE // hacking_data.bForceStartHacking=FALSE // ENDIF IF IS_BIT_SET(hacking_data.bsHacking,BS_FORCE_START_HACKING) CLEAR_BIT(hacking_data.bsHacking,BS_FORCE_START_HACKING) ENDIF DISABLE_CELLPHONE(TRUE) REQUEST_ADDITIONAL_TEXT("HACK", MINIGAME_TEXT_SLOT) IF NOT HAS_THIS_ADDITIONAL_TEXT_LOADED("HACK", MINIGAME_TEXT_SLOT) WAIT(0) ENDIF IF NOT IS_PED_INJURED(PLAYER_PED_ID()) v_temp = GET_GAMEPLAY_CAM_COORD() cam_temp = CREATE_CAM_WITH_PARAMS ("DEFAULT_SCRIPTED_CAMERA",v_temp, GET_GAMEPLAY_CAM_ROT(), 1.0, TRUE ) SET_CAM_ACTIVE(cam_temp,TRUE) SET_CAM_FAR_CLIP(cam_temp,15) SET_CAM_NEAR_CLIP(cam_temp,15) SET_PED_CURRENT_WEAPON_VISIBLE(PLAYER_PED_ID(),FALSE) //hacking_data.b_is_hacking = TRUE SET_BIT(hacking_data.bsHacking,BS_IS_HACKING) ENDIF ENDIF RETURN TRUE ELSE RETURN FALSE ENDIF ELSE RETURN FALSE ENDIF ELSE RETURN FALSE ENDIF ENDFUNC //HAS_PLAYER_SUCCESSFULLY_HACKED_TERMINAL //check to see if player has hacked terminal FUNC BOOL HAS_PLAYER_SUCCESSFULLY_HACKED_TERMINAL(S_HACKING_DATA &hacking_data) //IF hacking_data.b_brute_force_game_solved = TRUE AND hacking_data.b_hack_connect_game_solved = TRUE AND hacking_data.b_hacking_successful = TRUE IF IS_BIT_SET(hacking_data.bsHacking,BS_BRUTE_FORCE_GAME_SOLVED) AND IS_BIT_SET(hacking_data.bsHacking,BS_HACK_CONNECT_GAME_SOLVED) AND IS_BIT_SET(hacking_data.bsHacking,BS_HACKING_SUCCESSFUL) RETURN TRUE ELSE RETURN FALSE ENDIF ENDFUNC ///MANAGE LIVES - manages the rendering of lives in the game screen. ///PRIVATE FUNCTION DON'T USE IN SCRIPTS /// /// PROC MANAGE_LIVES(S_HACKING_DATA &hacking_data) //RENDER LIVES IF hacking_data.i_lives = 3 DRAW_RECT(0.8710, 0.1410, 0.0100, 0.0540, 0, 0, 0, 255) ENDIF IF hacking_data.i_lives = 2 DRAW_RECT(0.8710, 0.1410, 0.0100, 0.0540, 0, 0, 0, 255) DRAW_RECT(0.8590, 0.1410, 0.0100, 0.0540, 0, 0, 0, 255) ENDIF IF hacking_data.i_lives = 1 DRAW_RECT(0.8710, 0.1410, 0.0100, 0.0540, 0, 0, 0, 255) DRAW_RECT(0.8590, 0.1410, 0.0100, 0.0540, 0, 0, 0, 255) DRAW_RECT(0.8510, 0.1500, 0.0100, 0.0540, 0, 0, 0, 255) ENDIF IF hacking_data.i_lives = 0 DRAW_RECT(0.8390, 0.1480, 0.0100, 0.0540, 0, 0, 0, 255) DRAW_RECT(0.8710, 0.1410, 0.0100, 0.0540, 0, 0, 0, 255) DRAW_RECT(0.8590, 0.1410, 0.0100, 0.0540, 0, 0, 0, 255) DRAW_RECT(0.8510, 0.1500, 0.0100, 0.0540, 0, 0, 0, 255) ENDIF ENDPROC /// DISPLAY_TIMER - displays timer for use in mini games ///PRIVATE FUNCTION DON'T USE IN SCRIPTS /// /// PROC DISPLAY_TIMER(FLOAT DisplayAtX, FLOAT DisplayAtY, structTimer tThisTimer) INT timer_in_ms = ROUND(GET_TIMER_IN_SECONDS(tThisTimer)*1000.0) INT iMinutes = (timer_in_ms/1000)/60 INT iSeconds = (timer_in_ms-(iMinutes*60*1000))/1000 INT iMiliseconds = timer_in_ms-((iSeconds+(iMinutes*60))*1000) iMinutes = i_Minute_Val - iMinutes iSeconds = i_Second_Val - iSeconds iMiliseconds = i_MiliSecond_Val - iMiliseconds TEXT_LABEL str = "PS_TIMEH_" IF iMinutes > 0 str += "M0" ENDIF IF iSeconds > 0 str += "S0" ELSE str += "S1" ENDIF IF iMiliseconds < 10 str += "M2" ELIF iMiliseconds < 100 str += "M1" ELSE str += "M0" ENDIF //TURN RED AT 10 SECONDS LEFT IF iSeconds < 10 SET_TEXT_SCALE(0.7500, 0.7500) SET_TEXT_COLOUR(200, 0, 0, 255) ELSE SET_TEXT_SCALE(0.7500, 0.7500) SET_TEXT_COLOUR(0, 200, 0, 255) ENDIF IF iMinutes > 0 //DISPLAY_TEXT_WITH_3_NUMBERS(DisplayAtX, DisplayAtY, str, iMinutes, iSeconds, iMiliseconds) DISPLAY_TEXT_WITH_2_NUMBERS(DisplayAtX, DisplayAtY, str, iSeconds, iMiliseconds) ELSE DISPLAY_TEXT_WITH_2_NUMBERS(DisplayAtX, DisplayAtY, str, iSeconds, iMiliseconds) ENDIF ENDPROC /// IS_MOUSE_IN_SCREEN_AREA - checks if the mouse pointer is in a certain area of the screen defined by the top left point and the bottom right. ///PRIVATE FUNCTION DON'T USE IN SCRIPTS /// /// FUNC BOOL IS_MOUSE_IN_SCREEN_AREA(S_HACKING_DATA &hacking_data,VECTOR vTopLCorner,VECTOR vBottomRCorner) IF (hacking_data.f_mouse_x >= vTopLCorner.x AND hacking_data.f_mouse_x <= vBottomRCorner.x) AND (hacking_data.f_mouse_y >= vTopLCorner.y AND hacking_data.f_mouse_y <= vBottomRCorner.y) RETURN TRUE ENDIF RETURN FALSE ENDFUNC /// HAS_ANALOGUE_STICK_BEEN_RESET- checks to see if analogue stick has been moved back to centre position ///PRIVATE FUNCTION DON'T USE IN SCRIPTS /// /// PROC HAS_ANALOGUE_STICK_BEEN_RESET(S_HACKING_DATA &hacking_data) INT i_left_x,i_left_y,i_right_x,i_right_y //GET_POSITION_OF_ANALOGUE_STICKS(PLAYER_CONTROL,i_left_x,i_left_y,i_right_x,i_right_y) i_left_x = GET_CONTROL_VALUE(FRONTEND_CONTROL, INPUT_FRONTEND_AXIS_X) - 128 i_left_y = GET_CONTROL_VALUE(FRONTEND_CONTROL, INPUT_FRONTEND_AXIS_Y) - 128 i_right_x = GET_CONTROL_VALUE(FRONTEND_CONTROL, INPUT_FRONTEND_AXIS_X) - 128 i_right_y = GET_CONTROL_VALUE(FRONTEND_CONTROL, INPUT_FRONTEND_AXIS_Y) - 128 // IF hacking_data.b_hack_connect_open = TRUE // OR hacking_data.b_brute_force_open = TRUE IF IS_BIT_SET(hacking_data.bsHacking,BS_HACK_CONNECT_OPEN) OR IS_BIT_SET(hacking_data.bsHacking,BS_BRUTE_FORCE_OPEN) IF IS_BIT_SET(hacking_data.bsHacking,BS_NODE_INCREMENTED_X) IF i_right_x = 0 CLEAR_BIT(hacking_data.bsHacking,BS_NODE_INCREMENTED_X) ENDIF ENDIF IF IS_BIT_SET(hacking_data.bsHacking,BS_NODE_DECREMENTED_X) IF i_right_x = 0 CLEAR_BIT(hacking_data.bsHacking,BS_NODE_DECREMENTED_X) ENDIF ENDIF IF IS_BIT_SET(hacking_data.bsHacking,BS_NODE_INCREMENTED_Y) IF i_right_y = 0 CLEAR_BIT(hacking_data.bsHacking,BS_NODE_INCREMENTED_Y) ENDIF ENDIF IF IS_BIT_SET(hacking_data.bsHacking,BS_NODE_DECREMENTED_Y) IF i_right_y = 0 CLEAR_BIT(hacking_data.bsHacking,BS_NODE_DECREMENTED_Y) ENDIF ENDIF ENDIF IF IS_BIT_SET(hacking_data.bsHacking,BS_NODE_INCREMENTED_X) IF i_left_x = 0 CLEAR_BIT(hacking_data.bsHacking,BS_NODE_INCREMENTED_X) ENDIF ENDIF IF IS_BIT_SET(hacking_data.bsHacking,BS_NODE_DECREMENTED_X) IF i_left_x = 0 CLEAR_BIT(hacking_data.bsHacking,BS_NODE_DECREMENTED_X) ENDIF ENDIF IF IS_BIT_SET(hacking_data.bsHacking,BS_NODE_INCREMENTED_Y) IF i_left_y = 0 CLEAR_BIT(hacking_data.bsHacking,BS_NODE_INCREMENTED_Y) ENDIF ENDIF IF IS_BIT_SET(hacking_data.bsHacking,BS_NODE_DECREMENTED_Y) IF i_right_y = 0 CLEAR_BIT(hacking_data.bsHacking,BS_NODE_DECREMENTED_Y) ENDIF ENDIF ENDPROC /// GET_TEXT_FROM_INT - checks if the mouse pointer is in a certain area of the screen defined by the top left point and the bottom right. ///PRIVATE FUNCTION DON'T USE IN SCRIPTS /// /// FUNC STRING GET_TEXT_FROM_INT(INT number) STRING text = "0" SWITCH number CASE 1 text = "1" BREAK CASE 2 text = "2" BREAK CASE 3 text = "3" BREAK CASE 4 text = "4" BREAK CASE 5 text = "5" BREAK CASE 6 text = "6" BREAK CASE 7 text = "7" BREAK CASE 8 text = "8" BREAK CASE 9 text = "9" BREAK ENDSWITCH RETURN text ENDFUNC /// FORCE_QUIT_FAIL_HACKING_MINIGAME (pass in your own hacking data struct) /// NOTES: Force the termination of the hacking minigame and cause the player to fail. /// PURPOSE: /// Force the termination of the hacking minigame and cause the player to fail. /// PARAMS: /// S_HACKING_DATA &hacking_data - hacking data /// RETURNS: /// No Returns /// PROC FORCE_QUIT_FAIL_HACKING_MINIGAME(S_HACKING_DATA &hacking_data) // SET_SPRITES_DRAW_BEFORE_FADE(FALSE) // SET_SCRIPT_GFX_DRAW_ORDER(FALSE) IF NOT IS_PED_INJURED(PLAYER_PED_ID()) SET_PED_CURRENT_WEAPON_VISIBLE(PLAYER_PED_ID(),TRUE) ENDIF IF IS_MINIGAME_IN_PROGRESS() SET_MINIGAME_IN_PROGRESS(FALSE) ENDIF SET_SCRIPT_GFX_DRAW_BEHIND_PAUSEMENU(FALSE) CLEAR_HELP() SET_PLAYER_CONTROL(PLAYER_ID(),TRUE) DESTROY_CAM(cam_temp) CLEAR_BIT(hacking_data.bsHacking,BS_IS_HACKING) CLEAR_BIT(hacking_data.bsHacking,BS_HACKING_SUCCESSFUL) //hacking_data.b_is_hacking = FALSE //hacking_data.b_hacking_successful = FALSE DISABLE_CELLPHONE(FALSE) DISABLE_SCRIPT_HUD_THIS_FRAME_RESET() FORCE_POSTFX_BULLET_IMPACTS_AFTER_HUD(FALSE) //RESET_HACKING_DATA(hacking_data) ENDPROC /// FORCE_QUIT_PASS_HACKING_MINIGAME (pass in your own hacking data struct) /// NOTES: Force the termination of the hacking minigame and cause the player to pass. /// PURPOSE: /// Force the termination of the hacking minigame and cause the player to pass. /// PARAMS: /// S_HACKING_DATA &hacking_data - hacking data /// RETURNS: /// No Returns /// PROC FORCE_QUIT_PASS_HACKING_MINIGAME(S_HACKING_DATA &hacking_data, BOOL bRestoreControl = TRUE, BOOL bRestoreWeaponVisibility = TRUE) //hacking_data.b_is_hacking = FALSE //hacking_data.b_hacking_successful = TRUE CLEAR_BIT(hacking_data.bsHacking,BS_IS_HACKING) SET_BIT(hacking_data.bsHacking,BS_HACKING_SUCCESSFUL) //SET_SPRITES_DRAW_BEFORE_FADE(FALSE) //SET_SCRIPT_GFX_DRAW_ORDER(FALSE) SET_SCRIPT_GFX_DRAW_BEHIND_PAUSEMENU(FALSE) IF bRestoreWeaponVisibility IF NOT IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID()) // 2601506 SET_PED_CURRENT_WEAPON_VISIBLE(PLAYER_PED_ID(),TRUE) ENDIF ENDIF IF IS_MINIGAME_IN_PROGRESS() SET_MINIGAME_IN_PROGRESS(FALSE) ENDIF CLEAR_HELP() IF bRestoreControl SET_PLAYER_CONTROL(PLAYER_ID(),TRUE) CPRINTLN(DEBUG_MISSION, "FORCE_QUIT_PASS_HACKING_MINIGAME - SET_PLAYER_CONTROL(PLAYER_ID(),TRUE)") ENDIF DESTROY_CAM(cam_temp) DISABLE_CELLPHONE(FALSE) DISABLE_SCRIPT_HUD_THIS_FRAME_RESET() FORCE_POSTFX_BULLET_IMPACTS_AFTER_HUD(FALSE) RESET_HACKING_DATA(hacking_data) #IF IS_NEXTGEN_BUILD // DISABLE MULTIPLE DISPLAYS/BLINDERS SET_MULTIHEAD_SAFE(FALSE, TRUE) PRINTLN( "Hacking mini game RENDER_PC()Disable SET_MULTIHEAD_SAFE") #ENDIF ENDPROC /// HAS_PLAYER_FAILED_HACKING (pass in your own hacking data struct) /// NOTES: checks if the player has failed. /// PURPOSE: /// checks if the player has failed. /// PARAMS: /// S_HACKING_DATA &hacking_data - hacking data /// bAndForceQuit - pass TRUE to terminate hacking on fail. /// RETURNS: /// TRUE on the player losing all thier lives /// FUNC BOOL HAS_PLAYER_FAILED_HACKING(S_HACKING_DATA &hacking_data,BOOL bAndForceQuit = FALSE) IF hacking_data.i_lives < 1 IF bAndForceQuit FORCE_QUIT_FAIL_HACKING_MINIGAME(hacking_data) RETURN TRUE ELSE RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC FUNC BOOL HAS_PLAYER_FAILED_HACKING_MP(S_HACKING_DATA &hacking_data) //IF hacking_data.b_MP_Hack_fail IF IS_BIT_SET(hacking_data.bsHacking,BS_MP_HACK_FAIL) RETURN TRUE ENDIF RETURN FALSE ENDFUNC /// HAS_PLAYER_BEAT_BRUTEFORCE (pass in your own hacking data struct) /// NOTES: checks if a player has beaten Bruteforce /// PURPOSE: /// checks if a player has beaten Bruteforce /// PARAMS: /// S_HACKING_DATA &hacking_data - hacking data /// bAndForceQuit - pass TRUE to terminate hacking on success /// RETURNS: /// TRUE on player beating bruceforce /// FUNC BOOL HAS_PLAYER_BEAT_BRUTEFORCE(S_HACKING_DATA &hacking_data,BOOL bAndForceQuit = FALSE) //IF hacking_data.b_brute_force_game_solved = TRUE IF IS_BIT_SET(hacking_data.bsHacking,BS_BRUTE_FORCE_GAME_SOLVED) IF bAndForceQuit FORCE_QUIT_PASS_HACKING_MINIGAME(hacking_data) RETURN TRUE ELSE RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC FUNC BOOL HAS_PLAYER_VIEWED_HACKING_MAP(S_HACKING_DATA &hacking_data, BOOL bAndForceQuit = FALSE) IF IS_BIT_SET(hacking_data.iBS2Hacking, BS2_MAP_SHOWN) IF bAndForceQuit FORCE_QUIT_PASS_HACKING_MINIGAME(hacking_data) RETURN TRUE ELSE RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC /// HAS_PLAYER_BEAT_BRUTEFORCE (pass in your own hacking data struct) /// NOTES: checks if a player has beaten Bruteforce /// PURPOSE: /// checks if a player has beaten Bruteforce /// PARAMS: /// S_HACKING_DATA &hacking_data - hacking data /// bAndForceQuit - pass TRUE to terminate hacking on success /// RETURNS: /// TRUE on player beating bruceforce /// FUNC BOOL HAS_PLAYER_BEAT_HACK_CONNECT(S_HACKING_DATA &hacking_data,BOOL bAndForceQuit = FALSE) //IF hacking_data.b_hack_connect_game_solved = TRUE IF IS_BIT_SET(hacking_data.bsHacking,BS_HACK_CONNECT_GAME_SOLVED) IF bAndForceQuit FORCE_QUIT_PASS_HACKING_MINIGAME(hacking_data) RETURN TRUE ELSE RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC //PURPOSE: Checks to see if the download window has been opened FUNC BOOL HAS_DOWNLOAD_WINDOW_BEEN_OPENED(S_HACKING_DATA &hacking_data, BOOL bAndForceQuit = FALSE) //IF hacking_data.b_download_open = TRUE IF IS_BIT_SET(hacking_data.bsHacking,BS_DOWNLOAD_OPEN) IF bAndForceQuit FORCE_QUIT_PASS_HACKING_MINIGAME(hacking_data) RETURN TRUE ELSE RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC /// HAS_PLAYER_BEAT_NEW_HACKING (pass in your own hacking data struct) /// NOTES: checks if a player has beaten the new hacking mini game /// PURPOSE: /// checks if a player has beaten the new hacking mini game /// PARAMS: /// S_HACKING_DATA &hacking_data - hacking data /// bAndForceQuit - pass TRUE to terminate hacking on success /// RETURNS: /// TRUE on player beating new hacking /// FUNC BOOL HAS_PLAYER_BEAT_NEW_HACKING(S_HACKING_DATA &hacking_data,BOOL bAndForceQuit = FALSE) //IF hacking_data.b_new_hacking_game_solved = TRUE IF IS_BIT_SET(hacking_data.bsHacking,BS_NEW_HACKING_GAME_SOLVED) IF bAndForceQuit FORCE_QUIT_PASS_HACKING_MINIGAME(hacking_data) RETURN TRUE ELSE RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC // ################################# CIRCUIT HACKING MINIGAME - START ################################# // /// PURPOSE: /// Handles making the debug spew text scroll upwards when all array positions are full and a new value needs to be inserted /// Shifts all array position values 1 closer to array position 0, deleting the currrent values in position 0 /// [Position 1] -> [Position 0], ..., [Position 14] -> [Position 13] /// Makes room for a new value to be added to the last position in the array (arrayPos[14]) /// PARAMS: /// &hackingData - STRUCT: Hacking data /// i_ValueA - INT: New value to add to last position in Bit range A array /// i_ValueB - INT: New value to add to last position in Bit range B array PROC SHIFT_AND_STORE_DEBUG_OUTPUT_SPEW_BIT_RANGE_VALUES(S_HACKING_DATA &hackingData, INT i_ValueA, INT i_ValueB) INT i_DebugSpewArrayPosition FOR i_DebugSpewArrayPosition = 0 TO 13 IF i_DebugSpewArrayPosition < 9 SET_BITS_IN_RANGE(hackingData.i_DebugOutputBitRange[0], (i_DebugSpewArrayPosition * 3), ((i_DebugSpewArrayPosition * 3) + 2), GET_BITS_IN_RANGE(hackingData.i_DebugOutputBitRange[0], ((i_DebugSpewArrayPosition + 1) * 3), (((i_DebugSpewArrayPosition + 1) * 3) + 2))) SET_BITS_IN_RANGE(hackingData.i_DebugOutputBitRange[1], (i_DebugSpewArrayPosition * 3), ((i_DebugSpewArrayPosition * 3) + 2), GET_BITS_IN_RANGE(hackingData.i_DebugOutputBitRange[1], ((i_DebugSpewArrayPosition + 1) * 3), (((i_DebugSpewArrayPosition + 1) * 3) + 2))) ELIF i_DebugSpewArrayPosition = 9 SET_BITS_IN_RANGE(hackingData.i_DebugOutputBitRange[0], (i_DebugSpewArrayPosition * 3), ((i_DebugSpewArrayPosition * 3) + 2), GET_BITS_IN_RANGE(hackingData.i_DebugOutputBitRange[2], 0, 2)) SET_BITS_IN_RANGE(hackingData.i_DebugOutputBitRange[1], (i_DebugSpewArrayPosition * 3), ((i_DebugSpewArrayPosition * 3) + 2), GET_BITS_IN_RANGE(hackingData.i_DebugOutputBitRange[3], 0, 2)) ELSE SET_BITS_IN_RANGE(hackingData.i_DebugOutputBitRange[2], ((i_DebugSpewArrayPosition - 10) * 3), (((i_DebugSpewArrayPosition - 10) * 3) + 2), GET_BITS_IN_RANGE(hackingData.i_DebugOutputBitRange[2], (((i_DebugSpewArrayPosition + 1) - 10) * 3), ((((i_DebugSpewArrayPosition + 1) - 10) * 3) + 2))) SET_BITS_IN_RANGE(hackingData.i_DebugOutputBitRange[3], ((i_DebugSpewArrayPosition - 10) * 3), (((i_DebugSpewArrayPosition - 10) * 3) + 2), GET_BITS_IN_RANGE(hackingData.i_DebugOutputBitRange[3], (((i_DebugSpewArrayPosition + 1) - 10) * 3), ((((i_DebugSpewArrayPosition + 1) - 10) * 3) + 2))) ENDIF ENDFOR // NEW VALUES -> 14 SET_BITS_IN_RANGE(hackingData.i_DebugOutputBitRange[2], 12, 14, i_ValueA) SET_BITS_IN_RANGE(hackingData.i_DebugOutputBitRange[3], 12, 14, i_ValueB) ENDPROC /// PURPOSE: /// Stores the randomly generated values passed to the bit ranges /// PARAMS: /// &hackingData - STRUCT: Hacking data /// i_CurrentBit - INT: Current string /// i_BitRangeA - INT: Bit range A /// i_BitRangeB - INT: Bit range B PROC STORE_DEBUG_OUTPUT_SPEW_BIT_RANGE_VALUE(S_HACKING_DATA &hackingData, INT i_CurrentBit, INT i_BitRangeA, INT i_BitRangeB) SWITCH i_CurrentBit CASE 0 SET_BITS_IN_RANGE(hackingData.i_DebugOutputBitRange[0], 0, 2, i_BitRangeA) SET_BITS_IN_RANGE(hackingData.i_DebugOutputBitRange[1], 0, 2, i_BitRangeB) BREAK CASE 1 SET_BITS_IN_RANGE(hackingData.i_DebugOutputBitRange[0], 3, 5, i_BitRangeA) SET_BITS_IN_RANGE(hackingData.i_DebugOutputBitRange[1], 3, 5, i_BitRangeB) BREAK CASE 2 SET_BITS_IN_RANGE(hackingData.i_DebugOutputBitRange[0], 6, 8, i_BitRangeA) SET_BITS_IN_RANGE(hackingData.i_DebugOutputBitRange[1], 6, 8, i_BitRangeB) BREAK CASE 3 SET_BITS_IN_RANGE(hackingData.i_DebugOutputBitRange[0], 9, 11, i_BitRangeA) SET_BITS_IN_RANGE(hackingData.i_DebugOutputBitRange[1], 9, 11, i_BitRangeB) BREAK CASE 4 SET_BITS_IN_RANGE(hackingData.i_DebugOutputBitRange[0], 12, 14, i_BitRangeA) SET_BITS_IN_RANGE(hackingData.i_DebugOutputBitRange[1], 12, 14, i_BitRangeB) BREAK CASE 5 SET_BITS_IN_RANGE(hackingData.i_DebugOutputBitRange[0], 15, 17, i_BitRangeA) SET_BITS_IN_RANGE(hackingData.i_DebugOutputBitRange[1], 15, 17, i_BitRangeB) BREAK CASE 6 SET_BITS_IN_RANGE(hackingData.i_DebugOutputBitRange[0], 18, 20, i_BitRangeA) SET_BITS_IN_RANGE(hackingData.i_DebugOutputBitRange[1], 18, 20, i_BitRangeB) BREAK CASE 7 SET_BITS_IN_RANGE(hackingData.i_DebugOutputBitRange[0], 21, 23, i_BitRangeA) SET_BITS_IN_RANGE(hackingData.i_DebugOutputBitRange[1], 21, 23, i_BitRangeB) BREAK CASE 8 SET_BITS_IN_RANGE(hackingData.i_DebugOutputBitRange[0], 24, 26, i_BitRangeA) SET_BITS_IN_RANGE(hackingData.i_DebugOutputBitRange[1], 24, 26, i_BitRangeB) BREAK CASE 9 SET_BITS_IN_RANGE(hackingData.i_DebugOutputBitRange[0], 27, 29, i_BitRangeA) SET_BITS_IN_RANGE(hackingData.i_DebugOutputBitRange[1], 27, 29, i_BitRangeB) BREAK CASE 10 SET_BITS_IN_RANGE(hackingData.i_DebugOutputBitRange[2], 0, 2, i_BitRangeA) SET_BITS_IN_RANGE(hackingData.i_DebugOutputBitRange[3], 0, 2, i_BitRangeB) BREAK CASE 11 SET_BITS_IN_RANGE(hackingData.i_DebugOutputBitRange[2], 3, 5, i_BitRangeA) SET_BITS_IN_RANGE(hackingData.i_DebugOutputBitRange[3], 3, 5, i_BitRangeB) BREAK CASE 12 SET_BITS_IN_RANGE(hackingData.i_DebugOutputBitRange[2], 6, 8, i_BitRangeA) SET_BITS_IN_RANGE(hackingData.i_DebugOutputBitRange[3], 6, 8, i_BitRangeB) BREAK CASE 13 SET_BITS_IN_RANGE(hackingData.i_DebugOutputBitRange[2], 9, 11, i_BitRangeA) SET_BITS_IN_RANGE(hackingData.i_DebugOutputBitRange[3], 9, 11, i_BitRangeB) BREAK CASE 14 SET_BITS_IN_RANGE(hackingData.i_DebugOutputBitRange[2], 12, 14, i_BitRangeA) SET_BITS_IN_RANGE(hackingData.i_DebugOutputBitRange[3], 12, 14, i_BitRangeB) BREAK ENDSWITCH ENDPROC /// PURPOSE: /// Uses two int values stored in bit ranges to randomly determine the contents of the string to be output /// PARAMS: /// &hackingData - STRUCT: Hacking data /// i_CurrentBit - INT: The current possition in the string array (on screen print) /// i_ContentA - INT: Value from a bit range used as first random number when picking the string /// i_ContentB - INT: Value from a bit range used as second random number when picking the string /// RETURNS: /// STRING: The value determined by the two content values passed FUNC STRING GET_DEBUG_OUTPUT_SPEW_STRING_CONTENTS(S_HACKING_DATA &hackingData, BOOL b_UseDifficultLevels, INT i_CurrentBit, INT i_ContentA, INT i_ContentB, bool bHeist2) // OUTPUT SPEW STRING CONTENTS TEXT_LABEL_31 str_String str_String = "" IF i_CurrentBit < iHackSeconds OR IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_RECYCLE_DEBUG_OUTPUT) SWITCH i_ContentA // fx0 CASE 0 str_String = "fx" SWITCH i_ContentB CASE 0 str_String += "437265616d706965" BREAK CASE 1 str_String += "43756e744675636b" BREAK CASE 2 str_String += "42756c6c73686974" BREAK CASE 3 str_String += "416e616c536f6170" BREAK CASE 4 str_String += "436c69746f726973" BREAK CASE 5 str_String += "0000436865657365" BREAK DEFAULT str_String = "MEMORY LEAK: Error 1" BREAK ENDSWITCH BREAK // ERROR CODE: 0x CASE 1 str_String = "ERROR CODE: 0x" SWITCH i_ContentB CASE 0 str_String += "4675636b" BREAK CASE 1 str_String += "436f636b" BREAK CASE 2 str_String += "53686974" BREAK CASE 3 str_String += "53544453" BREAK CASE 4 str_String += "41727365" BREAK CASE 5 str_String += "54697473" BREAK DEFAULT str_String = "MEMORY LEAK: Error 2" BREAK ENDSWITCH BREAK // BLANK SPACE CASE 2 str_String = "" BREAK // CALL: Override_ CASE 3 str_String = "CALL: Override_" SWITCH i_ContentB CASE 0 str_String += "A" BREAK CASE 1 str_String += "B" BREAK CASE 2 str_String += "C" BREAK CASE 3 str_String += "D" BREAK CASE 4 str_String += "E" BREAK CASE 5 str_String += "F" BREAK DEFAULT str_String = "MEMORY LEAK: Error 3" BREAK ENDSWITCH BREAK // DETECTED: CASE 4 str_String = "DETECTED: " SWITCH i_ContentB CASE 0 str_String += "Hack" BREAK CASE 1 str_String += "Tunnel" BREAK CASE 2 str_String += "Breach" BREAK CASE 3 str_String += "Lag" BREAK CASE 4 str_String += "Load" BREAK CASE 5 str_String += "Unauthorized User" BREAK DEFAULT str_String = "MEMORY LEAK: Error 4" BREAK ENDSWITCH BREAK // RELAUNCHING: CASE 5 str_String = "RELAUNCHING: " SWITCH i_ContentB CASE 0 str_String += "Firewall" BREAK CASE 1 str_String += "Proxy" BREAK CASE 2 str_String += "Antivirus" BREAK CASE 3 str_String += "Security" BREAK CASE 4 str_String += "Log Capture" BREAK CASE 5 str_String += "Failed" BREAK DEFAULT str_String = "MEMORY LEAK: Error 5" BREAK ENDSWITCH BREAK // WARNING: CASE 6 str_String = "WARNING: " SWITCH i_ContentB CASE 0 str_String += "Memory Leak" BREAK CASE 1 str_String += "Latency Increase" BREAK CASE 2 IF b_UseDifficultLevels IF bHeist2 str_String += "Accessing server" ELSE str_String += "Accessing Fleeca Vault" ENDIF ELSE str_String += "Searching DIR for Porn" ENDIF BREAK CASE 3 str_String += "Additional User Found" BREAK CASE 4 str_String += "Protocol Changed" BREAK CASE 5 str_String += "Port 69 Unavailable" BREAK DEFAULT str_String = "MEMORY LEAK: Error 6" BREAK ENDSWITCH BREAK DEFAULT str_String = "MEMORY LEAK: Fatal Error" BREAK ENDSWITCH ENDIF // RETURN TEXTLABEL CONTENTS AS STRING TO BE DISLPAYED RETURN GET_STRING_FROM_TEXTLABEL(str_String) ENDFUNC /// PURPOSE: /// Starts the timer used to determine when to print debug output /// PARAMS: /// &hackingData - STRUCT: Hacking data PROC START_DEBUG_OUTPUT_SPEW_TIMER(S_HACKING_DATA &hackingData) RESTART_TIMER_NOW(hackingData.t_PhoneLaunchTimer) ENDPROC /// PURPOSE: /// Stops the timer used to determine when to print debug output /// PARAMS: /// &hackingData - STRUCT: Hacking data /// b_Restart - BOOL: Pass TRUE to reset the timer to 0.0 PROC STOP_DEBUG_OUTPUT_SPEW_TIMER(S_HACKING_DATA &hackingData, BOOL b_Restart = TRUE) IF IS_TIMER_STARTED(hackingData.t_PhoneLaunchTimer) IF b_Restart RESTART_TIMER_NOW(hackingData.t_PhoneLaunchTimer) ENDIF PAUSE_TIMER(hackingData.t_PhoneLaunchTimer) ENDIF ENDPROC /// PURPOSE: /// Draws the debug output to the left of the screen /// PARAMS: /// &hackingData - STRUCT: Hacking data PROC DRAW_DEBUG_OUTPUT_SPEW(S_HACKING_DATA &hackingData, BOOL b_UseDifficultLevels, BOOL bHeist2) // RECYCLED VALUES FROM ADAM'S MINIGAMES // i_DebugOutputSpewIterator => iHackSeconds // i_RandomDebugOutputWaitTime => iHackMilliseconds // t_DebugOutputSpewTimer => hackingData.t_PhoneLaunchTimer // UPDATE SPEW TIMER IF NOT IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_WAIT_TIME_PICKED) iHackMilliseconds = GET_RANDOM_INT_IN_RANGE(0, 6) SET_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_WAIT_TIME_PICKED) ENDIF // UPDATE DEBUG SPEW IF IS_TIMER_STARTED(hackingData.t_PhoneLaunchTimer) AND NOT IS_TIMER_PAUSED(hackingData.t_PhoneLaunchTimer) IF GET_TIMER_IN_SECONDS_SAFE(hackingData.t_PhoneLaunchTimer) >= iHackMilliseconds * 0.7 INT i_BitSetA = GET_RANDOM_INT_IN_RANGE(0, 7) INT i_BitSetB = GET_RANDOM_INT_IN_RANGE(0, 6) // IF FINAL ARRAY POSITION IF iHackSeconds > 14 iHackSeconds = 15 // SHIFT BITS SO CAN ADD A NEW VALUE IN LAST ARRAY POSITION - DELETES FIRST POSITION VALUE SHIFT_AND_STORE_DEBUG_OUTPUT_SPEW_BIT_RANGE_VALUES(hackingData, i_BitSetA, i_BitSetB) IF NOT IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_RECYCLE_DEBUG_OUTPUT) SET_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_RECYCLE_DEBUG_OUTPUT) ENDIF ELSE // ADD NEW BIT VALUES TO BIT RANGES WHILE NOT REACHED FINAL ARRAY POSITION STORE_DEBUG_OUTPUT_SPEW_BIT_RANGE_VALUE(hackingData, iHackSeconds, i_BitSetA, i_BitSetB) iHackSeconds++ ENDIF // ALLOW NEW WAIT TIME TO BE PICKED IF IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_WAIT_TIME_PICKED) CLEAR_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_WAIT_TIME_PICKED) ENDIF RESTART_TIMER_NOW(hackingData.t_PhoneLaunchTimer) ENDIF ENDIF // DRAW OUTPUT VARIABLES TEXT_LABEL_31 str_DebugOutputString FLOAT f_DebugOutputSpewX = 0.035 FLOAT f_DebugOutputSpewY = 0.30 FLOAT f_DebugOutputSpewSpacing = 0.018 INT i_DebugOutputSpewAlpha = 70 // CHANGE ALPHA FOR WHEN SCALEFROM IS ON SCREEN - TO LOOK LIKE SCALEFORM IS DRAWN OVER THE SPEW IF IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_SCALEFORM_SET_UP) i_DebugOutputSpewAlpha = 20 ENDIF // DRAW DEBUG SPEW INT i_DebugSpewArrayPosition = 0 // BIT SET ZERO - ONE FOR i_DebugSpewArrayPosition = 0 TO 9 SET_TEXT_COLOUR(255, 255, 255, i_DebugOutputSpewAlpha) SET_TEXT_SCALE(0.200, 0.275) SET_TEXT_WRAP(0.000, 1.000) str_DebugOutputString = GET_DEBUG_OUTPUT_SPEW_STRING_CONTENTS(hackingData, b_UseDifficultLevels, i_DebugSpewArrayPosition, GET_BITS_IN_RANGE(hackingData.i_DebugOutputBitRange[0], (i_DebugSpewArrayPosition * 3), ((i_DebugSpewArrayPosition * 3) + 2)), GET_BITS_IN_RANGE(hackingData.i_DebugOutputBitRange[1], (i_DebugSpewArrayPosition * 3), ((i_DebugSpewArrayPosition * 3) + 2)), bHeist2) DISPLAY_TEXT_WITH_PLAYER_NAME((0.5 - ((0.5 - f_DebugOutputSpewX) * hackingData.f_AspectRatioModifier)), f_DebugOutputSpewY + (f_DebugOutputSpewSpacing * i_DebugSpewArrayPosition), "STRING", str_DebugOutputString, HUD_COLOUR_WHITE) str_DebugOutputString = "" ENDFOR // BIT SET TWO - THREE FOR i_DebugSpewArrayPosition = 10 TO 14 SET_TEXT_COLOUR(255, 255, 255, i_DebugOutputSpewAlpha) SET_TEXT_SCALE(0.200, 0.275) SET_TEXT_WRAP(0.000, 1.000) str_DebugOutputString = GET_DEBUG_OUTPUT_SPEW_STRING_CONTENTS(hackingData, b_UseDifficultLevels, i_DebugSpewArrayPosition, GET_BITS_IN_RANGE(hackingData.i_DebugOutputBitRange[2], ((i_DebugSpewArrayPosition - 10) * 3), (((i_DebugSpewArrayPosition - 10) * 3) + 2)), GET_BITS_IN_RANGE(hackingData.i_DebugOutputBitRange[3], ((i_DebugSpewArrayPosition - 10) * 3), (((i_DebugSpewArrayPosition - 10) * 3) + 2)), bHeist2) DISPLAY_TEXT_WITH_PLAYER_NAME((0.5 - ((0.5 - f_DebugOutputSpewX) * hackingData.f_AspectRatioModifier)), f_DebugOutputSpewY + (f_DebugOutputSpewSpacing * i_DebugSpewArrayPosition), "STRING", str_DebugOutputString, HUD_COLOUR_WHITE) str_DebugOutputString = "" ENDFOR ENDPROC /// PURPOSE: /// Clears the bit range values used to generate the string output /// PARAMS: /// &hackingData - STRUCT: Hacking data PROC CLEAR_DEBUG_OUTPUT_SPEW(S_HACKING_DATA &hackingData) STOP_DEBUG_OUTPUT_SPEW_TIMER(hackingData) iHackSeconds = 0 iHackMilliseconds = 0 IF IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_WAIT_TIME_PICKED) CLEAR_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_WAIT_TIME_PICKED) ENDIF IF IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_RECYCLE_DEBUG_OUTPUT) CLEAR_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_RECYCLE_DEBUG_OUTPUT) ENDIF // RESET ALL DEBUG SPEW BIT RANGES hackingData.i_DebugOutputBitRange[0] = 0 hackingData.i_DebugOutputBitRange[1] = 0 hackingData.i_DebugOutputBitRange[2] = 0 hackingData.i_DebugOutputBitRange[3] = 0 ENDPROC /// PURPOSE: /// Draws the Circuit Hacking Minigame scaleform movie this frame PROC DRAW_CIRCUIT_HACKING_SCALEFORM() IF HAS_SCALEFORM_MOVIE_LOADED(sfHacking) //CPRINTLN(DEBUG_COLIN, "Circuit Hacking: DRAW_CIRCUIT_HACKING_SCALEFORM() - CHECK 1 - Draw Scaleform") // url:bugstar:2168936 DRAW_SCALEFORM_MOVIE_FULLSCREEN(sfHacking, 100, 100, 100, 255) ENDIF ENDPROC /// PURPOSE: /// Unloads the scalefrom movie used by the Circuit Hacking Minigame PROC CLEANUP_CIRCUIT_HACKING_SCALEFORM() IF HAS_SCALEFORM_MOVIE_LOADED(sfHacking) CPRINTLN(DEBUG_COLIN, "Circuit Hacking: CLEANUP_CIRCUIT_HACKING_SCALEFORM() - CHECK 1 - Clean Up Scaleform") // RESET SCALEFORM IF HAS_SCALEFORM_MOVIE_LOADED(sfHacking) BEGIN_SCALEFORM_MOVIE_METHOD(sfHacking, "SET_DISPLAY") SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(-1) END_SCALEFORM_MOVIE_METHOD() PRINTLN("[TMS] CLEANUP_CIRCUIT_HACKING_SCALEFORM - Scaleform should be cleaned up now") ENDIF SET_SCALEFORM_MOVIE_AS_NO_LONGER_NEEDED(sfHacking) sfHacking = NULL ELSE PRINTLN("[TMS] CLEANUP_CIRCUIT_HACKING_SCALEFORM - inside cleanup function but the scaleform isn't loaded") ENDIF ENDPROC /// PURPOSE: /// Compresses two floats into a single float value /// PARAMS: /// f_InputX - FLOAT: Value 1 to be compressed /// f_InputY - FLOAT: Value 2 to be compressed /// i_Precision - INT: Degree of precision value - hackingData.s_SnakeData.i_CompressPrecisionValue / (4096 LG | 9974 NG) is a good sweet spot /// RETURNS: /// FLOAT: Single float value made from compressing the two input float values together FUNC FLOAT FLOAT_COMPRESSION_PACK(FLOAT f_InputX, FLOAT f_InputY, INT i_Precision) FLOAT i_OutputX = TO_FLOAT(FLOOR(f_InputX * (i_Precision - 1))) FLOAT i_OutputY = TO_FLOAT(FLOOR(f_InputY * (i_Precision - 1))) RETURN (i_OutputX * i_Precision) + i_OutputY ENDFUNC /// PURPOSE: /// Decompresses a float variable output by FLOAT_COMPRESSION_PACK /// PARAMS: /// f_CompressedInput - FLOAT: Value output by FLOAT_COMPRESSION_PACK /// &f_OutputX - FLOAT: A refewrence to a float value - Stores value 1 decompressed from the input value /// &f_OutputY - FLOAT: A refewrence to a float value - Stores value 2 decompressed from the input value /// i_Precision - INT: Degree of precision value - Use the same value used to pack input value - hackingData.s_SnakeData.i_CompressPrecisionValue / (4096 LG | 9974 NG) PROC FLOAT_COMPRESSION_UNPACK(FLOAT f_CompressedInput, FLOAT &f_OutputX, FLOAT &f_OutputY, INT i_Precision) f_OutputX = TO_FLOAT(FLOOR(f_CompressedInput / i_Precision)) f_OutputY = f_CompressedInput % i_Precision f_OutputX = f_OutputX / (i_Precision - 1) f_OutputY = f_OutputY / (i_Precision - 1) ENDPROC /// PURPOSE: /// Decompresses and returns the X float variable of the output from FLOAT_COMPRESSION_PACK /// PARAMS: /// f_CompressedInput - FLOAT: Value output by FLOAT_COMPRESSION_PACK /// i_Precision - INT: Degree of precision value - Use the same value used to pack input value - hackingData.s_SnakeData.i_CompressPrecisionValue / (4096 LG | 9974 NG) /// RETURNS: /// FLOAT: X float value used in the original compression FUNC FLOAT FLOAT_COMPRESSION_UNPACK_RETURN_X(FLOAT f_CompressedInput, INT i_Precision) FLOAT f_Output = TO_FLOAT(FLOOR(f_CompressedInput / i_Precision)) f_Output = f_Output / (i_Precision - 1) RETURN f_Output ENDFUNC /// PURPOSE: /// Decompresses and returns the Y float variable of the output from FLOAT_COMPRESSION_PACK /// PARAMS: /// f_CompressedInput - FLOAT: Value output by FLOAT_COMPRESSION_PACK /// i_Precision - INT: Degree of precision value - Use the same value used to pack input value - hackingData.s_SnakeData.i_CompressPrecisionValue / (4096 LG | 9974 NG) /// RETURNS: /// FLOAT: Y float value used in the original compression FUNC FLOAT FLOAT_COMPRESSION_UNPACK_RETURN_Y(FLOAT f_CompressedInput, INT i_Precision) FLOAT f_Output = f_CompressedInput % i_Precision f_Output = f_Output / (i_Precision - 1) RETURN f_Output ENDFUNC /// PURPOSE: /// Single command that decides which controller vibration command to use based on whether running LG or NG /// PARAMS: /// i_Duration - INT: Time to vibrate for in milliseconds /// i_Frequency - INT: Strength of the vibrations PROC DO_CIRCUIT_HACKING_CONTROLLER_VIBRATIONS(INT i_Duration, INT i_Frequency) #IF IS_NEXTGEN_BUILD SET_CONTROL_SHAKE(FRONTEND_CONTROL, i_Duration, i_Frequency) #ENDIF #IF NOT IS_NEXTGEN_BUILD SET_PAD_SHAKE(PAD1, i_Duration, i_Frequency) #ENDIF ENDPROC /// PURPOSE: /// Checks if the hacking player is in an upright vehicle /// PARAMS: /// &hackingData - STRUCT: Holds all data passed into the header /// RETURNS: /// BOOL: TRUE if player is not in a vehicle. TRUE if player is in an upright vehicle. FALSE if player is in upside down vehicle FUNC BOOL CHECK_IS_CIRCUIT_HACKING_PLAYER_IN_UPRIGHT_VEHICLE(S_HACKING_DATA &hackingData) IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) VEHICLE_INDEX v_TempVehicleIndex = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()) IF GET_ENTITY_UPRIGHT_VALUE(v_TempVehicleIndex) < 0.0 // RESET PHONE LAUNCH VARIBALES RESTART_TIMER_AT(hackingData.t_PhoneLaunchTimer, 0.0) PAUSE_TIMER(hackingData.t_PhoneLaunchTimer) hackingData.e_IntroLaunchState = LIS_INITIALISE CPRINTLN(DEBUG_COLIN, "Circuit Hacking: CHECK_IS_CIRCUIT_HACKING_PLAYER_IN_UPRIGHT_VEHICLE() - CHECK 1 - Player not in upright vehicle - Resetting Phone Launch State") RETURN FALSE ENDIF ENDIF RETURN TRUE ENDFUNC /// PURPOSE: /// Handles launching the hacking mini game from the phone /// PARAMS: /// &hackingData - STRUCT: Holds all data passed into the header /// RETURNS: /// ENUM: The cellphone launch state - LS_PASSED, LS_FAILED or LS_WORKING FUNC LAUNCH_STATE DO_CIRCUIT_MINIGAME_LAUNCH_PHONE_INTRO(S_HACKING_DATA &hackingData) SWITCH hackingData.e_IntroLaunchState // IF WE DON'T WANT A PHONE INTRO OR THE PLAYER IS SPECTATING THEN SKIP IT CASE LIS_INITIALISE IF NETWORK_IS_GAME_IN_PROGRESS() IF NOT MP_FORCE_TERMINATE_INTERNET_ACTIVE() MP_FORCE_TERMINATE_INTERNET() CPRINTLN(DEBUG_COLIN, "Circuit Hacking: DO_CIRCUIT_MINIGAME_LAUNCH_PHONE_INTRO() - CHECK 1a - Initialise - MP_FORCE_TERMINATE_INTERNET_ACTIVE() is FALSE - Calling MP_FORCE_TERMINATE_INTERNET()") ENDIF g_TransitionSessionNonResetVars.contactRequests.bDisableContactRequestMenuNextFrame = TRUE ELSE // SP TERMINATE & CLEAR INTERNET APP #IF IS_DEBUG_BUILD g_bBSWebsiteNoSpaceTrigger = FALSE IF g_sBrowserHelpMessage.bShow = TRUE IF IS_HELP_MESSAGE_BEING_DISPLAYED() IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED(g_sBrowserHelpMessage.tl15Tag) CLEAR_HELP(TRUE) ENDIF ENDIF g_sBrowserHelpMessage.bShow = FALSE ENDIF IF HAS_ADDITIONAL_TEXT_LOADED(SHOP_TEXT_SLOT) CLEAR_ADDITIONAL_TEXT(SHOP_TEXT_SLOT, FALSE) ENDIF SET_BROWSER_OPEN(FALSE) g_BrowserStartState = SBSS_Default g_bBrowserNagScreenState = FALSE g_bBrowserGoToStoreTrigger = FALSE MP_FORCE_TERMINATE_INTERNET_CLEAR() CPRINTLN(DEBUG_COLIN, "Circuit Hacking: DO_CIRCUIT_MINIGAME_LAUNCH_PHONE_INTRO() - CHECK 1b - Initialise - Calling MP_FORCE_TERMINATE_INTERNET_CLEAR()") #ENDIF ENDIF #IF IS_NEXTGEN_BUILD // ENABLE MULTIPLE DISPLAYS/BLINDERS SET_MULTIHEAD_SAFE(TRUE, FALSE) CPRINTLN(DEBUG_COLIN, "Circuit Hacking: DO_CIRCUIT_MINIGAME_LAUNCH_PHONE_INTRO() - CHECK 2 - Initialise - Enabled SET_MULTIHEAD_SAFE") #ENDIF //IF PHONE IS RUNNING, KILL IT IF g_Cellphone.PhoneDS >= PDS_RUNNINGAPP OR IS_PHONE_ONSCREEN() HANG_UP_AND_PUT_AWAY_PHONE(TRUE) // EXIT CONTACT SUBMENU IF NETWORK_IS_GAME_IN_PROGRESS() g_TransitionSessionNonResetVars.contactRequests.bDisableContactRequestMenuNextFrame = TRUE ENDIF CPRINTLN(DEBUG_COLIN, "Circuit Hacking: DO_CIRCUIT_MINIGAME_LAUNCH_PHONE_INTRO() - CHECK 3 - Initialise - Hang up and put away phone - Moving to Triggered") hackingData.e_IntroLaunchState = LIS_TRIGGERED ELSE CPRINTLN(DEBUG_COLIN, "Circuit Hacking: DO_CIRCUIT_MINIGAME_LAUNCH_PHONE_INTRO() - CHECK 4 - Initialise - Moving to Triggered") hackingData.e_IntroLaunchState = LIS_TRIGGERED ENDIF BREAK CASE LIS_TRIGGERED // LAUNCH CAMERA APP IF NOT IS_PHONE_ONSCREEN() CPRINTLN(DEBUG_COLIN, "Circuit Hacking: DO_CIRCUIT_MINIGAME_LAUNCH_PHONE_INTRO() - CHECK 5 - Triggered - Launch App") LAUNCH_CELLPHONE_APPLICATION(AppCamera, FALSE, TRUE, FALSE) IF IS_TIMER_PAUSED(hackingData.t_PhoneLaunchTimer) OR IS_TIMER_STARTED(hackingData.t_PhoneLaunchTimer) CPRINTLN(DEBUG_COLIN, "Circuit Hacking: DO_CIRCUIT_MINIGAME_LAUNCH_PHONE_INTRO() - CHECK 6 - Triggered - Reset Timer") RESTART_TIMER_AT(hackingData.t_PhoneLaunchTimer, 0.0) ELSE CPRINTLN(DEBUG_COLIN, "Circuit Hacking: DO_CIRCUIT_MINIGAME_LAUNCH_PHONE_INTRO() - CHECK 7 - Triggered - Start Timer") START_TIMER_NOW_SAFE(hackingData.t_PhoneLaunchTimer) ENDIF CPRINTLN(DEBUG_COLIN, "Circuit Hacking: DO_CIRCUIT_MINIGAME_LAUNCH_PHONE_INTRO() - CHECK 8 - Triggered - Move to WAIT State") hackingData.e_IntroLaunchState = LIS_WAITING_FOR_CELL_FULL_SCREEN ELSE CPRINTLN(DEBUG_COLIN, "Circuit Hacking: DO_CIRCUIT_MINIGAME_LAUNCH_PHONE_INTRO() - CHECK 9 - Triggered - Waiting for phone to be removed from screen") ENDIF BREAK CASE LIS_WAITING_FOR_CELL_FULL_SCREEN // CHECK SCREEN ISN'T FADED OUT IF NOT IS_PC_VERSION() IF (IS_SCREEN_FADED_OUT() OR IS_SCREEN_FADING_OUT()) CPRINTLN(DEBUG_COLIN, "Circuit Hacking: DO_CIRCUIT_MINIGAME_LAUNCH_PHONE_INTRO() - CHECK 10 - Wait - Do Screen Fade in") DO_SCREEN_FADE_IN(500) ENDIF ENDIF // MAKE SURE SAFE TO USE CELLPHONE IF NOT IS_PED_INJURED(PLAYER_PED_ID()) IF NETWORK_HAS_CONTROL_OF_ENTITY(PLAYER_PED_ID()) IF NOT IS_PED_RUNNING_MOBILE_PHONE_TASK(PLAYER_PED_ID()) CLEAR_PED_TASKS(PLAYER_PED_ID()) TASK_USE_MOBILE_PHONE(PLAYER_PED_ID(), TRUE) // MAY NEED MORE ENDIF ENDIF ENDIF IF IS_PC_VERSION() IF (GET_TIMER_IN_SECONDS_SAFE(hackingData.t_PhoneLaunchTimer) > 1 AND (NOT IS_SCREEN_FADING_OUT() AND NOT IS_SCREEN_FADED_OUT())) DO_SCREEN_FADE_OUT(400) CPRINTLN(DEBUG_COLIN, "Circuit Hacking: DO_CIRCUIT_MINIGAME_LAUNCH_PHONE_INTRO - CHECK 11 - Wait - PC Version Calling Screen Fade Out") ENDIF ENDIF VECTOR v_Test3dPhonePosVec GET_MOBILE_PHONE_POSITION(v_Test3dPhonePosVec) CPRINTLN(DEBUG_COLIN, "Circuit Hacking: DO_CIRCUIT_MINIGAME_LAUNCH_PHONE_INTRO - CHECK 12 - Wait - phone position: ", v_Test3dPhonePosVec, " g_Phone_Active_but_Hidden: ", g_Phone_Active_but_Hidden) // IS PHONE FINISHED EXPANDING TO FILL SCREEN IF (v_Test3dPhonePosVec.x = 1.5 AND v_Test3dPhonePosVec.z = -17.0) OR (IS_PC_VERSION() AND IS_SCREEN_FADED_OUT()) //OR IS_SCREEN_FADED_OUT() HANG_UP_AND_PUT_AWAY_PHONE(TRUE) hackingData.e_IntroLaunchState = LIS_INITIALISE IF IS_PC_VERSION() DO_SCREEN_FADE_IN(0) CPRINTLN(DEBUG_COLIN, "Circuit Hacking: DO_CIRCUIT_MINIGAME_LAUNCH_PHONE_INTRO - CHECK 13 - Wait - PC Version Calling Screen Fade In") ENDIF RETURN LS_PASSED ELSE // SAFETY BACKUP FOR IF THE PHONE REFUSES TO OPEN UP IF NOT IS_PHONE_ONSCREEN() IF GET_TIMER_IN_SECONDS_SAFE(hackingData.t_PhoneLaunchTimer) > 2 // TRY AGAIN LAUNCH_CELLPHONE_APPLICATION(AppCamera, FALSE, TRUE, FALSE) CPRINTLN(DEBUG_COLIN, "Circuit Hacking: DO_CIRCUIT_MINIGAME_LAUNCH_PHONE_INTRO - CHECK 14 - Wait - Phone not appeared on screen, try again") ENDIF ELSE IF GET_TIMER_IN_SECONDS_SAFE(hackingData.t_PhoneLaunchTimer) > 6 // GIVE UP HANG_UP_AND_PUT_AWAY_PHONE(TRUE) CPRINTLN(DEBUG_COLIN, "Circuit Hacking: DO_CIRCUIT_MINIGAME_LAUNCH_PHONE_INTRO - CHECK 15 - Wait - Phone not appeared on screen, give up") hackingData.e_IntroLaunchState = LIS_WAITING_FOR_CELL_FULL_SCREEN RETURN LS_FAILED ENDIF ENDIF ENDIF BREAK ENDSWITCH CPRINTLN(DEBUG_COLIN, "Circuit Hacking: DO_CIRCUIT_MINIGAME_LAUNCH_PHONE_INTRO - CHECK 16 - Returning LS_WORKING") RETURN LS_WORKING ENDFUNC /// PURPOSE: /// Cleanup function used by the minigame to cleanup between levels /// PARAMS: /// &hackingData - STRUCT: Hacking data struct /// b_ResetRunnnigState - BOOL: Pass TRUE to reset the game flow state back to CHMS_RUNNING /// b_BlockClearDebugSpew - BOOL: Pass TRUE to clear all debug output spew /// b_ResetDeaths - BOOL: Pass TRUE to reset the death counter PROC CIRCUIT_MINIGAME_RESET(S_HACKING_DATA &hackingData, BOOL b_ResetRunnnigState = TRUE, BOOL b_BlockClearDebugSpew = FALSE, BOOL b_ResetDeaths = FALSE, BOOL b_ResetSafeToUsePhone = FALSE) CPRINTLN(DEBUG_COLIN, "Circuit Hacking: CIRCUIT_MINIGAME_RESET() - CHECK 1 - Variable Reset Started") // RESET ALL NECESSARY BIT FLAGS IF IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_MINIGAME_SOLVED) CPRINTLN(DEBUG_COLIN, "Circuit Hacking: CIRCUIT_MINIGAME_RESET() - CHECK 2 - Clearing MINIGAME_SOLVED Bit") CLEAR_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_MINIGAME_SOLVED) ENDIF IF IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_MOVE_HEAD) CLEAR_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_MOVE_HEAD) ENDIF IF IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_CHANGE_DIRECTION) CLEAR_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_CHANGE_DIRECTION) ENDIF IF IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_ENTRY_COLLISION) CLEAR_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_ENTRY_COLLISION) ENDIF IF NOT IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_DISABLE_VERTICAL_TURNING) SET_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_DISABLE_VERTICAL_TURNING) ENDIF IF IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_LEVEL_PASSED) CLEAR_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_LEVEL_PASSED) ENDIF IF IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_REMOVE_HEAD) CLEAR_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_REMOVE_HEAD) ENDIF IF IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_KILL_SCREEN) CLEAR_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_KILL_SCREEN) ENDIF IF IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_DRAW_SYS_UNLOCKED) CLEAR_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_DRAW_SYS_UNLOCKED) ENDIF IF IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_DRAWN_SYS_UNLOCKED_BKGROUND) CLEAR_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_DRAWN_SYS_UNLOCKED_BKGROUND) ENDIF IF IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_DRAW_UNLOCKED_LOCK) CLEAR_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_DRAW_UNLOCKED_LOCK) ENDIF IF IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_START_PHONE_UNLOCK) CLEAR_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_START_PHONE_UNLOCK) ENDIF IF IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_PULSE_END_PORT_LIGHTS) CLEAR_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_PULSE_END_PORT_LIGHTS) ENDIF IF IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_PULSE_UP) CLEAR_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_PULSE_UP) ENDIF IF IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_PLAY_PASS_AUDIO) CLEAR_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_PLAY_PASS_AUDIO) ENDIF IF IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_PLAY_FAIL_AUDIO) CLEAR_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_PLAY_FAIL_AUDIO) ENDIF IF IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_BLOCK_DEBUG_OUTPUT_SPEW) CLEAR_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_BLOCK_DEBUG_OUTPUT_SPEW) ENDIF IF IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_DROP_CORE_LIGHTS) CLEAR_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_DROP_CORE_LIGHTS) ENDIF IF IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_AUDIO_ONESHOT) CLEAR_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_AUDIO_ONESHOT) ENDIF IF IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_SCALEFORM_SET_UP) CLEAR_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_SCALEFORM_SET_UP) ENDIF IF IS_BIT_SET(hackingData.i_Circuitbitset, BIT_SET_CIRCUIT_SCALEFORM_RESET) CLEAR_BIT(hackingData.i_Circuitbitset, BIT_SET_CIRCUIT_SCALEFORM_RESET) ENDIF IF IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_SAFE_TO_USE_PHONE) AND b_ResetSafeToUsePhone CLEAR_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_SAFE_TO_USE_PHONE) CPRINTLN(DEBUG_COLIN, "Circuit Hacking: CIRCUIT_MINIGAME_RESET() - CHECK 3 - Clearing BIT_SET_CIRCUIT_SAFE_TO_USE_PHONE Bit") ENDIF #IF IS_DEBUG_BUILD IF IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_DRAW_WALLS) CLEAR_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_DRAW_WALLS) ENDIF #ENDIF // SET PASS TIMER hackingData.i_CircuitPassedLevelTimer = GET_GAME_TIMER() // RESET SNAKE VARIABLES hackingData.s_SnakeData.i_TailIndex = 0 hackingData.s_SnakeData.i_Alpha = 255 // RESET ALL SNAKE TAIL SEGMENTS INT i_Counter FOR i_Counter = 0 TO (NUM_MAX_TAIL_RECTS - 1) hackingData.s_SnakeData.f_Tail[i_Counter] = 0.0 ENDFOR // RESET SPARK hackingData.s_SnakeData.f_SparkWidth = 0.018 hackingData.s_SnakeData.i_SparkAlpha = 255 // RESET FINAL SCREEN CORE LIGHTS hackingData.s_SnakeData.i_CoreLightOneColourA = 255 hackingData.s_SnakeData.i_CoreLightTwoColourA = 255 hackingData.s_SnakeData.i_CoreLightThreeColourA = 255 hackingData.s_SnakeData.i_CoreLightFourColourA = 255 // RESET PORT LIGHTS hackingData.s_SnakeData.i_StartPortLightColourA = 255 hackingData.s_SnakeData.i_EndPortLightColourA = 255 // NUM TIMES DIED - BORROWED FROM ADAM IF hackingData.i_CircuitCurrentLevel >= 3 AND b_ResetDeaths hackingData.i_lives = 0 ENDIF // CLEAR DEBUG SPEW IF NOT b_BlockClearDebugSpew CLEAR_DEBUG_OUTPUT_SPEW(hackingData) ENDIF // RESET SCALEFORM IF HAS_SCALEFORM_MOVIE_LOADED(sfHacking) BEGIN_SCALEFORM_MOVIE_METHOD(sfHacking, "SET_DISPLAY") SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(-1) END_SCALEFORM_MOVIE_METHOD() ENDIF // RESET GAME BACK TO RUNNING STATE IF b_ResetRunnnigState hackingData.e_CircuitHackingMinigameState = CHMS_RUNNING ENDIF CPRINTLN(DEBUG_COLIN, "Circuit Hacking: CIRCUIT_MINIGAME_RESET() - CHECK 4 - Variable Reset Finished") ENDPROC /// PURPOSE: /// Get the screen aspect ratio based on the screen resolution /// PARAMS: /// &hackingData - STRUCT: Hacking data struct /// b_PrintResolution - BOOL: Pass TRUE to print the current screen resolution to logs /// RETURNS: /// FLOAT: the screen width / height FUNC FLOAT GET_CUSTOM_SCREEN_ASPECT_RATIO(S_HACKING_DATA &hackingData, BOOL b_PrintResolution = FALSE) INT i_ScreenX = 0 INT i_ScreenY = 0 // LG - HARD CODED VALUES FROM CODE #IF NOT IS_NEXTGEN_BUILD IF GET_IS_HIDEF() i_ScreenX = 1280 i_ScreenY = 720 ELSE i_ScreenX = 720 i_ScreenY = 480 ENDIF #ENDIF // NG #IF IS_NEXTGEN_BUILD GET_ACTUAL_SCREEN_RESOLUTION(i_ScreenX, i_ScreenY) #ENDIF IF b_PrintResolution // LG #IF NOT IS_NEXTGEN_BUILD CPRINTLN(DEBUG_COLIN, "Circuit Hacking: GET_CUSTOM_SCREEN_ASPECT_RATIO() - CHECK 1a - Last Gen Screen Resolution: ", i_ScreenX, "x", i_ScreenY) #ENDIF // NG #IF IS_NEXTGEN_BUILD CPRINTLN(DEBUG_COLIN, "Circuit Hacking: GET_CUSTOM_SCREEN_ASPECT_RATIO() - CHECK 1b - Next Gen Screen Resolution: ", i_ScreenX, "x", i_ScreenY) #ENDIF ENDIF // CHECK IF SHOULD DISPLAY DEBUG OUTPUT SPEW - SCREEN SIZE CHECK - STOPS CLIPPING OF DEBUG SPEW IF i_ScreenY < 600 IF NOT IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_BLOCK_DEBUG_OUTPUT_SPEW) SET_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_BLOCK_DEBUG_OUTPUT_SPEW) CPRINTLN(DEBUG_COLIN, "Circuit Hacking: GET_CUSTOM_SCREEN_ASPECT_RATIO() - CHECK 2 - Screen Resolution: ", i_ScreenX, "x", i_ScreenY, " - Blocking Debug Output Spew") ENDIF ELSE IF IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_BLOCK_DEBUG_OUTPUT_SPEW) CLEAR_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_BLOCK_DEBUG_OUTPUT_SPEW) CPRINTLN(DEBUG_COLIN, "Circuit Hacking: GET_CUSTOM_SCREEN_ASPECT_RATIO() - CHECK 3 - Screen Resolution: ", i_ScreenX, "x", i_ScreenY, " - Unblocking Debug Output Spew") ENDIF ENDIF FLOAT f_Aspect = TO_FLOAT(i_ScreenX) / TO_FLOAT(i_ScreenY) // FIX FOR EYEFINITY TRIPLE MONITOR - STOPS SPRITES BEING SQUASHED IF IS_PC_VERSION() IF f_Aspect > 4.0 f_Aspect = f_Aspect / 3 CPRINTLN(DEBUG_COLIN, "Circuit Hacking: GET_CUSTOM_SCREEN_ASPECT_RATIO() - CHECK 4 - Multiple Screen Resolutions Detected - Setting Aspect Ratio from: ", (TO_FLOAT(i_ScreenX) / TO_FLOAT(i_ScreenY)), " To:", f_Aspect) ENDIF ENDIF RETURN f_Aspect ENDFUNC /// PURPOSE: /// Calculates the modifer value used for the width of sprites based on the current aspect ratio and /// the default aspect modifier value /// PARAMS: /// f_CurrentAspectModifier - FLOAT: The current aspect ratio value. /// RETURNS: /// FLOAT: The value the sprite needs to be multiplied by to keep the correct aspect ratio. Default / current aspect value FUNC FLOAT CALCULATE_CURRENT_ASPECT_RATIO_MODIFIER(FLOAT f_CurrentAspectModifier) RETURN DEFAULT_ASPECT_RATIO_MODIFIER / f_CurrentAspectModifier ENDFUNC /// PURPOSE: /// Updates the current aspect value and the aspect modifier value /// PARAMS: /// &hackingData - STRUCT: Hacking data struct holding all variables PROC SET_CURRENT_ASPECT_RATIO_MODIFIER(S_HACKING_DATA &hackingData) hackingData.f_CurrentAspectRatio = GET_CUSTOM_SCREEN_ASPECT_RATIO(hackingData) hackingData.f_AspectRatioModifier = CALCULATE_CURRENT_ASPECT_RATIO_MODIFIER(hackingData.f_CurrentAspectRatio) ENDPROC /// PURPOSE: /// Initialises all data needed for a level. ie Wall collision, starting point, start/end ports... /// PARAMS: /// &hackingData - STRUCT: Hacking data struct holding all variables /// i_Level - INT: The level that will have its data loaded PROC INITIALISE_CIRCUIT_MINIGAME_LEVEL(S_HACKING_DATA &hackingData, INT i_Level) // LOAD ALL LEVEL DATA SWITCH i_Level CASE 0 // HEADER - Level: 1 hackingData.s_SnakeData.f_StartX = 0.1740 hackingData.s_SnakeData.f_StartY = 0.7390 hackingData.s_SnakeData.f_CenterX = hackingData.s_SnakeData.f_StartX hackingData.s_SnakeData.f_CenterY = hackingData.s_SnakeData.f_StartY hackingData.s_SnakeData.i_StartDirection = 3 hackingData.s_SnakeData.i_Direction = hackingData.s_SnakeData.i_StartDirection hackingData.s_SnakeData.f_SpeedX = 0.0880 hackingData.s_SnakeData.f_SpeedY = hackingData.s_SnakeData.f_SpeedX * hackingData.f_CurrentAspectRatio hackingData.s_SnakeData.f_EndX = 0.8300 hackingData.s_SnakeData.f_EndY = 0.2320 hackingData.s_SnakeData.f_EndWidth = 0.0260 hackingData.s_SnakeData.f_EndHeight = 0.0700 // WALLS hackingData.s_WallData[0].f_CenterX = 0.1573 hackingData.s_WallData[0].f_CenterY = 0.5000 hackingData.s_WallData[0].f_Width = 0.0070 hackingData.s_WallData[0].f_Height = 0.6960 hackingData.s_WallData[1].f_CenterX = 0.8423 hackingData.s_WallData[1].f_CenterY = 0.5000 hackingData.s_WallData[1].f_Width = 0.0070 hackingData.s_WallData[1].f_Height = 0.6960 hackingData.s_WallData[2].f_CenterX = 0.5003 hackingData.s_WallData[2].f_CenterY = 0.1480 hackingData.s_WallData[2].f_Width = 0.6905 hackingData.s_WallData[2].f_Height = 0.0100 hackingData.s_WallData[3].f_CenterX = 0.5005 hackingData.s_WallData[3].f_CenterY = 0.8530 hackingData.s_WallData[3].f_Width = 0.6910 hackingData.s_WallData[3].f_Height = 0.0100 hackingData.s_WallData[4].f_CenterX = 0.1710 hackingData.s_WallData[4].f_CenterY = 0.7390 hackingData.s_WallData[4].f_Width = 0.0270 hackingData.s_WallData[4].f_Height = 0.0780 hackingData.s_WallData[5].f_CenterX = 0.2438 hackingData.s_WallData[5].f_CenterY = 0.3675 hackingData.s_WallData[5].f_Width = 0.1230 hackingData.s_WallData[5].f_Height = 0.4285 hackingData.s_WallData[6].f_CenterX = 0.3511 hackingData.s_WallData[6].f_CenterY = 0.3157 hackingData.s_WallData[6].f_Width = 0.0590 hackingData.s_WallData[6].f_Height = 0.3200 hackingData.s_WallData[7].f_CenterX = 0.4125 hackingData.s_WallData[7].f_CenterY = 0.2648 hackingData.s_WallData[7].f_Width = 0.0308 hackingData.s_WallData[7].f_Height = 0.2235 hackingData.s_WallData[8].f_CenterX = 0.4607 hackingData.s_WallData[8].f_CenterY = 0.2645 hackingData.s_WallData[8].f_Width = 0.0316 hackingData.s_WallData[8].f_Height = 0.2240 hackingData.s_WallData[9].f_CenterX = 0.5079 hackingData.s_WallData[9].f_CenterY = 0.2645 hackingData.s_WallData[9].f_Width = 0.0300 hackingData.s_WallData[9].f_Height = 0.2240 hackingData.s_WallData[10].f_CenterX = 0.5611 hackingData.s_WallData[10].f_CenterY = 0.2294 hackingData.s_WallData[10].f_Width = 0.0443 hackingData.s_WallData[10].f_Height = 0.1520 hackingData.s_WallData[11].f_CenterX = 0.6210 hackingData.s_WallData[11].f_CenterY = 0.2294 hackingData.s_WallData[11].f_Width = 0.0443 hackingData.s_WallData[11].f_Height = 0.1520 hackingData.s_WallData[12].f_CenterX = 0.6947 hackingData.s_WallData[12].f_CenterY = 0.2031 hackingData.s_WallData[12].f_Width = 0.0670 hackingData.s_WallData[12].f_Height = 0.1000 hackingData.s_WallData[13].f_CenterX = 0.3678 hackingData.s_WallData[13].f_CenterY = 0.7750 hackingData.s_WallData[13].f_Width = 0.1280 hackingData.s_WallData[13].f_Height = 0.1480 hackingData.s_WallData[14].f_CenterX = 0.5102 hackingData.s_WallData[14].f_CenterY = 0.6458 hackingData.s_WallData[14].f_Width = 0.1162 hackingData.s_WallData[14].f_Height = 0.4180 hackingData.s_WallData[15].f_CenterX = 0.6453 hackingData.s_WallData[15].f_CenterY = 0.6630 hackingData.s_WallData[15].f_Width = 0.1151 hackingData.s_WallData[15].f_Height = 0.3700 hackingData.s_WallData[16].f_CenterX = 0.7790 hackingData.s_WallData[16].f_CenterY = 0.6630 hackingData.s_WallData[16].f_Width = 0.1140 hackingData.s_WallData[16].f_Height = 0.3700 hackingData.s_WallData[17].f_CenterX = 0.3711 hackingData.s_WallData[17].f_CenterY = 0.5917 hackingData.s_WallData[17].f_Width = 0.0532 hackingData.s_WallData[17].f_Height = 0.0920 hackingData.s_WallData[18].f_CenterX = 0.7130 hackingData.s_WallData[18].f_CenterY = 0.4130 hackingData.s_WallData[18].f_Width = 0.2550 hackingData.s_WallData[18].f_Height = 0.0700 hackingData.s_WallData[19].f_CenterX = 0.7648 hackingData.s_WallData[19].f_CenterY = 0.3458 hackingData.s_WallData[19].f_Width = 0.1432 hackingData.s_WallData[19].f_Height = 0.0660 hackingData.s_WallData[20].f_CenterX = 0.0000 hackingData.s_WallData[20].f_CenterY = 0.0000 hackingData.s_WallData[20].f_Width = 0.0000 hackingData.s_WallData[20].f_Height = 0.0000 hackingData.s_WallData[21].f_CenterX = 0.0000 hackingData.s_WallData[21].f_CenterY = 0.0000 hackingData.s_WallData[21].f_Width = 0.0000 hackingData.s_WallData[21].f_Height = 0.0000 hackingData.s_WallData[22].f_CenterX = 0.0000 hackingData.s_WallData[22].f_CenterY = 0.0000 hackingData.s_WallData[22].f_Width = 0.0000 hackingData.s_WallData[22].f_Height = 0.0000 hackingData.s_WallData[23].f_CenterX = 0.0000 hackingData.s_WallData[23].f_CenterY = 0.0000 hackingData.s_WallData[23].f_Width = 0.0000 hackingData.s_WallData[23].f_Height = 0.0000 hackingData.s_WallData[24].f_CenterX = 0.0000 hackingData.s_WallData[24].f_CenterY = 0.0000 hackingData.s_WallData[24].f_Width = 0.0000 hackingData.s_WallData[24].f_Height = 0.0000 hackingData.s_WallData[25].f_CenterX = 0.0000 hackingData.s_WallData[25].f_CenterY = 0.0000 hackingData.s_WallData[25].f_Width = 0.0000 hackingData.s_WallData[25].f_Height = 0.0000 hackingData.s_WallData[26].f_CenterX = 0.0000 hackingData.s_WallData[26].f_CenterY = 0.0000 hackingData.s_WallData[26].f_Width = 0.0000 hackingData.s_WallData[26].f_Height = 0.0000 hackingData.s_WallData[27].f_CenterX = 0.0000 hackingData.s_WallData[27].f_CenterY = 0.0000 hackingData.s_WallData[27].f_Width = 0.0000 hackingData.s_WallData[27].f_Height = 0.0000 hackingData.s_WallData[28].f_CenterX = 0.0000 hackingData.s_WallData[28].f_CenterY = 0.0000 hackingData.s_WallData[28].f_Width = 0.0000 hackingData.s_WallData[28].f_Height = 0.0000 hackingData.s_WallData[29].f_CenterX = 0.0000 hackingData.s_WallData[29].f_CenterY = 0.0000 hackingData.s_WallData[29].f_Width = 0.0000 hackingData.s_WallData[29].f_Height = 0.0000 hackingData.s_WallData[30].f_CenterX = 0.0000 hackingData.s_WallData[30].f_CenterY = 0.0000 hackingData.s_WallData[30].f_Width = 0.0000 hackingData.s_WallData[30].f_Height = 0.0000 hackingData.s_WallData[31].f_CenterX = 0.0000 hackingData.s_WallData[31].f_CenterY = 0.0000 hackingData.s_WallData[31].f_Width = 0.0000 hackingData.s_WallData[31].f_Height = 0.0000 hackingData.s_WallData[32].f_CenterX = 0.0000 hackingData.s_WallData[32].f_CenterY = 0.0000 hackingData.s_WallData[32].f_Width = 0.0000 hackingData.s_WallData[32].f_Height = 0.0000 hackingData.s_WallData[33].f_CenterX = 0.0000 hackingData.s_WallData[33].f_CenterY = 0.0000 hackingData.s_WallData[33].f_Width = 0.0000 hackingData.s_WallData[33].f_Height = 0.0000 hackingData.s_WallData[34].f_CenterX = 0.0000 hackingData.s_WallData[34].f_CenterY = 0.0000 hackingData.s_WallData[34].f_Width = 0.0000 hackingData.s_WallData[34].f_Height = 0.0000 hackingData.s_WallData[35].f_CenterX = 0.0000 hackingData.s_WallData[35].f_CenterY = 0.0000 hackingData.s_WallData[35].f_Width = 0.0000 hackingData.s_WallData[35].f_Height = 0.0000 hackingData.s_WallData[36].f_CenterX = 0.0000 hackingData.s_WallData[36].f_CenterY = 0.0000 hackingData.s_WallData[36].f_Width = 0.0000 hackingData.s_WallData[36].f_Height = 0.0000 hackingData.s_WallData[37].f_CenterX = 0.0000 hackingData.s_WallData[37].f_CenterY = 0.0000 hackingData.s_WallData[37].f_Width = 0.0000 hackingData.s_WallData[37].f_Height = 0.0000 hackingData.s_WallData[38].f_CenterX = 0.0000 hackingData.s_WallData[38].f_CenterY = 0.0000 hackingData.s_WallData[38].f_Width = 0.0000 hackingData.s_WallData[38].f_Height = 0.0000 hackingData.s_WallData[39].f_CenterX = 0.0000 hackingData.s_WallData[39].f_CenterY = 0.0000 hackingData.s_WallData[39].f_Width = 0.0000 hackingData.s_WallData[39].f_Height = 0.0000 BREAK CASE 1 // HEADER - Level: 2 hackingData.s_SnakeData.f_StartX = 0.1740 hackingData.s_SnakeData.f_StartY = 0.7390 hackingData.s_SnakeData.f_CenterX = hackingData.s_SnakeData.f_StartX hackingData.s_SnakeData.f_CenterY = hackingData.s_SnakeData.f_StartY hackingData.s_SnakeData.i_StartDirection = 3 hackingData.s_SnakeData.i_Direction = hackingData.s_SnakeData.i_StartDirection hackingData.s_SnakeData.f_SpeedX = 0.0880 hackingData.s_SnakeData.f_SpeedY = hackingData.s_SnakeData.f_SpeedX * hackingData.f_CurrentAspectRatio hackingData.s_SnakeData.f_EndX = 0.8300 hackingData.s_SnakeData.f_EndY = 0.3010 hackingData.s_SnakeData.f_EndWidth = 0.0260 hackingData.s_SnakeData.f_EndHeight = 0.0700 // WALLS hackingData.s_WallData[0].f_CenterX = 0.1573 hackingData.s_WallData[0].f_CenterY = 0.5000 hackingData.s_WallData[0].f_Width = 0.0070 hackingData.s_WallData[0].f_Height = 0.6960 hackingData.s_WallData[1].f_CenterX = 0.8423 hackingData.s_WallData[1].f_CenterY = 0.5000 hackingData.s_WallData[1].f_Width = 0.0070 hackingData.s_WallData[1].f_Height = 0.6960 hackingData.s_WallData[2].f_CenterX = 0.5003 hackingData.s_WallData[2].f_CenterY = 0.1480 hackingData.s_WallData[2].f_Width = 0.6905 hackingData.s_WallData[2].f_Height = 0.0100 hackingData.s_WallData[3].f_CenterX = 0.5005 hackingData.s_WallData[3].f_CenterY = 0.8530 hackingData.s_WallData[3].f_Width = 0.6910 hackingData.s_WallData[3].f_Height = 0.0100 hackingData.s_WallData[4].f_CenterX = 0.1710 hackingData.s_WallData[4].f_CenterY = 0.7390 hackingData.s_WallData[4].f_Width = 0.0270 hackingData.s_WallData[4].f_Height = 0.0780 hackingData.s_WallData[5].f_CenterX = 0.2034 hackingData.s_WallData[5].f_CenterY = 0.3984 hackingData.s_WallData[5].f_Width = 0.0890 hackingData.s_WallData[5].f_Height = 0.4880 hackingData.s_WallData[6].f_CenterX = 0.3278 hackingData.s_WallData[6].f_CenterY = 0.2125 hackingData.s_WallData[6].f_Width = 0.1720 hackingData.s_WallData[6].f_Height = 0.1130 hackingData.s_WallData[7].f_CenterX = 0.3763 hackingData.s_WallData[7].f_CenterY = 0.6380 hackingData.s_WallData[7].f_Width = 0.1240 hackingData.s_WallData[7].f_Height = 0.4367 hackingData.s_WallData[8].f_CenterX = 0.4860 hackingData.s_WallData[8].f_CenterY = 0.5433 hackingData.s_WallData[8].f_Width = 0.0526 hackingData.s_WallData[8].f_Height = 0.6100 hackingData.s_WallData[9].f_CenterX = 0.6212 hackingData.s_WallData[9].f_CenterY = 0.3510 hackingData.s_WallData[9].f_Width = 0.1257 hackingData.s_WallData[9].f_Height = 0.3996 hackingData.s_WallData[10].f_CenterX = 0.7034 hackingData.s_WallData[10].f_CenterY = 0.3048 hackingData.s_WallData[10].f_Width = 0.0400 hackingData.s_WallData[10].f_Height = 0.3010 hackingData.s_WallData[11].f_CenterX = 0.7397 hackingData.s_WallData[11].f_CenterY = 0.2289 hackingData.s_WallData[11].f_Width = 0.0330 hackingData.s_WallData[11].f_Height = 0.1490 hackingData.s_WallData[12].f_CenterX = 0.6249 hackingData.s_WallData[12].f_CenterY = 0.7105 hackingData.s_WallData[12].f_Width = 0.1412 hackingData.s_WallData[12].f_Height = 0.1499 hackingData.s_WallData[13].f_CenterX = 0.7900 hackingData.s_WallData[13].f_CenterY = 0.8010 hackingData.s_WallData[13].f_Width = 0.0955 hackingData.s_WallData[13].f_Height = 0.1032 hackingData.s_WallData[14].f_CenterX = 0.7704 hackingData.s_WallData[14].f_CenterY = 0.5977 hackingData.s_WallData[14].f_Width = 0.0564 hackingData.s_WallData[14].f_Height = 0.1630 hackingData.s_WallData[15].f_CenterX = 0.8086 hackingData.s_WallData[15].f_CenterY = 0.4081 hackingData.s_WallData[15].f_Width = 0.0593 hackingData.s_WallData[15].f_Height = 0.0931 hackingData.s_WallData[16].f_CenterX = 0.3295 hackingData.s_WallData[16].f_CenterY = 0.3910 hackingData.s_WallData[16].f_Width = 0.0304 hackingData.s_WallData[16].f_Height = 0.0642 hackingData.s_WallData[17].f_CenterX = 0.3961 hackingData.s_WallData[17].f_CenterY = 0.3097 hackingData.s_WallData[17].f_Width = 0.0346 hackingData.s_WallData[17].f_Height = 0.0785 hackingData.s_WallData[18].f_CenterX = 0.5495 hackingData.s_WallData[18].f_CenterY = 0.5064 hackingData.s_WallData[18].f_Width = 0.0150 hackingData.s_WallData[18].f_Height = 0.0900 hackingData.s_WallData[19].f_CenterX = 0.0000 hackingData.s_WallData[19].f_CenterY = 0.0000 hackingData.s_WallData[19].f_Width = 0.0000 hackingData.s_WallData[19].f_Height = 0.0000 hackingData.s_WallData[20].f_CenterX = 0.0000 hackingData.s_WallData[20].f_CenterY = 0.0000 hackingData.s_WallData[20].f_Width = 0.0000 hackingData.s_WallData[20].f_Height = 0.0000 hackingData.s_WallData[21].f_CenterX = 0.0000 hackingData.s_WallData[21].f_CenterY = 0.0000 hackingData.s_WallData[21].f_Width = 0.0000 hackingData.s_WallData[21].f_Height = 0.0000 hackingData.s_WallData[22].f_CenterX = 0.0000 hackingData.s_WallData[22].f_CenterY = 0.0000 hackingData.s_WallData[22].f_Width = 0.0000 hackingData.s_WallData[22].f_Height = 0.0000 hackingData.s_WallData[23].f_CenterX = 0.0000 hackingData.s_WallData[23].f_CenterY = 0.0000 hackingData.s_WallData[23].f_Width = 0.0000 hackingData.s_WallData[23].f_Height = 0.0000 hackingData.s_WallData[24].f_CenterX = 0.0000 hackingData.s_WallData[24].f_CenterY = 0.0000 hackingData.s_WallData[24].f_Width = 0.0000 hackingData.s_WallData[24].f_Height = 0.0000 hackingData.s_WallData[25].f_CenterX = 0.0000 hackingData.s_WallData[25].f_CenterY = 0.0000 hackingData.s_WallData[25].f_Width = 0.0000 hackingData.s_WallData[25].f_Height = 0.0000 hackingData.s_WallData[26].f_CenterX = 0.0000 hackingData.s_WallData[26].f_CenterY = 0.0000 hackingData.s_WallData[26].f_Width = 0.0000 hackingData.s_WallData[26].f_Height = 0.0000 hackingData.s_WallData[27].f_CenterX = 0.0000 hackingData.s_WallData[27].f_CenterY = 0.0000 hackingData.s_WallData[27].f_Width = 0.0000 hackingData.s_WallData[27].f_Height = 0.0000 hackingData.s_WallData[28].f_CenterX = 0.0000 hackingData.s_WallData[28].f_CenterY = 0.0000 hackingData.s_WallData[28].f_Width = 0.0000 hackingData.s_WallData[28].f_Height = 0.0000 hackingData.s_WallData[29].f_CenterX = 0.0000 hackingData.s_WallData[29].f_CenterY = 0.0000 hackingData.s_WallData[29].f_Width = 0.0000 hackingData.s_WallData[29].f_Height = 0.0000 hackingData.s_WallData[30].f_CenterX = 0.0000 hackingData.s_WallData[30].f_CenterY = 0.0000 hackingData.s_WallData[30].f_Width = 0.0000 hackingData.s_WallData[30].f_Height = 0.0000 hackingData.s_WallData[31].f_CenterX = 0.0000 hackingData.s_WallData[31].f_CenterY = 0.0000 hackingData.s_WallData[31].f_Width = 0.0000 hackingData.s_WallData[31].f_Height = 0.0000 hackingData.s_WallData[32].f_CenterX = 0.0000 hackingData.s_WallData[32].f_CenterY = 0.0000 hackingData.s_WallData[32].f_Width = 0.0000 hackingData.s_WallData[32].f_Height = 0.0000 hackingData.s_WallData[33].f_CenterX = 0.0000 hackingData.s_WallData[33].f_CenterY = 0.0000 hackingData.s_WallData[33].f_Width = 0.0000 hackingData.s_WallData[33].f_Height = 0.0000 hackingData.s_WallData[34].f_CenterX = 0.0000 hackingData.s_WallData[34].f_CenterY = 0.0000 hackingData.s_WallData[34].f_Width = 0.0000 hackingData.s_WallData[34].f_Height = 0.0000 hackingData.s_WallData[35].f_CenterX = 0.0000 hackingData.s_WallData[35].f_CenterY = 0.0000 hackingData.s_WallData[35].f_Width = 0.0000 hackingData.s_WallData[35].f_Height = 0.0000 hackingData.s_WallData[36].f_CenterX = 0.0000 hackingData.s_WallData[36].f_CenterY = 0.0000 hackingData.s_WallData[36].f_Width = 0.0000 hackingData.s_WallData[36].f_Height = 0.0000 hackingData.s_WallData[37].f_CenterX = 0.0000 hackingData.s_WallData[37].f_CenterY = 0.0000 hackingData.s_WallData[37].f_Width = 0.0000 hackingData.s_WallData[37].f_Height = 0.0000 hackingData.s_WallData[38].f_CenterX = 0.0000 hackingData.s_WallData[38].f_CenterY = 0.0000 hackingData.s_WallData[38].f_Width = 0.0000 hackingData.s_WallData[38].f_Height = 0.0000 hackingData.s_WallData[39].f_CenterX = 0.0000 hackingData.s_WallData[39].f_CenterY = 0.0000 hackingData.s_WallData[39].f_Width = 0.0000 hackingData.s_WallData[39].f_Height = 0.0000 BREAK CASE 2 // HEADER - Level: 3 hackingData.s_SnakeData.f_StartX = 0.1750 hackingData.s_SnakeData.f_StartY = 0.7720 hackingData.s_SnakeData.f_CenterX = hackingData.s_SnakeData.f_StartX hackingData.s_SnakeData.f_CenterY = hackingData.s_SnakeData.f_StartY hackingData.s_SnakeData.i_StartDirection = 3 hackingData.s_SnakeData.i_Direction = hackingData.s_SnakeData.i_StartDirection hackingData.s_SnakeData.f_SpeedX = 0.0880 hackingData.s_SnakeData.f_SpeedY = hackingData.s_SnakeData.f_SpeedX * hackingData.f_CurrentAspectRatio hackingData.s_SnakeData.f_EndX = 0.1710 hackingData.s_SnakeData.f_EndY = 0.2300 hackingData.s_SnakeData.f_EndWidth = 0.0260 hackingData.s_SnakeData.f_EndHeight = 0.0700 // WALLS hackingData.s_WallData[0].f_CenterX = 0.1573 hackingData.s_WallData[0].f_CenterY = 0.5000 hackingData.s_WallData[0].f_Width = 0.0070 hackingData.s_WallData[0].f_Height = 0.6960 hackingData.s_WallData[1].f_CenterX = 0.8423 hackingData.s_WallData[1].f_CenterY = 0.5000 hackingData.s_WallData[1].f_Width = 0.0070 hackingData.s_WallData[1].f_Height = 0.6960 hackingData.s_WallData[2].f_CenterX = 0.5003 hackingData.s_WallData[2].f_CenterY = 0.1480 hackingData.s_WallData[2].f_Width = 0.6905 hackingData.s_WallData[2].f_Height = 0.0100 hackingData.s_WallData[3].f_CenterX = 0.5005 hackingData.s_WallData[3].f_CenterY = 0.8530 hackingData.s_WallData[3].f_Width = 0.6910 hackingData.s_WallData[3].f_Height = 0.0100 hackingData.s_WallData[4].f_CenterX = 0.1710 hackingData.s_WallData[4].f_CenterY = 0.7720 hackingData.s_WallData[4].f_Width = 0.0280 hackingData.s_WallData[4].f_Height = 0.0790 hackingData.s_WallData[5].f_CenterX = 0.2405 hackingData.s_WallData[5].f_CenterY = 0.5073 hackingData.s_WallData[5].f_Width = 0.1739 hackingData.s_WallData[5].f_Height = 0.4143 hackingData.s_WallData[6].f_CenterX = 0.4010 hackingData.s_WallData[6].f_CenterY = 0.7611 hackingData.s_WallData[6].f_Width = 0.0698 hackingData.s_WallData[6].f_Height = 0.1734 hackingData.s_WallData[7].f_CenterX = 0.4172 hackingData.s_WallData[7].f_CenterY = 0.4899 hackingData.s_WallData[7].f_Width = 0.2000 hackingData.s_WallData[7].f_Height = 0.1679 hackingData.s_WallData[8].f_CenterX = 0.5370 hackingData.s_WallData[8].f_CenterY = 0.3792 hackingData.s_WallData[8].f_Width = 0.0701 hackingData.s_WallData[8].f_Height = 0.2620 hackingData.s_WallData[9].f_CenterX = 0.5992 hackingData.s_WallData[9].f_CenterY = 0.5190 hackingData.s_WallData[9].f_Width = 0.0994 hackingData.s_WallData[9].f_Height = 0.0891 hackingData.s_WallData[10].f_CenterX = 0.7266 hackingData.s_WallData[10].f_CenterY = 0.7504 hackingData.s_WallData[10].f_Width = 0.2270 hackingData.s_WallData[10].f_Height = 0.2018 hackingData.s_WallData[11].f_CenterX = 0.7684 hackingData.s_WallData[11].f_CenterY = 0.4950 hackingData.s_WallData[11].f_Width = 0.1410 hackingData.s_WallData[11].f_Height = 0.1301 hackingData.s_WallData[12].f_CenterX = 0.7276 hackingData.s_WallData[12].f_CenterY = 0.2681 hackingData.s_WallData[12].f_Width = 0.2250 hackingData.s_WallData[12].f_Height = 0.2300 hackingData.s_WallData[13].f_CenterX = 0.4103 hackingData.s_WallData[13].f_CenterY = 0.2460 hackingData.s_WallData[13].f_Width = 0.0704 hackingData.s_WallData[13].f_Height = 0.1924 hackingData.s_WallData[14].f_CenterX = 0.3368 hackingData.s_WallData[14].f_CenterY = 0.1981 hackingData.s_WallData[14].f_Width = 0.0743 hackingData.s_WallData[14].f_Height = 0.0938 hackingData.s_WallData[15].f_CenterX = 0.5345 hackingData.s_WallData[15].f_CenterY = 0.6472 hackingData.s_WallData[15].f_Width = 0.0653 hackingData.s_WallData[15].f_Height = 0.2456 hackingData.s_WallData[16].f_CenterX = 0.4531 hackingData.s_WallData[16].f_CenterY = 0.2952 hackingData.s_WallData[16].f_Width = 0.0225 hackingData.s_WallData[16].f_Height = 0.0954 hackingData.s_WallData[17].f_CenterX = 0.0000 hackingData.s_WallData[17].f_CenterY = 0.0000 hackingData.s_WallData[17].f_Width = 0.0000 hackingData.s_WallData[17].f_Height = 0.0000 hackingData.s_WallData[18].f_CenterX = 0.0000 hackingData.s_WallData[18].f_CenterY = 0.0000 hackingData.s_WallData[18].f_Width = 0.0000 hackingData.s_WallData[18].f_Height = 0.0000 hackingData.s_WallData[19].f_CenterX = 0.0000 hackingData.s_WallData[19].f_CenterY = 0.0000 hackingData.s_WallData[19].f_Width = 0.0000 hackingData.s_WallData[19].f_Height = 0.0000 hackingData.s_WallData[20].f_CenterX = 0.0000 hackingData.s_WallData[20].f_CenterY = 0.0000 hackingData.s_WallData[20].f_Width = 0.0000 hackingData.s_WallData[20].f_Height = 0.0000 hackingData.s_WallData[21].f_CenterX = 0.0000 hackingData.s_WallData[21].f_CenterY = 0.0000 hackingData.s_WallData[21].f_Width = 0.0000 hackingData.s_WallData[21].f_Height = 0.0000 hackingData.s_WallData[22].f_CenterX = 0.0000 hackingData.s_WallData[22].f_CenterY = 0.0000 hackingData.s_WallData[22].f_Width = 0.0000 hackingData.s_WallData[22].f_Height = 0.0000 hackingData.s_WallData[23].f_CenterX = 0.0000 hackingData.s_WallData[23].f_CenterY = 0.0000 hackingData.s_WallData[23].f_Width = 0.0000 hackingData.s_WallData[23].f_Height = 0.0000 hackingData.s_WallData[24].f_CenterX = 0.0000 hackingData.s_WallData[24].f_CenterY = 0.0000 hackingData.s_WallData[24].f_Width = 0.0000 hackingData.s_WallData[24].f_Height = 0.0000 hackingData.s_WallData[25].f_CenterX = 0.0000 hackingData.s_WallData[25].f_CenterY = 0.0000 hackingData.s_WallData[25].f_Width = 0.0000 hackingData.s_WallData[25].f_Height = 0.0000 hackingData.s_WallData[26].f_CenterX = 0.0000 hackingData.s_WallData[26].f_CenterY = 0.0000 hackingData.s_WallData[26].f_Width = 0.0000 hackingData.s_WallData[26].f_Height = 0.0000 hackingData.s_WallData[27].f_CenterX = 0.0000 hackingData.s_WallData[27].f_CenterY = 0.0000 hackingData.s_WallData[27].f_Width = 0.0000 hackingData.s_WallData[27].f_Height = 0.0000 hackingData.s_WallData[28].f_CenterX = 0.0000 hackingData.s_WallData[28].f_CenterY = 0.0000 hackingData.s_WallData[28].f_Width = 0.0000 hackingData.s_WallData[28].f_Height = 0.0000 hackingData.s_WallData[29].f_CenterX = 0.0000 hackingData.s_WallData[29].f_CenterY = 0.0000 hackingData.s_WallData[29].f_Width = 0.0000 hackingData.s_WallData[29].f_Height = 0.0000 hackingData.s_WallData[30].f_CenterX = 0.0000 hackingData.s_WallData[30].f_CenterY = 0.0000 hackingData.s_WallData[30].f_Width = 0.0000 hackingData.s_WallData[30].f_Height = 0.0000 hackingData.s_WallData[31].f_CenterX = 0.0000 hackingData.s_WallData[31].f_CenterY = 0.0000 hackingData.s_WallData[31].f_Width = 0.0000 hackingData.s_WallData[31].f_Height = 0.0000 hackingData.s_WallData[32].f_CenterX = 0.0000 hackingData.s_WallData[32].f_CenterY = 0.0000 hackingData.s_WallData[32].f_Width = 0.0000 hackingData.s_WallData[32].f_Height = 0.0000 hackingData.s_WallData[33].f_CenterX = 0.0000 hackingData.s_WallData[33].f_CenterY = 0.0000 hackingData.s_WallData[33].f_Width = 0.0000 hackingData.s_WallData[33].f_Height = 0.0000 hackingData.s_WallData[34].f_CenterX = 0.0000 hackingData.s_WallData[34].f_CenterY = 0.0000 hackingData.s_WallData[34].f_Width = 0.0000 hackingData.s_WallData[34].f_Height = 0.0000 hackingData.s_WallData[35].f_CenterX = 0.0000 hackingData.s_WallData[35].f_CenterY = 0.0000 hackingData.s_WallData[35].f_Width = 0.0000 hackingData.s_WallData[35].f_Height = 0.0000 hackingData.s_WallData[36].f_CenterX = 0.0000 hackingData.s_WallData[36].f_CenterY = 0.0000 hackingData.s_WallData[36].f_Width = 0.0000 hackingData.s_WallData[36].f_Height = 0.0000 hackingData.s_WallData[37].f_CenterX = 0.0000 hackingData.s_WallData[37].f_CenterY = 0.0000 hackingData.s_WallData[37].f_Width = 0.0000 hackingData.s_WallData[37].f_Height = 0.0000 hackingData.s_WallData[38].f_CenterX = 0.0000 hackingData.s_WallData[38].f_CenterY = 0.0000 hackingData.s_WallData[38].f_Width = 0.0000 hackingData.s_WallData[38].f_Height = 0.0000 hackingData.s_WallData[39].f_CenterX = 0.0000 hackingData.s_WallData[39].f_CenterY = 0.0000 hackingData.s_WallData[39].f_Width = 0.0000 hackingData.s_WallData[39].f_Height = 0.0000 BREAK CASE 3 // HEADER - Level: 4 hackingData.s_SnakeData.f_StartX = 0.1740 hackingData.s_SnakeData.f_StartY = 0.7530 hackingData.s_SnakeData.f_CenterX = hackingData.s_SnakeData.f_StartX hackingData.s_SnakeData.f_CenterY = hackingData.s_SnakeData.f_StartY hackingData.s_SnakeData.i_StartDirection = 3 hackingData.s_SnakeData.i_Direction = hackingData.s_SnakeData.i_StartDirection hackingData.s_SnakeData.f_SpeedX = 0.0880 hackingData.s_SnakeData.f_SpeedY = hackingData.s_SnakeData.f_SpeedX * hackingData.f_CurrentAspectRatio hackingData.s_SnakeData.f_EndX = 0.8300 hackingData.s_SnakeData.f_EndY = 0.2900 hackingData.s_SnakeData.f_EndWidth = 0.0260 hackingData.s_SnakeData.f_EndHeight = 0.0700 // WALLS hackingData.s_WallData[0].f_CenterX = 0.1573 hackingData.s_WallData[0].f_CenterY = 0.5000 hackingData.s_WallData[0].f_Width = 0.0070 hackingData.s_WallData[0].f_Height = 0.6960 hackingData.s_WallData[1].f_CenterX = 0.8423 hackingData.s_WallData[1].f_CenterY = 0.5000 hackingData.s_WallData[1].f_Width = 0.0070 hackingData.s_WallData[1].f_Height = 0.6960 hackingData.s_WallData[2].f_CenterX = 0.5003 hackingData.s_WallData[2].f_CenterY = 0.1480 hackingData.s_WallData[2].f_Width = 0.6905 hackingData.s_WallData[2].f_Height = 0.0100 hackingData.s_WallData[3].f_CenterX = 0.5005 hackingData.s_WallData[3].f_CenterY = 0.8530 hackingData.s_WallData[3].f_Width = 0.6910 hackingData.s_WallData[3].f_Height = 0.0100 hackingData.s_WallData[4].f_CenterX = 0.1710 hackingData.s_WallData[4].f_CenterY = 0.7530 hackingData.s_WallData[4].f_Width = 0.0260 hackingData.s_WallData[4].f_Height = 0.0780 hackingData.s_WallData[5].f_CenterX = 0.2406 hackingData.s_WallData[5].f_CenterY = 0.3722 hackingData.s_WallData[5].f_Width = 0.1605 hackingData.s_WallData[5].f_Height = 0.4400 hackingData.s_WallData[6].f_CenterX = 0.3290 hackingData.s_WallData[6].f_CenterY = 0.7922 hackingData.s_WallData[6].f_Width = 0.1040 hackingData.s_WallData[6].f_Height = 0.1245 hackingData.s_WallData[7].f_CenterX = 0.4985 hackingData.s_WallData[7].f_CenterY = 0.6060 hackingData.s_WallData[7].f_Width = 0.3826 hackingData.s_WallData[7].f_Height = 0.0964 hackingData.s_WallData[8].f_CenterX = 0.4807 hackingData.s_WallData[8].f_CenterY = 0.7167 hackingData.s_WallData[8].f_Width = 0.1194 hackingData.s_WallData[8].f_Height = 0.1268 hackingData.s_WallData[9].f_CenterX = 0.7102 hackingData.s_WallData[9].f_CenterY = 0.7833 hackingData.s_WallData[9].f_Width = 0.2629 hackingData.s_WallData[9].f_Height = 0.1297 hackingData.s_WallData[10].f_CenterX = 0.8100 hackingData.s_WallData[10].f_CenterY = 0.5780 hackingData.s_WallData[10].f_Width = 0.0600 hackingData.s_WallData[10].f_Height = 0.3630 hackingData.s_WallData[11].f_CenterX = 0.7690 hackingData.s_WallData[11].f_CenterY = 0.4530 hackingData.s_WallData[11].f_Width = 0.0240 hackingData.s_WallData[11].f_Height = 0.0430 hackingData.s_WallData[12].f_CenterX = 0.6691 hackingData.s_WallData[12].f_CenterY = 0.4250 hackingData.s_WallData[12].f_Width = 0.1854 hackingData.s_WallData[12].f_Height = 0.1048 hackingData.s_WallData[13].f_CenterX = 0.6643 hackingData.s_WallData[13].f_CenterY = 0.3040 hackingData.s_WallData[13].f_Width = 0.0429 hackingData.s_WallData[13].f_Height = 0.1461 hackingData.s_WallData[14].f_CenterX = 0.4955 hackingData.s_WallData[14].f_CenterY = 0.3611 hackingData.s_WallData[14].f_Width = 0.2535 hackingData.s_WallData[14].f_Height = 0.0936 hackingData.s_WallData[15].f_CenterX = 0.3947 hackingData.s_WallData[15].f_CenterY = 0.3276 hackingData.s_WallData[15].f_Width = 0.0519 hackingData.s_WallData[15].f_Height = 0.2157 hackingData.s_WallData[16].f_CenterX = 0.5282 hackingData.s_WallData[16].f_CenterY = 0.2075 hackingData.s_WallData[16].f_Width = 0.1359 hackingData.s_WallData[16].f_Height = 0.1086 hackingData.s_WallData[17].f_CenterX = 0.7504 hackingData.s_WallData[17].f_CenterY = 0.2068 hackingData.s_WallData[17].f_Width = 0.0550 hackingData.s_WallData[17].f_Height = 0.1120 hackingData.s_WallData[18].f_CenterX = 0.4298 hackingData.s_WallData[18].f_CenterY = 0.5236 hackingData.s_WallData[18].f_Width = 0.2205 hackingData.s_WallData[18].f_Height = 0.0686 hackingData.s_WallData[19].f_CenterX = 0.7586 hackingData.s_WallData[19].f_CenterY = 0.5968 hackingData.s_WallData[19].f_Width = 0.0431 hackingData.s_WallData[19].f_Height = 0.2474 hackingData.s_WallData[20].f_CenterX = 0.3614 hackingData.s_WallData[20].f_CenterY = 0.2587 hackingData.s_WallData[20].f_Width = 0.0174 hackingData.s_WallData[20].f_Height = 0.0782 hackingData.s_WallData[21].f_CenterX = 0.0000 hackingData.s_WallData[21].f_CenterY = 0.0000 hackingData.s_WallData[21].f_Width = 0.0000 hackingData.s_WallData[21].f_Height = 0.0000 hackingData.s_WallData[22].f_CenterX = 0.0000 hackingData.s_WallData[22].f_CenterY = 0.0000 hackingData.s_WallData[22].f_Width = 0.0000 hackingData.s_WallData[22].f_Height = 0.0000 hackingData.s_WallData[23].f_CenterX = 0.0000 hackingData.s_WallData[23].f_CenterY = 0.0000 hackingData.s_WallData[23].f_Width = 0.0000 hackingData.s_WallData[23].f_Height = 0.0000 hackingData.s_WallData[24].f_CenterX = 0.0000 hackingData.s_WallData[24].f_CenterY = 0.0000 hackingData.s_WallData[24].f_Width = 0.0000 hackingData.s_WallData[24].f_Height = 0.0000 hackingData.s_WallData[25].f_CenterX = 0.0000 hackingData.s_WallData[25].f_CenterY = 0.0000 hackingData.s_WallData[25].f_Width = 0.0000 hackingData.s_WallData[25].f_Height = 0.0000 hackingData.s_WallData[26].f_CenterX = 0.0000 hackingData.s_WallData[26].f_CenterY = 0.0000 hackingData.s_WallData[26].f_Width = 0.0000 hackingData.s_WallData[26].f_Height = 0.0000 hackingData.s_WallData[27].f_CenterX = 0.0000 hackingData.s_WallData[27].f_CenterY = 0.0000 hackingData.s_WallData[27].f_Width = 0.0000 hackingData.s_WallData[27].f_Height = 0.0000 hackingData.s_WallData[28].f_CenterX = 0.0000 hackingData.s_WallData[28].f_CenterY = 0.0000 hackingData.s_WallData[28].f_Width = 0.0000 hackingData.s_WallData[28].f_Height = 0.0000 hackingData.s_WallData[29].f_CenterX = 0.0000 hackingData.s_WallData[29].f_CenterY = 0.0000 hackingData.s_WallData[29].f_Width = 0.0000 hackingData.s_WallData[29].f_Height = 0.0000 hackingData.s_WallData[30].f_CenterX = 0.0000 hackingData.s_WallData[30].f_CenterY = 0.0000 hackingData.s_WallData[30].f_Width = 0.0000 hackingData.s_WallData[30].f_Height = 0.0000 hackingData.s_WallData[31].f_CenterX = 0.0000 hackingData.s_WallData[31].f_CenterY = 0.0000 hackingData.s_WallData[31].f_Width = 0.0000 hackingData.s_WallData[31].f_Height = 0.0000 hackingData.s_WallData[32].f_CenterX = 0.0000 hackingData.s_WallData[32].f_CenterY = 0.0000 hackingData.s_WallData[32].f_Width = 0.0000 hackingData.s_WallData[32].f_Height = 0.0000 hackingData.s_WallData[33].f_CenterX = 0.0000 hackingData.s_WallData[33].f_CenterY = 0.0000 hackingData.s_WallData[33].f_Width = 0.0000 hackingData.s_WallData[33].f_Height = 0.0000 hackingData.s_WallData[34].f_CenterX = 0.0000 hackingData.s_WallData[34].f_CenterY = 0.0000 hackingData.s_WallData[34].f_Width = 0.0000 hackingData.s_WallData[34].f_Height = 0.0000 hackingData.s_WallData[35].f_CenterX = 0.0000 hackingData.s_WallData[35].f_CenterY = 0.0000 hackingData.s_WallData[35].f_Width = 0.0000 hackingData.s_WallData[35].f_Height = 0.0000 hackingData.s_WallData[36].f_CenterX = 0.0000 hackingData.s_WallData[36].f_CenterY = 0.0000 hackingData.s_WallData[36].f_Width = 0.0000 hackingData.s_WallData[36].f_Height = 0.0000 hackingData.s_WallData[37].f_CenterX = 0.0000 hackingData.s_WallData[37].f_CenterY = 0.0000 hackingData.s_WallData[37].f_Width = 0.0000 hackingData.s_WallData[37].f_Height = 0.0000 hackingData.s_WallData[38].f_CenterX = 0.0000 hackingData.s_WallData[38].f_CenterY = 0.0000 hackingData.s_WallData[38].f_Width = 0.0000 hackingData.s_WallData[38].f_Height = 0.0000 hackingData.s_WallData[39].f_CenterX = 0.0000 hackingData.s_WallData[39].f_CenterY = 0.0000 hackingData.s_WallData[39].f_Width = 0.0000 hackingData.s_WallData[39].f_Height = 0.0000 BREAK CASE 4 // HEADER - Level: 5 hackingData.s_SnakeData.f_StartX = 0.1740 hackingData.s_SnakeData.f_StartY = 0.2900 hackingData.s_SnakeData.f_CenterX = hackingData.s_SnakeData.f_StartX hackingData.s_SnakeData.f_CenterY = hackingData.s_SnakeData.f_StartY hackingData.s_SnakeData.i_StartDirection = 3 hackingData.s_SnakeData.i_Direction = hackingData.s_SnakeData.i_StartDirection hackingData.s_SnakeData.f_SpeedX = 0.0880 hackingData.s_SnakeData.f_SpeedY = hackingData.s_SnakeData.f_SpeedX * hackingData.f_CurrentAspectRatio hackingData.s_SnakeData.f_EndX = 0.7910 hackingData.s_SnakeData.f_EndY = 0.8310 hackingData.s_SnakeData.f_EndWidth = 0.0400 hackingData.s_SnakeData.f_EndHeight = 0.0450 // WALLS hackingData.s_WallData[0].f_CenterX = 0.1573 hackingData.s_WallData[0].f_CenterY = 0.5000 hackingData.s_WallData[0].f_Width = 0.0070 hackingData.s_WallData[0].f_Height = 0.6960 hackingData.s_WallData[1].f_CenterX = 0.8423 hackingData.s_WallData[1].f_CenterY = 0.5000 hackingData.s_WallData[1].f_Width = 0.0070 hackingData.s_WallData[1].f_Height = 0.6960 hackingData.s_WallData[2].f_CenterX = 0.5003 hackingData.s_WallData[2].f_CenterY = 0.1480 hackingData.s_WallData[2].f_Width = 0.6905 hackingData.s_WallData[2].f_Height = 0.0100 hackingData.s_WallData[3].f_CenterX = 0.5005 hackingData.s_WallData[3].f_CenterY = 0.8530 hackingData.s_WallData[3].f_Width = 0.6910 hackingData.s_WallData[3].f_Height = 0.0100 hackingData.s_WallData[4].f_CenterX = 0.1670 hackingData.s_WallData[4].f_CenterY = 0.2900 hackingData.s_WallData[4].f_Width = 0.0360 hackingData.s_WallData[4].f_Height = 0.0780 hackingData.s_WallData[5].f_CenterX = 0.3475 hackingData.s_WallData[5].f_CenterY = 0.2064 hackingData.s_WallData[5].f_Width = 0.1869 hackingData.s_WallData[5].f_Height = 0.1068 hackingData.s_WallData[6].f_CenterX = 0.2903 hackingData.s_WallData[6].f_CenterY = 0.3900 hackingData.s_WallData[6].f_Width = 0.0721 hackingData.s_WallData[6].f_Height = 0.2870 hackingData.s_WallData[7].f_CenterX = 0.2260 hackingData.s_WallData[7].f_CenterY = 0.4760 hackingData.s_WallData[7].f_Width = 0.0601 hackingData.s_WallData[7].f_Height = 0.0735 hackingData.s_WallData[8].f_CenterX = 0.4322 hackingData.s_WallData[8].f_CenterY = 0.5830 hackingData.s_WallData[8].f_Width = 0.3560 hackingData.s_WallData[8].f_Height = 0.1035 hackingData.s_WallData[9].f_CenterX = 0.3125 hackingData.s_WallData[9].f_CenterY = 0.6660 hackingData.s_WallData[9].f_Width = 0.1171 hackingData.s_WallData[9].f_Height = 0.0692 hackingData.s_WallData[10].f_CenterX = 0.1885 hackingData.s_WallData[10].f_CenterY = 0.6079 hackingData.s_WallData[10].f_Width = 0.0601 hackingData.s_WallData[10].f_Height = 0.0538 hackingData.s_WallData[11].f_CenterX = 0.2675 hackingData.s_WallData[11].f_CenterY = 0.8070 hackingData.s_WallData[11].f_Width = 0.0726 hackingData.s_WallData[11].f_Height = 0.0892 hackingData.s_WallData[12].f_CenterX = 0.5352 hackingData.s_WallData[12].f_CenterY = 0.7972 hackingData.s_WallData[12].f_Width = 0.2359 hackingData.s_WallData[12].f_Height = 0.1064 hackingData.s_WallData[13].f_CenterX = 0.5231 hackingData.s_WallData[13].f_CenterY = 0.7283 hackingData.s_WallData[13].f_Width = 0.0537 hackingData.s_WallData[13].f_Height = 0.0467 hackingData.s_WallData[14].f_CenterX = 0.7517 hackingData.s_WallData[14].f_CenterY = 0.5701 hackingData.s_WallData[14].f_Width = 0.0219 hackingData.s_WallData[14].f_Height = 0.1489 hackingData.s_WallData[15].f_CenterX = 0.7182 hackingData.s_WallData[15].f_CenterY = 0.6725 hackingData.s_WallData[15].f_Width = 0.0486 hackingData.s_WallData[15].f_Height = 0.3545 hackingData.s_WallData[16].f_CenterX = 0.5527 hackingData.s_WallData[16].f_CenterY = 0.5174 hackingData.s_WallData[16].f_Width = 0.1125 hackingData.s_WallData[16].f_Height = 0.0673 hackingData.s_WallData[17].f_CenterX = 0.4222 hackingData.s_WallData[17].f_CenterY = 0.4538 hackingData.s_WallData[17].f_Width = 0.0780 hackingData.s_WallData[17].f_Height = 0.0774 hackingData.s_WallData[18].f_CenterX = 0.4251 hackingData.s_WallData[18].f_CenterY = 0.3047 hackingData.s_WallData[18].f_Width = 0.0319 hackingData.s_WallData[18].f_Height = 0.1075 hackingData.s_WallData[19].f_CenterX = 0.4953 hackingData.s_WallData[19].f_CenterY = 0.3437 hackingData.s_WallData[19].f_Width = 0.0277 hackingData.s_WallData[19].f_Height = 0.0830 hackingData.s_WallData[20].f_CenterX = 0.5222 hackingData.s_WallData[20].f_CenterY = 0.1977 hackingData.s_WallData[20].f_Width = 0.1650 hackingData.s_WallData[20].f_Height = 0.0892 hackingData.s_WallData[21].f_CenterX = 0.5540 hackingData.s_WallData[21].f_CenterY = 0.2726 hackingData.s_WallData[21].f_Width = 0.0439 hackingData.s_WallData[21].f_Height = 0.0620 hackingData.s_WallData[22].f_CenterX = 0.5895 hackingData.s_WallData[22].f_CenterY = 0.2454 hackingData.s_WallData[22].f_Width = 0.0307 hackingData.s_WallData[22].f_Height = 0.0180 hackingData.s_WallData[23].f_CenterX = 0.6824 hackingData.s_WallData[23].f_CenterY = 0.4000 hackingData.s_WallData[23].f_Width = 0.2089 hackingData.s_WallData[23].f_Height = 0.0642 hackingData.s_WallData[24].f_CenterX = 0.6821 hackingData.s_WallData[24].f_CenterY = 0.2876 hackingData.s_WallData[24].f_Width = 0.0478 hackingData.s_WallData[24].f_Height = 0.1780 hackingData.s_WallData[25].f_CenterX = 0.7637 hackingData.s_WallData[25].f_CenterY = 0.1870 hackingData.s_WallData[25].f_Width = 0.0217 hackingData.s_WallData[25].f_Height = 0.0681 hackingData.s_WallData[26].f_CenterX = 0.8290 hackingData.s_WallData[26].f_CenterY = 0.2930 hackingData.s_WallData[26].f_Width = 0.0215 hackingData.s_WallData[26].f_Height = 0.0686 hackingData.s_WallData[27].f_CenterX = 0.7780 hackingData.s_WallData[27].f_CenterY = 0.4940 hackingData.s_WallData[27].f_Width = 0.0542 hackingData.s_WallData[27].f_Height = 0.1207 hackingData.s_WallData[28].f_CenterX = 0.8240 hackingData.s_WallData[28].f_CenterY = 0.6610 hackingData.s_WallData[28].f_Width = 0.0299 hackingData.s_WallData[28].f_Height = 0.0921 hackingData.s_WallData[29].f_CenterX = 0.3549 hackingData.s_WallData[29].f_CenterY = 0.7440 hackingData.s_WallData[29].f_Width = 0.0322 hackingData.s_WallData[29].f_Height = 0.0864 hackingData.s_WallData[30].f_CenterX = 0.4358 hackingData.s_WallData[30].f_CenterY = 0.6514 hackingData.s_WallData[30].f_Width = 0.0691 hackingData.s_WallData[30].f_Height = 0.0428 hackingData.s_WallData[31].f_CenterX = 0.6290 hackingData.s_WallData[31].f_CenterY = 0.5832 hackingData.s_WallData[31].f_Width = 0.0458 hackingData.s_WallData[31].f_Height = 0.1989 hackingData.s_WallData[32].f_CenterX = 0.5213 hackingData.s_WallData[32].f_CenterY = 0.3994 hackingData.s_WallData[32].f_Width = 0.0798 hackingData.s_WallData[32].f_Height = 0.0648 hackingData.s_WallData[33].f_CenterX = 0.0000 hackingData.s_WallData[33].f_CenterY = 0.0000 hackingData.s_WallData[33].f_Width = 0.0000 hackingData.s_WallData[33].f_Height = 0.0000 hackingData.s_WallData[34].f_CenterX = 0.0000 hackingData.s_WallData[34].f_CenterY = 0.0000 hackingData.s_WallData[34].f_Width = 0.0000 hackingData.s_WallData[34].f_Height = 0.0000 hackingData.s_WallData[35].f_CenterX = 0.0000 hackingData.s_WallData[35].f_CenterY = 0.0000 hackingData.s_WallData[35].f_Width = 0.0000 hackingData.s_WallData[35].f_Height = 0.0000 hackingData.s_WallData[36].f_CenterX = 0.0000 hackingData.s_WallData[36].f_CenterY = 0.0000 hackingData.s_WallData[36].f_Width = 0.0000 hackingData.s_WallData[36].f_Height = 0.0000 hackingData.s_WallData[37].f_CenterX = 0.0000 hackingData.s_WallData[37].f_CenterY = 0.0000 hackingData.s_WallData[37].f_Width = 0.0000 hackingData.s_WallData[37].f_Height = 0.0000 hackingData.s_WallData[38].f_CenterX = 0.0000 hackingData.s_WallData[38].f_CenterY = 0.0000 hackingData.s_WallData[38].f_Width = 0.0000 hackingData.s_WallData[38].f_Height = 0.0000 hackingData.s_WallData[39].f_CenterX = 0.0000 hackingData.s_WallData[39].f_CenterY = 0.0000 hackingData.s_WallData[39].f_Width = 0.0000 hackingData.s_WallData[39].f_Height = 0.0000 BREAK CASE 5 // HEADER - Level: 6 hackingData.s_SnakeData.f_StartX = 0.7900 hackingData.s_SnakeData.f_StartY = 0.1780 hackingData.s_SnakeData.f_CenterX = hackingData.s_SnakeData.f_StartX hackingData.s_SnakeData.f_CenterY = hackingData.s_SnakeData.f_StartY hackingData.s_SnakeData.i_StartDirection = 1 hackingData.s_SnakeData.i_Direction = hackingData.s_SnakeData.i_StartDirection hackingData.s_SnakeData.f_SpeedX = 0.0880 hackingData.s_SnakeData.f_SpeedY = hackingData.s_SnakeData.f_SpeedX * hackingData.f_CurrentAspectRatio hackingData.s_SnakeData.f_EndX = 0.1710 hackingData.s_SnakeData.f_EndY = 0.2440 hackingData.s_SnakeData.f_EndWidth = 0.0260 hackingData.s_SnakeData.f_EndHeight = 0.0700 // WALLS hackingData.s_WallData[0].f_CenterX = 0.1573 hackingData.s_WallData[0].f_CenterY = 0.5000 hackingData.s_WallData[0].f_Width = 0.0070 hackingData.s_WallData[0].f_Height = 0.6960 hackingData.s_WallData[1].f_CenterX = 0.8423 hackingData.s_WallData[1].f_CenterY = 0.5000 hackingData.s_WallData[1].f_Width = 0.0070 hackingData.s_WallData[1].f_Height = 0.6960 hackingData.s_WallData[2].f_CenterX = 0.5003 hackingData.s_WallData[2].f_CenterY = 0.1480 hackingData.s_WallData[2].f_Width = 0.6905 hackingData.s_WallData[2].f_Height = 0.0100 hackingData.s_WallData[3].f_CenterX = 0.5005 hackingData.s_WallData[3].f_CenterY = 0.8530 hackingData.s_WallData[3].f_Width = 0.6910 hackingData.s_WallData[3].f_Height = 0.0100 hackingData.s_WallData[4].f_CenterX = 0.7900 hackingData.s_WallData[4].f_CenterY = 0.1690 hackingData.s_WallData[4].f_Width = 0.0410 hackingData.s_WallData[4].f_Height = 0.0530 hackingData.s_WallData[5].f_CenterX = 0.7227 hackingData.s_WallData[5].f_CenterY = 0.3900 hackingData.s_WallData[5].f_Width = 0.0500 hackingData.s_WallData[5].f_Height = 0.4769 hackingData.s_WallData[6].f_CenterX = 0.8089 hackingData.s_WallData[6].f_CenterY = 0.3596 hackingData.s_WallData[6].f_Width = 0.0587 hackingData.s_WallData[6].f_Height = 0.0819 hackingData.s_WallData[7].f_CenterX = 0.7713 hackingData.s_WallData[7].f_CenterY = 0.5076 hackingData.s_WallData[7].f_Width = 0.0510 hackingData.s_WallData[7].f_Height = 0.1008 hackingData.s_WallData[8].f_CenterX = 0.6870 hackingData.s_WallData[8].f_CenterY = 0.7990 hackingData.s_WallData[8].f_Width = 0.3008 hackingData.s_WallData[8].f_Height = 0.1046 hackingData.s_WallData[9].f_CenterX = 0.7007 hackingData.s_WallData[9].f_CenterY = 0.7211 hackingData.s_WallData[9].f_Width = 0.1060 hackingData.s_WallData[9].f_Height = 0.0540 hackingData.s_WallData[10].f_CenterX = 0.5632 hackingData.s_WallData[10].f_CenterY = 0.6991 hackingData.s_WallData[10].f_Width = 0.0539 hackingData.s_WallData[10].f_Height = 0.0940 hackingData.s_WallData[11].f_CenterX = 0.4796 hackingData.s_WallData[11].f_CenterY = 0.6816 hackingData.s_WallData[11].f_Width = 0.1175 hackingData.s_WallData[11].f_Height = 0.0587 hackingData.s_WallData[12].f_CenterX = 0.5470 hackingData.s_WallData[12].f_CenterY = 0.6250 hackingData.s_WallData[12].f_Width = 0.0442 hackingData.s_WallData[12].f_Height = 0.0600 hackingData.s_WallData[13].f_CenterX = 0.5885 hackingData.s_WallData[13].f_CenterY = 0.5550 hackingData.s_WallData[13].f_Width = 0.1268 hackingData.s_WallData[13].f_Height = 0.0837 hackingData.s_WallData[14].f_CenterX = 0.6261 hackingData.s_WallData[14].f_CenterY = 0.4294 hackingData.s_WallData[14].f_Width = 0.0519 hackingData.s_WallData[14].f_Height = 0.1730 hackingData.s_WallData[15].f_CenterX = 0.6472 hackingData.s_WallData[15].f_CenterY = 0.2786 hackingData.s_WallData[15].f_Width = 0.0370 hackingData.s_WallData[15].f_Height = 0.1251 hackingData.s_WallData[16].f_CenterX = 0.5127 hackingData.s_WallData[16].f_CenterY = 0.3840 hackingData.s_WallData[16].f_Width = 0.1757 hackingData.s_WallData[16].f_Height = 0.0820 hackingData.s_WallData[17].f_CenterX = 0.4650 hackingData.s_WallData[17].f_CenterY = 0.3118 hackingData.s_WallData[17].f_Width = 0.0240 hackingData.s_WallData[17].f_Height = 0.0629 hackingData.s_WallData[18].f_CenterX = 0.5500 hackingData.s_WallData[18].f_CenterY = 0.2257 hackingData.s_WallData[18].f_Width = 0.0791 hackingData.s_WallData[18].f_Height = 0.1228 hackingData.s_WallData[19].f_CenterX = 0.4637 hackingData.s_WallData[19].f_CenterY = 0.1888 hackingData.s_WallData[19].f_Width = 0.0211 hackingData.s_WallData[19].f_Height = 0.0712 hackingData.s_WallData[20].f_CenterX = 0.3855 hackingData.s_WallData[20].f_CenterY = 0.3728 hackingData.s_WallData[20].f_Width = 0.0215 hackingData.s_WallData[20].f_Height = 0.0702 hackingData.s_WallData[21].f_CenterX = 0.3719 hackingData.s_WallData[21].f_CenterY = 0.2010 hackingData.s_WallData[21].f_Width = 0.0425 hackingData.s_WallData[21].f_Height = 0.0995 hackingData.s_WallData[22].f_CenterX = 0.3269 hackingData.s_WallData[22].f_CenterY = 0.3440 hackingData.s_WallData[22].f_Width = 0.0519 hackingData.s_WallData[22].f_Height = 0.3836 hackingData.s_WallData[23].f_CenterX = 0.3505 hackingData.s_WallData[23].f_CenterY = 0.6085 hackingData.s_WallData[23].f_Width = 0.0510 hackingData.s_WallData[23].f_Height = 0.3014 hackingData.s_WallData[24].f_CenterX = 0.4005 hackingData.s_WallData[24].f_CenterY = 0.5702 hackingData.s_WallData[24].f_Width = 0.0510 hackingData.s_WallData[24].f_Height = 0.0546 hackingData.s_WallData[25].f_CenterX = 0.4748 hackingData.s_WallData[25].f_CenterY = 0.5469 hackingData.s_WallData[25].f_Width = 0.0216 hackingData.s_WallData[25].f_Height = 0.1392 hackingData.s_WallData[26].f_CenterX = 0.2159 hackingData.s_WallData[26].f_CenterY = 0.8031 hackingData.s_WallData[26].f_Width = 0.1140 hackingData.s_WallData[26].f_Height = 0.0896 hackingData.s_WallData[27].f_CenterX = 0.1826 hackingData.s_WallData[27].f_CenterY = 0.6674 hackingData.s_WallData[27].f_Width = 0.0430 hackingData.s_WallData[27].f_Height = 0.1915 hackingData.s_WallData[28].f_CenterX = 0.2088 hackingData.s_WallData[28].f_CenterY = 0.5968 hackingData.s_WallData[28].f_Width = 0.0140 hackingData.s_WallData[28].f_Height = 0.0503 hackingData.s_WallData[29].f_CenterX = 0.2506 hackingData.s_WallData[29].f_CenterY = 0.6819 hackingData.s_WallData[29].f_Width = 0.0216 hackingData.s_WallData[29].f_Height = 0.0688 hackingData.s_WallData[30].f_CenterX = 0.3119 hackingData.s_WallData[30].f_CenterY = 0.6508 hackingData.s_WallData[30].f_Width = 0.0286 hackingData.s_WallData[30].f_Height = 0.0921 hackingData.s_WallData[31].f_CenterX = 0.2752 hackingData.s_WallData[31].f_CenterY = 0.5175 hackingData.s_WallData[31].f_Width = 0.0497 hackingData.s_WallData[31].f_Height = 0.0920 hackingData.s_WallData[32].f_CenterX = 0.1871 hackingData.s_WallData[32].f_CenterY = 0.4220 hackingData.s_WallData[32].f_Width = 0.0526 hackingData.s_WallData[32].f_Height = 0.1849 hackingData.s_WallData[33].f_CenterX = 0.2287 hackingData.s_WallData[33].f_CenterY = 0.3770 hackingData.s_WallData[33].f_Width = 0.0368 hackingData.s_WallData[33].f_Height = 0.0940 hackingData.s_WallData[34].f_CenterX = 0.2924 hackingData.s_WallData[34].f_CenterY = 0.2899 hackingData.s_WallData[34].f_Width = 0.0180 hackingData.s_WallData[34].f_Height = 0.0752 hackingData.s_WallData[35].f_CenterX = 0.2360 hackingData.s_WallData[35].f_CenterY = 0.3090 hackingData.s_WallData[35].f_Width = 0.0222 hackingData.s_WallData[35].f_Height = 0.0562 hackingData.s_WallData[36].f_CenterX = 0.2432 hackingData.s_WallData[36].f_CenterY = 0.1858 hackingData.s_WallData[36].f_Width = 0.0221 hackingData.s_WallData[36].f_Height = 0.0667 hackingData.s_WallData[37].f_CenterX = 0.8108 hackingData.s_WallData[37].f_CenterY = 0.6542 hackingData.s_WallData[37].f_Width = 0.0541 hackingData.s_WallData[37].f_Height = 0.0815 hackingData.s_WallData[38].f_CenterX = 0.6899 hackingData.s_WallData[38].f_CenterY = 0.6045 hackingData.s_WallData[38].f_Width = 0.0194 hackingData.s_WallData[38].f_Height = 0.0493 hackingData.s_WallData[39].f_CenterX = 0.4123 hackingData.s_WallData[39].f_CenterY = 0.7818 hackingData.s_WallData[39].f_Width = 0.1749 hackingData.s_WallData[39].f_Height = 0.0504 BREAK ENDSWITCH CPRINTLN(DEBUG_COLIN, "Circuit Hacking: INITIALISE_CIRCUIT_MINIGAME_LEVEL() - CHECK 1 - Loading Level: ", i_Level) ENDPROC /// HAS_PLAYER_BEAT_CIRCUIT_HACKING (pass in your own hacking data struct) /// NOTES: checks if a player has beaten the circuit hacking minigame. /// PURPOSE: /// Checks if a player has beaten the new hacking mini game /// PARAMS: /// &hackingData - STRUCT: hacking data /// b_AndForceQuit - BOOL: Pass TRUE to terminate hacking on success /// RETURNS: /// BOOL: TRUE on player beating new hacking FUNC BOOL HAS_PLAYER_BEAT_CIRCUIT_HACKING(S_HACKING_DATA &hackingData, BOOL b_AndForceQuit = FALSE) IF IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_MINIGAME_SOLVED) IF b_AndForceQuit FORCE_QUIT_PASS_HACKING_MINIGAME(hackingData) ENDIF RETURN TRUE ENDIF RETURN FALSE ENDFUNC /// HAS_PLAYER_FAILED_CIRCUIT_HACKING (pass in your own hacking data struct) /// NOTES: checks if a player has failed the circuit hacking minigame /// PURPOSE: /// Checks if a player has beaten the new hacking mini game /// PARAMS: /// &hackingData - STRUCT: Hacking data struct /// b_AndForceQuit - BOOL: pass TRUE to terminate hacking on success /// RETURNS: /// BOOL: TRUE on player beating new hacking FUNC BOOL HAS_PLAYER_FAILED_CIRCUIT_HACKING(S_HACKING_DATA &hackingData, BOOL b_AndForceQuit = FALSE) IF IS_BIT_SET(hackingData.bsHacking, BS_MP_HACK_FAIL) //IF hackingData.b_MP_Hack_fail IF b_AndForceQuit FORCE_QUIT_FAIL_HACKING_MINIGAME(hackingData) ENDIF RETURN TRUE ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Checks if the circuit hacking minigame is currently running /// PARAMS: /// &hackingData - STRUCT: Hacking data struct /// RETURNS: /// BOOL: TRUE if the minigame is currently running FUNC BOOL IS_CIRCUIT_HACKING_MINIGAME_RUNNING(S_HACKING_DATA &hackingData) IF IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_GAME_RUNNING) RETURN TRUE ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Lets the Hacking Ped know when its safe to use TASK_USE_MOBILE_PHONE without the prop phone being cleaned up /// PARAMS: /// &hackingData - STRUCT: Hacking data struct /// RETURNS: /// BOOL: TRUE if the minigame has finished the launching state FUNC BOOL IS_SAFE_TO_RUN_FAKE_PHONE_TASK(S_HACKING_DATA &hackingData) IF IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_SAFE_TO_USE_PHONE) RETURN TRUE ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Resets the bit used in the MP Controller to increment a fail stat /// PARAMS: /// &hackingData - STRUCT: Hacking data struct PROC CHECK_SHOULD_RESET_LEVEL_FAIL_BIT(S_HACKING_DATA &hackingData) IF IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_LEVEL_FAILED) CPRINTLN(DEBUG_COLIN, "Circuit Hacking: CHECK_SHOULD_RESET_LEVEL_FAIL_BIT() - CHECK 1 - Clearing BIT_SET_CIRCUIT_LEVEL_FAILED Bit") CLEAR_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_LEVEL_FAILED) ENDIF ENDPROC /// PURPOSE: /// Quits the game by setting the game to be solved and then cleans up all assets /// PARAMS: /// &hackingData - STRUCT: Hacking data struct /// b_UseDifficultLevels - BOOL: Determines the use of the final three levels (uses first three levels if FALSE) /// b_ReturnPlayerControl - BOOL: Enable player controls on cleanup PROC CLEANUP_AND_QUIT_CIRCUIT_HACKING_MINIGAME(S_HACKING_DATA &hackingData, BOOL b_UseDifficultLevels, BOOL b_ReturnPlayerControl = TRUE) CPRINTLN(DEBUG_COLIN, "Circuit Hacking: CLEANUP_AND_QUIT_CIRCUIT_HACKING_MINIGAME() - CHECK 1 - Circuit Hacking Minigame Cleanup and Quit Called by [", GET_THIS_SCRIPT_NAME(), "]") // RE-ENABLE PLAYER CONTROL IF b_ReturnPlayerControl AND IS_SKYSWOOP_AT_GROUND() AND NOT IS_NEW_LOAD_SCENE_ACTIVE() IF NETWORK_IS_GAME_IN_PROGRESS() NET_SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) ELSE SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) ENDIF ENDIF #IF IS_NEXTGEN_BUILD // DISABLE MULTIPLE DISPLAYS/BLINDERS SET_MULTIHEAD_SAFE(FALSE, TRUE) CPRINTLN(DEBUG_COLIN, "Circuit Hacking: CLEANUP_AND_QUIT_CIRCUIT_HACKING_MINIGAME() - CHECK 2 - Disabled SET_MULTIHEAD_SAFE") #ENDIF // RE-ENABLE THE INTERACTION MENU ENABLE_INTERACTION_MENU() // UNLOAD GENERAL MINI GAME SPRITE DICT SET_STREAMED_TEXTURE_DICT_AS_NO_LONGER_NEEDED("MPCircuitHack") // UNLOAD TUTORIAL OR FINALE LEVEL SPRITES IF b_UseDifficultLevels SET_STREAMED_TEXTURE_DICT_AS_NO_LONGER_NEEDED("MPCircuitHack3") ELSE SET_STREAMED_TEXTURE_DICT_AS_NO_LONGER_NEEDED("MPCircuitHack2") ENDIF // RELEASE AUDIO BANK RELEASE_NAMED_SCRIPT_AUDIO_BANK("DLC_MPHEIST/HEIST_HACK_SNAKE") IF HAS_THIS_ADDITIONAL_TEXT_LOADED("HACK", MINIGAME_TEXT_SLOT) IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("CIRC_HACK_1") #IF IS_NEXTGEN_BUILD OR (IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL) AND (IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("CIRC_HACK_1_KM") OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("CIRC_HACK_3_KM"))) #ENDIF CLEAR_HELP() ENDIF ENDIF // UNLOAD MINIGAME TEXT CLEAR_ADDITIONAL_TEXT(MINIGAME_TEXT_SLOT, TRUE) // UNLOAD THE SCALEFORM MOVIE CLEANUP_CIRCUIT_HACKING_SCALEFORM() // STOP AUDIO SCENE STOP_AUDIO_SCENE("DLC_HEISTS_SNAKE_HACKING_SCENE") // STOP BACKGROUND AUDIO STOP_SOUND(hackingData.i_node) // STOP TRAIL LOOP STOP_SOUND(hackingData.i_hacking_sound) // RESET PHONE LAUNCH VARIABLES RESTART_TIMER_AT(hackingData.t_PhoneLaunchTimer, 0.0) PAUSE_TIMER(hackingData.t_PhoneLaunchTimer) hackingData.e_IntroLaunchState = LIS_INITIALISE // RESET CURRENT GAME STATE hackingData.e_CircuitHackingMinigameState = CHMS_INITIALISE // HANDLES ALL THE GAME CLEANUP AND SETS THE EXIT BIT CIRCUIT_MINIGAME_RESET(hackingData, FALSE, FALSE, TRUE, TRUE) // RESET SCALEFORM INDEX - MAKES SURE ALL REFERENCES ARE CLEANED UP sfHacking = NULL // ENABLE PHONE INSTRUCTIONS AGAIN g_FMMC_STRUCT.bDisablePhoneInstructions = FALSE // CLEAR THE INTERNET APP BLOCKING MP_FORCE_TERMINATE_INTERNET_CLEAR() CPRINTLN(DEBUG_COLIN, "Circuit Hacking: CLEANUP_AND_QUIT_CIRCUIT_HACKING_MINIGAME() - CHECK 3 - Calling MP_FORCE_TERMINATE_INTERNET_CLEAR()") // ENABLE THE RANK AND AWARD NOTIFICATIONS //GlobalplayerBD_FM[NATIVE_TO_INT(PLAYER_ID())].g_bIsHacking = FALSE CLEAR_BIT(GlobalplayerBD_FM[NATIVE_TO_INT(PLAYER_ID())].boolReplacementBS,GlobalPlayerBroadcastDataFM_BS_g_bIsHacking) CPRINTLN(DEBUG_COLIN, "Circuit Hacking: CLEANUP_AND_QUIT_CIRCUIT_HACKING_MINIGAME() - CHECK 4 - Enable Rank and Award Notifications") // CLEAR THE MINIGAME RUNNING BIT IF IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_GAME_RUNNING) CLEAR_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_GAME_RUNNING) CPRINTLN(DEBUG_COLIN, "Circuit Hacking: CLEANUP_AND_QUIT_CIRCUIT_HACKING_MINIGAME() - CHECK 5 - Clearing BIT_SET_CIRCUIT_GAME_RUNNING Bit") ENDIF ENDPROC /// PURPOSE: /// Check to see if two rectangles overlap with each other /// PARAMS: /// f_CentreX1 - FLOAT: X coord center point of rectangle 1 /// f_CentreY1 - FLOAT: Y coord center point of rectangle 1 /// f_Width1 - FLOAT: Width of rectangle 1 /// f_Height1 - FLOAT: Height of rectangle 1 /// f_CentreX - FLOAT: X coord center point of rectangle 2 /// f_CentreY2 - FLOAT: Y coord center point of rectangle 2 /// f_Width2 - FLOAT: Width of rectangle 1 /// f_Height2 - FLOAT: Width of rectangle 1 /// RETURNS: /// BOOL: TRUE if the two rectangles overlap FUNC BOOL DO_RECTANGLES_OVERLAP(FLOAT f_CentreX1, FLOAT f_CentreY1, FLOAT f_Width1, FLOAT f_Height1, FLOAT f_CentreX2, FLOAT f_CentreY2, FLOAT f_Width2, FLOAT f_Height2) IF (f_CentreX1 + (f_Width1 * 0.5)) < (f_CentreX2 - (f_Width2 * 0.5)) RETURN FALSE ENDIF IF (f_CentreX2 + (f_Width2 * 0.5)) < (f_CentreX1 - (f_Width1 * 0.5)) RETURN FALSE ENDIF IF (f_CentreY1 + (f_Height1 * 0.5)) < (f_CentreY2 - (f_Height2 * 0.5)) RETURN FALSE ENDIF IF (f_CentreY2 + (f_Height2 * 0.5)) < (f_CentreY1 - (f_Height1 * 0.5)) RETURN FALSE ENDIF RETURN TRUE ENDFUNC /// PURPOSE: /// Main logic update loop. Handles calculations and collision checks - (excludes tail collision checks) /// PARAMS: /// &hackingData - STRUCT: Hacking data struct PROC UPDATE_GAME_LOGIC_CIRCUIT_HACKING_MINIGAME(S_HACKING_DATA &hackingData, BOOL bHeists2 = FALSE) INT i_Counter // START SNAKE MOVING IF (IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT) #IF IS_NEXTGEN_BUILD OR (IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL) AND IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_ACCEPT)) #ENDIF ) AND NOT IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_MOVE_HEAD) SET_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_MOVE_HEAD) // STOP START PORT LIGHTS FLASHING AND START END PORTS IF NOT IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_PULSE_END_PORT_LIGHTS) SET_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_PULSE_END_PORT_LIGHTS) ENDIF // PLAY START AUDIO PLAY_SOUND_FRONTEND(-1, "Start", "DLC_HEIST_HACKING_SNAKE_SOUNDS") // START TRAIL LOOP AUDIO PLAY_SOUND_FRONTEND(hackingData.i_hacking_sound, "Trail_Custom", "DLC_HEIST_HACKING_SNAKE_SOUNDS") // HANDLE PAD VIBRATIONS DO_CIRCUIT_HACKING_CONTROLLER_VIBRATIONS(1, 150) CPRINTLN(DEBUG_COLIN, "Circuit Hacking: UPDATE_CIRCUIT_GAME_LOGIC() - CHECK 1 - Start: Player pressed button to start moving") ENDIF // SET MOVING SOUND INTENSITY IF NOT HAS_SOUND_FINISHED(hackingData.i_hacking_sound) SWITCH hackingData.i_CircuitCurrentLevel CASE 0 SET_VARIABLE_ON_SOUND(hackingData.i_hacking_sound, "SnakeSpeed", 0.16666666666666666666666666666667) BREAK CASE 1 SET_VARIABLE_ON_SOUND(hackingData.i_hacking_sound, "SnakeSpeed", 0.33333333333333333333333333333333) BREAK CASE 2 SET_VARIABLE_ON_SOUND(hackingData.i_hacking_sound, "SnakeSpeed", 0.5) BREAK CASE 3 SET_VARIABLE_ON_SOUND(hackingData.i_hacking_sound, "SnakeSpeed", 0.66666666666666666666666666666667) BREAK CASE 4 SET_VARIABLE_ON_SOUND(hackingData.i_hacking_sound, "SnakeSpeed", 0.83333333333333333333333333333333) BREAK CASE 5 SET_VARIABLE_ON_SOUND(hackingData.i_hacking_sound, "SnakeSpeed", 1.0) BREAK ENDSWITCH ENDIF // MOVING LOGIC IF IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_MOVE_HEAD) INT i_prevSnakeDirection = hackingData.s_SnakeData.i_Direction // ANALOG STICK VALUES FLOAT f_LeftStickX, f_LeftStickY f_LeftStickX = GET_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_SCRIPT_LEFT_AXIS_X) f_LeftStickY = GET_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_SCRIPT_LEFT_AXIS_Y) // CHECK FOR DIRECTION CHANGES COMING FROM THE PLAYER // UP IF ((f_LeftStickY < 0 AND ABSF(f_LeftStickY) > 0.80) #IF IS_NEXTGEN_BUILD OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_UP) #ENDIF #IF NOT IS_NEXTGEN_BUILD OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_UP) #ENDIF ) AND hackingData.s_SnakeData.i_Direction != 1 AND NOT IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_DISABLE_VERTICAL_TURNING) IF NOT IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_CHANGE_DIRECTION) SET_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_CHANGE_DIRECTION) ENDIF hackingData.s_SnakeData.i_NewSnakeDirection = 0 // DOWN ELIF ((f_LeftStickY > 0 AND ABSF(f_LeftStickY) > 0.80) #IF IS_NEXTGEN_BUILD OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_DOWN) #ENDIF #IF NOT IS_NEXTGEN_BUILD OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_DOWN) #ENDIF ) AND hackingData.s_SnakeData.i_Direction != 0 AND NOT IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_DISABLE_VERTICAL_TURNING) IF NOT IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_CHANGE_DIRECTION) SET_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_CHANGE_DIRECTION) ENDIF hackingData.s_SnakeData.i_NewSnakeDirection = 1 // LEFT ELIF ((f_LeftStickX < 0 AND ABSF(f_LeftStickX) > 0.80) #IF IS_NEXTGEN_BUILD OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_LEFT) #ENDIF #IF NOT IS_NEXTGEN_BUILD OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_LEFT) #ENDIF ) AND hackingData.s_SnakeData.i_Direction != 3 IF NOT IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_CHANGE_DIRECTION) SET_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_CHANGE_DIRECTION) ENDIF hackingData.s_SnakeData.i_NewSnakeDirection = 2 // RIGHT ELIF ((f_LeftStickX > 0 AND ABSF(f_LeftStickX) > 0.80) #IF IS_NEXTGEN_BUILD OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_RIGHT) #ENDIF #IF NOT IS_NEXTGEN_BUILD OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_RIGHT) #ENDIF ) AND hackingData.s_SnakeData.i_Direction != 2 IF NOT IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_CHANGE_DIRECTION) SET_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_CHANGE_DIRECTION) ENDIF hackingData.s_SnakeData.i_NewSnakeDirection = 3 ENDIF // HANDLE TURN DELAY SO HEAD DOESN'T TURN BACK ON SELF IF IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_CHANGE_DIRECTION) AND hackingData.s_SnakeData.i_TailIndex > 0 FLOAT f_TailCenterX, f_TailCenterY FLOAT_COMPRESSION_UNPACK(hackingData.s_SnakeData.f_Tail[hackingData.s_SnakeData.i_TailIndex - 1], f_TailCenterX, f_TailCenterY, hackingData.s_SnakeData.i_CompressPrecisionValue) SWITCH hackingData.s_SnakeData.i_NewSnakeDirection CASE 0 CASE 1 // TURNING VERTICAL IF ABSF(hackingData.s_SnakeData.f_CenterX - f_TailCenterX) > (hackingData.s_SnakeData.f_Width * hackingData.f_CurrentAspectRatio) * 0.3 CLEAR_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_CHANGE_DIRECTION) hackingData.s_SnakeData.i_Direction = hackingData.s_SnakeData.i_NewSnakeDirection // TURN AUDIO PLAY_SOUND_FRONTEND(-1, "Turn", "DLC_HEIST_HACKING_SNAKE_SOUNDS") ENDIF BREAK CASE 2 CASE 3 // TURNING HORIZONTAL IF ABSF(hackingData.s_SnakeData.f_CenterY - f_TailCenterY) > (hackingData.s_SnakeData.f_Width * hackingData.f_CurrentAspectRatio) * (0.3 * hackingData.f_CurrentAspectRatio) CLEAR_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_CHANGE_DIRECTION) hackingData.s_SnakeData.i_Direction = hackingData.s_SnakeData.i_NewSnakeDirection // TURN AUDIO PLAY_SOUND_FRONTEND(-1, "Turn", "DLC_HEIST_HACKING_SNAKE_SOUNDS") ENDIF BREAK ENDSWITCH ENDIF // STORE INITIAL TAIL INDEX IF hackingData.s_SnakeData.i_TailIndex = 0 hackingData.s_SnakeData.f_Tail[hackingData.s_SnakeData.i_TailIndex] = FLOAT_COMPRESSION_PACK(hackingData.s_SnakeData.f_CenterX, hackingData.s_SnakeData.f_CenterY, hackingData.s_SnakeData.i_CompressPrecisionValue) hackingData.s_SnakeData.i_TailIndex++ ENDIF // IF WE CHANGED DIRECTION THIS FRAME THEN ADD THE CURRENT HEAD POSITION AS A NODE IN THE SNAKE TAIL ARRAY IF i_prevSnakeDirection != hackingData.s_SnakeData.i_Direction // THE SNAKE ARRAY IS FULL, WE NEED TO DELETE THE FIRST ELEMENT OF THE ARRAY AND PUSH EVERYTHING BACK IF hackingData.s_SnakeData.i_TailIndex >= NUM_MAX_TAIL_RECTS FOR i_Counter = 0 TO (NUM_MAX_TAIL_RECTS - 1) IF i_Counter = NUM_MAX_TAIL_RECTS - 1 hackingData.s_SnakeData.f_Tail[i_Counter] = FLOAT_COMPRESSION_PACK(hackingData.s_SnakeData.f_CenterX, hackingData.s_SnakeData.f_CenterY, hackingData.s_SnakeData.i_CompressPrecisionValue) ELSE FLOAT f_TailCenterX = 0, f_TailCenterY = 0 FLOAT_COMPRESSION_UNPACK(hackingData.s_SnakeData.f_Tail[i_Counter + 1], f_TailCenterX, f_TailCenterY, hackingData.s_SnakeData.i_CompressPrecisionValue) hackingData.s_SnakeData.f_Tail[i_Counter] = FLOAT_COMPRESSION_PACK(f_TailCenterX, f_TailCenterY, hackingData.s_SnakeData.i_CompressPrecisionValue) ENDIF ENDFOR ELSE // WE STILL HAVE SPACE IN THE SNAKE ARRAY, SO JUST ASSIGN THE CURRENT HEAD POSITION TO THE NEXT EMPTY ELEMENT hackingData.s_SnakeData.f_Tail[hackingData.s_SnakeData.i_TailIndex] = FLOAT_COMPRESSION_PACK(hackingData.s_SnakeData.f_CenterX, hackingData.s_SnakeData.f_CenterY, hackingData.s_SnakeData.i_CompressPrecisionValue) hackingData.s_SnakeData.i_TailIndex++ ENDIF ENDIF // UPDATE THE SNAKE HEAD DIRECTION, SPEED & SPRITE ROATAION SWITCH hackingData.s_SnakeData.i_Direction CASE 0 // UP hackingData.s_SnakeData.f_CenterY = hackingData.s_SnakeData.f_CenterY -@ hackingData.s_SnakeData.f_SpeedY hackingData.s_SnakeData.f_HeadRotation = 0.0 BREAK CASE 1 // DOWN hackingData.s_SnakeData.f_CenterY = hackingData.s_SnakeData.f_CenterY +@ hackingData.s_SnakeData.f_SpeedY hackingData.s_SnakeData.f_HeadRotation = 180.0 BREAK CASE 2 // LEFT hackingData.s_SnakeData.f_CenterX = hackingData.s_SnakeData.f_CenterX -@ hackingData.s_SnakeData.f_SpeedX hackingData.s_SnakeData.f_HeadRotation = 270.0 BREAK CASE 3 // RIGHT hackingData.s_SnakeData.f_CenterX = hackingData.s_SnakeData.f_CenterX +@ hackingData.s_SnakeData.f_SpeedX hackingData.s_SnakeData.f_HeadRotation = 90.0 BREAK ENDSWITCH ENDIF // WIN CHECK LOGIC - COLLIDED WITH EXIT PORT IF (NOT IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_LEVEL_PASSED) AND IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_MOVE_HEAD) AND DO_RECTANGLES_OVERLAP((0.5 - ((0.5 - hackingData.s_SnakeData.f_CenterX) * hackingData.f_AspectRatioModifier)), hackingData.s_SnakeData.f_CenterY, (hackingData.s_SnakeData.f_Width * hackingData.f_AspectRatioModifier) * 0.52, hackingData.s_SnakeData.f_Height * 0.52, (0.5 - ((0.5 - hackingData.s_SnakeData.f_EndX) * hackingData.f_AspectRatioModifier)), hackingData.s_SnakeData.f_EndY, hackingData.s_SnakeData.f_EndWidth * hackingData.f_AspectRatioModifier, hackingData.s_SnakeData.f_EndHeight)) // SET LEVEL PASSED SET_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_LEVEL_PASSED) // STOP SNAKE MOVING IF IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_MOVE_HEAD) CLEAR_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_MOVE_HEAD) ENDIF // REMOVE SNAKE HEAD ON WIN IF NOT IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_REMOVE_HEAD) SET_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_REMOVE_HEAD) ENDIF // HANDLE PAD VIBRATIONS DO_CIRCUIT_HACKING_CONTROLLER_VIBRATIONS(500, 50) // SET PASS TIMER hackingData.i_CircuitPassedLevelTimer = GET_GAME_TIMER() // PLAY GOAL AUDIO PLAY_SOUND_FRONTEND(-1, "Goal", "DLC_HEIST_HACKING_SNAKE_SOUNDS") // STOP TRAIL LOOP AUDIO STOP_SOUND(hackingData.i_hacking_sound) IF NOT bHeists2 // MOVE TO PASS STATE hackingData.e_CircuitHackingMinigameState = CHMS_PASS CPRINTLN(DEBUG_COLIN, "Circuit Hacking: UPDATE_CIRCUIT_GAME_LOGIC() - CHECK 2 - Win: Collided against End Point") ELSE // JUMP TO FINAL COMPLETION SPRITES CPRINTLN(DEBUG_COLIN, "Circuit Hacking: UPDATE_CIRCUIT_GAME_LOGIC() - CHECK 3 - Skipping to Final Screen due to Heists 2") IF IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_MINIGAME_SOLVED) CPRINTLN(DEBUG_COLIN, "Circuit Hacking: UPDATE_CIRCUIT_GAME_LOGIC() - CHECK 4 - Clearing MINIGAME_SOLVED Bit") CLEAR_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_MINIGAME_SOLVED) ENDIF hackingData.i_WinScreenDelay = GET_GAME_TIMER() // DRAW FINALE CONNECTED CIRCUIT SPRITE hackingData.e_CircuitHackingMinigameState = CHMS_SYSTEM_HACKED SET_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_DRAW_SYS_UNLOCKED) ENDIF ENDIF // STOP WALL COLLISION UNTIL HEAD HAS LEFT ENTRANCE PORT COLLISION BOX IF NOT IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_ENTRY_COLLISION) IF NOT DO_RECTANGLES_OVERLAP((0.5 - ((0.5 - hackingData.s_SnakeData.f_CenterX) * hackingData.f_AspectRatioModifier)), hackingData.s_SnakeData.f_CenterY, (hackingData.s_SnakeData.f_Width * hackingData.f_AspectRatioModifier) * 0.52, hackingData.s_SnakeData.f_Height * 0.52, (0.5 - ((0.5 - hackingData.s_WallData[4].f_CenterX) * hackingData.f_AspectRatioModifier)), hackingData.s_WallData[4].f_CenterY, hackingData.s_WallData[4].f_Width * hackingData.f_AspectRatioModifier, hackingData.s_WallData[4].f_Height) // SET COLLISION ACTIVE SET_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_ENTRY_COLLISION) // ALLOW PLAYER TO TURN UP AND DOWN AGAIN IF IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_DISABLE_VERTICAL_TURNING) CLEAR_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_DISABLE_VERTICAL_TURNING) ENDIF ENDIF ENDIF // WALL COLLISION FAIL CHECKS LOGIC IF IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_ENTRY_COLLISION) FOR i_Counter = 0 TO (NUM_MAX_WALLS - 1) IF DO_RECTANGLES_OVERLAP((0.5 - ((0.5 - hackingData.s_SnakeData.f_CenterX) * hackingData.f_AspectRatioModifier)), hackingData.s_SnakeData.f_CenterY, (hackingData.s_SnakeData.f_Width * hackingData.f_AspectRatioModifier) * 0.52, hackingData.s_SnakeData.f_Height * 0.52, (0.5 - ((0.5 - hackingData.s_WallData[i_Counter].f_CenterX) * hackingData.f_AspectRatioModifier)), hackingData.s_WallData[i_Counter].f_CenterY, hackingData.s_WallData[i_Counter].f_Width * hackingData.f_AspectRatioModifier, hackingData.s_WallData[i_Counter].f_Height) // STOP SNAKE MOVING IF IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_MOVE_HEAD) CLEAR_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_MOVE_HEAD) ENDIF // STOP TRAIL LOOP AUDIO STOP_SOUND(hackingData.i_hacking_sound) // PLAY CRASH AUDIO PLAY_SOUND_FRONTEND(-1, "Crash", "DLC_HEIST_HACKING_SNAKE_SOUNDS") // SET PLAY SNAKE DEAD ANIM IF NOT IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_KILL_SCREEN) SET_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_KILL_SCREEN) ENDIF // HANDLE PAD VIBRATIONS DO_CIRCUIT_HACKING_CONTROLLER_VIBRATIONS(1000, 100) // SET PASS TIMER hackingData.i_CircuitPassedLevelTimer = GET_GAME_TIMER() // MOVE TO FAIL STATE hackingData.e_CircuitHackingMinigameState = CHMS_FAIL CPRINTLN(DEBUG_COLIN, "Circuit Hacking: UPDATE_CIRCUIT_GAME_LOGIC() - CHECK 3 - Fail: Collided against wall: ", i_Counter) ENDIF ENDFOR ENDIF // "TOO HARD" CHECK FOR THE THREE FINALE LEVELS IF hackingData.i_CircuitCurrentLevel >= 3 IF hackingData.i_lives >= 5 AND hackingData.s_SnakeData.f_SpeedX <> (0.082 * hackingData.f_AspectRatioModifier) // MAKE SNAKE MOVE SLIGHTLY SLOWER hackingData.s_SnakeData.f_SpeedX = (0.082 * hackingData.f_AspectRatioModifier) hackingData.s_SnakeData.f_SpeedY = hackingData.s_SnakeData.f_SpeedX * hackingData.f_CurrentAspectRatio CPRINTLN(DEBUG_COLIN, "Circuit Hacking: UPDATE_CIRCUIT_GAME_LOGIC() - CHECK 4 - Player has Died >= 5 Times: Reducing Snake Movement Speed") ENDIF ENDIF ENDPROC /// PURPOSE: /// Main draw function loop. HAndles drawing all sprites /// PARAMS: /// &hackingData - STRUCT: Hacking data struct /// b_DrawTail - BOOL: Pass TRUE to draw the tail /// b_DrawWallCollisions - BOOL: Pass TRUE to draw white boxes where the collision is setup - DEBUG ONLY PROC UPDATE_GAME_DISPLAY_CIRCUIT_HACKING_MINIGAME(S_HACKING_DATA &hackingData, BOOL b_UseDifficultLevels = FALSE, BOOL b_DrawTail = TRUE, BOOL bHeist2 = FALSE #IF IS_DEBUG_BUILD, BOOL b_DrawWallCollisions = FALSE #ENDIF ) INT i_Counter // DRAW BLACK RECT BACKGROUND - COVERS WHERE BACKGROUND SPRITE STOPS DRAW_RECT_FROM_CORNER(0.0, 0.0, 1.0, 1.0, 0, 0, 0, 255) // DRAW LEVEL BACKGROUND SPRITE SWITCH hackingData.i_CircuitCurrentLevel CASE 0 DRAW_SPRITE("MPCircuitHack2", "CBLevel1", 0.5, 0.5, 1.0 * hackingData.f_AspectRatioModifier, 1.0, 0.0, 255, 255, 255, 255) BREAK CASE 1 DRAW_SPRITE("MPCircuitHack2", "CBLevel2", 0.5, 0.5, 1.0 * hackingData.f_AspectRatioModifier, 1.0, 0.0, 255, 255, 255, 255) BREAK CASE 2 DRAW_SPRITE("MPCircuitHack2", "CBLevel3", 0.5, 0.5, 1.0 * hackingData.f_AspectRatioModifier, 1.0, 0.0, 255, 255, 255, 255) BREAK CASE 3 DRAW_SPRITE("MPCircuitHack3", "CBLevel4", 0.5, 0.5, 1.0 * hackingData.f_AspectRatioModifier, 1.0, 0.0, 255, 255, 255, 255) BREAK CASE 4 DRAW_SPRITE("MPCircuitHack3", "CBLevel5", 0.5, 0.5, 1.0 * hackingData.f_AspectRatioModifier, 1.0, 0.0, 255, 255, 255, 255) BREAK CASE 5 DRAW_SPRITE("MPCircuitHack3", "CBLevel6", 0.5, 0.5, 1.0 * hackingData.f_AspectRatioModifier, 1.0, 0.0, 255, 255, 255, 255) BREAK ENDSWITCH // DRAW SNAKE TAIL SEGMENTS IF b_DrawTail i_Counter = 0 FLOAT f_CentreX, f_CentreY FLOAT f_SegmentLength, f_SegmentHeight, f_TailRotation = 0 FLOAT f_NextNodeX, f_NextNodeY // CYCLE THROUGH SNAKE TAIL SEGMENTS WHILE i_Counter < NUM_MAX_TAIL_RECTS AND (FLOAT_COMPRESSION_UNPACK_RETURN_X(hackingData.s_SnakeData.f_Tail[i_Counter], hackingData.s_SnakeData.i_CompressPrecisionValue) != 0.0 OR FLOAT_COMPRESSION_UNPACK_RETURN_Y(hackingData.s_SnakeData.f_Tail[i_Counter], hackingData.s_SnakeData.i_CompressPrecisionValue) != 0.0) // IF THE NEXT NODE IS INVALID THEN THE CURRENT NODE NEEDS TO BE CONNECTED TO THE SNAKE HEAD IF i_Counter + 1 >= NUM_MAX_TAIL_RECTS OR (FLOAT_COMPRESSION_UNPACK_RETURN_X(hackingData.s_SnakeData.f_Tail[i_Counter + 1], hackingData.s_SnakeData.i_CompressPrecisionValue) = 0.0 AND FLOAT_COMPRESSION_UNPACK_RETURN_Y(hackingData.s_SnakeData.f_Tail[i_Counter + 1], hackingData.s_SnakeData.i_CompressPrecisionValue) = 0.0) f_NextNodeX = hackingData.s_SnakeData.f_CenterX f_NextNodeY = hackingData.s_SnakeData.f_CenterY ELSE f_NextNodeX = FLOAT_COMPRESSION_UNPACK_RETURN_X(hackingData.s_SnakeData.f_Tail[i_Counter + 1], hackingData.s_SnakeData.i_CompressPrecisionValue) f_NextNodeY = FLOAT_COMPRESSION_UNPACK_RETURN_Y(hackingData.s_SnakeData.f_Tail[i_Counter + 1], hackingData.s_SnakeData.i_CompressPrecisionValue) ENDIF FLOAT f_TailCenterX = 0, f_TailCenterY = 0 FLOAT_COMPRESSION_UNPACK(hackingData.s_SnakeData.f_Tail[i_Counter], f_TailCenterX, f_TailCenterY, hackingData.s_SnakeData.i_CompressPrecisionValue) // CONNECT THIS NODE TO THE NEXT NODE f_CentreX = f_TailCenterX + ((f_NextNodeX - f_TailCenterX) * 0.5) f_CentreY = f_TailCenterY + ((f_NextNodeY - f_TailCenterY) * 0.5) // SEGMENT IS HORIZONTAL: USE THE DIFFERENCE IN X TO WORK OUT THE LENGTH IF (ABSF(f_TailCenterX - f_NextNodeX) > 0.001) f_TailRotation = 90.0 f_SegmentLength = ABSF(f_NextNodeX - f_TailCenterX) + (0.003 * 0.5) f_SegmentHeight = (0.003 * hackingData.f_CurrentAspectRatio) ENDIF // SEGMENT IS VERTICAL: USE THE DIFFERENCE IN Y TO WORK OUT THE HEIGHT IF (ABSF(f_TailCenterY - f_NextNodeY) > 0.001) f_TailRotation = 0.0 f_SegmentLength = 0.003 f_SegmentHeight = ABSF(f_NextNodeY - f_TailCenterY) + (0.003 * 0.5 * hackingData.f_CurrentAspectRatio) ENDIF // DRAW SNAKE TAIL IF NOT IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_KILL_SCREEN) DRAW_SPRITE("MPCircuitHack", "Tail", (0.5 - ((0.5 - f_CentreX) * hackingData.f_AspectRatioModifier)), f_CentreY, f_SegmentLength * hackingData.f_AspectRatioModifier, f_SegmentHeight, f_TailRotation, 45, 203, 134, hackingData.s_SnakeData.i_Alpha) ELSE DRAW_SPRITE("MPCircuitHack", "Tail", (0.5 - ((0.5 - f_CentreX) * hackingData.f_AspectRatioModifier)), f_CentreY, f_SegmentLength * hackingData.f_AspectRatioModifier, f_SegmentHeight, f_TailRotation, 188, 49, 43, hackingData.s_SnakeData.i_Alpha) ENDIF // DO TAIL COLLISION LOGIC HERE TO SAVE VARIABLES // HORIZONTAL IF ((hackingData.s_SnakeData.i_Direction = 2 OR hackingData.s_SnakeData.i_Direction = 3) AND DO_RECTANGLES_OVERLAP((0.5 - ((0.5 - hackingData.s_SnakeData.f_CenterX) * hackingData.f_AspectRatioModifier)), hackingData.s_SnakeData.f_CenterY, (hackingData.s_SnakeData.f_Width * hackingData.f_AspectRatioModifier) * 0.52, hackingData.s_SnakeData.f_Height * 0.52, (0.5 - ((0.5 - f_CentreX) * hackingData.f_AspectRatioModifier)), f_CentreY, (f_SegmentLength * 0.95) * hackingData.f_AspectRatioModifier, f_SegmentHeight * (0.565 * hackingData.f_CurrentAspectRatio))) // VERTICAL OR ((hackingData.s_SnakeData.i_Direction = 0 OR hackingData.s_SnakeData.i_Direction = 1) AND DO_RECTANGLES_OVERLAP((0.5 - ((0.5 - hackingData.s_SnakeData.f_CenterX) * hackingData.f_AspectRatioModifier)), hackingData.s_SnakeData.f_CenterY, (hackingData.s_SnakeData.f_Width * hackingData.f_AspectRatioModifier) * 0.52, hackingData.s_SnakeData.f_Height * 0.52, (0.5 - ((0.5 - f_CentreX) * hackingData.f_AspectRatioModifier)), f_CentreY, (f_SegmentLength * (0.565 * hackingData.f_CurrentAspectRatio)) * hackingData.f_AspectRatioModifier, f_SegmentHeight * 0.95)) // IF NOT THE NEWEST TAIL SEGMENT IF i_Counter < (hackingData.s_SnakeData.i_TailIndex - 3) AND IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_MOVE_HEAD) // STOP SNAKE MOVING IF IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_MOVE_HEAD) CLEAR_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_MOVE_HEAD) ENDIF // STOP TRAIL LOOP AUDIO STOP_SOUND(hackingData.i_hacking_sound) // PLAY CRASH AUDIO PLAY_SOUND_FRONTEND(-1, "Crash", "DLC_HEIST_HACKING_SNAKE_SOUNDS") // SET PLAY SNAKE DEAD ANIM IF NOT IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_KILL_SCREEN) SET_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_KILL_SCREEN) ENDIF // HANDLE PAD VIBRATIONS DO_CIRCUIT_HACKING_CONTROLLER_VIBRATIONS(1000, 100) // SET PASS TIMER hackingData.i_CircuitPassedLevelTimer = GET_GAME_TIMER() // MOVE TO FAIL STATE hackingData.e_CircuitHackingMinigameState = CHMS_FAIL CPRINTLN(DEBUG_COLIN, "Circuit Hacking: UPDATE_CIRCUIT_GAME_DISPLAY() - CHECK 1 - Fail: Collided against tail segment: ", i_Counter) ENDIF ENDIF i_Counter++ ENDWHILE ENDIF // DRAW SNAKE HEAD IF NOT IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_KILL_SCREEN) // DRAW GREEN SNAKE HEAD - IF NOT PASSED LEVEL IF NOT IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_REMOVE_HEAD) DRAW_SPRITE("MPCircuitHack", "Head", (0.5 - ((0.5 - hackingData.s_SnakeData.f_CenterX) * hackingData.f_AspectRatioModifier)), hackingData.s_SnakeData.f_CenterY, hackingData.s_SnakeData.f_Width * hackingData.f_AspectRatioModifier, hackingData.s_SnakeData.f_Height, hackingData.s_SnakeData.f_HeadRotation, 45, 203, 134, hackingData.s_SnakeData.i_Alpha) ENDIF ELSE // DRAW RED SNAKE HEAD FOR FAILS DRAW_SPRITE("MPCircuitHack", "Head", (0.5 - ((0.5 - hackingData.s_SnakeData.f_CenterX) * hackingData.f_AspectRatioModifier)), hackingData.s_SnakeData.f_CenterY, hackingData.s_SnakeData.f_Width * hackingData.f_AspectRatioModifier, hackingData.s_SnakeData.f_Height, hackingData.s_SnakeData.f_HeadRotation, 188, 49, 43, hackingData.s_SnakeData.i_Alpha) ENDIF // PORT VARIABLES - START & END FLOAT f_StartPortX FLOAT f_StartPortY FLOAT f_StartPortWidth FLOAT f_StartPortHeight FLOAT f_StartPortRotation FLOAT f_EndPortX FLOAT f_EndPortY FLOAT f_EndPortWidth FLOAT f_EndPortHeight FLOAT f_EndPortRotation // PORT LIGHT VARIABLES - START & END FLOAT f_LightWidth = 0.0080 FLOAT f_LightHeight = f_LightWidth * hackingData.f_CurrentAspectRatio FLOAT f_StartPortLightOneX FLOAT f_StartPortLightOneY FLOAT f_StartPortLightTwoX FLOAT f_StartPortLightTwoY FLOAT f_EndPortLightOneX FLOAT f_EndPortLightOneY FLOAT f_EndPortLightTwoX FLOAT f_EndPortLightTwoY // ASSIGN PORT DATA PER LEVEL SWITCH hackingData.i_CircuitCurrentLevel CASE 0 // LEVEL 1 // PORTS f_StartPortX = 0.1710 f_StartPortY = 0.7380 f_StartPortWidth = 0.0300 f_StartPortHeight = 0.0800 f_StartPortRotation = 0.0000 f_EndPortX = 0.8290 f_EndPortY = 0.2320 f_EndPortWidth = 0.0300 f_EndPortHeight = 0.0800 f_EndPortRotation = 180.0000 // PORT LIGHTS f_StartPortLightOneX = 0.1811 f_StartPortLightOneY = 0.7065 f_StartPortLightTwoX = 0.1810 f_StartPortLightTwoY = 0.7700 f_EndPortLightOneX = 0.8195 f_EndPortLightOneY = 0.2000 f_EndPortLightTwoX = 0.8195 f_EndPortLightTwoY = 0.2640 BREAK CASE 1 // LEVEL 2 // PORTS f_StartPortX = 0.1710 f_StartPortY = 0.7380 f_StartPortWidth = 0.0300 f_StartPortHeight = 0.0800 f_StartPortRotation = 0.0000 f_EndPortX = 0.8290 f_EndPortY = 0.3010 f_EndPortWidth = 0.0300 f_EndPortHeight = 0.0800 f_EndPortRotation = 180.0000 // PORT LIGHTS f_StartPortLightOneX = 0.1811 f_StartPortLightOneY = 0.7065 f_StartPortLightTwoX = 0.1810 f_StartPortLightTwoY = 0.7700 f_EndPortLightOneX = 0.8195 f_EndPortLightOneY = 0.2695 f_EndPortLightTwoX = 0.8195 f_EndPortLightTwoY = 0.3330 BREAK CASE 2 // LEVEL 3 // PORTS f_StartPortX = 0.1710 f_StartPortY = 0.7720 f_StartPortWidth = 0.0300 f_StartPortHeight = 0.0800 f_StartPortRotation = 0.0000 f_EndPortX = 0.1710 f_EndPortY = 0.2300 f_EndPortWidth = 0.0300 f_EndPortHeight = 0.0800 f_EndPortRotation = 0.0000 // PORT LIGHTS f_StartPortLightOneX = 0.1811 f_StartPortLightOneY = 0.7405 f_StartPortLightTwoX = 0.1811 f_StartPortLightTwoY = 0.8040 f_EndPortLightOneX = 0.1811 f_EndPortLightOneY = 0.1989 f_EndPortLightTwoX = 0.1811 f_EndPortLightTwoY = 0.2618 BREAK CASE 3 // LEVEL 4 // PORTS f_StartPortX = 0.1710 f_StartPortY = 0.7530 f_StartPortWidth = 0.0300 f_StartPortHeight = 0.0800 f_StartPortRotation = 0.0000 f_EndPortX = 0.8290 f_EndPortY = 0.2900 f_EndPortWidth = 0.0300 f_EndPortHeight = 0.0800 f_EndPortRotation = 180.0000 // PORT LIGHTS f_StartPortLightOneX = 0.1811 f_StartPortLightOneY = 0.7215 f_StartPortLightTwoX = 0.1811 f_StartPortLightTwoY = 0.7850 f_EndPortLightOneX = 0.8195 f_EndPortLightOneY = 0.2585 f_EndPortLightTwoX = 0.8195 f_EndPortLightTwoY = 0.3220 BREAK CASE 4 // LEVEL 5 // PORTS f_StartPortX = 0.1710 f_StartPortY = 0.2900 f_StartPortWidth = 0.0300 f_StartPortHeight = 0.0800 f_StartPortRotation = 0.0000 f_EndPortX = 0.7900 f_EndPortY = 0.8300 f_EndPortWidth = 0.0440 f_EndPortHeight = 0.0530 f_EndPortRotation = 270.0000 // PORT LIGHTS f_StartPortLightOneX = 0.1810 f_StartPortLightOneY = 0.2585 f_StartPortLightTwoX = 0.1810 f_StartPortLightTwoY = 0.3220 f_EndPortLightOneX = 0.7730 f_EndPortLightOneY = 0.8128 f_EndPortLightTwoX = 0.8082 f_EndPortLightTwoY = 0.8130 BREAK CASE 5 // LEVEL 6 // PORTS f_StartPortX = 0.7900 f_StartPortY = 0.1710 f_StartPortWidth = 0.0440 f_StartPortHeight = 0.0530 f_StartPortRotation = 90.0000 f_EndPortX = 0.1710 f_EndPortY = 0.2440 f_EndPortWidth = 0.0300 f_EndPortHeight = 0.0800 f_EndPortRotation = 0.0000 // PORT LIGHTS f_StartPortLightOneX = 0.7725 f_StartPortLightOneY = 0.1890 f_StartPortLightTwoX = 0.8075 f_StartPortLightTwoY = 0.1890 f_EndPortLightOneX = 0.1813 f_EndPortLightOneY = 0.2120 f_EndPortLightTwoX = 0.1813 f_EndPortLightTwoY = 0.2755 BREAK ENDSWITCH // DRAW ENTRY & EXIT PORT SPRITES //START PORT DRAW_SPRITE("MPCircuitHack", "GenericPort", (0.5 - ((0.5 - f_StartPortX) * hackingData.f_AspectRatioModifier)), f_StartPortY, f_StartPortWidth * hackingData.f_AspectRatioModifier, f_StartPortHeight, f_StartPortRotation, 255, 255, 255, 255) // END PORT DRAW_SPRITE("MPCircuitHack", "GenericPort", (0.5 - ((0.5 - f_EndPortX) * hackingData.f_AspectRatioModifier)), f_EndPortY, f_EndPortWidth * hackingData.f_AspectRatioModifier, f_EndPortHeight, f_EndPortRotation, 255, 255, 255, 255) // CONTROLS PULSE SPEED INT i_PulseValue = 800 // PULSE LIGHTS // END PORT LIGHTS IF NOT IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_PULSE_END_PORT_LIGHTS) IF NOT IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_PULSE_UP) // CHANGE TO ALPHA LIGHTS UP IF hackingData.s_SnakeData.i_StartPortLightColourA <= 0 SET_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_PULSE_UP) ENDIF hackingData.s_SnakeData.i_StartPortLightColourA = ROUND(hackingData.s_SnakeData.i_StartPortLightColourA -@ i_PulseValue) ELSE // CHANGE TO ALPHA LIGHTS DOWN IF hackingData.s_SnakeData.i_StartPortLightColourA >= 255 CLEAR_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_PULSE_UP) ENDIF hackingData.s_SnakeData.i_StartPortLightColourA = ROUND(hackingData.s_SnakeData.i_StartPortLightColourA +@ i_PulseValue) ENDIF ELSE // START PORT LIGHTS hackingData.s_SnakeData.i_StartPortLightColourA = 255 IF NOT IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_PULSE_UP) // CHANGE TO ALPHA LIGHTS UP IF hackingData.s_SnakeData.i_EndPortLightColourA <= 0 SET_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_PULSE_UP) ENDIF hackingData.s_SnakeData.i_EndPortLightColourA = ROUND(hackingData.s_SnakeData.i_EndPortLightColourA -@ i_PulseValue) ELSE // CHANGE TO ALPHA LIGHTS DOWN IF hackingData.s_SnakeData.i_EndPortLightColourA >= 255 CLEAR_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_PULSE_UP) ENDIF hackingData.s_SnakeData.i_EndPortLightColourA = ROUND(hackingData.s_SnakeData.i_EndPortLightColourA +@ i_PulseValue) ENDIF ENDIF // DRAW START PORT LIGHTS - ALWAYS GREEN LIGHTS DRAW_SPRITE("MPCircuitHack", "Light", (0.5 - ((0.5 - f_StartPortLightOneX) * hackingData.f_AspectRatioModifier)), f_StartPortLightOneY, f_LightWidth * hackingData.f_AspectRatioModifier, f_LightHeight, 0.0, 45, 203, 134, hackingData.s_SnakeData.i_StartPortLightColourA) DRAW_SPRITE("MPCircuitHack", "Light", (0.5 - ((0.5 - f_StartPortLightTwoX) * hackingData.f_AspectRatioModifier)), f_StartPortLightTwoY, f_LightWidth * hackingData.f_AspectRatioModifier, f_LightHeight, 0.0, 45, 203, 134, hackingData.s_SnakeData.i_StartPortLightColourA) // DRAW END PORT LIGHTS - START RED AND CHANGE TO GREEN WHEN LEVEL IS COMPLETED IF (IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_LEVEL_PASSED) AND (GET_GAME_TIMER() - hackingData.i_CircuitPassedLevelTimer) > 500) // DRAW END GREEN LIGHTS DRAW_SPRITE("MPCircuitHack", "Light", (0.5 - ((0.5 - f_EndPortLightOneX) * hackingData.f_AspectRatioModifier)), f_EndPortLightOneY, f_LightWidth * hackingData.f_AspectRatioModifier, f_LightHeight, 0.0, 45, 203, 134, 255) DRAW_SPRITE("MPCircuitHack", "Light", (0.5 - ((0.5 - f_EndPortLightTwoX) * hackingData.f_AspectRatioModifier)), f_EndPortLightTwoY, f_LightWidth * hackingData.f_AspectRatioModifier, f_LightHeight, 0.0, 45, 203, 134, 255) ELSE // DRAW END RED LIGHTS DRAW_SPRITE("MPCircuitHack", "Light", (0.5 - ((0.5 - f_EndPortLightOneX) * hackingData.f_AspectRatioModifier)), f_EndPortLightOneY, f_LightWidth * hackingData.f_AspectRatioModifier, f_LightHeight, 0.0, 188, 49, 43, hackingData.s_SnakeData.i_EndPortLightColourA) DRAW_SPRITE("MPCircuitHack", "Light", (0.5 - ((0.5 - f_EndPortLightTwoX) * hackingData.f_AspectRatioModifier)), f_EndPortLightTwoY, f_LightWidth * hackingData.f_AspectRatioModifier, f_LightHeight, 0.0, 188, 49, 43, hackingData.s_SnakeData.i_EndPortLightColourA) ENDIF // HANDLES DRAWING THE DEBUG OUTPUT SPEW IF NOT IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_BLOCK_DEBUG_OUTPUT_SPEW) DRAW_DEBUG_OUTPUT_SPEW(hackingData, b_UseDifficultLevels, bHeist2) ENDIF #IF IS_DEBUG_BUILD // DEBUG DRAW WALL COLLISIONS IF b_DrawWallCollisions FOR i_Counter = 0 TO (NUM_MAX_WALLS - 1) IF hackingData.s_WallData[i_Counter].f_Width <> 0.0 OR hackingData.s_WallData[i_Counter].f_Height <> 0.0 DRAW_RECT((0.5 - ((0.5 - hackingData.s_WallData[i_Counter].f_CenterX) * hackingData.f_AspectRatioModifier)), hackingData.s_WallData[i_Counter].f_CenterY, hackingData.s_WallData[i_Counter].f_Width * hackingData.f_AspectRatioModifier, hackingData.s_WallData[i_Counter].f_Height, 190, 190, 190, 190) // PRINT COLLISION WALL NUMBER SET_TEXT_COLOUR(0, 0, 0, 255) SET_TEXT_SCALE(0.200, 0.275) SET_TEXT_WRAP(0.000, 1.000) DISPLAY_TEXT_WITH_NUMBER((0.5 - ((0.5 - hackingData.s_WallData[i_Counter].f_CenterX) * hackingData.f_AspectRatioModifier)) - 0.0043, hackingData.s_WallData[i_Counter].f_CenterY - 0.01, "NUMBER", i_Counter) ENDIF ENDFOR // START POS DRAW_RECT((0.5 - ((0.5 - hackingData.s_SnakeData.f_StartX) * hackingData.f_AspectRatioModifier)), hackingData.s_SnakeData.f_StartY, 0.030 * hackingData.f_AspectRatioModifier, (0.030 * hackingData.f_CurrentAspectRatio), 0, 255, 0, 190) SET_TEXT_COLOUR(0, 0, 0, 255) SET_TEXT_SCALE(0.200, 0.275) SET_TEXT_WRAP(0.000, 1.000) DISPLAY_TEXT_WITH_PLAYER_NAME((0.5 - ((0.5 - hackingData.s_SnakeData.f_StartX) * hackingData.f_AspectRatioModifier)) - 0.013, hackingData.s_SnakeData.f_StartY - 0.01, "STRING", "START", HUD_COLOUR_BLACK) // END POS DRAW_RECT((0.5 - ((0.5 - hackingData.s_SnakeData.f_EndX) * hackingData.f_AspectRatioModifier)), hackingData.s_SnakeData.f_EndY, hackingData.s_SnakeData.f_EndWidth * hackingData.f_AspectRatioModifier, hackingData.s_SnakeData.f_EndHeight, 255, 0, 0, 190) SET_TEXT_COLOUR(0, 0, 0, 255) SET_TEXT_SCALE(0.200, 0.275) SET_TEXT_WRAP(0.000, 1.000) DISPLAY_TEXT_WITH_PLAYER_NAME((0.5 - ((0.5 - hackingData.s_SnakeData.f_EndX) * hackingData.f_AspectRatioModifier)) - 0.0083, hackingData.s_SnakeData.f_EndY - 0.01, "STRING", "END", HUD_COLOUR_BLACK) ENDIF // DEBUG ASPECT RATIO TEST IF IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_DRAW_ASPECT_TEST) SET_WIDESCREEN_FORMAT(WIDESCREEN_FORMAT_CENTRE) DRAW_SPRITE("MPCircuitHack", "SafezoneLines", 0.5, 0.5, 1.0, 1.0, 0.0, 255, 255, 255, 255) ENDIF #ENDIF ENDPROC #IF IS_DEBUG_BUILD /// PURPOSE: /// Main debug update loop. Handles all debug /// PARAMS: /// &hackingData - STRUCT: Hacking data struct /// b_UseDifficultLevels - BOOL: Pass TRUE for the final three levels PROC UPDATE_DEBUG_CIRCUIT_HACKING_MINIGAME(S_HACKING_DATA &hackingData, BOOL b_UseDifficultLevels) CPRINTLN(DEBUG_GOLF, "Circuit Hacking: UPDATE_CIRCUIT_MINIGAME_DEBUG() - RUN CHECK 1 - Running Debug") // RESET IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD1) CPRINTLN(DEBUG_COLIN, "Circuit Hacking: UPDATE_CIRCUIT_MINIGAME_DEBUG() - CHECK 1 - Debug Reset") CIRCUIT_MINIGAME_RESET(hackingData, TRUE, FALSE, TRUE, FALSE) hackingData.i_CircuitCurrentLevel = 0 INITIALISE_CIRCUIT_MINIGAME_LEVEL(hackingData, hackingData.i_CircuitCurrentLevel) START_DEBUG_OUTPUT_SPEW_TIMER(hackingData) ENDIF // SKIP TO PREVIOUS STAGE IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD2) CPRINTLN(DEBUG_COLIN, "Circuit Hacking: UPDATE_CIRCUIT_MINIGAME_DEBUG() - CHECK 2 - Debug Skip to Previous Level") CIRCUIT_MINIGAME_RESET(hackingData, TRUE, FALSE, TRUE, FALSE) IF hackingData.i_CircuitCurrentLevel > 0 hackingData.i_CircuitCurrentLevel-- ELSE hackingData.i_CircuitCurrentLevel = 0 ENDIF INITIALISE_CIRCUIT_MINIGAME_LEVEL(hackingData, hackingData.i_CircuitCurrentLevel) START_DEBUG_OUTPUT_SPEW_TIMER(hackingData) ENDIF // SKIP TO NEXT STAGE IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD3) CPRINTLN(DEBUG_COLIN, "Circuit Hacking: UPDATE_CIRCUIT_MINIGAME_DEBUG() - CHECK 3 - Debug Skip to Next Level") CIRCUIT_MINIGAME_RESET(hackingData, TRUE, FALSE, TRUE, FALSE) IF hackingData.i_CircuitCurrentLevel < 5 hackingData.i_CircuitCurrentLevel++ ELSE hackingData.i_CircuitCurrentLevel = 5 hackingData.e_CircuitHackingMinigameState = CHMS_SYSTEM_HACKED ENDIF INITIALISE_CIRCUIT_MINIGAME_LEVEL(hackingData, hackingData.i_CircuitCurrentLevel) START_DEBUG_OUTPUT_SPEW_TIMER(hackingData) ENDIF // DRAW WALL COLLISION IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD4) IF NOT IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_DRAW_ASPECT_TEST) SET_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_DRAW_ASPECT_TEST) ELSE CLEAR_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_DRAW_ASPECT_TEST) ENDIF CPRINTLN(DEBUG_COLIN, "Circuit Hacking: UPDATE_CIRCUIT_MINIGAME_DEBUG() - CHECK 4 - Draw 4:3 Aspect Test Sprite: ", GET_BOOL_DISPLAY_STRING_FROM_BOOL(IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_DRAW_ASPECT_TEST))) ENDIF // DRAW WALL COLLISION IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD5) IF NOT IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_DRAW_WALLS) SET_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_DRAW_WALLS) ELSE CLEAR_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_DRAW_WALLS) ENDIF CPRINTLN(DEBUG_COLIN, "Circuit Hacking: UPDATE_CIRCUIT_MINIGAME_DEBUG() - CHECK 5 - Draw wall collision boxes: ", GET_BOOL_DISPLAY_STRING_FROM_BOOL(IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_DRAW_WALLS))) ENDIF // STOP MOVING IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD6) IF IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_MOVE_HEAD) CLEAR_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_MOVE_HEAD) ELIF NOT IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_MOVE_HEAD) SET_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_MOVE_HEAD) ENDIF CPRINTLN(DEBUG_COLIN, "Circuit Hacking: UPDATE_CIRCUIT_MINIGAME_DEBUG() - CHECK 6 - Moving: ", IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_MOVE_HEAD)) ENDIF // JUMP TO FINAL COMPLETION SPRITES IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD7) CPRINTLN(DEBUG_COLIN, "Circuit Hacking: UPDATE_CIRCUIT_MINIGAME_DEBUG() - CHECK 7 - Debug Skip to Final Screen") IF IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_MINIGAME_SOLVED) CPRINTLN(DEBUG_COLIN, "Circuit Hacking: UPDATE_CIRCUIT_MINIGAME_DEBUG() - CHECK 8 - Clearing MINIGAME_SOLVED Bit") CLEAR_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_MINIGAME_SOLVED) ENDIF hackingData.i_WinScreenDelay = GET_GAME_TIMER() // DRAW FINALE CONNECTED CIRCUIT SPRITE hackingData.e_CircuitHackingMinigameState = CHMS_SYSTEM_HACKED ENDIF // FORCE SOLVE IF IS_DEBUG_KEY_JUST_PRESSED(KEY_NUMPAD1, KEYBOARD_MODIFIER_SHIFT, "Force Solve Circuit Hacking Mingame") CPRINTLN(DEBUG_COLIN, "Circuit Hacking: UPDATE_CIRCUIT_MINIGAME_DEBUG() - CHECK 9 - Debug Force Solve") IF NOT IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_MINIGAME_SOLVED) CPRINTLN(DEBUG_COLIN, "Circuit Hacking: UPDATE_CIRCUIT_MINIGAME_DEBUG() - CHECK 10 - Setting MINIGAME_SOLVED Bit") SET_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_MINIGAME_SOLVED) ENDIF ENDIF // JUMP TO FINAL COMPLETION SPRITES IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD8) CPRINTLN(DEBUG_COLIN, "Circuit Hacking: UPDATE_CIRCUIT_MINIGAME_DEBUG() - CHECK 7 - Debug Skip to Final Screen") IF IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_MINIGAME_SOLVED) CPRINTLN(DEBUG_COLIN, "Circuit Hacking: UPDATE_CIRCUIT_MINIGAME_DEBUG() - CHECK 8 - Clearing MINIGAME_SOLVED Bit") CLEAR_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_MINIGAME_SOLVED) ENDIF hackingData.i_WinScreenDelay = GET_GAME_TIMER() // DRAW FINALE CONNECTED CIRCUIT SPRITE hackingData.e_CircuitHackingMinigameState = CHMS_SYSTEM_HACKED SET_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_DRAW_SYS_UNLOCKED) ENDIF // FORCE CLEANUP IF IS_DEBUG_KEY_JUST_PRESSED(KEY_NUMPAD2, KEYBOARD_MODIFIER_SHIFT, "Force Cleanup Circuit Hacking Mingame") CPRINTLN(DEBUG_COLIN, "Circuit Hacking: UPDATE_CIRCUIT_MINIGAME_DEBUG() - CHECK 11 - Debug Force Cleanup & Quit") CLEANUP_AND_QUIT_CIRCUIT_HACKING_MINIGAME(hackingData, b_UseDifficultLevels) ENDIF // INFO DUMP IF IS_DEBUG_KEY_JUST_PRESSED(KEY_NUMPAD3, KEYBOARD_MODIFIER_SHIFT, "Print SIZE_OF info.") CPRINTLN(DEBUG_COLIN, "Circuit Hacking: UPDATE_CIRCUIT_MINIGAME_DEBUG() - CHECK 12 - Debug Info") // DEBUG VALUE CHECK CPRINTLN(DEBUG_COLIN, "Circuit Hacking: Current Level: ", hackingData.i_CircuitCurrentLevel) CPRINTLN(DEBUG_COLIN, "Circuit Hacking: Current Deaths: ", hackingData.i_lives) CPRINTLN(DEBUG_COLIN, "Circuit Hacking: Move Speed X: ", hackingData.s_SnakeData.f_SpeedX) CPRINTLN(DEBUG_COLIN, "Circuit Hacking: Move Speed Y: ", hackingData.s_SnakeData.f_SpeedY) CPRINTLN(DEBUG_COLIN, "") ENDIF ENDPROC #ENDIF /// PURPOSE: /// Handles all updates needed every frame /// PARAMS: /// &hackingData - STRUCT: Hacking data struct /// b_CanExitVehicle - BOOL: Pass TRUE to lock Player in a vehicle during minigame PROC UPDATE_PER_FRAME_CIRCUIT_HACKING_MINIGAME(S_HACKING_DATA &hackingData, BOOL b_CanExitVehicle = FALSE) // GENERAL SETUP & BLOCKING FUNCTIONS ALLOW_ALTERNATIVE_SCRIPT_CONTROLS_LAYOUT(PLAYER_CONTROL) ALLOW_ALTERNATIVE_SCRIPT_CONTROLS_LAYOUT(FRONTEND_CONTROL) SET_SCRIPT_GFX_DRAW_BEHIND_PAUSEMENU(FALSE) SET_INSTRUCTIONAL_BUTTONS_UNDER_HUD_THIS_FRAME() DISABLE_SCRIPT_HUD_THIS_FRAME(HUDPART_ALL_OVERHEADS) DISABLE_SELECTOR_THIS_FRAME() DISABLE_DPADDOWN_THIS_FRAME() #IF IS_NEXTGEN_BUILD // HIDE THE RECORDING HELP TEXT/FEED UPDATES #IF USE_REPLAY_RECORDING_TRIGGERS // DISABLES FEED AND INPUT HANDLER WHEN RECORDING STOPS DISABLE_REPLAY_RECORDING_UI_THIS_FRAME() #ENDIF // PREVENT RECORDING DURING THE MINIGAME REPLAY_PREVENT_RECORDING_THIS_FRAME() #ENDIF // STOP PLAYER EXITING VEHICLE WHILE MINIGAME IS RUNNING IF NOT b_CanExitVehicle //DISABLE_VEHICLE_EXIT_THIS_FRAME() DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT) ENDIF // DISABLE CELLPHONE IF hackingData.e_CircuitHackingMinigameState > CHMS_LAUNCHING DISABLE_CELLPHONE_THIS_FRAME_ONLY() ENDIF // GET SCREEN RESOLUTION SET_CURRENT_ASPECT_RATIO_MODIFIER(hackingData) // USED IN CONTROLLER TO INCREMENT A STAT CHECK_SHOULD_RESET_LEVEL_FAIL_BIT(hackingData) // PAUSE MENU CHECK IF NOT IS_PAUSE_MENU_ACTIVE() AND hackingData.e_CircuitHackingMinigameState > CHMS_LAUNCHING HIDE_HUD_AND_RADAR_THIS_FRAME() SET_SCRIPT_GFX_DRAW_ORDER(GFX_ORDER_BEFORE_HUD) ENDIF ENDPROC PROC SELECT_RANDOM_CIRCUIT_HACKING_LEVEL(S_HACKING_DATA &hackingData) hackingData.i_CircuitCurrentLevel = -2 CPRINTLN(DEBUG_COLIN, "Circuit Hacking: SELECT_RANDOM_CIRCUIT_HACKING_LEVEL") ENDPROC /// PURPOSE: /// Initialises the Circuit Hacking Minigame /// PARAMS: /// &hackingData - STRUCT: Hacking data struct /// b_UseDifficultLevels - BOOL: Pass TRUE for the final three levels PROC INITIALISE_CIRCUIT_HACKING_MINIGAME(S_HACKING_DATA &hackingData, BOOL b_UseDifficultLevels = FALSE) CPRINTLN(DEBUG_GOLF, "Circuit Hacking: INITIALISE_CIRCUIT_HACKING_MINIGAME() - RUN CHECK 1 - Game state = CHMS_INITIALISE") CPRINTLN(DEBUG_COLIN, "Circuit Hacking: INITIALISE_CIRCUIT_HACKING_MINIGAME() - CHECK 0 - Circuit Hacking Minigame Initialised by [", GET_THIS_SCRIPT_NAME(), "]") CPRINTLN(DEBUG_COLIN, "Circuit Hacking: INITIALISE_CIRCUIT_HACKING_MINIGAME() - CHECK 1 - Initialise Started") // Reset the bit hackingData.i_CircuitBitSet = 0 // SET GAME RUNNING BIT IF NOT IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_GAME_RUNNING) SET_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_GAME_RUNNING) ENDIF // PRINT CURRENT SCREEN RESOLUTION GET_CUSTOM_SCREEN_ASPECT_RATIO(hackingData, TRUE) // INITIALISE MINIGAME VARIABLES CPRINTLN(DEBUG_COLIN, "Circuit Hacking: INITIALISE_CIRCUIT_HACKING_MINIGAME() - CHECK 2 - Initialise Variables Started") // DISABLE PHONE INSTRUCTIONS g_FMMC_STRUCT.bDisablePhoneInstructions = TRUE // GET BACKGROUND AUDIO ID hackingData.i_node = GET_SOUND_ID() // GET TRAIL LOOP AUDIO ID hackingData.i_hacking_sound = GET_SOUND_ID() // SETUP PHONE LAUNCH VARIBALES RESTART_TIMER_AT(hackingData.t_PhoneLaunchTimer, 0.0) PAUSE_TIMER(hackingData.t_PhoneLaunchTimer) hackingData.e_IntroLaunchState = LIS_INITIALISE #IF IS_NEXTGEN_BUILD // NEXT GEN ADVANCED COMPRESSION PRECISION VALUE hackingData.s_SnakeData.i_CompressPrecisionValue = 9974 #ENDIF // STOP AIMING GUN WHILE PHONE LAUNCHES GLITCH IF NETWORK_IS_GAME_IN_PROGRESS() IF IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_ALLOW_DAMAGE) NET_SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, NSPC_LEAVE_CAMERA_CONTROL_ON | NSPC_ALLOW_PLAYER_DAMAGE) ELSE NET_SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, NSPC_LEAVE_CAMERA_CONTROL_ON) ENDIF DISABLE_INTERACTION_MENU() ELSE SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON) ENDIF // RESET SCALEFORM INDEX & DEBUG OUTPUT VARIABLES BORROWED FROM ADAM sfHacking = NULL iHackSeconds = 0 iHackMilliseconds = 0 hackingData.i_lives = 0 CPRINTLN(DEBUG_COLIN, "Circuit Hacking: INITIALISE_CIRCUIT_HACKING_MINIGAME() - CHECK 3 - Initialise Variables Finished") // BLOCK THE RANK AND AWARD NOTIFICATIONS //GlobalplayerBD_FM[NATIVE_TO_INT(PLAYER_ID())].g_bIsHacking = TRUE SET_BIT(GlobalplayerBD_FM[NATIVE_TO_INT(PLAYER_ID())].boolReplacementBS,GlobalPlayerBroadcastDataFM_BS_g_bIsHacking) CPRINTLN(DEBUG_COLIN, "Circuit Hacking: INITIALISE_CIRCUIT_HACKING_MINIGAME() - CHECK 4 - Block Rank and Award Notifications") // DISABLE ABILITY TO TURN UP/DOWN (FOR START ONLY) IF NOT IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_DISABLE_VERTICAL_TURNING) SET_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_DISABLE_VERTICAL_TURNING) CPRINTLN(DEBUG_COLIN, "Circuit Hacking: INITIALISE_CIRCUIT_HACKING_MINIGAME() - CHECK 5 - Disable Vertical Turning") ENDIF // REQUEST MINIGAME TEXT REQUEST_ADDITIONAL_TEXT("HACK", MINIGAME_TEXT_SLOT) CPRINTLN(DEBUG_COLIN, "Circuit Hacking: INITIALISE_CIRCUIT_HACKING_MINIGAME() - CHECK 6 - Request Text") // NEW, FOR SELECTING RANDOM LEVELS IF hackingData.i_CircuitCurrentLevel = -2 IF b_UseDifficultLevels hackingData.i_CircuitCurrentLevel = GET_RANDOM_INT_IN_RANGE(3, 6) CPRINTLN(DEBUG_COLIN, "Circuit Hacking: INITIALISE_CIRCUIT_HACKING_MINIGAME - SELECT_RANDOM_CIRCUIT_HACKING_LEVEL - Difficult - Level: ", hackingData.i_CircuitCurrentLevel) ELSE hackingData.i_CircuitCurrentLevel = GET_RANDOM_INT_IN_RANGE(0, 3) CPRINTLN(DEBUG_COLIN, "Circuit Hacking: INITIALISE_CIRCUIT_HACKING_MINIGAME - SELECT_RANDOM_CIRCUIT_HACKING_LEVEL - Easy - Level: ", hackingData.i_CircuitCurrentLevel) ENDIF ELSE // SET EITHER TUTORIAL/FINALE LEVEL PACK IF b_UseDifficultLevels hackingData.i_CircuitCurrentLevel = 3 CPRINTLN(DEBUG_COLIN, "Circuit Hacking: INITIALISE_CIRCUIT_HACKING_MINIGAME() - CHECK 7a - Initialise Finale Levels") ELSE hackingData.i_CircuitCurrentLevel = 0 CPRINTLN(DEBUG_COLIN, "Circuit Hacking: INITIALISE_CIRCUIT_HACKING_MINIGAME() - CHECK 7b - Initialise Tutorial Levels") ENDIF ENDIF // GENERATE LEVEL DATA (DEPENDS ON WHICH LEVEL PACK PASSED) INITIALISE_CIRCUIT_MINIGAME_LEVEL(hackingData, hackingData.i_CircuitCurrentLevel) CPRINTLN(DEBUG_COLIN, "Circuit Hacking: INITIALISE_CIRCUIT_HACKING_MINIGAME() - CHECK 8 - Initialise Finished") // MOVE TO REQUEST ASSETS STATE hackingData.e_CircuitHackingMinigameState = CHMS_REQUEST_ASSETS CPRINTLN(DEBUG_COLIN, "Circuit Hacking: INITIALISE_CIRCUIT_HACKING_MINIGAME() - CHECK 9 - Moving to Stage: CHMS_REQUEST_ASSETS") ENDPROC /// PURPOSE: /// Requests and loads all Circuit Hacking minigame assets /// PARAMS: /// &hackingData - STRUCT: Hacking data struct /// b_UseDifficultLevels - BOOL: Pass TRUE for the final three levels /// b_TestAllLevels - BOOL: Debug only. Allows to play all six levels in a row - DEBUG ONLY PROC REQUEST_ASSETS_CIRCUIT_HACKING_MINIGAME(S_HACKING_DATA &hackingData, BOOL b_UseDifficultLevels = FALSE #IF IS_DEBUG_BUILD, BOOL b_TestAllLevels = FALSE #ENDIF ) CPRINTLN(DEBUG_GOLF, "Circuit Hacking: REQUEST_ASSETS_CIRCUIT_HACKING_MINIGAME() - RUN CHECK 2 - Game state = CHMS_REQUEST_ASSETS") BOOL b_LoadAllLevelAssets #IF IS_DEBUG_BUILD b_LoadAllLevelAssets = b_TestAllLevels #ENDIF // IF NOT DEBUG IF NOT b_LoadAllLevelAssets // REQUEST THE TEXTURE DICTIONARY REQUEST_STREAMED_TEXTURE_DICT("MPCircuitHack") sfHacking = REQUEST_SCALEFORM_MOVIE("HACKING_MESSAGE") REQUEST_SCRIPT_AUDIO_BANK("DLC_MPHEIST/HEIST_HACK_SNAKE") IF NOT b_UseDifficultLevels REQUEST_STREAMED_TEXTURE_DICT("MPCircuitHack2") IF HAS_STREAMED_TEXTURE_DICT_LOADED("MPCircuitHack") AND HAS_STREAMED_TEXTURE_DICT_LOADED("MPCircuitHack2") AND HAS_SCALEFORM_MOVIE_LOADED(sfHacking) AND REQUEST_SCRIPT_AUDIO_BANK("DLC_MPHEIST/HEIST_HACK_SNAKE") // DISABLE PLAYER CONTROL IF NETWORK_IS_GAME_IN_PROGRESS() IF IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_ALLOW_DAMAGE) NET_SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, NSPC_ALLOW_PLAYER_DAMAGE) ELSE NET_SET_PLAYER_CONTROL(PLAYER_ID(), FALSE) ENDIF DISABLE_INTERACTION_MENU() ELSE SET_PLAYER_CONTROL(PLAYER_ID(), FALSE) ENDIF hackingData.i_CircuitPassedLevelTimer = 0 CPRINTLN(DEBUG_COLIN, "Circuit Hacking: REQUEST_ASSETS_CIRCUIT_HACKING_MINIGAME() - CHECK 1a - Tutorial Levels Assets Loaded") hackingData.e_CircuitHackingMinigameState = CHMS_LAUNCHING CPRINTLN(DEBUG_COLIN, "Circuit Hacking: REQUEST_ASSETS_CIRCUIT_HACKING_MINIGAME() - CHECK 2a - Moving to Stage: CHMS_LAUNCHING") ENDIF ELSE REQUEST_STREAMED_TEXTURE_DICT("MPCircuitHack3") IF HAS_STREAMED_TEXTURE_DICT_LOADED("MPCircuitHack") AND HAS_STREAMED_TEXTURE_DICT_LOADED("MPCircuitHack3") AND HAS_SCALEFORM_MOVIE_LOADED(sfHacking) AND REQUEST_SCRIPT_AUDIO_BANK("DLC_MPHEIST/HEIST_HACK_SNAKE") // DISABLE PLAYER CONTROL IF NETWORK_IS_GAME_IN_PROGRESS() IF IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_ALLOW_DAMAGE) NET_SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, NSPC_ALLOW_PLAYER_DAMAGE) ELSE NET_SET_PLAYER_CONTROL(PLAYER_ID(), FALSE) ENDIF DISABLE_INTERACTION_MENU() ELSE SET_PLAYER_CONTROL(PLAYER_ID(), FALSE) ENDIF hackingData.i_CircuitPassedLevelTimer = 0 CPRINTLN(DEBUG_COLIN, "Circuit Hacking: REQUEST_ASSETS_CIRCUIT_HACKING_MINIGAME() - CHECK 1b - Finale Levels Assets Loaded") hackingData.e_CircuitHackingMinigameState = CHMS_LAUNCHING CPRINTLN(DEBUG_COLIN, "Circuit Hacking: REQUEST_ASSETS_CIRCUIT_HACKING_MINIGAME() - CHECK 2b - Moving to Stage: CHMS_LAUNCHING") ENDIF ENDIF ELSE // DEBUG LOAD ALL ASSETS FOR ALL LEVELS REQUEST_STREAMED_TEXTURE_DICT("MPCircuitHack") REQUEST_STREAMED_TEXTURE_DICT("MPCircuitHack2") REQUEST_STREAMED_TEXTURE_DICT("MPCircuitHack3") sfHacking = REQUEST_SCALEFORM_MOVIE("HACKING_MESSAGE") REQUEST_SCRIPT_AUDIO_BANK("DLC_MPHEIST/HEIST_HACK_SNAKE") IF HAS_STREAMED_TEXTURE_DICT_LOADED("MPCircuitHack") AND HAS_STREAMED_TEXTURE_DICT_LOADED("MPCircuitHack2") AND HAS_STREAMED_TEXTURE_DICT_LOADED("MPCircuitHack3") AND HAS_SCALEFORM_MOVIE_LOADED(sfHacking) AND REQUEST_SCRIPT_AUDIO_BANK("DLC_MPHEIST/HEIST_HACK_SNAKE") // DISABLE PLAYER CONTROL IF NETWORK_IS_GAME_IN_PROGRESS() NET_SET_PLAYER_CONTROL(PLAYER_ID(), FALSE) DISABLE_INTERACTION_MENU() ELSE SET_PLAYER_CONTROL(PLAYER_ID(), FALSE) ENDIF hackingData.i_CircuitPassedLevelTimer = 0 CPRINTLN(DEBUG_COLIN, "Circuit Hacking: REQUEST_ASSETS_CIRCUIT_HACKING_MINIGAME() - CHECK 1c - All Levels Assets Loaded") hackingData.e_CircuitHackingMinigameState = CHMS_LAUNCHING CPRINTLN(DEBUG_COLIN, "Circuit Hacking: REQUEST_ASSETS_CIRCUIT_HACKING_MINIGAME() - CHECK 2c - Moving to Stage: CHMS_LAUNCHING") ENDIF ENDIF ENDPROC /// PURPOSE: /// Launches the phone camera app to fill the screen before starting the Circuit Hacking minigame /// PARAMS: /// &hackingData - STRUCT: Hacking data struct PROC LAUNCH_PHONE_CIRCUIT_HACKING_MINIGAME(S_HACKING_DATA &hackingData, BOOL b_UseDifficultLevels, BOOL bHeist2) CPRINTLN(DEBUG_GOLF, "Circuit Hacking: RUN_CIRCUIT_HACKING_MINIGAME() - RUN CHECK 3 - Game state = CHMS_LAUNCHING") // DISABLE PlAYER ABILITY TO LAUNCH PHONE MANUALLY #IF IS_NEXTGEN_BUILD DISABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_FRONTEND_UP) #ENDIF #IF NOT IS_NEXTGEN_BUILD DISABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_UP) #ENDIF // DISABLE ENTER/EXIT VEHICLE UNTIL PHONE HAS LAUNCHED DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT) // CARRY OUT MINIGAME CELLPHONE LAUNCH IF VEHICLE IS UPRIGHT IF CHECK_IS_CIRCUIT_HACKING_PLAYER_IN_UPRIGHT_VEHICLE(hackingData) IF DO_CIRCUIT_MINIGAME_LAUNCH_PHONE_INTRO(hackingData) <> LS_WORKING CPRINTLN(DEBUG_COLIN, "Circuit Hacking: RUN_CIRCUIT_HACKING_MINIGAME() - CHECK 1 - Launch Finished") // UPDATE DISPLAY FOR ONE FRAME DELAY BETWEEN HAND OVER TO THE MAIN RUNNING LOOP UPDATE_GAME_DISPLAY_CIRCUIT_HACKING_MINIGAME(hackingData, b_UseDifficultLevels, TRUE, bHeist2 #IF IS_DEBUG_BUILD, IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_DRAW_WALLS) #ENDIF ) // INITIALISE VARIABLES START_AUDIO_SCENE("DLC_HEISTS_SNAKE_HACKING_SCENE") CPRINTLN(DEBUG_COLIN, "Circuit Hacking: RUN_CIRCUIT_HACKING_MINIGAME() - CHECK 2 - Audio Scene Started") // BACKGROUND AUDIO PLAY_SOUND_FRONTEND(hackingData.i_node, "Background", "DLC_HEIST_HACKING_SNAKE_SOUNDS") CPRINTLN(DEBUG_COLIN, "Circuit Hacking: RUN_CIRCUIT_HACKING_MINIGAME() - CHECK 3 - Background Audio Started") // SET DELAY TIMER hackingData.i_CircuitPassedLevelTimer = GET_GAME_TIMER() // HANDLES DEBUG TEXT ON LEFT SIDE OF SCREEN START_DEBUG_OUTPUT_SPEW_TIMER(hackingData) CPRINTLN(DEBUG_COLIN, "Circuit Hacking: RUN_CIRCUIT_HACKING_MINIGAME() - CHECK 4 - Debug Output Spew Started") // SAFE FOR LOCAL PLAYER PED TO USE PHONE TASK SET_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_SAFE_TO_USE_PHONE) // MOVE TO MAIN GAME LOOP hackingData.e_CircuitHackingMinigameState = CHMS_RUNNING CPRINTLN(DEBUG_COLIN, "Circuit Hacking: RUN_CIRCUIT_HACKING_MINIGAME() - CHECK 5 - Moving to Stage: CHMS_RUNNING") ENDIF ENDIF ENDPROC /// PURPOSE: /// Runs the display and logic update loop for Circuit Hacking minigame /// PARAMS: /// &hackingData - STRUCT: Hacking data struct PROC RUN_MAIN_LOOP_CIRCUIT_HACKING_MINIGAME(S_HACKING_DATA &hackingData, BOOL b_UseDifficultLevels, BOOL bHeists2) CPRINTLN(DEBUG_GOLF, "Circuit Hacking: RUN_MAIN_LOOP_CIRCUIT_HACKING_MINIGAME() - RUN CHECK 4 - Game state = CHMS_RUNNING") IF NOT IS_PAUSE_MENU_ACTIVE() //UPDATE GAME LOGIC UPDATE_GAME_LOGIC_CIRCUIT_HACKING_MINIGAME(hackingData, bHeists2) // UPDATE DISPLAY UPDATE_GAME_DISPLAY_CIRCUIT_HACKING_MINIGAME(hackingData, b_UseDifficultLevels, TRUE, bHeists2 #IF IS_DEBUG_BUILD, IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_DRAW_WALLS) #ENDIF ) // DRAW SCAN LINES DRAW_CIRCUIT_HACKING_SCALEFORM() // DISPLAY INGAME HELP TEXT IF (GET_GAME_TIMER() - hackingData.i_CircuitPassedLevelTimer) > 500 hackingData.i_CircuitPassedLevelTimer = 0 IF FM_EVENT_GET_VARIATION_PLAYER_IS_ON(PLAYER_ID(), FMMC_TYPE_SUPER_BUSINESS_BATTLES) = ENUM_TO_INT(BBCV_FACTORY_RAID) #IF IS_NEXTGEN_BUILD IF NOT IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_MOVE_HEAD) IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL) PRINT_HELP_FOREVER("CIRC_HACK_1_KM") ELSE PRINT_HELP_FOREVER("CIRC_HACK_1") ENDIF ELSE IF (IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL) AND IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("CIRC_HACK_1_KM")) OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("CIRC_HACK_1") CLEAR_HELP() ENDIF ENDIF #ENDIF #IF NOT IS_NEXTGEN_BUILD PRINT_HELP_FOREVER("CIRC_HACK_1") #ENDIF ELSE #IF IS_NEXTGEN_BUILD IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL) DISPLAY_HELP_TEXT_THIS_FRAME("CIRC_HACK_1_KM", FALSE) ELSE DISPLAY_HELP_TEXT_THIS_FRAME("CIRC_HACK_1", FALSE) ENDIF #ENDIF #IF NOT IS_NEXTGEN_BUILD DISPLAY_HELP_TEXT_THIS_FRAME("CIRC_HACK_1", FALSE) #ENDIF ENDIF ENDIF // HANDLE PROGRESSION IF PASS/FAIL IF IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_MINIGAME_SOLVED) OR IS_BIT_SET(hackingData.bsHacking, BS_MP_HACK_FAIL) //OR hackingData.b_MP_Hack_fail hackingData.e_CircuitHackingMinigameState = CHMS_CLEANUP CPRINTLN(DEBUG_COLIN, "Circuit Hacking: RUN_MAIN_LOOP_CIRCUIT_HACKING_MINIGAME() - CHECK 1 - Moving to Stage: CHMS_CLEANUP") ENDIF ENDIF ENDPROC /// PURPOSE: /// Handles the pass screen for Circuit Hacking minigame /// PARAMS: /// &hackingData - STRUCT: Hacking data struct /// b_TestAllLevels - BOOL: Debug only. Allows to play all six levels in a row - DEBUG ONLY PROC PASS_SCREEN_CIRCUIT_HACKING_MINIGAME(S_HACKING_DATA &hackingData, BOOl b_UseDifficultLevels #IF IS_DEBUG_BUILD, BOOL b_TestAllLevels = FALSE #ENDIF ) CPRINTLN(DEBUG_GOLF, "Circuit Hacking: PASS_SCREEN_CIRCUIT_HACKING_MINIGAME() - RUN CHECK 5 - Game state = CHMS_PASS") IF NOT IS_PAUSE_MENU_ACTIVE() // UPDATE DISPLAY UPDATE_GAME_DISPLAY_CIRCUIT_HACKING_MINIGAME(hackingData, b_UseDifficultLevels, TRUE #IF IS_DEBUG_BUILD, IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_DRAW_WALLS) #ENDIF ) // DRAW SCAN LINES DRAW_CIRCUIT_HACKING_SCALEFORM() // IF LEVEL PASSED AND TIMER FINISHED IF (IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_LEVEL_PASSED) AND (GET_GAME_TIMER() - hackingData.i_CircuitPassedLevelTimer) > 1000) // SCALEFORM SETUP IF NOT IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_SCALEFORM_SET_UP) BEGIN_SCALEFORM_MOVIE_METHOD(sfHacking, "SET_DISPLAY") CPRINTLN(DEBUG_COLIN, "Circuit Hacking: PASS_SCREEN_CIRCUIT_HACKING_MINIGAME() - CHECK 1 - Stage Passed - Begin Scaleform Movie Method") SWITCH hackingData.i_CircuitCurrentLevel CASE 0 // PARAM ONE - LOCK IMAGE SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(1) // PARAM TWO - LARGE TEXT SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("CIRC_COMP") // PARAM THREE - SUB TEXT SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("TUT_WIN") //PARAM FOUR - COLOUR R SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(45) //PARAM FIVE - COLOUR G SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(203) //PARAM SIX - COLOUR B SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(134) //PARAM SEVEN - BOOL: TRUE FOR PASS SCREEN SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(TRUE) BREAK CASE 1 // PARAM ONE - LOCK IMAGE SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(2) // PARAM TWO - LARGE TEXT SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("CIRC_COMP") // PARAM THREE - SUB TEXT SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("TUT_WIN") //PARAM FOUR - COLOUR R SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(45) //PARAM FIVE - COLOUR G SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(203) //PARAM SIX - COLOUR B SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(134) //PARAM SEVEN - BOOL: TRUE FOR PASS SCREEN SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(TRUE) BREAK CASE 2 // PARAM ONE - LOCK IMAGE SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(3) // PARAM TWO - LARGE TEXT SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("CIRC_COMP") // PARAM THREE - SUB TEXT SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("TUT_WIN") //PARAM FOUR - COLOUR R SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(45) //PARAM FIVE - COLOUR G SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(203) //PARAM SIX - COLOUR B SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(134) //PARAM SEVEN - BOOL: TRUE FOR PASS SCREEN SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(TRUE) BREAK CASE 3 // PARAM ONE - LOCK IMAGE SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(1) // PARAM TWO - LARGE TEXT SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("CIRC_COMP") // PARAM THREE - SUB TEXT SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("FIN_WIN") //PARAM FOUR - COLOUR R SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(45) //PARAM FIVE - COLOUR G SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(203) //PARAM SIX - COLOUR B SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(134) //PARAM SEVEN - BOOL: TRUE FOR PASS SCREEN SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(TRUE) BREAK CASE 4 // PARAM ONE - LOCK IMAGE SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(2) // PARAM TWO - LARGE TEXT SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("CIRC_COMP") // PARAM THREE - SUB TEXT SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("FIN_WIN") //PARAM FOUR - COLOUR R SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(45) //PARAM FIVE - COLOUR G SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(203) //PARAM SIX - COLOUR B SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(134) //PARAM SEVEN - BOOL: TRUE FOR PASS SCREEN SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(TRUE) BREAK CASE 5 // PARAM ONE - LOCK IMAGE SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(3) // PARAM TWO - LARGE TEXT SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("CIRC_COMP") // PARAM THREE - SUB TEXT SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("FIN_WIN") //PARAM FOUR - COLOUR R SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(45) //PARAM FIVE - COLOUR G SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(203) //PARAM SIX - COLOUR B SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(134) //PARAM SEVEN - BOOL: TRUE FOR PASS SCREEN SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(TRUE) BREAK ENDSWITCH END_SCALEFORM_MOVIE_METHOD() SET_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_SCALEFORM_SET_UP) ENDIF IF NOT IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_PLAY_PASS_AUDIO) SET_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_PLAY_PASS_AUDIO) // PLAY CRASH AUDIO PLAY_SOUND_FRONTEND(-1, "Success", "DLC_HEIST_HACKING_SNAKE_SOUNDS") ENDIF // CHECK IF WE'RE FINISHED TUTORIAL LEVELS IF hackingData.i_CircuitCurrentLevel = 2 #IF IS_DEBUG_BUILD AND NOT b_TestAllLevels #ENDIF CPRINTLN(DEBUG_COLIN, "Circuit Hacking: PASS_SCREEN_CIRCUIT_HACKING_MINIGAME() - CHECK 2 - Finished Tutorial Levels") // SET DELAT TIMER hackingData.i_WinScreenDelay = GET_GAME_TIMER() // MOVE TO TUTORIAL FINISHED STATE hackingData.e_CircuitHackingMinigameState = CHMS_FINISHED_TUTORIAL CPRINTLN(DEBUG_COLIN, "Circuit Hacking: PASS_SCREEN_CIRCUIT_HACKING_MINIGAME() - CHECK 3 - Moving to Stage: CHMS_FINISHED_TUTORIAL") // EXIT HERE SO INPUT ISN'T REGISTERED BELOW EXIT // CHECK IF WE'RE FINISHED FINALE LEVELS ELIF hackingData.i_CircuitCurrentLevel = 5 // IF WIN DELAY IS OVER IF (GET_GAME_TIMER() - hackingData.i_CircuitPassedLevelTimer) > 3000 IF (IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT) #IF IS_NEXTGEN_BUILD OR (IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL) AND IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_ACCEPT)) #ENDIF OR ((GET_GAME_TIMER() - hackingData.i_CircuitPassedLevelTimer) > 25000)) CPRINTLN(DEBUG_COLIN, "Circuit Hacking: PASS_SCREEN_CIRCUIT_HACKING_MINIGAME() - CHECK 4 - Finished Finale Levels") // SET DELAY TIMER hackingData.i_WinScreenDelay = GET_GAME_TIMER() // PLAY FINALE LEVEL COMPLETED INPUT ACCEPTED SOUND PLAY_SOUND_FRONTEND(-1, "Click", "DLC_HEIST_HACKING_SNAKE_SOUNDS") // MOVE TO SYSTEM HACKED STATE hackingData.e_CircuitHackingMinigameState = CHMS_SYSTEM_HACKED CPRINTLN(DEBUG_COLIN, "Circuit Hacking: PASS_SCREEN_CIRCUIT_HACKING_MINIGAME() - CHECK 5 - Moving to Stage: CHMS_SYSTEM_HACKED") // EXIT HERE SO INPUT ISN'T REGISTERED BELOW EXIT ENDIF ENDIF ENDIF // IF WE HAVE MORE LEVELS TO PLAY IF NOT IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_MINIGAME_SOLVED) IF (GET_GAME_TIMER() - hackingData.i_CircuitPassedLevelTimer) > 3000 // DISPLAY PASS HELP TEXT #IF IS_NEXTGEN_BUILD IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL) DISPLAY_HELP_TEXT_THIS_FRAME("CIRC_HACK_2_KM", FALSE) ELSE DISPLAY_HELP_TEXT_THIS_FRAME("CIRC_HACK_2", FALSE) ENDIF #ENDIF #IF NOT IS_NEXTGEN_BUILD DISPLAY_HELP_TEXT_THIS_FRAME("CIRC_HACK_2", FALSE) #ENDIF // HAS PLAYER PRESS ACCEPT IF (IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT) #IF IS_NEXTGEN_BUILD OR (IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL) AND IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_ACCEPT)) #ENDIF OR ((GET_GAME_TIMER() - hackingData.i_CircuitPassedLevelTimer) > 25000)) //MOVE ON TO NEXT LEVEL hackingData.i_CircuitCurrentLevel++ // RESET NUM TIMES DIED - i_lives BORROWED FROM ADAM IF hackingData.i_CircuitCurrentLevel >= 3 hackingData.i_lives = 0 CPRINTLN(DEBUG_COLIN, "Circuit Hacking: PASS_SCREEN_CIRCUIT_HACKING_MINIGAME() - CHECK 6 - Reset Deaths to 0") ENDIF // PLAY PASS INPUT ACCEPTED SOUND PLAY_SOUND_FRONTEND(-1, "Click", "DLC_HEIST_HACKING_SNAKE_SOUNDS") // INITIALISE NEXT LEVEL INITIALISE_CIRCUIT_MINIGAME_LEVEL(hackingData, hackingData.i_CircuitCurrentLevel) // RESET THE MINIGAME CIRCUIT_MINIGAME_RESET(hackingData, TRUE, FALSE, TRUE, FALSE) // RESTART DEBUG SPEW START_DEBUG_OUTPUT_SPEW_TIMER(hackingData) CPRINTLN(DEBUG_COLIN, "Circuit Hacking: PASS_SCREEN_CIRCUIT_HACKING_MINIGAME() - CHECK 7 - Moving to Stage: CHMS_RUNNING") ENDIF ENDIF ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// Handles the fail screen for Circuit Hacking minigame /// PARAMS: /// &hackingData - STRUCT: Hacking data struct PROC FAIL_SCREEN_CIRCUIT_HACKING_MINIGAME(S_HACKING_DATA &hackingData, BOOL b_UseDifficultLevels) CPRINTLN(DEBUG_GOLF, "Circuit Hacking: FAIL_SCREEN_CIRCUIT_HACKING_MINIGAME() - RUN CHECK 6 - Game state = CHMS_FAIL") IF NOT IS_PAUSE_MENU_ACTIVE() // UPDATE DISPLAY UPDATE_GAME_DISPLAY_CIRCUIT_HACKING_MINIGAME(hackingData, b_UseDifficultLevels, TRUE #IF IS_DEBUG_BUILD, IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_DRAW_WALLS) #ENDIF ) // DRAW SCAN LINES DRAW_CIRCUIT_HACKING_SCALEFORM() // HANDLE SNAKE DEATH ANIM IF IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_KILL_SCREEN) CPRINTLN(DEBUG_COLIN, "Circuit Hacking: FAIL_SCREEN_CIRCUIT_HACKING_MINIGAME() - CHECK 1 - Kill Screen") // HANDLE SPARK ANIM IF hackingData.s_SnakeData.i_SparkAlpha >= 15 hackingData.s_SnakeData.f_SparkWidth = hackingData.s_SnakeData.f_SparkWidth +@ 0.05 FLOAT f_height f_height = hackingData.s_SnakeData.f_SparkWidth * hackingData.f_CurrentAspectRatio hackingData.s_SnakeData.i_SparkAlpha = ROUND(hackingData.s_SnakeData.i_SparkAlpha -@ 255) // DRAW SPARK DRAW_SPRITE("MPCircuitHack", "Spark", (0.5 - ((0.5 - hackingdata.s_SnakeData.f_CenterX) * hackingData.f_AspectRatioModifier)), hackingdata.s_SnakeData.f_CenterY, hackingData.s_SnakeData.f_SparkWidth * hackingData.f_AspectRatioModifier, f_height, hackingdata.s_SnakeData.f_HeadRotation, 255, 255, 255, hackingData.s_SnakeData.i_SparkAlpha) ENDIF // FADE OUT SNAKE IF hackingData.s_SnakeData.i_Alpha > 0 hackingData.s_SnakeData.i_Alpha = ROUND(hackingData.s_SnakeData.i_Alpha -@ 240) ENDIF // WHEN SNAKE FADED ENOUGH IF hackingData.s_SnakeData.i_Alpha < 5 hackingData.s_SnakeData.i_Alpha = 0 CLEAR_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_KILL_SCREEN) ENDIF ELSE IF NOT IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_PLAY_FAIL_AUDIO) SET_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_PLAY_FAIL_AUDIO) // PLAY CRASH AUDIO PLAY_SOUND_FRONTEND(-1, "Failure", "DLC_HEIST_HACKING_SNAKE_SOUNDS") ENDIF // SCALEFORM SETUP IF NOT IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_SCALEFORM_SET_UP) BEGIN_SCALEFORM_MOVIE_METHOD(sfHacking, "SET_DISPLAY") CPRINTLN(DEBUG_COLIN, "Circuit Hacking: FAIL_SCREEN_CIRCUIT_HACKING_MINIGAME() - CHECK 2 - Begin Scaleform Movie Method") SWITCH hackingData.i_CircuitCurrentLevel CASE 0 // PARAM ONE - LOCK IMAGE SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(0) // PARAM TWO - LARGE TEXT SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("CIRC_FAIL") // PARAM THREE - SUB TEXT SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("TUT_FAIL") //PARAM FOUR - COLOUR R SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(188) //PARAM FIVE - COLOUR G SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(49) //PARAM SIX - COLOUR B SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(43) //PARAM SEVEN - BOOL: FALSE FOR FAIL SCREEN SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(FALSE) BREAK CASE 1 // PARAM ONE - LOCK IMAGE SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(1) // PARAM TWO - LARGE TEXT SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("CIRC_FAIL") // PARAM THREE - SUB TEXT SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("TUT_FAIL") //PARAM FOUR - COLOUR R SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(188) //PARAM FIVE - COLOUR G SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(49) //PARAM SIX - COLOUR B SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(43) //PARAM SEVEN - BOOL: FALSE FOR FAIL SCREEN SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(FALSE) BREAK CASE 2 // PARAM ONE - LOCK IMAGE SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(2) // PARAM TWO - LARGE TEXT SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("CIRC_FAIL") // PARAM THREE - SUB TEXT SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("TUT_FAIL") //PARAM FOUR - COLOUR R SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(188) //PARAM FIVE - COLOUR G SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(49) //PARAM SIX - COLOUR B SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(43) //PARAM SEVEN - BOOL: FALSE FOR FAIL SCREEN SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(FALSE) BREAK CASE 3 // PARAM ONE - LOCK IMAGE SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(0) // PARAM TWO - LARGE TEXT SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("CIRC_FAIL") // PARAM THREE - SUB TEXT SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("FIN_FAIL") //PARAM FOUR - COLOUR R SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(188) //PARAM FIVE - COLOUR G SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(49) //PARAM SIX - COLOUR B SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(43) //PARAM SEVEN - BOOL: FALSE FOR FAIL SCREEN SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(FALSE) BREAK CASE 4 // PARAM ONE - LOCK IMAGE SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(1) // PARAM TWO - LARGE TEXT SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("CIRC_FAIL") // PARAM THREE - SUB TEXT SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("FIN_FAIL") //PARAM FOUR - COLOUR R SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(188) //PARAM FIVE - COLOUR G SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(49) //PARAM SIX - COLOUR B SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(43) //PARAM SEVEN - BOOL: FALSE FOR FAIL SCREEN SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(FALSE) BREAK CASE 5 // PARAM ONE - NUM OPEN LOCKS SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(2) // PARAM TWO - LARGE TEXT SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("CIRC_FAIL") // PARAM THREE - SUB TEXT SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("FIN_FAIL") //PARAM FOUR - COLOUR R SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(188) //PARAM FIVE - COLOUR G SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(49) //PARAM SIX - COLOUR B SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(43) //PARAM SEVEN - BOOL: FALSE FOR FAIL SCREEN SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(FALSE) BREAK ENDSWITCH END_SCALEFORM_MOVIE_METHOD() SET_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_SCALEFORM_SET_UP) ENDIF // IF FAIL DELAY FINSIHED IF (GET_GAME_TIMER() - hackingData.i_CircuitPassedLevelTimer) > 2000 // DISPLAY FAIL HELP TEXT #IF IS_NEXTGEN_BUILD IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL) DISPLAY_HELP_TEXT_THIS_FRAME("CIRC_HACK_3_KM", FALSE) ELSE DISPLAY_HELP_TEXT_THIS_FRAME("CIRC_HACK_3", FALSE) ENDIF #ENDIF #IF NOT IS_NEXTGEN_BUILD DISPLAY_HELP_TEXT_THIS_FRAME("CIRC_HACK_3", FALSE) #ENDIF // HAS PLAYER PRESSED ACCEPT IF (IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT) #IF IS_NEXTGEN_BUILD OR (IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL) AND IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_ACCEPT)) #ENDIF OR ((GET_GAME_TIMER() - hackingData.i_CircuitPassedLevelTimer) > 25000)) // RESET SNAKE POSITION AND START DIRECTION hackingData.s_SnakeData.i_Direction = hackingData.s_SnakeData.i_StartDirection hackingData.s_SnakeData.f_CenterX = hackingData.s_SnakeData.f_StartX hackingData.s_SnakeData.f_CenterY = hackingData.s_SnakeData.f_StartY // PLAY FAIL INPUT ACCEPTED SOUND PLAY_SOUND_FRONTEND(-1, "Click", "DLC_HEIST_HACKING_SNAKE_SOUNDS") // INCREMENT NUM TIMES DIED - BORROWED FROM ADAM IF hackingData.i_CircuitCurrentLevel >= 3 hackingData.i_lives++ CPRINTLN(DEBUG_COLIN, "Circuit Hacking: FAIL_SCREEN_CIRCUIT_HACKING_MINIGAME() - CHECK 3 - Increasing Lives by 1") ENDIF // SETTING LEVEL FAILED STAT BIT IF NOT IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_LEVEL_FAILED) SET_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_LEVEL_FAILED) CPRINTLN(DEBUG_COLIN, "Circuit Hacking: FAIL_SCREEN_CIRCUIT_HACKING_MINIGAME() - CHECK 4 - Setting BIT_SET_CIRCUIT_LEVEL_FAILED Bit") ENDIF // RESET MINIGAME CIRCUIT_MINIGAME_RESET(hackingData, TRUE, TRUE, FALSE, FALSE) CPRINTLN(DEBUG_COLIN, "Circuit Hacking: FAIL_SCREEN_CIRCUIT_HACKING_MINIGAME() - CHECK 5 - Replaying Level: ", hackingData.i_CircuitCurrentLevel) CPRINTLN(DEBUG_COLIN, "Circuit Hacking: FAIL_SCREEN_CIRCUIT_HACKING_MINIGAME() - CHECK 6 - Moving to Stage: CHMS_RUNNING") ENDIF ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// Handles tutorial levels finish screen for Circuit Hacking minigame /// PARAMS: /// &hackingData - STRUCT: Hacking data struct PROC FINISHED_TUTORIAL_LEVELS_CIRCUIT_HACKING_MINIGAME(S_HACKING_DATA &hackingData, BOOL b_UseDifficultLevels) CPRINTLN(DEBUG_GOLF, "Circuit Hacking: FINISHED_TUTORIAL_LEVELS_CIRCUIT_HACKING_MINIGAME() - RUN CHECK 7 - Game state = CHMS_FINISHED_TUTORIAL") IF NOT IS_PAUSE_MENU_ACTIVE() // UPDATE DISPLAY UPDATE_GAME_DISPLAY_CIRCUIT_HACKING_MINIGAME(hackingData, b_UseDifficultLevels, TRUE #IF IS_DEBUG_BUILD, IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_DRAW_WALLS) #ENDIF ) // DRAW SCAN LINES DRAW_CIRCUIT_HACKING_SCALEFORM() // SCALEFORM SETUP IF NOT IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_SCALEFORM_SET_UP) BEGIN_SCALEFORM_MOVIE_METHOD(sfHacking, "SET_DISPLAY") CPRINTLN(DEBUG_COLIN, "Circuit Hacking: FINISHED_TUTORIAL_LEVELS_CIRCUIT_HACKING_MINIGAME() - CHECK 1 - Begin Scaleform Movie Method") // PARAM ONE - LOCK IMAGE SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(3) // PARAM TWO - LARGE TEXT SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("CIRC_COMP") // PARAM THREE - SUB TEXT SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("TUT_WIN") //PARAM FOUR - COLOUR R SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(45) //PARAM FIVE - COLOUR G SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(203) //PARAM SIX - COLOUR B SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(134) //PARAM SEVEN - BOOL: TRUE FOR PASS SCREEN SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(TRUE) END_SCALEFORM_MOVIE_METHOD() SET_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_SCALEFORM_SET_UP) ENDIF // IF WIN DELAY FINISHED IF (GET_GAME_TIMER() - hackingData.i_WinScreenDelay) > 7000 IF NOT IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_MINIGAME_SOLVED) CPRINTLN(DEBUG_COLIN, "Circuit Hacking: FINISHED_TUTORIAL_LEVELS_CIRCUIT_HACKING_MINIGAME() - CHECK 2 - Setting Minigame Finished") // CLEAR HELP IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("CIRC_HACK_2") CLEAR_HELP(TRUE) ENDIF #IF IS_NEXTGEN_BUILD IF IS_PC_VERSION() IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("CIRC_HACK_2_KM") CLEAR_HELP(TRUE) ENDIF ENDIF #ENDIF // STOP BACKGROUND AUDIO STOP_SOUND(hackingData.i_node) // SET MINIGAME SOLVED CPRINTLN(DEBUG_COLIN, "Circuit Hacking: FINISHED_TUTORIAL_LEVELS_CIRCUIT_HACKING_MINIGAME() - CHECK 3 - Setting MINIGAME_SOLVED Bit") SET_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_MINIGAME_SOLVED) // RESET GAME RUNNING BIT IF IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_GAME_RUNNING) CLEAR_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_GAME_RUNNING) CPRINTLN(DEBUG_COLIN, "Circuit Hacking: FINISHED_TUTORIAL_LEVELS_CIRCUIT_HACKING_MINIGAME() - CHECK 4 - Clearing BIT_SET_CIRCUIT_GAME_RUNNNIG Bit") ENDIF ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// Handles Finale levels System Unlocked finish screen for Circuit Hacking minigame /// PARAMS: /// &hackingData - STRUCT: Hacking data struct PROC SYSTEM_HACKED_SCREEN_CIRCUIT_HACKING_MINIGAME(S_HACKING_DATA &hackingData, BOOL b_UseDifficultLevels, BOOL bHeists2 = FALSE) CPRINTLN(DEBUG_GOLF, "Circuit Hacking: SYSTEM_HACKED_SCREEN_CIRCUIT_HACKING_MINIGAME() - RUN CHECK 8 - Game state = CHMS_SYSTEM_HACKED") IF NOT IS_PAUSE_MENU_ACTIVE() // RESETS THE SCALEFORM FROM THE LAST PASS SCREEN (STOPS FRAME POP) IF NOT IS_BIT_SET(hackingData.i_Circuitbitset, BIT_SET_CIRCUIT_SCALEFORM_RESET) SET_BIT(hackingData.i_Circuitbitset, BIT_SET_CIRCUIT_SCALEFORM_RESET) // RESET SCALEFORM SETUP BIT IF IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_SCALEFORM_SET_UP) CLEAR_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_SCALEFORM_SET_UP) ENDIF // RESET SCALEFORM BEGIN_SCALEFORM_MOVIE_METHOD(sfHacking, "SET_DISPLAY") SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(-1) END_SCALEFORM_MOVIE_METHOD() ENDIF // UPDATE BACKGROUND SPRITE IF !bHeists2 DRAW_SPRITE("MPCircuitHack", "CBFinalScreen", 0.5, 0.5, 1.0 * hackingData.f_AspectRatioModifier, 1.0, 0.0, 255, 255, 255, 255) ELSE // UPDATE DISPLAY UPDATE_GAME_DISPLAY_CIRCUIT_HACKING_MINIGAME(hackingData, b_UseDifficultLevels, TRUE, bHeists2 #IF IS_DEBUG_BUILD, IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_DRAW_WALLS) #ENDIF ) ENDIF // CORE LIGHT VARIABLES FLOAT f_CoreLightWidth = 0.01 FLOAT f_CoreLightHeight = f_CoreLightWidth * hackingData.f_CurrentAspectRatio FLOAT f_FadeValue = 700.0 // IF SHOULD NOT DRAW SYSTEM UNLOCKED IF NOT IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_DRAW_SYS_UNLOCKED) // IF NOT DROPPING CORE LIGHTS IF NOT IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_DROP_CORE_LIGHTS) // IF DELAY FINAIHED IF (GET_GAME_TIMER() - hackingData.i_WinScreenDelay) > 1000 // PLAY POWER DOWN AUDIO PLAY_SOUND_FRONTEND(-1, "Power_Down", "DLC_HEIST_HACKING_SNAKE_SOUNDS") // SET DROP CORE LIGHTS SET_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_DROP_CORE_LIGHTS) // SET DELAY TIMER hackingData.i_WinScreenDelay = GET_GAME_TIMER() ENDIF // DRAW RED CORE LIGHTS - FULL ALPHA DRAW_SPRITE("MPCircuitHack", "Light", (0.5 - ((0.5 - 0.3117) * hackingData.f_AspectRatioModifier)), 0.6995, f_CoreLightWidth * hackingData.f_AspectRatioModifier, f_CoreLightHeight, 0.0, 188, 49, 43, hackingData.s_SnakeData.i_CoreLightOneColourA) DRAW_SPRITE("MPCircuitHack", "Light", (0.5 - ((0.5 - 0.3230) * hackingData.f_AspectRatioModifier)), 0.6995, f_CoreLightWidth * hackingData.f_AspectRatioModifier, f_CoreLightHeight, 0.0, 188, 49, 43, hackingData.s_SnakeData.i_CoreLightTwoColourA) DRAW_SPRITE("MPCircuitHack", "Light", (0.5 - ((0.5 - 0.3340) * hackingData.f_AspectRatioModifier)), 0.6995, f_CoreLightWidth * hackingData.f_AspectRatioModifier, f_CoreLightHeight, 0.0, 188, 49, 43, hackingData.s_SnakeData.i_CoreLightThreeColourA) DRAW_SPRITE("MPCircuitHack", "Light", (0.5 - ((0.5 - 0.3450) * hackingData.f_AspectRatioModifier)), 0.6995, f_CoreLightWidth * hackingData.f_AspectRatioModifier, f_CoreLightHeight, 0.0, 188, 49, 43, hackingData.s_SnakeData.i_CoreLightFourColourA) ELSE // FADE CORE LIGHTS OUYT ON BY ONE hackingData.s_SnakeData.i_CoreLightOneColourA = ROUND(hackingData.s_SnakeData.i_CoreLightOneColourA -@ f_FadeValue) IF hackingData.s_SnakeData.i_CoreLightOneColourA <= 0 IF hackingData.s_SnakeData.i_CoreLightTwoColourA > 250 PLAY_SOUND_FRONTEND(-1, "Beep_Red", "DLC_HEIST_HACKING_SNAKE_SOUNDS") ENDIF hackingData.s_SnakeData.i_CoreLightTwoColourA = ROUND(hackingData.s_SnakeData.i_CoreLightTwoColourA -@ f_FadeValue) ENDIF IF hackingData.s_SnakeData.i_CoreLightTwoColourA <= 0 IF hackingData.s_SnakeData.i_CoreLightThreeColourA > 250 PLAY_SOUND_FRONTEND(-1, "Beep_Red", "DLC_HEIST_HACKING_SNAKE_SOUNDS") ENDIF hackingData.s_SnakeData.i_CoreLightThreeColourA = ROUND(hackingData.s_SnakeData.i_CoreLightThreeColourA -@ f_FadeValue) ENDIF IF hackingData.s_SnakeData.i_CoreLightThreeColourA <= 0 IF hackingData.s_SnakeData.i_CoreLightFourColourA > 250 PLAY_SOUND_FRONTEND(-1, "Beep_Red", "DLC_HEIST_HACKING_SNAKE_SOUNDS") hackingData.i_WinScreenDelay = 0 ENDIF hackingData.s_SnakeData.i_CoreLightFourColourA = ROUND(hackingData.s_SnakeData.i_CoreLightFourColourA -@ f_FadeValue) ENDIF // IF THE FINAL CORE LIGHT HAS FADED OUT IF hackingData.s_SnakeData.i_CoreLightFourColourA <= 0 AND hackingData.i_WinScreenDelay = 0 PLAY_SOUND_FRONTEND(-1, "Beep_Red", "DLC_HEIST_HACKING_SNAKE_SOUNDS") // SET DELAY TIMER hackingData.i_WinScreenDelay = GET_GAME_TIMER() ENDIF // DRAW LIGHTS - FADING DRAW_SPRITE("MPCircuitHack", "Light", (0.5 - ((0.5 - 0.3117) * hackingData.f_AspectRatioModifier)), 0.6995, f_CoreLightWidth * hackingData.f_AspectRatioModifier, f_CoreLightHeight, 0.0, 188, 49, 43, hackingData.s_SnakeData.i_CoreLightOneColourA) DRAW_SPRITE("MPCircuitHack", "Light", (0.5 - ((0.5 - 0.3230) * hackingData.f_AspectRatioModifier)), 0.6995, f_CoreLightWidth * hackingData.f_AspectRatioModifier, f_CoreLightHeight, 0.0, 188, 49, 43, hackingData.s_SnakeData.i_CoreLightTwoColourA) DRAW_SPRITE("MPCircuitHack", "Light", (0.5 - ((0.5 - 0.3340) * hackingData.f_AspectRatioModifier)), 0.6995, f_CoreLightWidth * hackingData.f_AspectRatioModifier, f_CoreLightHeight, 0.0, 188, 49, 43, hackingData.s_SnakeData.i_CoreLightThreeColourA) DRAW_SPRITE("MPCircuitHack", "Light", (0.5 - ((0.5 - 0.3450) * hackingData.f_AspectRatioModifier)), 0.6995, f_CoreLightWidth * hackingData.f_AspectRatioModifier, f_CoreLightHeight, 0.0, 188, 49, 43, hackingData.s_SnakeData.i_CoreLightFourColourA) // IF THE FINAL CORE LIGHT HAS FADED OUT & DELAY TIMER FINISHED IF hackingData.s_SnakeData.i_CoreLightFourColourA <= 0 AND (GET_GAME_TIMER() - hackingData.i_WinScreenDelay) > 500 // PLAY AUDIO PLAY_SOUND_FRONTEND(-1, "Beep_Green", "DLC_HEIST_HACKING_SNAKE_SOUNDS") // SET DELAY TIMER hackingData.i_WinScreenDelay = GET_GAME_TIMER() // SET ALLOW TO DRAW SYSTEM UNLOCKED SET_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_DRAW_SYS_UNLOCKED) ENDIF ENDIF ELSE IF !bHeists2 // DRAW GREEN CORE LIGHTS DRAW_SPRITE("MPCircuitHack", "Light", (0.5 - ((0.5 - 0.3117) * hackingData.f_AspectRatioModifier)), 0.6995, f_CoreLightWidth * hackingData.f_AspectRatioModifier, f_CoreLightHeight, 0.0, 45, 203, 134, 255) DRAW_SPRITE("MPCircuitHack", "Light", (0.5 - ((0.5 - 0.3230) * hackingData.f_AspectRatioModifier)), 0.6995, f_CoreLightWidth * hackingData.f_AspectRatioModifier, f_CoreLightHeight, 0.0, 45, 203, 134, 255) DRAW_SPRITE("MPCircuitHack", "Light", (0.5 - ((0.5 - 0.3340) * hackingData.f_AspectRatioModifier)), 0.6995, f_CoreLightWidth * hackingData.f_AspectRatioModifier, f_CoreLightHeight, 0.0, 45, 203, 134, 255) DRAW_SPRITE("MPCircuitHack", "Light", (0.5 - ((0.5 - 0.3450) * hackingData.f_AspectRatioModifier)), 0.6995, f_CoreLightWidth * hackingData.f_AspectRatioModifier, f_CoreLightHeight, 0.0, 45, 203, 134, 255) ENDIF // SCALEFORM SETUP IF NOT IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_SCALEFORM_SET_UP) AND (GET_GAME_TIMER() - hackingData.i_WinScreenDelay) > 1000 BEGIN_SCALEFORM_MOVIE_METHOD(sfHacking, "SET_DISPLAY") CPRINTLN(DEBUG_COLIN, "Circuit Hacking: SYSTEM_HACKED_SCREEN_CIRCUIT_HACKING_MINIGAME() - CHECK 1 - Begin Scaleform Movie Method") // PARAM ONE - LOCK IMAGE SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(4) // PARAM TWO - LARGE TEXT SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("CIRC_HACK") // PARAM THREE - SUB TEXT SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("UNLCK_FIN") //PARAM FOUR - COLOUR R SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(45) //PARAM FIVE - COLOUR G SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(203) //PARAM SIX - COLOUR B SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(134) //PARAM SEVEN - BOOL: TRUE FOR PASS SCREEN SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(TRUE) END_SCALEFORM_MOVIE_METHOD() // SET FINISHED SCALEFORM SETUP SET_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_SCALEFORM_SET_UP) // RESET ONE SHOT AUDIO BIT IF IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_AUDIO_ONESHOT) CLEAR_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_AUDIO_ONESHOT) ENDIF // SET DELAY TIMER hackingData.i_WinScreenDelay = GET_GAME_TIMER() ENDIF // IF DELAY FINISHED IF (GET_GAME_TIMER() - hackingData.i_WinScreenDelay) > 500 IF NOT IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_AUDIO_ONESHOT) // PLAY SUCCESS AUDIO PLAY_SOUND_FRONTEND(-1, "Success", "DLC_HEIST_HACKING_SNAKE_SOUNDS") SET_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_AUDIO_ONESHOT) ENDIF ENDIF // IF DELAY TIMER FINISHED IF (GET_GAME_TIMER() - hackingData.i_WinScreenDelay) > 5000 // DISPLAY PASS HELP TEXT #IF IS_NEXTGEN_BUILD IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL) DISPLAY_HELP_TEXT_THIS_FRAME("CIRC_HACK_2_KM", FALSE) ELSE DISPLAY_HELP_TEXT_THIS_FRAME("CIRC_HACK_2", FALSE) ENDIF #ENDIF #IF NOT IS_NEXTGEN_BUILD DISPLAY_HELP_TEXT_THIS_FRAME("CIRC_HACK_2", FALSE) #ENDIF ENDIF // IF WIN DELAY FINISHED IF (((GET_GAME_TIMER() - hackingData.i_WinScreenDelay) > 12000) #IF IS_NEXTGEN_BUILD OR (((GET_GAME_TIMER() - hackingData.i_WinScreenDelay) > 3000) AND IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL) AND IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_ACCEPT)) #ENDIF OR (((GET_GAME_TIMER() - hackingData.i_WinScreenDelay) > 3000) AND IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT))) IF NOT IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_MINIGAME_SOLVED) // SET GAME SOLVED CPRINTLN(DEBUG_COLIN, "Circuit Hacking: SYSTEM_HACKED_SCREEN_CIRCUIT_HACKING_MINIGAME() - CHECK 2 - Setting MINIGAME_SOLVED Bit") SET_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_MINIGAME_SOLVED) // CLEAR HELP IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("CIRC_HACK_2") CLEAR_HELP(TRUE) ENDIF #IF IS_NEXTGEN_BUILD IF IS_PC_VERSION() IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("CIRC_HACK_2_KM") CLEAR_HELP(TRUE) ENDIF ENDIF #ENDIF // RESET SCALEFORM IF HAS_SCALEFORM_MOVIE_LOADED(sfHacking) BEGIN_SCALEFORM_MOVIE_METHOD(sfHacking, "SET_DISPLAY") SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(-1) END_SCALEFORM_MOVIE_METHOD() ENDIF // BACKGROUND AUDIO STOP_SOUND(hackingData.i_node) // PLAY HANG UP BEEP PLAY_SOUND_FRONTEND(-1, "Put_Away", "Phone_SoundSet_Michael") // CLEAR GAME RUNNING BIT IF IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_GAME_RUNNING) CLEAR_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_GAME_RUNNING) CPRINTLN(DEBUG_COLIN, "Circuit Hacking: SYSTEM_HACKED_SCREEN_CIRCUIT_HACKING_MINIGAME() - CHECK 3 - Clearing BIT_SET_CIRCUIT_GAME_RUNNING Bit") ENDIF // RESET AUDIO ONESHOT IF IS_BIT_SET(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_AUDIO_ONESHOT) CLEAR_BIT(hackingData.i_CircuitBitSet, BIT_SET_CIRCUIT_AUDIO_ONESHOT) ENDIF ENDIF ENDIF ENDIF // DRAW SCALEFORM SCAN LINES - DRAW OVER THE CORE LIGHTS DRAW_CIRCUIT_HACKING_SCALEFORM() ENDIF ENDPROC /// PURPOSE: /// Specific update procedure for Circuit Hacking minigame. /// PARAMS: /// &hackingData - STRUCT: Hacking data struct /// b_UseDifficultLevels - BOOL: Pass TRUE for the final three levels /// b_CanExitVehicle - BOOL: Pass TRUE to lock Player in a vehicle during minigame /// b_TestAllLevels - BOOL: Debug only. Allows to play all six levels in a row - DEBUG ONLY /// NOTES: /// Run every frame, initalise local hacking data struct and pass this through. PROC RUN_CIRCUIT_HACKING_MINIGAME(S_HACKING_DATA &hackingData, BOOL b_UseDifficultLevels = FALSE, BOOL b_CanExitVehicle = FALSE, BOOL bHeists2 = FALSE #IF IS_DEBUG_BUILD, BOOL b_TestAllLevels = FALSE #ENDIF ) CPRINTLN(DEBUG_GOLF, "Circuit Hacking: RUN_CIRCUIT_HACKING_MINIGAME() - RUN CHECK - Circuit Hacking Minigame Running") // HANDLES ALL UPDATES NEEDED EVERY FRAME UPDATE_PER_FRAME_CIRCUIT_HACKING_MINIGAME(hackingData, b_CanExitVehicle) // MINI GAME FLOW SWITCH hackingData.e_CircuitHackingMinigameState CASE CHMS_INITIALISE INITIALISE_CIRCUIT_HACKING_MINIGAME(hackingData, b_UseDifficultLevels) BREAK CASE CHMS_REQUEST_ASSETS REQUEST_ASSETS_CIRCUIT_HACKING_MINIGAME(hackingData, b_UseDifficultLevels #IF IS_DEBUG_BUILD, b_TestAllLevels #ENDIF ) BREAK CASE CHMS_LAUNCHING IF bHeists2 hackingData.e_CircuitHackingMinigameState = CHMS_RUNNING //Skip the phone animation if this hack is happening in its Heists 2 context ELSE LAUNCH_PHONE_CIRCUIT_HACKING_MINIGAME(hackingData, b_UseDifficultLevels, bHeists2) ENDIF BREAK CASE CHMS_RUNNING RUN_MAIN_LOOP_CIRCUIT_HACKING_MINIGAME(hackingData, b_UseDifficultLevels, bHeists2) BREAK CASE CHMS_PASS PASS_SCREEN_CIRCUIT_HACKING_MINIGAME(hackingData, b_UseDifficultLevels #IF IS_DEBUG_BUILD, b_TestAllLevels #ENDIF ) BREAK CASE CHMS_FAIL FAIL_SCREEN_CIRCUIT_HACKING_MINIGAME(hackingData, b_UseDifficultLevels) BREAK CASE CHMS_FINISHED_TUTORIAL FINISHED_TUTORIAL_LEVELS_CIRCUIT_HACKING_MINIGAME(hackingData, b_UseDifficultLevels) BREAK CASE CHMS_SYSTEM_HACKED SYSTEM_HACKED_SCREEN_CIRCUIT_HACKING_MINIGAME(hackingData, b_UseDifficultLevels, bHeists2) BREAK CASE CHMS_CLEANUP CPRINTLN(DEBUG_COLIN, "Circuit Hacking: RUN_CIRCUIT_HACKING_MINIGAME() - RUN CHECK 9 - Game state = CHMS_CLEANUP") CLEANUP_AND_QUIT_CIRCUIT_HACKING_MINIGAME(hackingData, b_UseDifficultLevels) BREAK ENDSWITCH // DEBUG UPDATES #IF IS_DEBUG_BUILD UPDATE_DEBUG_CIRCUIT_HACKING_MINIGAME(hackingData, b_UseDifficultLevels) #ENDIF ENDPROC // ################################# CIRCUIT HACKING MINIGAME - END ################################# // //SCRIPT // #IF IS_DEBUG_BUILD // CREATE_HACK_WIDGETS() // #ENDIF //ENDSCRIPT