//////////////////////////////////////////////////////////////////// // // // SCRIPT NAME : Darts.sc // // AUTHOR : Lino Manansala // // DESCRIPTION : Darts Minigame for V // // // ////////////////////////////////////////////////////////////// USING "commands_player.sch" USING "script_player.sch" USING "commands_script.sch" USING "commands_brains.sch" USING "friendactivity_public.sch" USING "net_fps_cam.sch" USING "Darts.sch" USING "Darts_Core.sch" USING "Darts_Player_lib.sch" USING "Darts_UI_lib.sch" USING "Darts_Audio.sch" USING "Darts_Args.sch" USING "Darts_Stats_lib.sch" USING "Darts_Leaderboard_lib.sch" USING "script_oddjob_funcs.sch" #IF IS_DEBUG_BUILD USING "Darts_Debug.sch" #ENDIF PED_INDEX piDartPlayers[NUM_DART_PLAYERS] BOOL bZoomCamSkip BOOL bEndGameDartZoomTrans BOOL bEndGameMessageDisplayed BOOL bBoredAudioPlayedThisTurn BOOL bOneDartAudioPlayed BOOL bAnyAudioPlayedThisTurn BOOL bOneDartHelpShown BOOL bVehicleSaved BOOL bHasQuitTextPrinted // per B* 843808 "Can we skip opponent’s turn instantly", turn this on or off for instant skips BOOL bInstantSkip = TRUE BOOL bAISkipped BOOL bDartsWon //BOOL bSubtitlesMoved BOOL bNewOpponent BOOL bGameOverSpeechPlayed BOOL bLogCompletion = FALSE BOOL bInSyncCam BOOL bFranklin BOOL bOutroRequested BOOL bOutroStreamed BOOL bActivateScoreBoard BOOL bDartsLBPredictDone BOOL bDartsLBWrite BOOL bDartsProfilesReady VEHICLE_SAVE_ARGS VehicleSaveArgs //INT iDartStartTime INT iDartZoom INT iAllowSkipCutsceneTime INT iSkipAILoopCatch INT iStaminaXP INT iLevelBit INT iSceneID INT iAnimLimit enumActivityLocation DartsLoc enumActivityResult DartsResult MODEL_NAMES modelOpponent SEQUENCE_INDEX siTemp CAMERA_INDEX camDartsSync DARTS_LOCATION DartsLocation FIRST_PERSON_CAM_STRUCT fpDartsCam VECTOR vFPDartsPos, vFPDartsRot VECTOR vRockClubSpawnPos = <<-573.1373, 294.0269, 78.1765>> VECTOR vRockClubSpawnPos2 = <<-574.1169, 292.7964, 78.1766>> VECTOR vHickBarSpawnPos = <<1995.29517, 3050.08447, 46.91535>>//<<1995.6138, 3049.8774, 46.2153>> VECTOR vHickBarSpawnPos2 = <<1995.4880, 3047.3833, 46.91535>> //<<1996.0013, 3048.4270, 46.2153>> FLOAT fRockClubHeading = 172.6813 FLOAT fRockClubHeading2 = 274.5094 FLOAT fHickBarHeading = 142.6717 FLOAT fHickBarHeading2 = 44.8785 enumCharacterList eDartsPlayerOne, eDartsPlayerTwo STRING sDartsPlayerOne, sDartsPlayerTwo INT iP2NameHash STRING sFacialDictPed STRING sFacialDictPlayer STRING sFacialClip[3] STRING sOutroWin[3] STRING sOutroLoss[3] STRING sOutroCam[3] #IF IS_DEBUG_BUILD //BOOL bDartsNoSocialClub DEBUG_POS_DATA DebugBoard SPRITE_PLACEMENT spriteDebug SCALEFORM_INDEX siScoreBoardDebug #ENDIF /// PURPOSE: /// Sets peds as no longer needed /// PARAMS: /// piDartOpp - The ped opponent to be cleaned up PROC CLEANUP_PEDS(PED_INDEX & piDartOpp) // VECTOR vRockScenPos1, vRockScenPos2, vHickScenPos1, vHickScenPos2 // vRockScenPos1 = <<-555.543640,284.138580,81.176231>> // vRockScenPos2 = <<-572.095398,286.635406,78.176636>> // vHickScenPos1 = <<1990.397827,3045.063965,46.215023>> // vHickScenPos2 = <<1985.908203,3054.239014,46.215214>> IF DOES_ENTITY_EXIST(piDartOpp) AND NOT IS_PED_INJURED(piDartOpp) CLEAR_SEQUENCE_TASK(siTemp) OPEN_SEQUENCE_TASK(siTemp) IF DOES_ENTITY_EXIST(piDartPlayers[0]) TASK_LOOK_AT_ENTITY(NULL, piDartPlayers[0], 8000, SLF_SLOW_TURN_RATE | SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_HIGH) ENDIF TASK_STAND_STILL(NULL, 1000) IF bNewOpponent IF NOT IS_BIT_SET(g_iDartsTutorialFlags, gDARTS_ALT_START_POS) TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, PICK_VECTOR((DartsLocation = DARTSLOCATION_ROCK_CLUB), vRockClubSpawnPos2, vHickBarSpawnPos2), PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_DEFAULT, PICK_FLOAT((DartsLocation = DARTSLOCATION_ROCK_CLUB), fRockClubHeading2, fHickBarHeading2)) // TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, PICK_VECTOR((DartsLocation = DARTSLOCATION_ROCK_CLUB), vRockScenPos1, vHickScenPos1), PEDMOVEBLENDRATIO_WALK, // DEFAULT_TIME_BEFORE_WARP, 1.0) // IF DOES_SCENARIO_EXIST_IN_AREA(PICK_VECTOR((DartsLocation = DARTSLOCATION_ROCK_CLUB), vRockScenPos1, vHickScenPos1), 2.0, TRUE) // TASK_USE_NEAREST_SCENARIO_TO_COORD(NULL, PICK_VECTOR((DartsLocation = DARTSLOCATION_ROCK_CLUB), vRockScenPos1, vHickScenPos1), 2.00) // ELSE // TASK_WANDER_STANDARD(NULL) // ENDIF ELSE TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, PICK_VECTOR((DartsLocation = DARTSLOCATION_ROCK_CLUB), vRockClubSpawnPos, vHickBarSpawnPos), PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_DEFAULT, PICK_FLOAT((DartsLocation = DARTSLOCATION_ROCK_CLUB), fRockClubHeading, fHickBarHeading)) ENDIF TASK_START_SCENARIO_IN_PLACE(NULL, "WORLD_HUMAN_HANG_OUT_STREET", 0, TRUE) ELSE TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, PICK_VECTOR((DartsLocation = DARTSLOCATION_ROCK_CLUB), vRockClubSpawnPos, vHickBarSpawnPos), PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_DEFAULT, PICK_FLOAT((DartsLocation = DARTSLOCATION_ROCK_CLUB), 172.6813, 142.6717)) TASK_START_SCENARIO_IN_PLACE(NULL, "WORLD_HUMAN_STAND_IMPATIENT", 0, TRUE) //"WORLD_HUMAN_DRINKING") ENDIF CLOSE_SEQUENCE_TASK(siTemp) TASK_PERFORM_SEQUENCE(piDartOpp, siTemp) SET_PED_KEEP_TASK(piDartOpp, TRUE) //SET_PED_AS_NO_LONGER_NEEDED(piDartOpp) ENDIF SET_MODEL_AS_NO_LONGER_NEEDED(modelOpponent) ENDPROC /// PURPOSE: /// Ends the dart game script /// PARAMS: /// DartGame - All the DART_GAME parts are cleaned out PROC CLEANUP_DARTS_GAME(DART_GAME & DartGame, DARTS_UI & DartsUI, END_SCREEN_DATASET & DartsEndScreen) DISPLAY_AREA_NAME(TRUE) DARTS_STATS_UPDATE(DARTS_STAT_AVG_DARTS_MATCH) // DARTS_STATS_UPDATE(DARTS_STAT_TIME_PLAYED, GET_GAME_TIMER() - iDartStartTime) CLEANUP_DARTS_PC_CONTROLS() //cleanups IF bVehicleSaved ODDJOB_RESTORE_SAVED_VEHICLE(VehicleSaveArgs) ENDIF INT iTemp1, iTemp2 REPEAT NUM_DART_PLAYERS iTemp1 REPEAT NUM_DART_TURNS iTemp2 CLEANUP_DART(DartGame.Darts[iTemp1][iTemp2]) ENDREPEAT ENDREPEAT SET_MODEL_AS_NO_LONGER_NEEDED(modelDart1) SET_MODEL_AS_NO_LONGER_NEEDED(modelDart2) IF NOT IS_PED_INJURED(piDartPlayers[0]) AND NOT IS_PED_INJURED(piDartPlayers[1]) TASK_CLEAR_LOOK_AT(piDartPlayers[0]) TASK_CLEAR_LOOK_AT(piDartPlayers[1]) ENDIF CLEANUP_RETICLE() SET_MODEL_AS_NO_LONGER_NEEDED(modelReticleRegular) CLEANUP_HUD() CLEANUP_SC_LEADERBOARD_UI(DartsUI.uiLeaderboard) CLEANUP_MG_BIG_MESSAGE(DartsUI.siBigMessage) // CLEANUP_MG_MIDSIZED_MESSAGE(DartsUI.siMidMessage) IF NOT IS_ENTITY_DEAD(FRIEND_A_PED_ID()) SET_PED_AS_GROUP_MEMBER(FRIEND_A_PED_ID(), PLAYER_GROUP_ID()) finishActivity(DartsLoc, DartsResult) ELSE CLEANUP_PEDS(piDartPlayers[1]) ENDIF DISABLE_CELLPHONE(FALSE) ENDSCREEN_SHUTDOWN(DartsEndScreen) SET_RESULT_SCREEN_DISPLAYING_STATE(FALSE) RESET_HUD_COMPONENT_VALUES(NEW_HUD_SUBTITLE_TEXT) //CLEANUP_MENU_ASSETS() IF IS_PLAYER_ONLINE() IF DartGame.bWriteToLeaderboard AND NOT bDartsLBWrite CDEBUG1LN(DEBUG_DARTS, "online, emergency writing to social club leaderboard") WRITE_DARTS_SCLB_DATA(LEADERBOARD_MINI_GAMES_DARTS,FALSE) ENDIF ENDIF CLEAR_RANK_REDICTION_DETAILS() SC_LEADERBOARD_CACHE_CLEAR_ALL() CLEANUP_SOCIAL_CLUB_LEADERBOARD(DartsUI.dartsLB_control) CDEBUG1LN(DEBUG_DARTS, "All Cleaned Up") // Put a small wait so that player doesn't throw a punch if he's exiting WAIT(200) // Log completion if need be. IF bLogCompletion REGISTER_SCRIPT_IN_COMPLETION_PERCENTAGE_TOTAL(CP_MG_DARTS) ODDJOB_AUTO_SAVE() ENDIF DISABLE_CHEAT(CHEAT_TYPE_ALL, FALSE) TERMINATE_THIS_THREAD() ENDPROC /// PURPOSE: /// Grab the necessary assets for Darts PROC REQUEST_STREAMS(DARTS_SCOREBOARD & DartsSB, DARTS_UI & DartsUI) REQUEST_MODEL(modelDart1) REQUEST_MODEL(modelDart2) REQUEST_MODEL(modelReticleRegular) REQUEST_MODEL(modelOpponent) REQUEST_STREAMED_TEXTURE_DICT("Darts") REQUEST_STREAMED_TEXTURE_DICT("ShopUI_Title_Darts") // REQUEST_ANIM_DICT("mini@dartsintro") // REQUEST_ANIM_DICT("mini@dartsintro_alt1") REQUEST_ANIM_DICT(sFacialDictPed) REQUEST_ANIM_DICT(sFacialDictPlayer) DartsSB.siScoreBoard = REQUEST_SCALEFORM_MOVIE("darts_scoreboard") DartsUI.uiLeaderboard = REQUEST_SC_LEADERBOARD_UI() DartsUI.siBigMessage.siMovie = REQUEST_MG_BIG_MESSAGE() DartsUI.siMidMessage.siMovie = REQUEST_MG_MIDSIZED_MESSAGE() #IF IS_DEBUG_BUILD siScoreBoardDebug = REQUEST_SCALEFORM_MOVIE("darts_scoreboard") #ENDIF REQUEST_ADDITIONAL_TEXT("DARTS", MINIGAME_TEXT_SLOT) ENDPROC /// PURPOSE: /// Asset loading checker /// RETURNS: /// TRUE if all the needed assets have loaded FUNC BOOL HAVE_STREAMS_LOADED(DARTS_SCOREBOARD & DartsSB, DARTS_UI & DartsUI) IF NOT REQUEST_SCRIPT_AUDIO_BANK("SCRIPT\\DARTS") CDEBUG1LN(DEBUG_DARTS, "Darts Audio loading") RETURN FALSE ENDIF IF NOT REQUEST_SCRIPT_AUDIO_BANK("SCRIPT\\FAMILY1_2") CDEBUG1LN(DEBUG_DARTS, "Family Audio loading") RETURN FALSE ENDIF IF NOT HAS_MODEL_LOADED(modelDart1) OR NOT HAS_MODEL_LOADED(modelDart2) OR NOT HAS_MODEL_LOADED(modelReticleRegular) OR NOT HAS_MODEL_LOADED(modelOpponent) OR NOT HAS_SCALEFORM_MOVIE_LOADED(DartsSB.siScoreBoard) OR NOT HAS_SCALEFORM_MOVIE_LOADED(DartsUI.uiLeaderboard) OR NOT HAS_SCALEFORM_MOVIE_LOADED(DartsUI.siBigMessage.siMovie) OR NOT HAS_SCALEFORM_MOVIE_LOADED(DartsUI.siMidMessage.siMovie) OR NOT HAS_ADDITIONAL_TEXT_LOADED(MINIGAME_TEXT_SLOT) OR NOT HAS_STREAMED_TEXTURE_DICT_LOADED("Darts") // OR NOT HAS_ANIM_DICT_LOADED("mini@dartsintro") // OR NOT HAS_ANIM_DICT_LOADED("mini@dartsintro_alt1") OR NOT HAS_ANIM_DICT_LOADED(sFacialDictPed) OR NOT HAS_ANIM_DICT_LOADED(sFacialDictPlayer) OR NOT LOAD_MENU_ASSETS() CDEBUG1LN(DEBUG_DARTS, "Streams loading") RETURN FALSE ENDIF #IF IS_DEBUG_BUILD IF NOT HAS_SCALEFORM_MOVIE_LOADED(siScoreBoardDebug) CDEBUG1LN(DEBUG_DARTS, "darts scoreboard loading") RETURN FALSE ELSE CDEBUG1LN(DEBUG_DARTS, "darts scoreboard finished") ENDIF #ENDIF RETURN TRUE ENDFUNC FUNC STRING GET_DARTS_RAVE_SCENE(DARTS_RAVE_SCENES DartsRaveScene) IF DartsLocation = DARTSLOCATION_HICK_BAR SWITCH DartsRaveScene CASE DARTSRAVE_GREETING RETURN "DARTS_MEET_OPPONENT_BAR" CASE DARTSRAVE_MENU RETURN "DARTS_MENU_BAR" CASE DARTSRAVE_MATCH RETURN "DARTS_START_MATCH_BAR" CASE DARTSRAVE_COMPLETE RETURN "DARTS_MATCH_COMPLETE_BAR" ENDSWITCH ELIF DartsLocation = DARTSLOCATION_ROCK_CLUB SWITCH DartsRaveScene CASE DARTSRAVE_GREETING RETURN "DARTS_MEET_OPPONENT_ROCK" CASE DARTSRAVE_MENU RETURN "DARTS_MENU_ROCK" CASE DARTSRAVE_MATCH RETURN "DARTS_START_MATCH_ROCK" CASE DARTSRAVE_COMPLETE RETURN "DARTS_MATCH_COMPLETE_ROCK" ENDSWITCH ENDIF RETURN "" ENDFUNC FUNC INT GET_WHICH_DARTS_OUTRO() INT iWhichOutro IF NOT bFranklin iWhichOutro = (GET_RANDOM_INT_IN_RANGE() % 3) ELSE iAnimLimit++ iWhichOutro = iAnimLimit % 2 ENDIF CDEBUG1LN(DEBUG_DARTS, "outro chosen is ", iWhichOutro) RETURN iWhichOutro ENDFUNC /// PURPOSE: /// Manages the process in which players quit Darts /// PARAMS: /// DartGame - PROC PLAYER_QUIT_CONTROL(DART_GAME & DartGame) BOOL bWaitToQuit = FALSE //BOOL bHasQuitTextPrinted = FALSE // Check to see if the player has released CROSS (just do CIRCLE too) IF NOT bNoCrossConflict IF NOT IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT) AND NOT IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL) bNoCrossConflict = TRUE ELSE bNoCrossConflict = FALSE ENDIF ENDIF IF DartGame.Stage <> STAGE_FINISHED IF bWaitToQuit IF bNoCrossConflict AND bCrossButtonReleased = FALSE bNoCrossConflict = FALSE bWaitToQuit = FALSE bHasQuitTextPrinted = FALSE CLEAR_HELP() ENDIF ENDIF IF IS_CONTROL_JUST_RELEASED(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_RIGHT) OR IS_DISABLED_CONTROL_JUST_RELEASED(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_RIGHT) CDEBUG1LN(DEBUG_DARTS, "quit just attempted") IF NOT bHasQuitTextPrinted DartGame.Stage = STAGE_PLAYER_QUIT bHasQuitTextPrinted = TRUE CLEAR_HELP() ENDIF ELSE IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("DARTS_QUIT") bWaitToQuit = TRUE ELSE bWaitToQuit = FALSE bHasQuitTextPrinted = FALSE ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// Manages if the player wants to skip some of the in-game text transitions PROC WAIT_FOR_TEXT_OR_SKIP() SETTIMERA(0) bNoCrossConflict = FALSE CLEAR_SMALL_PRINTS() ENDPROC /// PURPOSE: /// Initiate the game, scores, darts /// PARAMS: /// DartGame - FUNC BOOL DO_START_GAME(DART_GAME & DartGame, DARTS_SCOREBOARD & DartsSB, DARTS_UI & DartsUI) INT i, j // Initialise the scoreboard // Reset the player scores to 301 // Reset the number of throws and bullseyes REPEAT NUM_DART_PLAYERS i DartGame.Scores[i] = INIT_DART_SCORE DartGame.LastScore[i] = INIT_DART_SCORE //DartGame.iThrowsTaken[i] = 0 //DartGame.iBullsEyesHit[i] = 0 ENDREPEAT CDEBUG1LN(DEBUG_DARTS, "[DO_START_GAME] Scores reset") DartGame.bDartWinner = FALSE REPEAT NUM_DART_PLAYERS i REPEAT NUM_DART_TURNS j RESET_DART(DartGame.Darts[i][j]) ENDREPEAT DARTS_CLEAR_SCORES(DartsSB, i) DARTS_ADD_SCORE(DartsSB, i, 301) ENDREPEAT CDEBUG1LN(DEBUG_DARTS, "[DO_START_GAME] Scoreboard reset") // reset the player iPlayr = 0 // reset the turn iTurn = 0 DartGame.iTurnScore = 0 // reset the AI brain DartGame.AIBrain.iThrowTotal = 0 // reset Zoom iDartZoom = 0 DartGame.iNumThrowsTurn = 0 iSteadyShotsUsed = 0 // reset the end game dart zoom bEndGameDartZoomTrans = TRUE //reset the end game message bEndGameMessageDisplayed = FALSE // AUDIO CONTEXT CHECK bOneDartAudioPlayed = FALSE bSteadyShotHelp = FALSE // Win audio reset DartGame.bWinNoise = FALSE DartGame.bOneDartAway = FALSE bAISkipped = FALSE DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_IN_WIN_RANGE, FALSE) // set minigame control scaleforms //DARTS_ACTIVATE_QUIT_UI(DartsUI.uiQuitControls) //DARTS_ACTIVATE_ENDGAME_UI(DartsUI.uiEndGameControls) //DARTS_ACTIVATE_CONTROLS_UI(DartsUI.uiInGameControls) WAIT_FOR_TEXT_OR_SKIP() DARTS_INIT_UI(DartsUI) IF DartGame.bAnotherCamActive START_DARTS_GAME_FADE_IN(DartGame.bAnotherCamActive) DartGame.bAnotherCamActive = FALSE ENDIF RETURN TRUE ENDFUNC /// PURPOSE: /// Checks where the player is in the game, transition the number of legs and sets /// RETURNS: /// TRUE if all the sets have been completed, FALSE if there's more to go FUNC BOOL EVALUATE_DART_GAME_PROGRESS(DART_GAME & DartGame) INT iEvaluator = PICK_INT(DartGame.bDartWinner, 0, 1) INT iWinsNeeded SWITCH DartGame.iNumDartLegs CASE 1 iWinsNeeded = 1 BREAK CASE 3 iWinsNeeded = 2 BREAK CASE 5 iWinsNeeded = 3 BREAK ENDSWITCH IF (DartGame.iDartGamesWon[iEvaluator] = iWinsNeeded) DartGame.iDartSetsWon[iEvaluator]++ DartGame.iDartSBSetsWon[iEvaluator]++ DartGame.iDartGamesWon[0] = 0 DartGame.iDartGamesWon[1] = 0 DartGame.bSetJustWon = TRUE IF iEvaluator = 0 DartsStats[DARTS_SCLB_STAT_NUM_SETS_WON]++ ENDIF CDEBUG1LN(DEBUG_DARTS, "EVALUATE_DART_GAME_PROGRESS - Set just won by ", iEvaluator, ", number of sets won is ", DartGame.iDartSetsWon[iEvaluator]) IF (DartGame.iDartSetsWon[iEvaluator] = DartGame.iNumDartSets) DartGame.bSetJustWon = FALSE RETURN TRUE ENDIF ELSE //continue on until the set is completed CDEBUG1LN(DEBUG_DARTS, "EVALUATE_DART_GAME_PROGRESS - leg just won by ", iEvaluator, ", number of legs won is ", DartGame.iDartGamesWon[iEvaluator]) ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Processes a players win (or loss), gets game ready for a replay or a quit /// PARAMS: /// DartGame - PROC GAME_WON(DART_GAME & DartGame) //GET_GAME_TIMER(i) //INCREMENT_INT_STAT_NO_MESSAGE(STAT_SCORE_DARTS_TOTAL_TIME_PLAYED, (i - gameStartTime)) IF NOT DartGame.bWriteToLeaderboard DartGame.bWriteToLeaderboard = TRUE ENDIF DARTS_STATS_UPDATE(DARTS_STAT_NUM_GAMES) CLEAR_SMALL_PRINTS() CLEAR_HELP() IF IS_AUDIO_SCENE_ACTIVE(GET_DARTS_RAVE_SCENE(DARTSRAVE_MATCH)) STOP_AUDIO_SCENE(GET_DARTS_RAVE_SCENE(DARTSRAVE_MATCH)) ENDIF //WIN_GAME_CAM() IF DartGame.eThrowStyle = DARTS_STYLE_STICK BOARD_ZOOM_CAM() ENDIF IF iPlayr = 0 //PRINT_NOW("DARTS_WON", 5000, 1) //PRINT_WITH_NUMBER_NOW("DARTS_REMAINL", 0, 5000, 1) DartGame.bDartWinner = TRUE bLogCompletion = TRUE DartGame.iDartGamesWon[iPlayr]++ DartGame.iDartSBGamesWon[iPlayr]++ // updating stats DARTS_STATS_UPDATE(DARTS_STAT_NUM_WINS) DartsStats[DARTS_SCLB_STAT_NUM_LEGS_WON]++ //PLAY_WIN_AUDIO(piDartPlayers, bFirstGame) CDEBUG1LN(DEBUG_DARTS, "updating sc stats: DartsStats[DARTS_SCLB_STAT_NUM_LEGS_WON] = ", DartsStats[DARTS_SCLB_STAT_NUM_LEGS_WON]) // TODO: implement ambient speech and overall game stat //IF isFriendActivity // SAY_AMBIENT_SPEECH(opponent, "Darts_Player_Wins") //ENDIF //Implement when it's ready in V /*INCREMENT_INT_STAT_NO_MESSAGE(STAT_SCORE_DARTS_NUMBER_OF_WINS, 1) REGISTER_BEST_POSITION(STAT_SCORE_DARTS_SHORTEST_CHECK_OUT, throwsTaken) Minigames_Store_Result(MGR_PLAYER_WON) Flow_Achievements_Games_Complete(GAME_COMPLETION_DARTS) IncreaseOpponentSkill(dartsGameGlobal)*/ ELSE //PRINT_NOW("DARTS_LOSE", 5000, 1) //PRINT_WITH_NUMBER_NOW("DARTS_REMAINL", 0, 5000, 1) DartGame.bDartWinner = FALSE CDEBUG1LN(DEBUG_DARTS, "******************** AI Throws: ", DartGame.AIBrain.iThrowTotal) DartGame.iDartGamesWon[iPlayr]++ DartGame.iDartSBGamesWon[iPlayr]++ DARTS_STATS_UPDATE(DARTS_STAT_NUM_LOSS) DartsStats[DARTS_SCLB_STAT_NUM_LEGS_LOST]++ //PLAY_LOSS_AUDIO(piDartPlayers) CDEBUG1LN(DEBUG_DARTS, "updating sc stats: DartsStats[DARTS_SCLB_STAT_NUM_LEGS_LOST] = ", DartsStats[DARTS_SCLB_STAT_NUM_LEGS_LOST]) // TODO: implement ambient speech and overall game stat //IF isFriendActivity // SAY_AMBIENT_SPEECH(opponent, "Darts_Player_Loses") //ENDIF //Implement when it's ready in V /*INCREMENT_INT_STAT_NO_MESSAGE(STAT_SCORE_DARTS_NUMBER_OF_DEFEATS, 1) Minigames_Store_Result(MGR_PLAYER_LOST) DecreaseOpponentSkill(dartsGameGlobal)*/ ENDIF DARTS_STATS_UPDATE(DARTS_STAT_WIN_PCT) // IF NOT IS_PED_INJURED(piDartPlayers[0]) AND NOT IS_PED_INJURED(piDartPlayers[1]) // TASK_LOOK_AT_ENTITY(piDartPlayers[0], piDartPlayers[1], 10000, SLF_SLOW_TURN_RATE | SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_HIGH) // TASK_LOOK_AT_ENTITY(piDartPlayers[1], piDartPlayers[0], 11500, SLF_SLOW_TURN_RATE | SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_HIGH) // ENDIF RESTART_TIMER_NOW(DartGame.miscTimer) IF EVALUATE_DART_GAME_PROGRESS(DartGame) CDEBUG1LN(DEBUG_DARTS, "darts game is won, resetting sets and legs") DartGame.iDartSetsWon[0] = 0 DartGame.iDartSetsWon[1] = 0 DartGame.iDartGamesWon[0] = 0 DartGame.iDartGamesWon[1] = 0 DartGame.iDartSBFullGamesWon[iPlayr]++ IF NOT DartGame.bWinNoise IF DartGame.bDartWinner MISSION_FLOW_PLAY_END_OF_MISSION_MUSIC(TRUE) ELSE // lose sound gets played later ENDIF DartGame.bWinNoise = TRUE ENDIF IF DartGame.bDartWinner // player won DartsStats[DARTS_SCLB_STAT_NUM_WINS]++ DartsResult = AR_playerWon CDEBUG1LN(DEBUG_DARTS, "updating sc stats: DartsStats[DARTS_SCLB_STAT_NUM_WINS] = ", DartsStats[DARTS_SCLB_STAT_NUM_WINS]) ELSE DartsStats[DARTS_SCLB_STAT_NUM_LOSSES]++ DartsResult = AR_buddyA_won CDEBUG1LN(DEBUG_DARTS, "updating sc stats: DartsStats[DARTS_SCLB_STAT_NUM_LOSSES] = ", DartsStats[DARTS_SCLB_STAT_NUM_LOSSES]) ENDIF // Write leaderboard stats here. //WRITE_DARTS_SCLB_DATA(LEADERBOARD_MINI_GAMES_DARTS, FALSE) DartGame.Stage = STAGE_GAME_END ELSE DartGame.Stage = STAGE_GAME_TRANSITION ENDIF DartGame.TurnStage = DPS_AIM START_AUDIO_SCENE(GET_DARTS_RAVE_SCENE(DARTSRAVE_COMPLETE)) CDEBUG1LN(DEBUG_DARTS, "darts won being set to true right now") bDartsWon = TRUE // reset the turn // iTurn = 0 // iPlayr = 0 DartGame.iTurnScore = 0 bNoCrossConflict = FALSE DartGame.LastScore[0] = 301 DartGame.LastScore[1] = 301 CDEBUG1LN(DEBUG_DARTS, "Stage is now ", DartGame.Stage) ENDPROC /// PURPOSE: /// Call after every throw, checks for wins, busts, or player transition /// PARAMS: /// DartGame - PROC TURN_INCREMENT(DART_GAME & DartGame, DARTS_UI & DartsUI) #IF IS_DEBUG_BUILD INT iDebugScores #ENDIF DartGame.bDartsClash = FALSE IF NOT DARTS_GET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_GAME_WON) // Update the player's score DartGame.Scores[iPlayr] -= DartGame.Darts[iPlayr][iTurn].iHitValue #IF IS_DEBUG_BUILD iDebugScores = DartGame.Scores[iPlayr] CDEBUG1LN(DEBUG_DARTS, "Player ", iPlayr, "'s Total score: ", iDebugScores) #ENDIF // Update the player's turn score DartGame.iTurnScore += DartGame.Darts[iPlayr][iTurn].iHitValue #IF IS_DEBUG_BUILD iDebugScores = DartGame.iTurnScore CDEBUG1LN(DEBUG_DARTS, "Player ", iPlayr, "'s Turn score: ", iDebugScores) #ENDIF ENDIF // if the game has been won and the initial score has been shown IF DARTS_GET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_GAME_WON) CDEBUG1LN(DEBUG_DARTS, "**********GAME HAS BEEN WON**********") CDEBUG1LN(DEBUG_DARTS, "**********Stage is ", DartGame.TurnStage, "**********") GAME_WON(DartGame) CDEBUG1LN(DEBUG_DARTS, "Un-setting uiFlag for DARTS_UIFLAGS_GAME_WON in line 455") DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_GAME_WON, FALSE) ELSE DartGame.iThrowsTaken[iPlayr]++ IF iPlayr = 0 DARTS_STATS_UPDATE(DARTS_STAT_DARTS_THROWN) DartsStats[DARTS_SCLB_STAT_DARTS_THROWN]++ ENDIF // if the game has been won IF (DartGame.Darts[iPlayr][iTurn].iHitMultiplier = 2 OR DartGame.Darts[iPlayr][iTurn].iHitValue = 50) AND DartGame.Scores[iPlayr] = 0 IF DartGame.Darts[iPlayr][iTurn].iHitValue = 50 DartGame.iBullsEyesHit[iPlayr]++ IF iPlayr = 0 DARTS_STATS_UPDATE(DARTS_STAT_NUM_BULLSEYES) DartsStats[DARTS_SCLB_STAT_BULLS_EYES]++ ENDIF ENDIF CDEBUG1LN(DEBUG_DARTS, "Setting uiFlag for DARTS_UIFLAGS_GAME_WON in line 467") DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_BUST_UNDER_ZERO, FALSE) DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_BUST_NOT_DOUBLE, FALSE) DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_BUST_ONE_POINT_LEFT, FALSE) DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_GAME_WON, TRUE) GAME_WON(DartGame) CDEBUG1LN(DEBUG_DARTS, "Un-setting uiFlag for DARTS_UIFLAGS_GAME_WON in line 481") DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_GAME_WON, FALSE) SETTIMERB(0) // The player has bust ELIF (DartGame.Scores[iPlayr] = 1 OR DartGame.Scores[iPlayr] < 0) OR (DartGame.Scores[iPlayr] = 0 AND DartGame.Darts[iPlayr][iTurn].iHitMultiplier <> 2) CDEBUG1LN(DEBUG_DARTS, "**********Playr has bust**********") CDEBUG1LN(DEBUG_DARTS, "**********Stage is ", DartGame.TurnStage, "**********") IF DartGame.Scores[iPlayr] = 0 AND DartGame.Darts[iPlayr][iTurn].iHitMultiplier <> 2 // The player hit the right number, but didn't double out. PRINT_WITH_NUMBER_NOW("DARTS_PLR_DUB", DartGame.Darts[iPlayr][iTurn].iHitValue, 5000, 0) DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_BUST_NOT_DOUBLE, TRUE) ELIF DartGame.Scores[iPlayr] = 1 DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_BUST_ONE_POINT_LEFT, TRUE) ELSE // output "you're bust text" IF iPlayr = 1 PRINT_WITH_NUMBER_NOW("DARTS_OPP_BUST", DartGame.Darts[iPlayr][iTurn].iHitValue, 5000, 0) ELSE PRINT_WITH_NUMBER_NOW("DARTS_PLR_BUST", DartGame.Darts[iPlayr][iTurn].iHitValue, 5000, 0) ENDIF ENDIF IF NOT bAnyAudioPlayedThisTurn IF PLAY_BUST_AUDIO(piDartPlayers[1 - iPlayr]) bAnyAudioPlayedThisTurn = TRUE CDEBUG1LN(DEBUG_DARTS, "***** Bust Audio played by player ", 1 - iPlayr) ENDIF ENDIF // rollback the player's score at start of turn DartGame.Scores[iPlayr] = DartGame.LastScore[iPlayr] IF DartGame.TurnStage = DPS_SKIP_AI CDEBUG1LN(DEBUG_DARTS, "***** SKIP_AI MADE IT HERE! *****") ENDIF SETTIMERA(0) DartGame.TurnStage = DPS_TURN_CHANGE IF iPlayr = 0 DartGame.iBustStreak++ ENDIF DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_BUST_UNDER_ZERO, TRUE) // The game continues ELSE // Increment stats for the results UI // Do bullseye audio IF DartGame.Darts[iPlayr][iTurn].iHitValue = 50 DartGame.iBullsEyesHit[iPlayr]++ IF iPlayr = 0 DARTS_TRIGGER_SPLASH(DartsUI, DARTSSPLASH_BULLSEYE) DARTS_STATS_UPDATE(DARTS_STAT_NUM_BULLSEYES) DartsStats[DARTS_SCLB_STAT_BULLS_EYES]++ ENDIF // TODO: bullseye audio not recorded for player yet, make the ped say it for now IF NOT bAnyAudioPlayedThisTurn AND NOT bAISkipped IF PLAY_BULLSEYE_AUDIO(piDartPlayers[iPlayr]) bAnyAudioPlayedThisTurn = TRUE ENDIF ENDIF ENDIF IF DartGame.Darts[iPlayr][iTurn].iHitValue = 0 // TODO: dart audio not recorded for player yet, make the ped say it for now IF NOT bAnyAudioPlayedThisTurn AND NOT bAISkipped PLAY_MISS_AUDIO(piDartPlayers[1 - iPlayr]) bAnyAudioPlayedThisTurn = TRUE ENDIF ENDIF IF (DartGame.iTurnScore = 180) IF NOT bAnyAudioPlayedThisTurn AND NOT bAISkipped IF PLAY_180_AUDIO(piDartPlayers[1], (iPlayr = 0)) bAnyAudioPlayedThisTurn = TRUE CDEBUG1LN(DEBUG_DARTS, "***** 180 Audio Played *****") ENDIF ENDIF IF (iPlayr = 0) DARTS_TRIGGER_SPLASH(DartsUI, DARTSSPLASH_180) DARTS_STATS_UPDATE(DARTS_STAT_NUM_180S) DartsStats[DARTS_SCLB_STAT_NUM_180S]++ // INCREMENT_INT_STAT_NO_MESSAGE(STAT_SCORE_DARTS_NUMBER_OF_180_HITS, 1) // AWARD_ACHIEVEMENT(ENUM_TO_INT(SCOREDARTGAME)) ENDIF ENDIF IF (DartGame.iTurnScore = 140) // TODO: dart audio not recorded for player yet, make the ped say it for now IF NOT bAnyAudioPlayedThisTurn AND NOT bAISkipped IF PLAY_140_AUDIO(piDartPlayers[iPlayr], (iPlayr = 0)) bAnyAudioPlayedThisTurn = TRUE CDEBUG1LN(DEBUG_DARTS, "***** 140 Audio Played *****") ENDIF ENDIF ENDIF // Do one dart away message IF iPlayr = 0 IF iTurn < 2 IF DartGame.Scores[iPlayr] <= 170 AND NOT DARTS_GET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_END_HELP_READY) DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_END_HELP_READY, TRUE) ENDIF IF NOT DARTS_GET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_BUST_HELP_READY) AND DARTS_GET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_WIN_HELP) DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_BUST_HELP_READY, TRUE) ENDIF IF ((DartGame.Scores[iPlayr] < 41 AND DartGame.Scores[iPlayr] > 0) AND (DartGame.Scores[iPlayr] % 2 = 0)) OR DartGame.Scores[iPlayr] = 50 IF DartGame.Scores[iPlayr] = 50 // CDEBUG1LN(DEBUG_DARTS, "-----One Dart Away Bullseye Should Print-----") ELSE // CDEBUG1LN(DEBUG_DARTS, "-----One Dart Away Text Should Print-----") ENDIF // TODO: only recorded for peds for now, so just force it IF NOT bOneDartAudioPlayed PLAY_ONE_DART_AWAY_AUDIO(piDartPlayers[1]) bOneDartAudioPlayed = TRUE ENDIF IF NOT DartGame.bOneDartAway DartGame.bOneDartAway = TRUE ENDIF IF NOT DARTS_GET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_IN_WIN_RANGE) DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_IN_WIN_RANGE, TRUE) ENDIF ELIF DartGame.bOneDartAway DartGame.bOneDartAway = FALSE ENDIF ENDIF ENDIF IF iPlayr = 0 AND iTurn < 2 //AND ((DartGame.Scores[iPlayr] % 2 = 1) OR NOT DartGame.bOneDartAway) CDEBUG1LN(DEBUG_DARTS, "-----Score Text Should Have Printed-----") //PRINT_WITH_NUMBER_NOW("DARTS_REMAINL", DartGame.Scores[iPlayr], DEFAULT_GOD_TEXT_TIME, 0) PRINT_WITH_2_NUMBERS_NOW("DARTS_REMAIN", DartGame.LastScore[iPlayr] - DartGame.Scores[iPlayr], DartGame.Scores[iPlayr], DEFAULT_GOD_TEXT_TIME, 0) ELIF (iPlayr = 1) AND (iTurn = 2) //PRINT_WITH_2_NUMBERS_NOW("DARTS_REMAIN2", DartGame.Darts[iPlayr][iTurn].iHitValue, DartGame.Scores[iPlayr], DEFAULT_GOD_TEXT_TIME, 0) ELSE // do a little pause after each dart if we're not sped up IF DartGame.TurnStage <> DPS_SKIP_AI SKIP_AI_TURN_CHECK(DartGame.TurnStage) ENDIF ENDIF DartGame.Darts[iPlayr][iTurn].bDoneScoring = TRUE // increment dart... iTurn++ SETTIMERA(0) IF DartGame.TurnStage <> DPS_SKIP_AI IF DartGame.bOneDartAway AND DartGame.eThrowStyle = DARTS_STYLE_STICK DartGame.TurnStage = DPS_ONE_DART_HELPER ELSE DartGame.TurnStage = DPS_AIM ENDIF ENDIF // If the player has had 3 throws, switch IF (iTurn = 3) CDEBUG1LN(DEBUG_DARTS, "Player ", iPlayr, " finished, now we're switching") iTurn = 2 DartGame.TurnStage = DPS_TURN_CHANGE ENDIF IF iPlayr = 0 DartGame.iBustStreak = 0 ENDIF DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_BUST_NOT_DOUBLE, FALSE) DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_BUST_UNDER_ZERO, FALSE) DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_BUST_ONE_POINT_LEFT, FALSE) ENDIF ENDIF ENDPROC /// PURPOSE: /// Simulates a full or partial AI turn if player chooses to skip it /// PARAMS: /// DartGame - PROC DO_SKIP_AI_TURN(DART_GAME & DartGame, DARTS_UI & DartsUI) VECTOR vTemp iSkipAILoopCatch++ //this is reset at beginning of each turn CDEBUG1LN(DEBUG_DARTS, "iSkipAILoopCatch = ", iSkipAILoopCatch) iPlayr = 1 iTurn = 0 bAISkipped = TRUE // loop through each of the 3 darts WHILE (iTurn < 3) AND DartGame.TurnStage = DPS_SKIP_AI CDEBUG1LN(DEBUG_DARTS, "-------------") CDEBUG1LN(DEBUG_DARTS, "DOING SKIP AI TURN - PLAYER ", iPlayr, " - TURN ", iTurn) // DART HAS FINISHED IF DartGame.Darts[iPlayr][iTurn].bStuck CDEBUG1LN(DEBUG_DARTS, "######### DART HAS FINISHED") CDEBUG1LN(DEBUG_DARTS, "dart score ", iTurn, " = ", DartGame.Darts[iPlayr][iTurn].iHitValue) CDEBUG1LN(DEBUG_DARTS, "---------------------------") IF DartGame.Darts[iPlayr][iTurn].bDoneScoring // don't do anything... it's already there iTurn++ ELSE // store the dart score CDEBUG1LN(DEBUG_DARTS, "Scoring Dart Turn ", iTurn, ", Player ", iPlayr) SCORE_DART(DartGame.Darts[iPlayr][iTurn], DartGame.DartsBoard) CDEBUG1LN(DEBUG_DARTS, "---------------------------") // Update the player's score TURN_INCREMENT(DartGame, DartsUI) ENDIF // DART IS IN FLIGHT ELIF DartGame.Darts[iPlayr][iTurn].bTravelling CDEBUG1LN(DEBUG_DARTS, "######### DART IS IN FLIGHT") IF bInstantSkip IF DOES_ENTITY_EXIST(DartGame.Darts[iPlayr][iTurn].object) DELETE_OBJECT(DartGame.Darts[iPlayr][iTurn].object) CDEBUG1LN(DEBUG_DARTS, "okay this turn's object was deleted: ", iTurn) ENDIF ELSE DartGame.Darts[iPlayr][iTurn].bStuck = TRUE DartGame.Darts[iPlayr][iTurn].bTravelling = FALSE CDEBUG1LN(DEBUG_DARTS, "darts[playr][turn].offsetTarget = ", vTemp) // snap it to coords vTemp = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(DartGame.DartsBoard.vDartBoard, DartGame.DartsBoard.fBoardHeading, <>) IF DOES_ENTITY_EXIST(DartGame.Darts[iPlayr][iTurn].object) SET_ENTITY_COORDS(DartGame.Darts[iPlayr][iTurn].object, vTemp) ENDIF ENDIF // store the dart score CDEBUG1LN(DEBUG_DARTS, "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ STATS BEFORE SCORING - iPlayr: ", iPlayr, ", iTurn:", iTurn) CDEBUG1LN(DEBUG_DARTS, "Scoring Dart Turn ", iTurn, ", Player ", iPlayr) SCORE_DART(DartGame.Darts[iPlayr][iTurn], DartGame.DartsBoard) CDEBUG1LN(DEBUG_DARTS, " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ") // Update the player's score TURN_INCREMENT(DartGame, DartsUI) IF bInstantSkip IF bDartsWon CDEBUG1LN(DEBUG_DARTS, "creating win in-flight-dart number ", iTurn) DartGame.Darts[iPlayr][iTurn].object = CREATE_OBJECT(DartGame.Darts[iPlayr][iTurn].modelDart, vInitDartPos) //CDEBUG1LN(DEBUG_DARTS, "Darts[iPlayr][iturn].vOffsetTarget coords ", DartGame.Darts[iPlayr][iTurn].vOffsetTarget) // create it snapped to board vTemp = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(DartGame.DartsBoard.vDartBoard, DartGame.DartsBoard.fBoardHeading, <>) SET_ENTITY_COORDS(DartGame.Darts[iPlayr][iTurn].object, vTemp) // put some random spin on it FLOAT fTemp1 fTemp1 = GET_RANDOM_FLOAT_IN_RANGE(0.0, 90.0) DartGame.Darts[iPlayr][iTurn].vRotation = << 90.0, fTemp1, DartGame.DartsBoard.fBoardHeading>> SET_ENTITY_ROTATION(DartGame.Darts[iPlayr][iTurn].object, DartGame.Darts[iPlayr][iTurn].vRotation, EULER_XYZ) DartGame.Darts[iPlayr][iTurn].bStuck = TRUE DartGame.Darts[iPlayr][iTurn].bTravelling = FALSE ENDIF ENDIF // DART HASN'T YET BEEN THROWN ELSE CDEBUG1LN(DEBUG_DARTS, "@@@@@@@@@@@@@ DART HASN'T YET BEEN THROWN") // calculate it's coords GET_NEXT_AI_THROW(DartGame.Scores, DartGame.AIBrain) GET_AI_THROW_VECTOR(DartGame.Darts[iPlayr][iTurn], DartGame.DartsBoard, DartGame.TurnStage, DartGame.AIBrain) DartGame.iNumThrowsTurn++ // store the dart score CDEBUG1LN(DEBUG_DARTS, "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ STATS BEFORE SCORING - iPlayr: ", iPlayr, ", iTurn:", iTurn) CDEBUG1LN(DEBUG_DARTS, "Scoring Dart Turn ", iTurn, ", Player ", iPlayr) SCORE_DART(DartGame.Darts[iPlayr][iTurn], DartGame.DartsBoard) CDEBUG1LN(DEBUG_DARTS, " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ") // we have to check for wins early if it's skip AI, otherwise the win may not register IF (DartGame.Darts[iPlayr][iTurn].iHitMultiplier = 2 OR DartGame.Darts[iPlayr][iTurn].iHitValue = 50) AND DartGame.Scores[iPlayr] = 0 IF DartGame.Darts[iPlayr][iTurn].iHitValue = 50 DartGame.iBullsEyesHit[iPlayr]++ ENDIF CDEBUG1LN(DEBUG_DARTS, "Setting uiFlag for DARTS_UIFLAGS_GAME_WON in line 758") DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_BUST_UNDER_ZERO, FALSE) DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_BUST_NOT_DOUBLE, FALSE) DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_BUST_ONE_POINT_LEFT, FALSE) DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_GAME_WON, TRUE) //PRINT_WITH_2_NUMBERS_NOW("DARTS_REMAIN2", DartGame.iTurnScore, DartGame.Scores[iPlayr], DEFAULT_GOD_TEXT_TIME, 0) SETTIMERB(0) ENDIF // Update the player's score TURN_INCREMENT(DartGame, DartsUI) IF bInstantSkip IF bDartsWon INT idx REPEAT (iTurn + 1) idx IF NOT DartGame.Darts[iPlayr][idx].bStuck CDEBUG1LN(DEBUG_DARTS, "creating win dart number ", idx) DartGame.Darts[iPlayr][idx].object = CREATE_OBJECT(DartGame.Darts[iPlayr][idx].modelDart, vInitDartPos) //CDEBUG1LN(DEBUG_DARTS, "Darts[iPlayr][iturn].vOffsetTarget coords ", DartGame.Darts[iPlayr][iTurn].vOffsetTarget) // create it snapped to board vTemp = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(DartGame.DartsBoard.vDartBoard, DartGame.DartsBoard.fBoardHeading, <>) IF DOES_ENTITY_EXIST(DartGame.Darts[iPlayr][idx].object) SET_ENTITY_COORDS(DartGame.Darts[iPlayr][idx].object, vTemp) ENDIF // put some random spin on it FLOAT fTemp1 fTemp1 = GET_RANDOM_FLOAT_IN_RANGE(0.0, 90.0) DartGame.Darts[iPlayr][idx].vRotation = << 90.0, fTemp1, DartGame.DartsBoard.fBoardHeading>> SET_ENTITY_ROTATION(DartGame.Darts[iPlayr][idx].object, DartGame.Darts[iPlayr][idx].vRotation, EULER_XYZ) DartGame.Darts[iPlayr][idx].bStuck = TRUE DartGame.Darts[iPlayr][idx].bTravelling = FALSE ENDIF ENDREPEAT ENDIF ENDIF ENDIF CDEBUG1LN(DEBUG_DARTS, "TURN AT END OF THROW- ", iTurn) CDEBUG1LN(DEBUG_DARTS, "@@@@@@@@@@@@@@@@@@@@@@@@@@@") ENDWHILE //iTurn = 0 CDEBUG1LN(DEBUG_DARTS, "TURN AFTER AI SKIP THROWS HAVE COMPLETED- ", iTurn) DartGame.TurnStage = DPS_TURN_CHANGE // this is redundant since TURN_INCREMENT should already do this, but at least it will prevent inf loops IF iSkipAILoopCatch > 2 SCRIPT_ASSERT("SKIP_AI was caught looping! Please copy game log and attach to B* 248553") DartGame.TurnStage = DPS_TURN_CHANGE ENDIF ENDPROC /// PURPOSE: /// Handles whether another darts game will be started or if the darts session will end. /// PARAMS: /// DartGame - PROC REPLAY_GAME_LOOP(DART_GAME & DartGame, DARTS_UI & DartsUI, DARTS_SCOREBOARD & DartsSB, END_SCREEN_DATASET & DartsEndScreen, BOOL bUsedSetsLegs) DARTS_UI_RETVAL DartsUIRetVal IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL) DISABLE_CONTROL_ACTION( FRONTEND_CONTROL, INPUT_FRONTEND_PAUSE) ENDIF IF IS_PLAYER_ONLINE() IF NOT bDartsLBPredictDone IF DARTS_RANK_PREDICTIONS(DartsUI, FALSE, bDartsLBWrite) DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_SETUP_ENDUI, FALSE) bDartsLBPredictDone = TRUE CDEBUG1LN(DEBUG_DARTS, "rank predictions finished") ENDIF ENDIF ENDIF // wait for the player to pick an option IF bEndGameMessageDisplayed IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL) SET_MOUSE_CURSOR_THIS_FRAME() ENDIF BOOL bProcessMenuInput = TRUE IF DartsUI.bDrawingLeaderboard IF NOT DartsUI.bLBDOnlineWarningDone AND NOT IS_PLAYER_ONLINE() DartsUI.bLBDOnlineWarningDone = DO_SIGNED_OUT_WARNING(DartsUI.iLBDWarningBitset) bProcessMenuInput = FALSE // After the warning, don't then transition to the leaderboards... IF DartsUI.bLBDOnlineWarningDone DartsUI.bDrawingLeaderboard = FALSE DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_SETUP_ENDUI, FALSE) // Reset the warning display. DartsUI.bLBDOnlineWarningDone = FALSE ENDIF ELSE DARTS_DISPLAY_SOCIAL_CLUB_LEADERBOARD(DartsUI.dartsLB_control, DartsUI.uiLeaderboard) //, FALSE) ENDIF // Process input here. IF bProcessMenuInput UPDATE_SIMPLE_USE_CONTEXT(DartsUI.inGameControlContext) IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL) // No longer drawing the leaderboard, and re-do the input. DartsUI.bDrawingLeaderboard = FALSE DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_SETUP_ENDUI, FALSE) ELIF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ENDSCREEN_ACCEPT) // Continue. DartsUIRetVal = DARTS_UIRETVAL_FALSE ELIF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ENDSCREEN_EXPAND) // Rematch. DartsUIRetVal = DARTS_UIRETVAL_TRUE ENDIF ENDIF IF SHOULD_PROFILE_BUTTON_BE_AVAILABLE_FOR_LEADERBOARD(DartsUI.dartsLB_control) IF NOT bDartsProfilesReady bDartsProfilesReady = TRUE // just do override here INIT_SIMPLE_USE_CONTEXT(DartsUI.inGameControlContext, FALSE, FALSE, TRUE, TRUE) ADD_SIMPLE_USE_CONTEXT_INPUT(DartsUI.inGameControlContext, "DARTS_CONT", FRONTEND_CONTROL, INPUT_FRONTEND_ENDSCREEN_ACCEPT) ADD_SIMPLE_USE_CONTEXT_INPUT(DartsUI.inGameControlContext, "DARTS_REMATCH", FRONTEND_CONTROL, INPUT_FRONTEND_ENDSCREEN_EXPAND) ADD_SIMPLE_USE_CONTEXT_INPUT(DartsUI.inGameControlContext, "IB_BACK", FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL) ADD_SIMPLE_USE_CONTEXT_INPUT(DartsUI.inGameControlContext, "SCLB_PROFILE", FRONTEND_CONTROL, INPUT_FRONTEND_SELECT) SET_SIMPLE_USE_CONTEXT_FULLSCREEN(DartsUI.inGameControlContext) CDEBUG1LN(DEBUG_DARTS, "profile is ready, button should show") ENDIF ELSE CDEBUG1LN(DEBUG_DARTS, "profiles not ready yet") ENDIF ELSE DartsUIRetVal = DARTS_UPDATE_END_MENU(DartsUI, FALSE, FALSE, bDartsLBPredictDone) RENDER_ENDSCREEN(DartsEndScreen) ENDIF IF (IS_SYNCHRONIZED_SCENE_RUNNING(iSceneID) AND GET_SYNCHRONIZED_SCENE_PHASE(iSceneID) >= 0.995) OR NOT IS_SYNCHRONIZED_SCENE_RUNNING(iSceneID) bInSyncCam = TRUE IF DOES_CAM_EXIST(camDartsSync) DESTROY_CAM(camDartsSync) IF NOT IS_PED_INJURED(piDartPlayers[0]) AND NOT IS_PED_INJURED(piDartPlayers[1]) CLEAR_PED_TASKS_IMMEDIATELY(piDartPlayers[0]) CLEAR_PED_TASKS_IMMEDIATELY(piDartPlayers[1]) FORCE_PED_AI_AND_ANIMATION_UPDATE(piDartPlayers[0]) FORCE_PED_AI_AND_ANIMATION_UPDATE(piDartPlayers[1]) ENDIF ENDIF ANOTHER_GAME_BACKSIDE() ENDIF IF GET_TIMER_IN_SECONDS_SAFE(DartGame.miscTimer) > 2.0 IF NOT bGameOverSpeechPlayed IF DartGame.bDartWinner BOOL bFirstGame IF (DartGame.iDartSBGamesWon[0] + DartGame.iDartSBGamesWon[1]) = 1 bFirstGame = TRUE ELSE bFirstGame = FALSE ENDIF PLAY_WIN_AUDIO(piDartPlayers, bFirstGame) ELSE PLAY_LOSS_AUDIO(piDartPlayers) ENDIF bGameOverSpeechPlayed = TRUE ENDIF ENDIF // player wants another game IF DartsUIRetVal = DARTS_UIRETVAL_TRUE CLEAR_HELP() STOP_AUDIO_SCENE(GET_DARTS_RAVE_SCENE(DARTSRAVE_COMPLETE)) IF NOT IS_PED_INJURED(piDartPlayers[0]) AND NOT IS_PED_INJURED(piDartPlayers[1]) TASK_CLEAR_LOOK_AT(piDartPlayers[0]) TASK_CLEAR_LOOK_AT(piDartPlayers[1]) ENDIF //CLEANUP_MINIGAME_INSTRUCTIONS(DartsUI.uiQuitControls) //CLEANUP_MINIGAME_INSTRUCTIONS(DartsUI.uiEndGameControls) RESET_ENDSCREEN(DartsEndScreen) IF bUsedSetsLegs UPDATE_SB_SETS_LEGS(DartsSB, 0, 0, 0, 0) ENDIF DartGame.iThrowsTaken[0] = 0 DartGame.iThrowsTaken[1] = 0 DartGame.iBullsEyesHit[0] = 0 DartGame.iBullsEyesHit[1] = 0 iPlayr = 1 CANCEL_TIMER(DartGame.miscTimer) DartGame.Stage = STAGE_STARTING bGameOverSpeechPlayed = FALSE bDartsWon = FALSE bInSyncCam = FALSE CDEBUG1LN(DEBUG_DARTS, "rematch happening, resetting rank prediction stuff") CLEAR_RANK_REDICTION_DETAILS() bDartsLBPredictDone = FALSE bDartsLBRead = FALSE DartsUI.bDrawingLeaderboard = FALSE bDartsLBWrite = FALSE bDartsProfilesReady = FALSE CLEANUP_SOCIAL_CLUB_LEADERBOARD(DartsUI.dartsLB_control) SC_LEADERBOARD_CACHE_CLEAR_ALL() // player wants to quit ELIF DartsUIRetVal = DARTS_UIRETVAL_FALSE //Set endscreen to transition-out ENDSCREEN_START_TRANSITION_OUT(DartsendScreen) STOP_AUDIO_SCENE(GET_DARTS_RAVE_SCENE(DARTSRAVE_COMPLETE)) // give player his money IF (DartGame.iDartGamesWon[0] * DART_MONEY_WON) > 0 CREDIT_BANK_ACCOUNT(GET_CURRENT_PLAYER_PED_ENUM(), BAAC_TAXI, (DartGame.iDartGamesWon[0] * DART_MONEY_WON)) ENDIF CLEAR_PRINTS() DartGame.Stage = STAGE_FINISHED //CLEANUP_DARTS_GAME(DartGame, DartsUI) ELIF (IS_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_SCRIPT_PAD_LEFT) OR IS_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_SCRIPT_PAD_RIGHT)) AND DartGame.eThrowStyle = DARTS_STYLE_STICK AND bProcessMenuInput VECTOR vTemp DartGame.bAnotherCamActive = FALSE IF bEndGameDartZoomTrans vTemp = GET_ENTITY_COORDS(DartGame.Darts[iPlayr][iDartZoom].object) DARTS_ZOOM_DART_CAM_TRANS(vTemp, FALSE, bEndGameDartZoomTrans) bEndGameDartZoomTrans = FALSE ELIF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_RIGHT) iDartZoom++ IF iDartZoom >= DartGame.iNumThrowsTurn iDartZoom = 0 ENDIF vTemp = GET_ENTITY_COORDS(DartGame.Darts[iPlayr][iDartZoom].object) DARTS_ZOOM_DART_CAM(vTemp) CDEBUG1LN(DEBUG_DARTS, "_____ Throw ", iDartZoom+1, ": ", DartGame.Darts[iPlayr][iDartZoom].iHitValue, " points _____") ELIF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_LEFT) iDartZoom-- IF iDartZoom < 0 iDartZoom = DartGame.iNumThrowsTurn - 1 ENDIF vTemp = GET_ENTITY_COORDS(DartGame.Darts[iPlayr][iDartZoom].object) DARTS_ZOOM_DART_CAM(vTemp) CDEBUG1LN(DEBUG_DARTS, "_____ Throw ", iDartZoom+1, ": ", DartGame.Darts[iPlayr][iDartZoom].iHitValue, " points _____") ENDIF ELIF (IS_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_FRONTEND_LEADERBOARD) OR IS_DISABLED_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_FRONTEND_LEADERBOARD)) AND bProcessMenuInput AND (bDartsLBPredictDone OR NOT IS_PLAYER_ONLINE()) // Trying to go to the leaderboard. DartsUI.bDrawingLeaderboard = TRUE // STRING eOpenGamerCardButton = GET_CONTROL_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, INPUT_FRONTEND_SELECT) // Setup new prompts. INIT_SIMPLE_USE_CONTEXT(DartsUI.inGameControlContext, FALSE, FALSE, TRUE, TRUE) ADD_SIMPLE_USE_CONTEXT_INPUT(DartsUI.inGameControlContext, "DARTS_CONT", FRONTEND_CONTROL, INPUT_FRONTEND_ENDSCREEN_ACCEPT) ADD_SIMPLE_USE_CONTEXT_INPUT(DartsUI.inGameControlContext, "DARTS_REMATCH", FRONTEND_CONTROL, INPUT_FRONTEND_ENDSCREEN_EXPAND) ADD_SIMPLE_USE_CONTEXT_INPUT(DartsUI.inGameControlContext, "IB_BACK", FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL) IF bDartsProfilesReady ADD_SIMPLE_USE_CONTEXT_INPUT(DartsUI.inGameControlContext, "SCLB_PROFILE", FRONTEND_CONTROL, INPUT_FRONTEND_SELECT)//eOpenGamerCardButton ENDIF SET_SIMPLE_USE_CONTEXT_FULLSCREEN(DartsUI.inGameControlContext) ENDIF ELSE // wait 'til we've finished rendering the player win/lost text IF NOT DartGame.bAnotherCamActive //IS_CAM_ACTIVE(camAnotherGame) CLEAR_HELP() CLEAR_PRINTS() DARTS_SETUP_END_MENU(DartsEndScreen, DartGame.bDartWinner, DartGame.iThrowsTaken[iPlayr], DartGame.iBullsEyesHit[iPlayr], DartsStats[DARTS_SCLB_STAT_NUM_180S], DartGame.iDartSBGamesWon[0], DartGame.iDartSBGamesWon[1], DartGame.iDartSBSetsWon[0], DartGame.iDartSBSetsWon[1], DartGame.iDartSBFullGamesWon[0], DartGame.iDartSBFullGamesWon[1], bUsedSetsLegs) // SET_SCALEFORM_BIG_MESSAGE(DartsUI.siBigMessage, PICK_STRING(DartGame.bDartWinner, "DARTS_WINNER", "DARTS_LOSER"), // PICK_STRING(DartGame.bDartWinner, "DARTS_WON", "DARTS_LOSE"), 6000) FLOAT fResolution fResolution = GET_ASPECT_RATIO(TRUE) CDEBUG1LN(DEBUG_DARTS, " fResolution = ", fResolution) VECTOR scenePosition VECTOR sceneRotation IF fResolution > 2.0 CDEBUG1LN(DEBUG_DARTS, " resolution is eyefinity") scenePosition = << 1992.29407, 3047.57690, 46.21517 >> sceneRotation = << 0.000, 0.000, 138.740 >> ELSE CDEBUG1LN(DEBUG_DARTS, "resolution is not eyefinity") scenePosition = << 1992.33569, 3047.92432, 46.21517 >> sceneRotation = << 0.000, 0.000, 136.740 >> ENDIF INT iWhichOutro iWhichOutro = GET_WHICH_DARTS_OUTRO() //GET_RANDOM_INT_IN_RANGE(0, iAnimLimit) iSceneID = CREATE_SYNCHRONIZED_SCENE(scenePosition, sceneRotation) camDartsSync = CREATE_CAM("DEFAULT_ANIMATED_CAMERA", FALSE) PLAY_SYNCHRONIZED_CAM_ANIM(camDartsSync, iSceneID, sOutroCam[iWhichOutro], "mini@dartsoutro") SET_CAM_ACTIVE(camDartsSync, TRUE) RENDER_SCRIPT_CAMS(TRUE, FALSE) IF NOT IS_PED_INJURED(piDartPlayers[0]) AND NOT IS_PED_INJURED(piDartPlayers[1]) IF DartGame.bDartWinner TASK_SYNCHRONIZED_SCENE (piDartPlayers[0], iSceneID, "mini@dartsoutro", sOutroWin[iWhichOutro], INSTANT_BLEND_IN, WALK_BLEND_OUT ) TASK_SYNCHRONIZED_SCENE (piDartPlayers[1], iSceneID, "mini@dartsoutro", sOutroLoss[iWhichOutro], INSTANT_BLEND_IN, WALK_BLEND_OUT ) TASK_PLAY_ANIM(PLAYER_PED_ID(), sFacialDictPlayer, sFacialClip[GET_RANDOM_INT_IN_RANGE(0, 3)], SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_SECONDARY) ELSE TASK_SYNCHRONIZED_SCENE (piDartPlayers[1], iSceneID, "mini@dartsoutro", sOutroWin[iWhichOutro], INSTANT_BLEND_IN, WALK_BLEND_OUT ) TASK_SYNCHRONIZED_SCENE (piDartPlayers[0], iSceneID, "mini@dartsoutro", sOutroLoss[iWhichOutro], INSTANT_BLEND_IN, WALK_BLEND_OUT ) TASK_PLAY_ANIM(piDartPlayers[1], sFacialDictPed, sFacialClip[GET_RANDOM_INT_IN_RANGE(0, 3)], SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_SECONDARY) ENDIF ENDIF bInSyncCam = FALSE //ANOTHER_GAME_CAM() DartGame.bAnotherCamActive = TRUE DartsUI.iEndDelay = GET_GAME_TIMER() INT idx, idy REPEAT NUM_DART_PLAYERS idx REPEAT NUM_DART_TURNS idy RESET_DART(DartGame.Darts[idx][idy]) ENDREPEAT DARTS_CLEAR_SCORES(DartsSB, idx) ENDREPEAT //ELIF NOT IS_CAM_INTERPOLATING(camAnotherGame) ELIF GET_GAME_TIMER() - DartsUI.iEndDelay > 400 AND ENDSCREEN_PREPARE(DartsEndScreen, FALSE) IF NOT DartGame.bDartWinner PLAY_SOUND_FRONTEND(-1, "LOOSE_MATCH", "HUD_MINI_GAME_SOUNDSET") ENDIF bEndGameMessageDisplayed = TRUE ENDIF ENDIF ENDPROC FUNC BOOL IS_SPECIFIC_DARTS_OPPONENT_NEARBY(PED_INDEX & piNearbyPeds[], PED_INDEX & piOpponent, MODEL_NAMES eSpecificModel) INT iPed REPEAT GET_PED_NEARBY_PEDS(PLAYER_PED_ID(), piNearbyPeds) iPed IF NOT IS_PED_INJURED(piNearbyPeds[iPed]) IF GET_ENTITY_MODEL(piNearbyPeds[iPed]) = eSpecificModel SET_ENTITY_AS_MISSION_ENTITY(piNearbyPeds[iPed], TRUE, TRUE) piOpponent = piNearbyPeds[iPed] CDEBUG1LN(DEBUG_DARTS, "Ped model ", iPed, " got what we need") RETURN TRUE ELSE CDEBUG1LN(DEBUG_DARTS, "Ped model ", iPed, " is not the one we want") ENDIF ENDIF ENDREPEAT RETURN FALSE ENDFUNC FUNC BOOL IS_DARTS_OPPONENT_NEARBY(PED_INDEX & piNearbyPeds[]) INT iPed REPEAT GET_PED_NEARBY_PEDS(PLAYER_PED_ID(), piNearbyPeds) iPed IF NOT IS_PED_INJURED(piNearbyPeds[iPed]) IF GET_ENTITY_MODEL(piNearbyPeds[iPed]) = A_F_M_SALTON_01 OR GET_ENTITY_MODEL(piNearbyPeds[iPed]) = A_F_O_SALTON_01 OR GET_ENTITY_MODEL(piNearbyPeds[iPed]) = A_M_Y_VINEWOOD_01 OR GET_ENTITY_MODEL(piNearbyPeds[iPed]) = A_M_Y_STLAT_01 OR GET_ENTITY_MODEL(piNearbyPeds[iPed]) = A_M_Y_VINEWOOD_04 OR GET_ENTITY_MODEL(piNearbyPeds[iPed]) = A_M_Y_STWHI_02 OR GET_ENTITY_MODEL(piNearbyPeds[iPed]) = A_M_Y_VINEWOOD_03 SET_ENTITY_AS_MISSION_ENTITY(piNearbyPeds[iPed], TRUE, TRUE) piDartPlayers[1] = piNearbyPeds[iPed] CDEBUG1LN(DEBUG_DARTS, "Ped model ", iPed, " got what we need") RETURN TRUE ELSE CDEBUG1LN(DEBUG_DARTS, "Ped model ", iPed, " is not the one we want") ENDIF ENDIF ENDREPEAT RETURN FALSE ENDFUNC PROC SET_NEXT_OPPONENT(MODEL_NAMES eDartOpponent, MODEL_NAMES & eNextOpponent) SWITCH eDartOpponent CASE A_F_M_SALTON_01 eNextOpponent = A_F_O_SALTON_01 BREAK CASE A_F_O_SALTON_01 eNextOpponent = A_F_M_SALTON_01 BREAK CASE A_M_Y_VINEWOOD_01 eNextOpponent = A_M_Y_STWHI_02 BREAK CASE A_M_Y_VINEWOOD_03 eNextOpponent = A_M_Y_VINEWOOD_01 BREAK CASE A_M_Y_VINEWOOD_04 eNextOpponent = A_M_Y_VINEWOOD_03 BREAK CASE A_M_Y_STLAT_01 eNextOpponent = A_M_Y_VINEWOOD_04 BREAK CASE A_M_Y_STWHI_02 eNextOpponent = A_M_Y_STLAT_01 BREAK ENDSWITCH ENDPROC /// PURPOSE: /// used for russian name translation /// PARAMS: /// sName - original name /// RETURNS: /// russian translation FUNC STRING GET_DART_LOCAL_PLAYER_NAME(STRING sName) IF GET_CURRENT_LANGUAGE() = LANGUAGE_RUSSIAN IF ARE_STRINGS_EQUAL(sName, "MICHAEL") RETURN "МАЙКЛ" ELIF ARE_STRINGS_EQUAL(sName, "FRANKLIN") RETURN "ФРАНКЛИН" ELIF ARE_STRINGS_EQUAL(sName, "TREVOR") RETURN "ТРЕВОР" ELIF ARE_STRINGS_EQUAL(sName, "LAMAR") RETURN "ЛАМАР" ELIF ARE_STRINGS_EQUAL(sName, "JIMMY") RETURN "ДЖИММИ" ELIF ARE_STRINGS_EQUAL(sName, "KRISTY") RETURN "КРИСТИ" ELIF ARE_STRINGS_EQUAL(sName, "MARLENE") RETURN "МАРЛЕН" ELIF ARE_STRINGS_EQUAL(sName, "LORIE") RETURN "ЛОРИ" ELIF ARE_STRINGS_EQUAL(sName, "SHELLEY") RETURN "ШЕЛЛИ" ELIF ARE_STRINGS_EQUAL(sName, "RAYMOND") RETURN "РЕЙМОНД" ELIF ARE_STRINGS_EQUAL(sName, "JOHAN") RETURN "ЙОХАН" ELIF ARE_STRINGS_EQUAL(sName, "STAN") RETURN "СТЭН" ELIF ARE_STRINGS_EQUAL(sName, "VINCE") RETURN "ВИНС" ENDIF ENDIF RETURN sName ENDFUNC /// PURPOSE: /// Creates opponent ped, sets player and opponent at the proper position PROC INIT_PEDS(FLOAT fBoardHeading, DARTS_PLAYER_POS PlayerPositions, PED_INDEX & piNearbyPeds[], DARTS_ARGS & DartsArgs) CDEBUG1LN(DEBUG_DARTS, "PlayerPositions.vDartPlayrPos = ", PlayerPositions.vDartPlayrPos, ". PlayerPositions.vOpponentPos = ", PlayerPositions.vOpponentPos) //SET_ENTITY_COORDS(piDartPlayers[0], PlayerPositions.vDartPlayrPos) //SET_ENTITY_HEADING(piDartPlayers[0], fBoardHeading) IF DOES_ENTITY_EXIST(FRIEND_A_PED_ID())// if this is a friend activity, this should already be set AND NOT IS_PED_INJURED(FRIEND_A_PED_ID()) REMOVE_PED_FROM_GROUP(FRIEND_A_PED_ID()) //SET_ENTITY_COORDS(FRIEND_A_PED_ID(), PlayerPositions.vOpponentPos) //SET_ENTITY_HEADING(FRIEND_A_PED_ID(), fBoardHeading) CDEBUG1LN(DEBUG_DARTS, "Friend activity, familiar ped is set") ELSE IF DOES_ENTITY_EXIST(DartsArgs.piDartOpponent) AND NOT IS_PED_INJURED(DartsArgs.piDartOpponent) CDEBUG1LN(DEBUG_DARTS, "Ped found from DartsArgs") SET_ENTITY_AS_MISSION_ENTITY(DartsArgs.piDartOpponent, TRUE, TRUE) piDartPlayers[1] = DartsArgs.piDartOpponent CLEAR_PED_TASKS(piDartPlayers[1]) ELSE IF IS_DARTS_OPPONENT_NEARBY(piNearbyPeds) CDEBUG1LN(DEBUG_DARTS, "Non friend activity, ped grabbed from setting") CLEAR_PED_TASKS(piDartPlayers[1]) ELSE piDartPlayers[1] = CREATE_PED(PEDTYPE_MISSION, modelOpponent, PlayerPositions.vOpponentPos, fBoardHeading) CDEBUG1LN(DEBUG_DARTS, "Non friend activity, random ped generated") ENDIF ENDIF IF DECOR_EXIST_ON(piDartPlayers[1], "Darts_name") // Awesome, get that name. INT iHashName = DECOR_GET_INT(piDartPlayers[1], "Darts_name") IF (HASH("RAYMOND") = iHashName) sDartsPlayerTwo = GET_DART_LOCAL_PLAYER_NAME("RAYMOND") iP2NameHash = HASH("RAYMOND") ELIF (HASH("JOHAN") = iHashName) sDartsPlayerTwo = GET_DART_LOCAL_PLAYER_NAME("JOHAN") iP2NameHash = HASH("JOHAN") ELIF (HASH("STAN") = iHashName) sDartsPlayerTwo = GET_DART_LOCAL_PLAYER_NAME("STAN") iP2NameHash = HASH("STAN") ELIF (HASH("VINCE") = iHashName) sDartsPlayerTwo = GET_DART_LOCAL_PLAYER_NAME("VINCE") iP2NameHash = HASH("VINCE") ELIF (HASH("KRISTY") = iHashName) sDartsPlayerTwo = GET_DART_LOCAL_PLAYER_NAME("KRISTY") iP2NameHash = HASH("KRISTY") ELIF (HASH("MARLENE") = iHashName) sDartsPlayerTwo = GET_DART_LOCAL_PLAYER_NAME("MARLENE") iP2NameHash = HASH("MARLENE") ELIF (HASH("LORIE") = iHashName) sDartsPlayerTwo = GET_DART_LOCAL_PLAYER_NAME("LORIE") iP2NameHash = HASH("LORIE") ELIF (HASH("SHELLEY") = iHashName) sDartsPlayerTwo = GET_DART_LOCAL_PLAYER_NAME("SHELLEY") iP2NameHash = HASH("SHELLEY") ENDIF ENDIF DECOR_SET_INT(piDartPlayers[1], "Darts_name", iP2NameHash) ENDIF MODEL_NAMES mDartOpponentModel mDartOpponentModel = GET_ENTITY_MODEL(piDartPlayers[1]) SET_DART_OPPONENT_VOICE(mDartOpponentModel) TASK_TURN_PED_TO_FACE_ENTITY(piDartPlayers[1], piDartPlayers[0]) TASK_TURN_PED_TO_FACE_ENTITY(piDartPlayers[0], piDartPlayers[1]) #IF IS_DEBUG_BUILD VECTOR vTemp1, vTemp2 vTemp1 = GET_ENTITY_COORDS(piDartPlayers[0]) vTemp2 = GET_ENTITY_COORDS(piDartPlayers[1]) IF NOT IS_PED_INJURED(piDartPlayers[0]) AND NOT IS_PED_INJURED(piDartPlayers[1]) CDEBUG1LN(DEBUG_DARTS, "Player is at ", vTemp1, ". Opponent is at ", vTemp2) CDEBUG1LN(DEBUG_DARTS, "Player heading is ", GET_ENTITY_HEADING(piDartPlayers[0]), ". Opponent heading is ", GET_ENTITY_HEADING(piDartPlayers[1])) ENDIF #ENDIF // IS_DEBUG_BUILD ENDPROC /// PURPOSE: /// An end of turn transtion showing the players score and a closeup of the Darts Board /// PARAMS: /// DartGame - PROC DO_TURN_CHANGE (DART_GAME & DartGame, DARTS_SCOREBOARD & DartsSB, DARTS_UI & DartsUI)//, DARTS_LOCATION DartsLocation = DARTSLOCATION_ROCK_CLUB) VECTOR vTemp SWITCH DartGame.TurnChange CASE DTC_BOARD_ZOOM IF DartGame.eThrowStyle = DARTS_STYLE_STICK BOARD_ZOOM_CAM() ENDIF IF iPlayr = 0 IF DARTS_GET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_BUST_NOT_DOUBLE) PRINT_WITH_NUMBER_NOW("DARTS_PLR_DUB", DartGame.Darts[iPlayr][iTurn].iHitValue, 5000, 0) ELIF DARTS_GET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_BUST_ONE_POINT_LEFT) PRINT_NOW("DARTS_ONE_PT", 5000, 0) ELIF DARTS_GET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_BUST_UNDER_ZERO) PRINT_WITH_NUMBER_NOW("DARTS_PLR_BUST", DartGame.Darts[iPlayr][iTurn].iHitValue, 5000, 0) ELSE PRINT_WITH_NUMBER_NOW("DARTS_SWITCH_C", DartGame.Scores[iPlayr], 5000, 0) ENDIF ELSE IF DARTS_GET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_BUST_NOT_DOUBLE) PRINT_WITH_NUMBER_NOW("DARTS_OPP_DUB", DartGame.Darts[iPlayr][iTurn].iHitValue, 5000, 0) ELIF DARTS_GET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_BUST_ONE_POINT_LEFT) PRINT_NOW("DARTS_ONE_PT", 5000, 0) ELIF DARTS_GET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_BUST_UNDER_ZERO) PRINT_WITH_NUMBER_NOW("DARTS_OPP_BUST", DartGame.Darts[iPlayr][iTurn].iHitValue, 5000, 0) ELSE PRINT_WITH_NUMBER_NOW("DARTS_SWITCH_B", DartGame.Scores[iPlayr], 5000, 0) ENDIF ENDIF SETTIMERB(0) DartGame.TurnChange = DTC_NEXT_TURN BREAK CASE DTC_DART_ZOOM IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_RIGHT) iDartZoom++ IF iDartZoom >= DartGame.iNumThrowsTurn iDartZoom = 0 ENDIF vTemp = GET_ENTITY_COORDS(DartGame.Darts[iPlayr][iDartZoom].object) DARTS_ZOOM_DART_CAM(vTemp) CDEBUG1LN(DEBUG_DARTS, "********** iDartZoom is ", iDartZoom) CDEBUG1LN(DEBUG_DARTS, "********** vPosition is: ", DartGame.Darts[iPlayr][iDartZoom].vPosition) CDEBUG1LN(DEBUG_DARTS, "********** Entity coords are: ",vTemp) CDEBUG1LN(DEBUG_DARTS, "********************") CDEBUG1LN(DEBUG_DARTS, "_____ Throw ", iDartZoom+1, ": ", DartGame.Darts[iPlayr][iDartZoom].iHitValue, " points _____") ENDIF IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_LEFT) iDartZoom-- IF iDartZoom < 0 iDartZoom = DartGame.iNumThrowsTurn - 1 ENDIF vTemp = GET_ENTITY_COORDS(DartGame.Darts[iPlayr][iDartZoom].object) DARTS_ZOOM_DART_CAM(vTemp) CDEBUG1LN(DEBUG_DARTS, "********** iDartZoom is ", iDartZoom) CDEBUG1LN(DEBUG_DARTS, "********** vPosition is: ", DartGame.Darts[iPlayr][iDartZoom].vPosition) CDEBUG1LN(DEBUG_DARTS, "********** Entity coords are: ", vTemp) CDEBUG1LN(DEBUG_DARTS, "********************") CDEBUG1LN(DEBUG_DARTS, "_____ Throw ", iDartZoom+1, ": ", DartGame.Darts[iPlayr][iDartZoom].iHitValue, " points _____") ENDIF IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL) vTemp = GET_ENTITY_COORDS(DartGame.Darts[iPlayr][iDartZoom].object) DARTS_ZOOM_DART_CAM_TRANS(vTemp, FALSE) DartGame.TurnChange = DTC_NEXT_TURN ENDIF IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT) bZoomCamSkip = TRUE DartGame.TurnChange = DTC_NEXT_TURN ENDIF BREAK CASE DTC_NEXT_TURN IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT) OR (bAISkipped AND bInstantSkip) bZoomCamSkip = TRUE ENDIF IF (IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_LEFT) OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_RIGHT)) AND DartGame.eThrowStyle = DARTS_STYLE_STICK vTemp = GET_ENTITY_COORDS(DartGame.Darts[iPlayr][iDartZoom].object) DARTS_ZOOM_DART_CAM_TRANS(vTemp) //iDartZoom = iTurn DartGame.TurnChange = DTC_DART_ZOOM CDEBUG1LN(DEBUG_DARTS, "_____ Throw ", iDartZoom+1, ": ", DartGame.Darts[iPlayr][iDartZoom].iHitValue, " points _____") ENDIF IF NOT DARTS_GET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_IN_WIN_RANGE) IF NOT bAnyAudioPlayedThisTurn IF PLAY_DARTS_TRASH_TALK((iPlayr = 0), piDartPlayers[1], (DartGame.LastScore[iPlayr] - DartGame.Scores[iPlayr]), DartGame.Scores[0], DartGame.Scores[1]) CDEBUG1LN(DEBUG_DARTS, "TRASH TALK PLAYED") bAnyAudioPlayedThisTurn = TRUE ELSE CDEBUG1LN(DEBUG_DARTS, "TRASH TALK DID NOT PLAY") ENDIF ELSE IF (GET_GAME_TIMER() % 500) < 50 CDEBUG1LN(DEBUG_DARTS, "Some audio already played this turn") ENDIF ENDIF ELSE IF NOT bAnyAudioPlayedThisTurn IF PLAY_DARTS_TRASH_TALK_CLUTCH((iPlayr = 0), piDartPlayers[1], (DartGame.LastScore[iPlayr] - DartGame.Scores[iPlayr]), DartGame.Scores[0], DartGame.Scores[1]) CDEBUG1LN(DEBUG_DARTS, "TRASH TALK CLUTCH PLAYED") bAnyAudioPlayedThisTurn = TRUE ELSE CDEBUG1LN(DEBUG_DARTS, "TRASH TALK CLUTCH DID NOT PLAY") ENDIF ELSE IF (GET_GAME_TIMER() % 500) < 50 CDEBUG1LN(DEBUG_DARTS, "Some audio already played this turn") ENDIF ENDIF ENDIF IF bZoomCamSkip OR TIMERB() > 2000 bAISkipped = FALSE INT i REPEAT NUM_DART_TURNS i RESET_DART(DartGame.Darts[iPlayr][i]) ENDREPEAT IF DartGame.LastScore[iPlayr] <> DartGame.Scores[iPlayr] DARTS_ADD_SCORE(DartsSB, iPlayr, DartGame.Scores[iPlayr]) PLAY_SOUND_FROM_COORD(-1, "DARTS_SCOREBOARD_MASTER", Dartgame.DartsBoard.vDartBoard) ENDIF // store the previous score in case we need to roll back to it for bustouts DartGame.LastScore[iPlayr] = DartGame.Scores[iPlayr] // reset the turn iTurn = 0 DartGame.iTurnScore = 0 // switch the player IF iPlayr = 0 iPlayr = 1 ELSE iPlayr = 0 ENDIF UPDATE_HIGHLIGHT(DartsSB, iPlayr) bNoCrossConflict = FALSE CDEBUG1LN(DEBUG_DARTS, "%%%%%%%%%%%%%%%%%%%%%%%%%%%% SWITCHING PLAYER %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%") DARTS_GAME_CAM() IF NOT bInstantSkip CLEAR_SMALL_PRINTS() ENDIF // BOOL bIsPlayer // // IF iPlayr = 0 // bIsPlayer = TRUE // ELSE // bIsPlayer = FALSE // ENDIF iSteadyShotsUsed = 0 DartsUI.iDartsLeft = 3 bOneDartHelpShown = FALSE bBoredAudioPlayedThisTurn = FALSE bAnyAudioPlayedThisTurn = FALSE bZoomCamSkip = FALSE iDartZoom = 0 DartGame.iNumThrowsTurn = 0 DartGame.TurnStage = DPS_AIM DartGame.TurnChange = DTC_BOARD_ZOOM ENDIF BREAK ENDSWITCH ENDPROC FUNC BOOL DID_DARTS_CLASH(DART_GAME & DartGame) INT i REPEAT iTurn i IF DartGame.Darts[iPlayr][iTurn].vTarget.x > DartGame.Darts[iPlayr][i].vTarget.x - 0.008 AND DartGame.Darts[iPlayr][iTurn].vTarget.x < DartGame.Darts[iPlayr][i].vTarget.x + 0.008 AND DartGame.Darts[iPlayr][iTurn].vTarget.z > DartGame.Darts[iPlayr][i].vTarget.z - 0.008 AND DartGame.Darts[iPlayr][iTurn].vTarget.z < DartGame.Darts[iPlayr][i].vTarget.z + 0.008 RETURN TRUE ENDIF ENDREPEAT RETURN FALSE ENDFUNC FUNC BOOL DO_TURN_ZOOM(DART_ZOOM_TURN & DartZoomStage) SWITCH DartZoomStage CASE DZT_ZOOM_IN IF IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_LT) DARTS_ZOOM_LAST_TURN() DartZoomStage = DZT_ZOOM_INTERP ELSE RETURN FALSE ENDIF BREAK CASE DZT_ZOOM_INTERP IF IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_LT) IF NOT IS_CAM_INTERPOLATING(camZoomBoard) SETUP_DARTS_PC_ZOOM_CONTROLS() INIT_FIRST_PERSON_CAMERA(fpDartsCam, vFPDartsPos, vFPDartsRot, 30, 10, 10, 3, 15, FALSE, 0, -1, TRUE) DartZoomStage = DZT_ZOOM_FP ENDIF ELSE DartZoomStage = DZT_ZOOM_OUT ENDIF BREAK CASE DZT_ZOOM_FP IF NOT IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_LT) DartZoomStage = DZT_ZOOM_OUT ELSE UPDATE_FIRST_PERSON_CAMERA(fpDartsCam) ENDIF BREAK CASE DZT_ZOOM_OUT //CLEAR_FIRST_PERSON_CAMERA(fpDartsCam) DARTS_ZOOM_LAST_TURN(FALSE) SETUP_DARTS_PC_CONTROLS() IF DOES_CAM_EXIST(fpDartsCam.theCam) IF IS_CAM_ACTIVE(fpDartsCam.theCam) SET_CAM_ACTIVE(fpDartsCam.theCam,FALSE) ENDIF DESTROY_CAM(fpDartsCam.theCam) ENDIF DartZoomStage = DZT_ZOOM_IN RETURN FALSE BREAK ENDSWITCH RETURN TRUE ENDFUNC FUNC BOOL DO_ONE_DART_HELPER (INT iTotalScore, DARTS_BOARD & DartsBoard, ONE_DART_STAGE & OneDartStage, VECTOR & vOneDartZoomCoord) SWITCH OneDartStage CASE ODS_ZOOM_IN VECTOR vLocalDoubleCoord vLocalDoubleCoord = GET_DOUBLE_VECTOR(iTotalScore) vOneDartZoomCoord = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(DartsBoard.oiDartBoard, vLocalDoubleCoord) CDEBUG1LN(DEBUG_DARTS, "--------------- vLocalDoubleCoord = ", vLocalDoubleCoord, ", vOneDartZoomCoord = ", vOneDartZoomCoord) DARTS_DOUBLE_CAM_START(vOneDartZoomCoord) SETTIMERB(0) OneDartStage = ODS_ZOOM_OUT BREAK CASE ODS_ZOOM_OUT IF TIMERB() > 3000 OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT) DARTS_DOUBLE_CAM_END() OneDartStage = ODS_ZOOM_IN RETURN TRUE ENDIF BREAK ENDSWITCH RETURN FALSE ENDFUNC /// PURPOSE: /// The main in game progress loop. /// PARAMS: /// DartGame - PROC DO_IN_PROGRESS (DART_GAME & DartGame, DARTS_STARTING_RETICLE_POS & InitRetPos, DARTS_SCOREBOARD & DartsSB, DARTS_UI & DartsUI, structTimer & ThrowTimer)//, DARTS_LOCATION DartsLocation) #IF IS_DEBUG_BUILD IF iPlayr < 2 AND iTurn < 3 IF DartGame.Darts[iPlayr][iTurn].bTravelling DRAW_DEBUG_TEXT_2D("bTravelling is TRUE", << 0.7, 0.3, 0.0 >>) ENDIF ENDIF HANDLE_SWITCH_CAM(DebugBoard.bSwitchCam) #ENDIF BOOL bGameCamInterpolating //If cam is moving, don't show HUD IF NOT IS_CAM_INTERPOLATING(camDartGame) bGameCamInterpolating = FALSE PLAYER_QUIT_CONTROL(DartGame) IF NOT bHasQuitTextPrinted // Instructions during end of turn board and dart zooms IF DartGame.TurnStage = DPS_TURN_CHANGE IF DartsUI.bInstructTextTransIn CLEAR_HELP() DartsUI.bInstructTextTransIn = FALSE ENDIF // Instructions during regular gameplay ELIF NOT bUITextDisplayed IF DARTS_GET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_END_HELP_READY) IF NOT DARTS_GET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_WIN_HELP) IF NOT IS_BIT_SET(g_iDartsTutorialFlags, gWIN_HELP_SHOWN) PRINT_HELP("DARTS_INSTR_W") SET_BIT(g_iDartsTutorialFlags, gWIN_HELP_SHOWN) ENDIF DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_WIN_HELP, TRUE) ELIF NOT DARTS_GET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_BUST_HELP) AND DARTS_GET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_BUST_HELP_READY) IF NOT IS_BIT_SET(g_iDartsTutorialFlags, gBUST_HELP_SHOWN) PRINT_HELP("DARTS_INSTR_B") SET_BIT(g_iDartsTutorialFlags, gBUST_HELP_SHOWN) ENDIF DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_BUST_HELP, TRUE) ENDIF ENDIF // IF DARTS_GET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_IN_WIN_RANGE) // AND NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("DARTS_SHT_USE") // AND NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("DARTS_FST_HLP") // AND iPlayr = 0 // IF (DartGame.Scores[iPlayr] % 2) = 0 // IF DartGame.Scores[iPlayr] = 50 // ELSE // CLEAR_HELP() // ENDIF // // ELSE // //PRINT_HELP_FOREVER_WITH_NUMBER("DARTS_CURRENT", DartGame.Scores[iPlayr]) // ENDIF // ELSE // //DARTS_HELP(iPlayr, DartsUI) // // ENDIF DartsUI.bInstructTextTransIn = TRUE ELSE IF DartsUI.bInstructTextTransIn CLEAR_HELP() DartsUI.bInstructTextTransIn = FALSE ENDIF ENDIF ENDIF IF DartGame.TurnStage = DPS_ZOOM IF NOT IS_CAM_INTERPOLATING(camZoomBoard) AND DartGame.ZoomTurn = DZT_ZOOM_FP DARTS_ZOOM_CONTROLS_UI(DartsUI) ENDIF ELSE DARTS_CONTROLS_UI(DartsUI, iPlayr) ENDIF // SET_SCRIPT_GFX_ALIGN(UI_ALIGN_LEFT, UI_ALIGN_BOTTOM) // SET_SCRIPT_GFX_ALIGN_PARAMS(0.0, 0.0, 0.0, 0.0) // // IF NOT bSubtitlesMoved // FLOAT fnewx, fnewy // GET_SCRIPT_GFX_ALIGN_POSITION(0.0, 0.0, fnewx, fnewy) // SET_HUD_COMPONENT_POSITION(NEW_HUD_SUBTITLE_TEXT, fnewx, fnewy-0.21) // bSubtitlesMoved = TRUE // ENDIF // // RESET_SCRIPT_GFX_ALIGN() // SET_SCRIPT_GFX_ALIGN(UI_ALIGN_LEFT, UI_ALIGN_TOP) // SET_SCRIPT_GFX_ALIGN_PARAMS(-0.05, -0.05, 0.0, 0.0) // // RESET_SCRIPT_GFX_ALIGN() //DRAW_DARTS_HUD(DartsUI) SKIP_AI_TURN_CHECK(DartGame.TurnStage) ELSE bGameCamInterpolating = TRUE ENDIF DARTS_DISPLAY_SPECIAL_SPLASH(DartsUI) SWITCH DartGame.TurnStage CASE DPS_ZOOM IF NOT DO_TURN_ZOOM(DartGame.ZoomTurn) DartGame.TurnStage = DPS_AIM ENDIF BREAK CASE DPS_ONE_DART_HELPER IF DO_ONE_DART_HELPER(DartGame.Scores[iPlayr], DartGame.DartsBoard, DartGame.OneDartStage, DartGame.vOneDartZoomCoord) DartGame.TurnStage = DPS_AIM ENDIF BREAK CASE DPS_AIM //prepping reticle and reticle shake //doing reticle move speed IF IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_LT) AND iPlayr = 0 //AND DartGame.eThrowStyle = DARTS_STYLE_STICK DartGame.TurnStage = DPS_ZOOM ENDIF IF iPlayr = 0 // IF DartGame.iBustStreak > 3 AND (DartGame.Scores[iPlayr] % 2 = 0) AND DartGame.eThrowStyle = DARTS_STYLE_STICK // DartGame.TurnStage = DPS_ONE_DART_HELPER // DartGame.iBustStreak = 0 DARTS_GAME_HELP(iTurn) IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("DARTS_SHT_USE") AND NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("DARTS_INSTR_W") AND NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("DARTS_INSTR_B") AND NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("DARTS_AIM_HLP") AND NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("DARTS_STD_HLP") AND NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("DARTS_FST_HLP") IF DARTS_GET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_SHOW_LEVEL_UP) // set the global bit here PRINT_HELP("DARTS_LEVEL") SET_BIT(g_savedGlobals.sDartsData.iDartTimePlayed, iLevelBit) DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_SHOW_LEVEL_UP, FALSE) ENDIF ENDIF IF (DartGame.Scores[iPlayr] % 2 = 0) AND DartGame.Scores[iPlayr] < 41 AND iTurn = 0 AND NOT bOneDartHelpShown IF NOT DARTS_GET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_IN_WIN_RANGE) DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_IN_WIN_RANGE, TRUE) ENDIF bOneDartHelpShown = TRUE ELIF DartGame.Scores[iPlayr] = 50 AND NOT bOneDartHelpShown IF NOT DARTS_GET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_IN_WIN_RANGE) DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_IN_WIN_RANGE, TRUE) ENDIF bOneDartHelpShown = TRUE ELSE IF DO_AIMING(DartGame.Darts[iPlayr][iTurn], DartGame.DartsBoard, InitRetPos, bGameCamInterpolating, FALSE, FALSE, DartGame.eThrowStyle) CLEAR_PRINTS() DartsUI.iDartsLeft-- CDEBUG1LN(DEBUG_DARTS, "[DO_IN_PROGRESS->DPS_AIM] Aiming finished") DartGame.TurnStage = DPS_THROW ELSE IF NOT bBoredAudioPlayedThisTurn IF NOT IS_TIMER_STARTED(ThrowTimer) RESTART_COUNTDOWNTIMER_NOW(ThrowTimer) ELIF GET_TIMER_IN_SECONDS(ThrowTimer) > 20.0 PLAY_HURRY_AUDIO(piDartPlayers[1-iPlayr]) CANCEL_TIMER(ThrowTimer) bBoredAudioPlayedThisTurn = TRUE ENDIF ENDIF ENDIF ENDIF ELSE IF iTurn = 0 iSkipAILoopCatch = 0 // resetting for loop catch, take out when skipAIloop bug is resolved GET_NEXT_AI_THROW(DartGame.Scores, DartGame.AIBrain) GET_AI_THROW_VECTOR(DartGame.Darts[iPlayr][iTurn], DartGame.DartsBoard, DartGame.TurnStage, DartGame.AIBrain) ELIF TIMERA() > GET_RANDOM_INT_IN_RANGE(1250, 2500) //750 GET_NEXT_AI_THROW(DartGame.Scores, DartGame.AIBrain) GET_AI_THROW_VECTOR(DartGame.Darts[iPlayr][iTurn], DartGame.DartsBoard, DartGame.TurnStage, DartGame.AIBrain) ENDIF // AUDIO PROC FLAG //bDartMissAudioPlayed = FALSE ENDIF BREAK CASE DPS_THROW //displaying the dart flying through the air and hitting the board //playing the correct sound effects IF THROW_DART(DartGame.Darts[iPlayr][iTurn], DartGame.DartsBoard, DartGame.eThrowStyle) DartGame.iNumThrowsTurn++ DartGame.bDartsClash = DID_DARTS_CLASH(DartGame) DartGame.TurnStage = DPS_SCORING CDEBUG1LN(DEBUG_DARTS, "[DO_IN_PROGRESS->DPS_THROW] Throw finished") ENDIF BREAK CASE DPS_SCORING //calculating the score //keeping track of bust and win possibilities //keeping track of turn cycles //displaying to the UI IF NOT DARTS_GET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_GAME_WON) CDEBUG1LN(DEBUG_DARTS, "[DO_IN_PROGRESS->DPS_SCORING] Scoring Dart Turn ", iTurn, ", Player ", iPlayr) SCORE_DART(DartGame.Darts[iPlayr][iTurn], DartGame.DartsBoard, DartGame.bDartsClash) ENDIF TURN_INCREMENT(DartGame, DartsUI) BREAK CASE DPS_TURN_CHANGE DO_TURN_CHANGE(DartGame, DartsSB, DartsUI)//, DartsLocation) IF IS_TIMER_STARTED(ThrowTimer) CANCEL_TIMER(ThrowTimer) ENDIF BREAK CASE DPS_SKIP_AI //simulate AI player until a skip is called DO_SKIP_AI_TURN(DartGame, DartsUI) BREAK ENDSWITCH ENDPROC FUNC BOOL DARTS_TUTORIAL(DARTS_TUTORIAL_STAGE & DartsTutorialStage, DARTS_BOARD & DartsBoard, DARTS_AI_BRAIN & AIBrain, DARTS_PLAYER_STATE & TurnStage, DART & TutorialDarts[], structTimer & TutorialTimer) IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED() AND GET_GAME_TIMER() >= iAllowSkipCutsceneTime + 1000 AND DartsTutorialStage != TS_SKIP IF NOT IS_SCREEN_FADED_OUT() AND NOT IS_SCREEN_FADING_OUT() DO_SCREEN_FADE_OUT(500) ENDIF ENDIF IF IS_SCREEN_FADED_OUT() AND DartsTutorialStage != TS_SKIP //HANG_UP_AND_PUT_AWAY_PHONE() //KILL_ANY_CONVERSATION() DartsTutorialStage = TS_SKIP ENDIF SWITCH DartsTutorialStage CASE TS_DOUBLE SWITCH iTurn CASE 0 IF TurnStage = DPS_AIM iAllowSkipCutsceneTime = GET_GAME_TIMER() DARTS_TUTORIAL_CAM(DartsBoard.vDartBoard, DartsBoard.fBoardHeading, GET_TUTORIAL_CAM_COORD_OFFSET(TS_DOUBLE), GET_TUTORIAL_CAM_ROT_OFFSET(), 0, TRUE) AIBrain.iThrowValue = 20 AIBrain.iThrowMultiplier = 2 GET_AI_THROW_VECTOR(TutorialDarts[0], DartsBoard, TurnStage, AIBrain, TRUE) ENDIF IF TurnStage = DPS_THROW IF THROW_DART(TutorialDarts[0], DartsBoard) PLAY_SOUND_FROM_COORD(-1, "DARTS_HIT_BOARD_MASTER", DartsBoard.vDartBoard) iTurn++ RESTART_TIMER_NOW(TutorialTimer) TurnStage = DPS_AIM ENDIF ENDIF BREAK CASE 1 IF GET_TIMER_IN_SECONDS_SAFE(TutorialTimer) > 1.0 AND NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("DARTS_DOUBLE_T") PRINT_HELP("DARTS_DOUBLE_T") ENDIF IF GET_TIMER_IN_SECONDS_SAFE(TutorialTimer) > 5.0 RESTART_TIMER_NOW(TutorialTimer) CLEAR_HELP() DARTS_TUTORIAL_CAM_INTERP(DartsBoard.vDartBoard, DartsBoard.fBoardHeading, GET_TUTORIAL_CAM_COORD_OFFSET(TS_TRIPLE), GET_TUTORIAL_CAM_ROT_OFFSET(), 1000) iTurn=0 DartsTutorialStage = TS_TRIPLE ENDIF BREAK ENDSWITCH BREAK CASE TS_TRIPLE SWITCH iTurn CASE 0 IF NOT IS_CAM_INTERPOLATING(camTutInterp) IF TurnStage = DPS_AIM AIBrain.iThrowValue = 20 AIBrain.iThrowMultiplier = 3 GET_AI_THROW_VECTOR(TutorialDarts[1], DartsBoard, TurnStage, AIBrain, TRUE) ENDIF IF TurnStage = DPS_THROW IF THROW_DART(TutorialDarts[1], DartsBoard) PLAY_SOUND_FROM_COORD(-1, "DARTS_HIT_BOARD_MASTER", DartsBoard.vDartBoard) iTurn++ RESTART_TIMER_NOW(TutorialTimer) TurnStage = DPS_AIM ENDIF ENDIF ENDIF BREAK CASE 1 IF GET_TIMER_IN_SECONDS_SAFE(TutorialTimer) > 1.0 AND NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("DARTS_TRIPLE_T") PRINT_HELP("DARTS_TRIPLE_T") ENDIF IF GET_TIMER_IN_SECONDS_SAFE(TutorialTimer) > 5.0 RESTART_TIMER_NOW(TutorialTimer) CLEAR_HELP() DARTS_TUTORIAL_CAM(DartsBoard.vDartBoard, DartsBoard.fBoardHeading, GET_TUTORIAL_CAM_COORD_OFFSET(TS_BULLSEYE), GET_TUTORIAL_CAM_ROT_OFFSET(), 1000) iTurn=0 DartsTutorialStage = TS_BULLSEYE ENDIF BREAK ENDSWITCH // IF NOT IS_CAM_INTERPOLATING(camTutInterp) // AND NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("DARTS_DOUBLE_T") // PRINT_HELP("DARTS_DOUBLE_T") // // //AND NOT IS_THIS_FLOATING_HELP_BEING_DISPLAYED("DARTS_DOUBLE_T") // // HELP_AT_ENTITY_OFFSET("DARTS_DOUBLE_T", DartGame.TutorialDarts[0].object, << 0, 0, -0.85 >>) // ENDIF // // IF GET_TIMER_IN_SECONDS_SAFE(TutorialTimer) > 6.0 // RESTART_TIMER_NOW(TutorialTimer) // DARTS_TUTORIAL_CAM(DartsBoard.vDartBoard, DartsBoard.fBoardHeading, // GET_TUTORIAL_CAM_COORD_OFFSET(TS_TRIPLE), GET_TUTORIAL_CAM_ROT_OFFSET(), 1000) // //HELP_AT_ENTITY("DARTS_TRIPLE_T", DartGame.TutorialDarts[0].object) // //CLEAR_THIS_FLOATING_HELP("DARTS_DOUBLE_T") // DartsTutorialStage = TS_BULLSEYE // ENDIF BREAK CASE TS_BULLSEYE SWITCH iTurn CASE 0 IF NOT IS_CAM_INTERPOLATING(camTutorial) IF TurnStage = DPS_AIM AIBrain.iThrowValue = 50 AIBrain.iThrowMultiplier = 1 GET_AI_THROW_VECTOR(TutorialDarts[2], DartsBoard, TurnStage, AIBrain, TRUE) ENDIF IF TurnStage = DPS_THROW IF THROW_DART(TutorialDarts[2], DartsBoard) PLAY_SOUND_FROM_COORD(-1, "DARTS_HIT_BOARD_MASTER", DartsBoard.vDartBoard) iTurn++ RESTART_TIMER_NOW(TutorialTimer) TurnStage = DPS_AIM ENDIF ENDIF ENDIF BREAK CASE 1 IF GET_TIMER_IN_SECONDS_SAFE(TutorialTimer) > 1.0 AND NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("DARTS_BULL_T") PRINT_HELP("DARTS_BULL_T") ENDIF IF GET_TIMER_IN_SECONDS_SAFE(TutorialTimer) > 5.0 RESTART_TIMER_NOW(TutorialTimer) CLEAR_HELP() PLAY_SOUND_FRONTEND(-1, "CAM_PAN_DARTS", "HUD_MINI_GAME_SOUNDSET") CPRINTLN(DEBUG_DARTS, "Playing first pan whoosh sound") DARTS_TUTORIAL_CAM_INTERP(DartsBoard.vDartBoard, DartsBoard.fBoardHeading, GET_TUTORIAL_CAM_COORD_OFFSET(TS_DBL_TO_WIN), GET_TUTORIAL_CAM_ROT_OFFSET(TRUE), 1500) iTurn=0 DartsTutorialStage = TS_DBL_TO_WIN ENDIF BREAK ENDSWITCH // IF NOT IS_CAM_INTERPOLATING(camTutorial) // AND NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("DARTS_TRIPLE_T") // PRINT_HELP("DARTS_TRIPLE_T") // // //AND NOT IS_THIS_FLOATING_HELP_BEING_DISPLAYED("DARTS_TRIPLE_T") // // HELP_AT_ENTITY("DARTS_TRIPLE_T", DartGame.TutorialDarts[0].object) // ENDIF // // IF GET_TIMER_IN_SECONDS_SAFE(TutorialTimer) > 6.0 // RESTART_TIMER_NOW(TutorialTimer) // DARTS_TUTORIAL_CAM_INTERP(DartsBoard.vDartBoard, DartsBoard.fBoardHeading, // GET_TUTORIAL_CAM_COORD_OFFSET(TS_BULLSEYE), GET_TUTORIAL_CAM_ROT_OFFSET(), 1000) // //HELP_AT_ENTITY("DARTS_BULL_T", DartGame.TutorialDarts[1].object) // //CLEAR_THIS_FLOATING_HELP("DARTS_TRIPLE_T") // DartsTutorialStage = TS_DBL_TO_WIN // ENDIF BREAK CASE TS_DBL_TO_WIN IF NOT IS_CAM_INTERPOLATING(camTutInterp) AND NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("DARTS_DBL_WIN") PRINT_HELP("DARTS_DBL_WIN") //AND NOT IS_THIS_FLOATING_HELP_BEING_DISPLAYED("DARTS_BULL_T") // HELP_AT_ENTITY("DARTS_BULL_T", DartGame.TutorialDarts[1].object) ENDIF IF GET_TIMER_IN_SECONDS_SAFE(TutorialTimer) > 6.0 RESTART_TIMER_NOW(TutorialTimer) // DARTS_TUTORIAL_CAM(DartsBoard.vDartBoard, DartsBoard.fBoardHeading, // GET_TUTORIAL_CAM_COORD_OFFSET(TS_DBL_TO_WIN), GET_TUTORIAL_CAM_ROT_OFFSET(), 1500) //HELP_AT_ENTITY("DARTS_DBL_WIN", DartGame.TutorialDarts[2].object) //CLEAR_THIS_FLOATING_HELP("DARTS_BULL_T") DartsTutorialStage = TS_ENDING ENDIF BREAK CASE TS_ENDING // IF NOT IS_CAM_INTERPOLATING(camTutorial) // AND NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("DARTS_DBL_WIN") // PRINT_HELP("DARTS_DBL_WIN") // // //AND NOT IS_THIS_FLOATING_HELP_BEING_DISPLAYED("DARTS_DBL_WIN") // // HELP_AT_ENTITY("DARTS_DBL_WIN", DartGame.TutorialDarts[2].object) // ENDIF //IF GET_TIMER_IN_SECONDS_SAFE(TutorialTimer) > 5.0 //TIMERA() > 6000 PLAY_SOUND_FRONTEND(-1, "CAM_PAN_DARTS", "HUD_MINI_GAME_SOUNDSET") CPRINTLN(DEBUG_DARTS, "Playing second whoosh sound") SET_CAM_ACTIVE_WITH_INTERP(camDartGame, camTutInterp, 1500) //CLEAR_THIS_FLOATING_HELP("DARTS_DBL_WIN") DartsTutorialStage = TS_ENDING2 //ENDIF BREAK CASE TS_ENDING2 IF NOT IS_CAM_INTERPOLATING(camDartGame) iTurn = 0 CLEAR_HELP() CLEAR_PRINTS() //CLEAR_ALL_FLOATING_HELP() INT i REPEAT NUM_DART_TURNS i CLEANUP_DART(TutorialDarts[i]) ENDREPEAT RETURN TRUE ENDIF BREAK CASE TS_SKIP IF IS_SCREEN_FADED_OUT() iTurn = 0 CLEAR_HELP() CLEAR_PRINTS() //CLEAR_ALL_FLOATING_HELP() INT i REPEAT NUM_DART_TURNS i CLEANUP_DART(TutorialDarts[i]) ENDREPEAT SET_CAM_ACTIVE(camDartGame, TRUE) DO_SCREEN_FADE_IN(500) RETURN TRUE ENDIF BREAK ENDSWITCH RETURN FALSE ENDFUNC FUNC BOOL SHOULD_DARTS_LEVEL_HELP_SHOW(INT iNumGames, INT & iBitToSet) // IF iNumGames >= 100 // IF NOT IS_BIT_SET(g_savedGlobals.sDartsData.iDartTimePlayed, gDARTS_LVL_UP5_SHWN) // iBitToSet = gDARTS_LVL_UP5_SHWN // RETURN TRUE // ENDIF // ELIF iNumGames >= 70 // IF NOT IS_BIT_SET(g_savedGlobals.sDartsData.iDartTimePlayed, gDARTS_LVL_UP4_SHWN) // iBitToSet = gDARTS_LVL_UP4_SHWN // RETURN TRUE // ENDIF // ELIF iNumGames >= 50 // IF NOT IS_BIT_SET(g_savedGlobals.sDartsData.iDartTimePlayed, gDARTS_LVL_UP3_SHWN) // iBitToSet = gDARTS_LVL_UP3_SHWN // RETURN TRUE // ENDIF // ELIF iNumGames >= 30 // IF NOT IS_BIT_SET(g_savedGlobals.sDartsData.iDartTimePlayed, gDARTS_LVL_UP2_SHWN) // iBitToSet = gDARTS_LVL_UP2_SHWN // RETURN TRUE // ENDIF // ELIF iNumGames >= 10 IF iNumGames >= 10 IF NOT IS_BIT_SET(g_savedGlobals.sDartsData.iDartTimePlayed, gDARTS_LVL_UP1_SHWN) iBitToSet = gDARTS_LVL_UP1_SHWN RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC SCRIPT (DARTS_ARGS DartsArgs) //Necessary variables DART_GAME DartGame DARTS_TUTORIAL_STAGE DartsTutorialStage DARTS_PLAYER_POS DartsPlayerPositions DARTS_STARTING_RETICLE_POS DartsInitReticlePos DARTS_SCOREBOARD DartsSB DARTS_UI DartsUI END_SCREEN_DATASET DartsEndScreen BOOL bPlayerQuitEarly BOOL bUsedSetsLegs BOOL bRequestGameSaid BOOL bAcceptGameSaid BOOL bCanGoToCleanup INT iNameTemp INT iSplashStage = 0 INT idz FLOAT fStaminaPercentage FLOAT fSteadyShotLength // FLOAT fRotTemp VECTOR vHickBar, vRockClub //, vLostHideout VECTOR vTemp // VECTOR vCamTemp VECTOR scenePosition VECTOR sceneRotation STRING sPlayerFacialAnimClip structTimer ThrowTimer structTimer TutorialTimer structTimer DialogTimer PED_INDEX piNearbyPeds[20] OBJECT_INDEX oiDartChallenge sFacialDictPed = "facials@gen_female@variations@happy" SWITCH GET_PLAYER_PED_ENUM(PLAYER_PED_ID()) CASE CHAR_MICHAEL sFacialDictPlayer = "facials@p_m_zero@variations@happy" BREAK CASE CHAR_FRANKLIN sFacialDictPlayer = "facials@p_m_one@variations@happy" BREAK CASE CHAR_TREVOR sFacialDictPlayer = "facials@p_m_two@variations@happy" BREAK ENDSWITCH sFacialClip[0] = "mood_happy_1" sFacialClip[1] = "mood_happy_2" sFacialClip[2] = "mood_happy_3" sOutroWin[0] = "darts_outro_01_guy1" sOutroWin[1] = "darts_outro_02_guy2" sOutroWin[2] = "darts_outro_03_guy2" sOutroLoss[0] = "darts_outro_01_guy2" sOutroLoss[1] = "darts_outro_02_guy1" sOutroLoss[2] = "darts_outro_03_guy1" sOutroCam[0] = "darts_outro_01_cam" sOutroCam[1] = "darts_outro_02_cam" sOutroCam[2] = "darts_outro_03_cam" piDartPlayers[0] = PLAYER_PED_ID() bNewOpponent = TRUE vHickBar = <<1992.293213,3050.582764,47.989731>> vRockClub = <<-572.040649,294.195770,79.937401>> SETUP_DARTS_PC_CONTROLS() IF NOT IS_PED_INJURED(PLAYER_PED_ID()) // IF GET_PLAYER_DISTANCE_FROM_LOCATION(vRockClub) < GET_PLAYER_DISTANCE_FROM_LOCATION(vHickBar) // DartsLocation = DARTSLOCATION_ROCK_CLUB // SWITCH GET_RANDOM_INT_IN_RANGE(0, 5) // CASE 0 // modelOpponent = A_M_Y_VINEWOOD_01 // CDEBUG1LN(DEBUG_DARTS, "modelOpponent = A_M_Y_VINEWOOD_01") // BREAK // CASE 1 // modelOpponent = A_M_Y_STLAT_01 // CDEBUG1LN(DEBUG_DARTS, "modelOpponent = A_M_Y_VINEWOOD_01") // BREAK // CASE 2 // modelOpponent = A_M_Y_VINEWOOD_04 // CDEBUG1LN(DEBUG_DARTS, "modelOpponent = A_M_Y_VINEWOOD_01") // BREAK // CASE 3 // modelOpponent = A_M_Y_STWHI_02 // CDEBUG1LN(DEBUG_DARTS, "modelOpponent = A_M_Y_VINEWOOD_01") // BREAK // CASE 4 // modelOpponent = A_M_Y_VINEWOOD_03 // CDEBUG1LN(DEBUG_DARTS, "modelOpponent = A_M_Y_VINEWOOD_01") // BREAK // ENDSWITCH // DartsLoc = ALOC_darts_rockClub // // CDEBUG1LN(DEBUG_DARTS, "Darts game started at Rock Club") // ELSE DartsLocation = DARTSLOCATION_HICK_BAR SWITCH GET_RANDOM_INT_IN_RANGE(0, 2) CASE 0 modelOpponent = A_F_M_SALTON_01 CDEBUG1LN(DEBUG_DARTS, "modelOpponent = A_F_M_SALTON_01") BREAK CASE 1 modelOpponent = A_F_O_SALTON_01 CDEBUG1LN(DEBUG_DARTS, "modelOpponent = A_F_O_SALTON_01") BREAK ENDSWITCH DartsLoc = ALOC_darts_hickBar CDEBUG1LN(DEBUG_DARTS, "Darts game started at Hick Bar") // ENDIF SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE) //TASK_SWAP_WEAPON(PLAYER_PED_ID(), FALSE) ENDIF IF NOT DOES_ENTITY_EXIST(DartsArgs.oiDartBoard) CDEBUG1LN(DEBUG_DARTS, "DartsArgs.oiDartBoard DOES NOT exist.") IF NOT IS_PED_INJURED(PLAYER_PED_ID()) // IF DartsLocation = DARTSLOCATION_LOST_HIDEOUT // DartsArgs.vDartBoard = vLostHideout // DartsArgs.fBoardHeading = -137.348129 IF DartsLocation = DARTSLOCATION_ROCK_CLUB DartsArgs.vDartBoard = vRockClub DartsArgs.fBoardHeading = -0.09 ELSE DartsArgs.vDartBoard = vHickBar DartsArgs.fBoardHeading = 57.783146 ENDIF IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(DartsArgs.vDartBoard, 5.0, PROP_DART_BD_CAB_01) DartsArgs.oiDartBoard = GET_CLOSEST_OBJECT_OF_TYPE(DartsArgs.vDartBoard, 5.0, PROP_DART_BD_CAB_01) GET_COORDS_AND_ROTATION_OF_CLOSEST_OBJECT_OF_TYPE(DartsArgs.vDartBoard, 5.0, PROP_DART_BD_CAB_01, DartsArgs.vDartBoard, vTemp, EULER_XYZ) DartsArgs.fBoardHeading = vTemp.z CDEBUG1LN(DEBUG_DARTS, "PROP_DART_BD_CAB_01 found in area.") ELSE CDEBUG1LN(DEBUG_DARTS, "PROP_DART_BD_CAB_01 not found in area of Darts Args.") ENDIF ENDIF ELSE CDEBUG1LN(DEBUG_DARTS, "DartsArgs.oiDartBoard DOES exist.") vTemp = GET_ENTITY_COORDS(DartsArgs.oiDartBoard) CDEBUG1LN(DEBUG_DARTS, "DartsArgs.oiDartBoard is located in ", vTemp) CDEBUG1LN(DEBUG_DARTS, "DartsArgs.oiDartBoard is heading ", GET_ENTITY_HEADING(DartsArgs.oiDartBoard)) ENDIF CDEBUG1LN(DEBUG_DARTS, "********** DartsArgs.vDartBoard", DartsArgs.vDartBoard, "**************") CDEBUG1LN(DEBUG_DARTS, "********** DartsArgs.fBoardHeading", DartsArgs.fBoardHeading, "*************") //Gets the friend for a friend activity IF NOT IS_ENTITY_DEAD(FRIEND_A_PED_ID()) startActivity(DartsLoc) IF IS_PED_IN_ANY_VEHICLE(FRIEND_A_PED_ID()) //SPECIAL_FUNCTION_DO_NOT_USE(FRIEND_A_PED_ID(), TRUE) TASK_LEAVE_ANY_VEHICLE(FRIEND_A_PED_ID()) ENDIF piDartPlayers[1] = FRIEND_A_PED_ID() //tasking the friend to do nothing is sufficient for now. //TASK_PAUSE(FRIEND_A_PED_ID(), -1) CDEBUG1LN(DEBUG_DARTS, "[DARTS] starting friend activity") ELSE CDEBUG1LN(DEBUG_DARTS, "[DARTS] friend not valid, using normal opponent") SET_MISSION_FLAG(TRUE) ENDIF IF HAS_FORCE_CLEANUP_OCCURRED(DEFAULT_FORCE_CLEANUP_FLAGS | FORCE_CLEANUP_FLAG_REPEAT_PLAY) //Cleanups MISSION_FLOW_MISSION_FORCE_CLEANUP() CLEANUP_DARTS_GAME(DartGame, DartsUI, DartsEndScreen) ENDIF //FORCE_CLEANUP_FLAG_SP_TO_MP #IF IS_DEBUG_BUILD ADD_WIDGETS(DebugBoard) #ENDIF //SET_PED_CURRENT_WEAPON_VISIBLE(PLAYER_PED_ID(), FALSE) DISPLAY_AREA_NAME(FALSE) SET_PLAYER_CONTROL(PLAYER_ID(), FALSE) DISABLE_CELLPHONE(TRUE) // max steady shot length = 1320 iStaminaXP = GET_SP_PLAYER_PED_STAT_VALUE(GET_PLAYER_PED_ENUM(piDartPlayers[0]), PS_STAMINA) CDEBUG1LN(DEBUG_DARTS, "stamina stat = ", iStaminaXP) fStaminaPercentage = TO_FLOAT(iStaminaXP)/100 fSteadyShotLength = fStaminaPercentage * 1200 iSteadyShotLength = ROUND(fSteadyShotLength) CDEBUG1LN(DEBUG_DARTS, "steady shot = ", iSteadyShotLength) IF iSteadyShotLength < 660 iSteadyShotLength = 660 CDEBUG1LN(DEBUG_DARTS, "steady shot readjusted to 660") ENDIF DISABLE_CHEAT(CHEAT_TYPE_ALL, TRUE) WHILE (TRUE) // main loop WAIT(0) HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_WEAPON_ICON) HIDE_HUD_AND_RADAR_THIS_FRAME() SET_HUD_COMPONENT_POSITION(NEW_HUD_SUBTITLE_TEXT, 0.0, -0.0375) // debug builds only #IF IS_DEBUG_BUILD DO_DEBUG_PROCS(DebugBoard, DartGame, spriteDebug, siScoreBoardDebug, piDartPlayers) IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F) CDEBUG1LN(DEBUG_DARTS, "Darts Script Debug Quit") //bDartsNoSocialClub = TRUE CLEANUP_DARTS_GAME(DartGame, DartsUI, DartsEndScreen) ENDIF IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S) CDEBUG1LN(DEBUG_DARTS, "Darts Script Debug Won") //bDartsNoSocialClub = TRUE GAME_WON(DartGame) ENDIF #ENDIF // draw the scoreboard scaleform //IF DartGame.Stage > STAGE_CHALLENGE AND DartGame.Stage < STAGE_FINISHED IF bActivateScoreBoard AND DartGame.Stage < STAGE_FINISHED //DRAW_SCALEFORM_MOVIE(DartsSB.siScoreBoard, 0.275, 0.3, 0.24, 0.5, 255, 255, 255, 0) //placeholder 2D scoreboard DRAW_SCALEFORM_MOVIE_3D(DartsSB.siScoreBoard, DartsSB.vScoreBoardPos, DartsSB.vScoreBoardRot, DartsSB.vScoreBoardScale, DartsSB.vScoreBoardScale) ENDIF IF (IS_PED_INJURED(DartsArgs.piDartOpponent) AND NOT DOES_ENTITY_EXIST(FRIEND_A_PED_ID())) OR (DOES_ENTITY_EXIST(FRIEND_A_PED_ID()) AND IS_PED_INJURED(FRIEND_A_PED_ID())) CDEBUG1LN(DEBUG_DARTS, "opponent died, cleaning up.") CLEANUP_DARTS_GAME(DartGame, DartsUI, DartsEndScreen) ENDIF IF NOT IS_PED_INJURED(piDartPlayers[0]) SET_PED_RESET_FLAG(piDartPlayers[0], PRF_DisableAgitation, TRUE) SET_PED_RESET_FLAG(piDartPlayers[0], PRF_CannotBeTargetedByAI, TRUE) DISABLE_SELECTOR_THIS_FRAME() ALLOW_ALTERNATIVE_SCRIPT_CONTROLS_LAYOUT(PLAYER_CONTROL) ALLOW_ALTERNATIVE_SCRIPT_CONTROLS_LAYOUT(FRONTEND_CONTROL) REPEAT GET_PED_NEARBY_PEDS(PLAYER_PED_ID(), piNearbyPeds) idz IF piNearbyPeds[idz] != piDartPlayers[1] IF NOT IS_PED_INJURED(piNearbyPeds[idz]) SET_PED_RESET_FLAG(piNearbyPeds[idz], PRF_DisableTalk, TRUE) //SET_PED_CONFIG_FLAG(piNearbyPeds[idz], PCF_CanBeAgitated, FALSE) ENDIF ENDIF ENDREPEAT // run appropriate stage SWITCH DartGame.Stage CASE STAGE_PRE_INIT CDEBUG1LN(DEBUG_DARTS, "Reached STAGE_PRE_INIT") CLEAR_HELP() INIT_BOARD(DartGame.DartsBoard, DartsArgs) INIT_CAM(DartGame.DartsBoard.vDartBoard, DartGame.DartsBoard.fBoardHeading) IF DOES_ENTITY_EXIST(DartGame.DartsBoard.oiDartBoard) //ATTACH_CAM_TO_ENTITY(camZoomBoard, DartGame.DartsBoard.oiDartBoard, <<0.7792, -1.1380, 0.1814>>) //POINT_CAM_AT_ENTITY(camZoomBoard, DartGame.DartsBoard.oiDartBoard, <<-0.9485, 1.2798, -0.2296>>) vFPDartsPos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(DartGame.DartsBoard.oiDartBoard, <<0.7792, -1.1380, 0.1814>>) vFPDartsRot = << -7.9947, 0.0, DartGame.DartsBoard.fBoardHeading + 36.191757 >> camZoomBoard = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, vFPDartsPos, vFPDartsRot) SET_CAM_FOV(camZoomBoard, 30.0) ELSE CDEBUG1LN(DEBUG_DARTS, "dartboard object does not exist!!") ENDIF SC_LEADERBOARD_CACHE_CLEAR_ALL() CDEBUG1LN(DEBUG_DARTS, "cleared leaderboard cache") SETTIMERA(0) DartGame.Stage = STAGE_PRE_INIT_WAIT BREAK CASE STAGE_PRE_INIT_WAIT IF TIMERA() > 500 AND NOT IS_PED_RAGDOLL(PLAYER_PED_ID()) CDEBUG1LN(DEBUG_DARTS, "Reached STAGE_PRE_INIT_WAIT") CLEAR_AREA(DartsArgs.vDartBoard, 0.5, TRUE) IF NOT IS_PED_INJURED(PLAYER_PED_ID()) AND IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID(), TRUE) CLEAR_SEQUENCE_TASK(siTemp) OPEN_SEQUENCE_TASK(siTemp) //failsafe if player gets on a bike before the control is turned off TASK_LEAVE_ANY_VEHICLE(NULL) //TASK_GO_STRAIGHT_TO_COORD(NULL, vInitLostHideoutPos, PEDMOVEBLENDRATIO_WALK) CLOSE_SEQUENCE_TASK(siTemp) TASK_PERFORM_SEQUENCE(PLAYER_PED_ID(), siTemp) ENDIF vInitLostHideoutPos = vInitLostHideoutPos DartGame.Stage = STAGE_INIT ENDIF BREAK CASE STAGE_INIT CDEBUG1LN(DEBUG_DARTS, "Reached STAGE_INIT") //init variables // CAM POS Offset // vCamTemp = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(DartsArgs.oiDartBoard, <<1992.679, 3050.739, 47.660>>) // CDEBUG1LN(DEBUG_DARTS, "TUTORIAL CAM OFFSET!!: ", vCamTemp) // fRotTemp = GET_ENTITY_HEADING(DartsArgs.oiDartBoard) - 54.000 // CDEBUG1LN(DEBUG_DARTS, "rotation : ", fRotTemp) INT i, j REPEAT NUM_DART_PLAYERS i REPEAT NUM_DART_TURNS j INIT_DARTS(DartGame.Darts[i][j], i) ENDREPEAT ENDREPEAT INT k REPEAT NUM_DART_TURNS k INIT_DARTS(DartGame.TutorialDarts[k], 0) ENDREPEAT DartsTutorialStage = TS_DOUBLE //TS_THROWING INIT_SPRITE_RETICLE() DARTS_INIT_SCOREBOARD(DartsSB, ENUM_TO_INT(DartsLocation), DartGame.DartsBoard.vDartBoard, DartGame.DartsBoard.fBoardHeading) IF DOES_ENTITY_EXIST(DartGame.DartsBoard.oiDartBoard) vTemp = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(DartGame.DartsBoard.oiDartBoard, DartsSB.vScoreBoardPos) CDEBUG1LN(DEBUG_DARTS, "offset for scoreboard = ", vTemp) ENDIF //request streams REQUEST_STREAMS(DartsSB, DartsUI) REGISTER_SCRIPT_WITH_AUDIO() CDEBUG1LN(DEBUG_DARTS, "Finished Stage_init") DartGame.Stage = STAGE_STREAMING BREAK CASE STAGE_STREAMING //wait for all streams to load up before proceeding IF HAVE_STREAMS_LOADED(DartsSB, DartsUI) //create all necessary components GET_WORLD_OFFSETS(DartGame.DartsBoard, DartsPlayerPositions, DartsInitReticlePos) //writing the names on the chalkboard eDartsPlayerOne = GET_PLAYER_PED_ENUM(piDartPlayers[0]) SWITCH eDartsPlayerOne CASE CHAR_MICHAEL sDartsPlayerOne = GET_DART_LOCAL_PLAYER_NAME("MICHAEL") IF NOT IS_BIT_SET(g_iDartsTutorialFlags, gDARTS_TUTORIAL_SHOWN) sPlayerFacialAnimClip = "darts_ig_intro_player_0_face" ELSE sPlayerFacialAnimClip = "darts_ig_intro_alt1_player_0_face" ENDIF BREAK CASE CHAR_FRANKLIN sDartsPlayerOne = GET_DART_LOCAL_PLAYER_NAME("FRANKLIN") bFranklin = TRUE IF NOT IS_BIT_SET(g_iDartsTutorialFlags, gDARTS_TUTORIAL_SHOWN) sPlayerFacialAnimClip = "darts_ig_intro_player_1_face" ELSE sPlayerFacialAnimClip = "darts_ig_intro_alt1_player_1_face" ENDIF BREAK CASE CHAR_TREVOR sDartsPlayerOne = GET_DART_LOCAL_PLAYER_NAME("TREVOR") IF NOT IS_BIT_SET(g_iDartsTutorialFlags, gDARTS_TUTORIAL_SHOWN) sPlayerFacialAnimClip = "darts_ig_intro_player_2_face" ELSE sPlayerFacialAnimClip = "darts_ig_intro_alt1_player_2_face" ENDIF BREAK ENDSWITCH IF NOT IS_ENTITY_DEAD(FRIEND_A_PED_ID()) // setting name for friend activity eDartsPlayerTwo = GET_PLAYER_PED_ENUM(FRIEND_A_PED_ID()) IF eDartsPlayerTwo = NO_CHARACTER eDartsPlayerTwo = GET_NPC_PED_ENUM(FRIEND_A_PED_ID()) ENDIF SWITCH eDartsPlayerTwo CASE CHAR_MICHAEL sDartsPlayerTwo = GET_DART_LOCAL_PLAYER_NAME("MICHAEL") BREAK CASE CHAR_FRANKLIN sDartsPlayerTwo = GET_DART_LOCAL_PLAYER_NAME("FRANKLIN") BREAK CASE CHAR_TREVOR sDartsPlayerTwo = GET_DART_LOCAL_PLAYER_NAME("TREVOR") BREAK CASE CHAR_LAMAR sDartsPlayerTwo = GET_DART_LOCAL_PLAYER_NAME("LAMAR") SET_PED_COMPONENT_VARIATION(FRIEND_A_PED_ID(), PED_COMP_HAND, 2, 0) BREAK CASE CHAR_JIMMY sDartsPlayerTwo = GET_DART_LOCAL_PLAYER_NAME("JIMMY") BREAK DEFAULT sDartsPlayerTwo = "NEW_GUY" BREAK ENDSWITCH CDEBUG1LN(DEBUG_DARTS, "Setting name for friend activity to ", sDartsPlayerTwo) ELSE // Setting random name for ped iNameTemp = GET_RANDOM_INT_IN_RANGE(0, 200) IF DartsLocation = DARTSLOCATION_ROCK_CLUB IF iNameTemp < 51 sDartsPlayerTwo = GET_DART_LOCAL_PLAYER_NAME("RAYMOND") iP2NameHash = HASH("RAYMOND") ELIF iNameTemp < 101 sDartsPlayerTwo = GET_DART_LOCAL_PLAYER_NAME("JOHAN") iP2NameHash = HASH("JOHAN") ELIF iNameTemp < 151 sDartsPlayerTwo = GET_DART_LOCAL_PLAYER_NAME("STAN") iP2NameHash = HASH("STAN") ELSE sDartsPlayerTwo = GET_DART_LOCAL_PLAYER_NAME("VINCE") iP2NameHash = HASH("VINCE") ENDIF ELSE IF iNameTemp < 51 sDartsPlayerTwo = GET_DART_LOCAL_PLAYER_NAME("KRISTY") iP2NameHash = HASH("KRISTY") ELIF iNameTemp < 101 sDartsPlayerTwo = GET_DART_LOCAL_PLAYER_NAME("MARLENE") iP2NameHash = HASH("MARLENE") ELIF iNameTemp < 151 sDartsPlayerTwo = GET_DART_LOCAL_PLAYER_NAME("LORIE") iP2NameHash = HASH("LORIE") ELSE sDartsPlayerTwo = GET_DART_LOCAL_PLAYER_NAME("SHELLEY") iP2NameHash = HASH("SHELLEY") ENDIF ENDIF CDEBUG1LN(DEBUG_DARTS, "Setting name for non friend activity to ", sDartsPlayerTwo) ENDIF oiReticle = CREATE_OBJECT(modelReticleRegular, DartsInitReticlePos.vInitReticlePos) DartGame.iDartGamesWon[0] = 0 DartGame.iDartGamesWon[1] = 0 //iDartStartTime = GET_GAME_TIMER() DartGame.Stage = STAGE_SPAWNING CDEBUG1LN(DEBUG_DARTS, "Finished Stage_streaming") ENDIF BREAK CASE STAGE_SPAWNING IF NOT IS_INTERPOLATING_TO_SCRIPT_CAMS() oiDartChallenge = CREATE_OBJECT(PROP_DART_1, DartsInitReticlePos.vInitReticlePos) INIT_PEDS(DartGame.DartsBoard.fBoardHeading, DartsPlayerPositions, piNearbyPeds, DartsArgs) DARTS_ADD_NAMES(DartsSB, sDartsPlayerOne, sDartsPlayerTwo) CLEAR_PED_TASKS(piDartPlayers[1]) camDartsSync = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, <<0,0,0>>, <<0,0,0>>) IF NOT IS_PED_INJURED(PLAYER_PED_ID()) FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_IDLE) CDEBUG1LN(DEBUG_DARTS, "Set vehicle save position, set player to walking") ENDIF //bVehicleSaved = ODDJOB_SAVE_VEHICLE_AND_WARP(VehicleSaveArgs, PICK_VECTOR((DartsLocation = DARTSLOCATION_ROCK_CLUB), << -572.0901, 268.8933, 81.7819 >>, << 1995.0244, 3055.6152, 46.0753 >>), // TRUE,PICK_FLOAT((DartsLocation = DARTSLOCATION_ROCK_CLUB), 85.7488, 241.7907)) ADD_PED_FOR_DIALOGUE(DartGame.DartsConvo, 0, PLAYER_PED_ID(), sDartsPlayerOne) IF IS_ENTITY_DEAD(FRIEND_A_PED_ID()) CDEBUG1LN(DEBUG_DARTS, "Adding dialogue for a non-friend activity") //TODO: fix dialogue IF DartsLocation = DARTSLOCATION_ROCK_CLUB ADD_PED_FOR_DIALOGUE(DartGame.DartsConvo, 3, piDartPlayers[1], "DartsBillLost1") ELSE ADD_PED_FOR_DIALOGUE(DartGame.DartsConvo, 3, piDartPlayers[1], "DartsMelHick1") ENDIF iSplashStage = -1 ELSE ADD_PED_FOR_DIALOGUE(DartGame.DartsConvo, 3, FRIEND_A_PED_ID(), sDartsPlayerTwo) CDEBUG1LN(DEBUG_DARTS, "This is a friend activity, dialogue to be added later") CDEBUG1LN(DEBUG_DARTS, "Also setting the intro scene to be skipped") RESTART_TIMER_NOW(DialogTimer) iSplashStage = 6 ENDIF IF NOT IS_BIT_SET(g_iDartsTutorialFlags, gDARTS_TUTORIAL_SHOWN) iSplashStage = -1 ELSE iSplashStage = 3 ENDIF UPDATE_HIGHLIGHT(DartsSB, 0) CDEBUG1LN(DEBUG_DARTS, "Finished STAGE_SPAWNING") DartGame.Stage = STAGE_CHALLENGE ENDIF BREAK CASE STAGE_CHALLENGE IF NOT IS_PED_INJURED(piDartPlayers[1]) AND IS_PED_ON_FOOT(piDartPlayers[0]) AND NOT IS_PED_IN_ANY_VEHICLE(piDartPlayers[0], TRUE) AND IS_PED_ON_FOOT(piDartPlayers[1]) AND NOT IS_PED_IN_ANY_VEHICLE(piDartPlayers[1], TRUE) bVehicleSaved = ODDJOB_SAVE_VEHICLE(VehicleSaveArgs) IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED() AND GET_GAME_TIMER() >= iAllowSkipCutsceneTime + 1000 AND iSplashStage != 9 IF NOT IS_SCREEN_FADED_OUT() AND NOT IS_SCREEN_FADING_OUT() DO_SCREEN_FADE_OUT(500) ENDIF ENDIF IF IS_SCREEN_FADED_OUT() AND iSplashStage != 9 HANG_UP_AND_PUT_AWAY_PHONE() KILL_ANY_CONVERSATION() iSplashStage = 9 ENDIF SWITCH iSplashStage // -------------- First game in a session ------------------------- CASE -1 IF NOT IS_PED_INJURED(piDartPlayers[1]) iSceneId = CREATE_SYNCHRONIZED_SCENE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(DartsArgs.oiDartBoard, << 0.337842, -0.243051, -0.329731 >>), << 0, 0, GET_ENTITY_HEADING(DartsArgs.oiDartBoard) - 3.783146>>) camDartsSync = CREATE_CAM("DEFAULT_ANIMATED_CAMERA", FALSE) PLAY_SYNCHRONIZED_CAM_ANIM(camDartsSync, iSceneId, "darts_ig_intro_cam", "mini@dartsintro") SET_CAM_ACTIVE(camDartsSync, TRUE) RENDER_SCRIPT_CAMS(TRUE, FALSE) TASK_CLEAR_LOOK_AT(piDartPlayers[0]) TASK_CLEAR_LOOK_AT(piDartPlayers[1]) CLEAR_PED_TASKS_IMMEDIATELY(piDartPlayers[0]) CLEAR_PED_TASKS_IMMEDIATELY(piDartPlayers[1]) TASK_SYNCHRONIZED_SCENE (piDartPlayers[1], iSceneId, "mini@dartsintro", "darts_ig_intro_guy1", INSTANT_BLEND_IN, INSTANT_BLEND_OUT ) TASK_SYNCHRONIZED_SCENE (piDartPlayers[0], iSceneId, "mini@dartsintro", "darts_ig_intro_guy2", INSTANT_BLEND_IN, INSTANT_BLEND_OUT ) TASK_PLAY_ANIM(piDartPlayers[1], "mini@dartsintro", "darts_ig_intro_guy1_face", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_SECONDARY) TASK_PLAY_ANIM(piDartPlayers[0], "mini@dartsintro", sPlayerFacialAnimClip, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_SECONDARY) PLAY_SYNCHRONIZED_ENTITY_ANIM( oiDartChallenge, iSceneId, "darts_ig_intro_dart","mini@dartsintro" , INSTANT_BLEND_IN ) //PLAY_PED_AMBIENT_SPEECH(piDartPlayers[0], "DARTS_REQUEST_GAME") START_TIMER_NOW_SAFE(DialogTimer) iSplashStage++ ENDIF BREAK CASE 0 IF IS_SYNCHRONIZED_SCENE_RUNNING(iSceneId) IF NOT bRequestGameSaid IF GET_TIMER_IN_SECONDS_SAFE(DialogTimer) > 1.5 PLAY_PED_AMBIENT_SPEECH(piDartPlayers[0], "DARTS_REQUEST_GAME", SPEECH_PARAMS_FORCE_NORMAL) bRequestGameSaid = TRUE CANCEL_TIMER(DialogTimer) ENDIF ELSE IF NOT IS_AMBIENT_SPEECH_PLAYING(piDartPlayers[0]) IF NOT bAcceptGameSaid IF NOT IS_TIMER_STARTED(DialogTimer) RESTART_TIMER_NOW(DialogTimer) ELIF GET_TIMER_IN_SECONDS_SAFE(DialogTimer) > 0.5 PLAY_AGREE_AUDIO(piDartPlayers[1]) CANCEL_TIMER(DialogTimer) bAcceptGameSaid = TRUE ENDIF ENDIF ENDIF ENDIF SWITCH iTurn CASE 0 START_TIMER_NOW_SAFE(DialogTimer) PRINT_HELP("DARTS_HOW_TO_2") iTurn++ BREAK CASE 1 // IF GET_TIMER_IN_SECONDS_SAFE(DialogTimer) > 1.25 // CANCEL_TIMER(DialogTimer) // PLAY_PED_AMBIENT_SPEECH(piDartPlayers[0], "DARTS_REQUEST_GAME") // ENDIF IF GET_SYNCHRONIZED_SCENE_PHASE(iSceneId) > 0.25 START_TIMER_NOW_SAFE(DialogTimer) PRINT_HELP("DARTS_HOW_TO_3") iTurn++ ENDIF BREAK CASE 2 // IF GET_TIMER_IN_SECONDS_SAFE(DialogTimer) > 1.25 // CANCEL_TIMER(DialogTimer) // PLAY_AGREE_AUDIO(piDartPlayers[1]) // ENDIF IF GET_SYNCHRONIZED_SCENE_PHASE(iSceneId) > 0.55 PRINT_HELP("DARTS_HOW_3A") iTurn++ ENDIF BREAK CASE 3 IF GET_SYNCHRONIZED_SCENE_PHASE(iSceneId) > 0.85 PRINT_HELP("DARTS_HOW_3A") iTurn++ ENDIF BREAK ENDSWITCH IF GET_SYNCHRONIZED_SCENE_PHASE(iSceneId) > 0.95 CDEBUG1LN(DEBUG_DARTS, "sync scene almost done, going to splash stage 1") bActivateScoreBoard = TRUE iSplashStage++ ELSE IF (GET_GAME_TIMER() % 1000) < 50 CDEBUG1LN(DEBUG_DARTS, "sync scene phase = ", GET_SYNCHRONIZED_SCENE_PHASE(iSceneId)) ENDIF ENDIF ENDIF BREAK CASE 1 IF GET_SYNCHRONIZED_SCENE_PHASE(iSceneId) > 0.99 IF NOT IS_PED_INJURED(piDartPlayers[1]) DARTS_TUTORIAL_CAM(DartGame.DartsBoard.vDartBoard, DartGame.DartsBoard.fBoardHeading, GET_TUTORIAL_CAM_COORD_OFFSET(TS_DOUBLE), GET_TUTORIAL_CAM_ROT_OFFSET(), 0, TRUE) iTurn = 0 CLEAR_HELP() DESTROY_CAM(camDartsSync) CLEAR_PED_TASKS (piDartPlayers[0]) CLEAR_PED_TASKS (piDartPlayers[1]) STOP_SYNCHRONIZED_ENTITY_ANIM( oiDartChallenge, INSTANT_BLEND_OUT, FALSE) DELETE_OBJECT(oiDartChallenge) STOP_AUDIO_SCENE(GET_DARTS_RAVE_SCENE(DARTSRAVE_GREETING)) CANCEL_TIMER(DialogTimer) DartGame.Stage = STAGE_SPLASH iSplashStage = 0 ENDIF ELSE CDEBUG1LN(DEBUG_DARTS, "sync scene is still running") ENDIF BREAK // -------------- Succesive games in a session ------------------------- CASE 3 IF NOT IS_PED_INJURED(piDartPlayers[1]) iSceneId = CREATE_SYNCHRONIZED_SCENE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(DartsArgs.oiDartBoard, << 0.337842, -0.243051, -0.329731 >>), << 0, 0, GET_ENTITY_HEADING(DartsArgs.oiDartBoard) - 3.783146>>) camDartsSync = CREATE_CAM("DEFAULT_ANIMATED_CAMERA", FALSE) PLAY_SYNCHRONIZED_CAM_ANIM(camDartsSync, iSceneId, "darts_ig_intro_alt1_cam", "mini@dartsintro_alt1") SET_CAM_ACTIVE(camDartsSync, TRUE) RENDER_SCRIPT_CAMS(TRUE, FALSE) TASK_CLEAR_LOOK_AT(piDartPlayers[0]) TASK_CLEAR_LOOK_AT(piDartPlayers[1]) CLEAR_PED_TASKS_IMMEDIATELY(piDartPlayers[0]) CLEAR_PED_TASKS_IMMEDIATELY(piDartPlayers[1]) TASK_SYNCHRONIZED_SCENE (piDartPlayers[1], iSceneId, "mini@dartsintro_alt1", "darts_ig_intro_alt1_guy1", INSTANT_BLEND_IN, INSTANT_BLEND_OUT ) TASK_SYNCHRONIZED_SCENE (piDartPlayers[0], iSceneId, "mini@dartsintro_alt1", "darts_ig_intro_alt1_guy2", INSTANT_BLEND_IN, INSTANT_BLEND_OUT ) TASK_PLAY_ANIM(piDartPlayers[1], "mini@dartsintro_alt1", "darts_ig_intro_alt1_guy1_face", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_SECONDARY) TASK_PLAY_ANIM(piDartPlayers[0], "mini@dartsintro_alt1", sPlayerFacialAnimClip, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_SECONDARY) PLAY_SYNCHRONIZED_ENTITY_ANIM( oiDartChallenge, iSceneId, "darts_ig_intro_alt1_dart","mini@dartsintro_alt1" , INSTANT_BLEND_IN ) START_TIMER_NOW_SAFE(DialogTimer) iSplashStage++ ENDIF BREAK CASE 4 IF IS_SYNCHRONIZED_SCENE_RUNNING(iSceneId) IF NOT bRequestGameSaid IF GET_TIMER_IN_SECONDS_SAFE(DialogTimer) > 0.5 PLAY_PED_AMBIENT_SPEECH(piDartPlayers[0], "DARTS_REQUEST_GAME", SPEECH_PARAMS_FORCE_NORMAL) bRequestGameSaid = TRUE CANCEL_TIMER(DialogTimer) ENDIF ELSE IF NOT IS_AMBIENT_SPEECH_PLAYING(piDartPlayers[0]) IF NOT bAcceptGameSaid IF NOT IS_TIMER_STARTED(DialogTimer) RESTART_TIMER_NOW(DialogTimer) ELIF GET_TIMER_IN_SECONDS_SAFE(DialogTimer) > 0.25 PLAY_AGREE_AUDIO(piDartPlayers[1]) CANCEL_TIMER(DialogTimer) bAcceptGameSaid = TRUE ENDIF ENDIF ENDIF ENDIF IF GET_SYNCHRONIZED_SCENE_PHASE(iSceneId) > 0.95 CDEBUG1LN(DEBUG_DARTS, "sync scene almost done, going to splash stage 1") bActivateScoreBoard = TRUE iSplashStage++ ELSE IF (GET_GAME_TIMER() % 1000) < 50 CDEBUG1LN(DEBUG_DARTS, "sync scene phase = ", GET_SYNCHRONIZED_SCENE_PHASE(iSceneId)) ENDIF ENDIF ENDIF BREAK CASE 5 IF GET_SYNCHRONIZED_SCENE_PHASE(iSceneId) > 0.99 IF NOT IS_PED_INJURED(piDartPlayers[1]) DARTS_GAME_CAM() DESTROY_CAM(camDartsSync) CLEAR_PED_TASKS (piDartPlayers[0]) CLEAR_PED_TASKS (piDartPlayers[1]) STOP_SYNCHRONIZED_ENTITY_ANIM( oiDartChallenge, INSTANT_BLEND_OUT, FALSE) DELETE_OBJECT(oiDartChallenge) STOP_AUDIO_SCENE(GET_DARTS_RAVE_SCENE(DARTSRAVE_GREETING)) CANCEL_TIMER(DialogTimer) DartGame.Stage = STAGE_SPLASH iSplashStage = 0 ENDIF ELSE CDEBUG1LN(DEBUG_DARTS, "sync scene is still running") ENDIF BREAK // -------------- skipping the intro ------------------------- CASE 9 IF IS_SCREEN_FADED_OUT() bActivateScoreBoard = TRUE iTurn = 0 CLEAR_HELP() IF NOT IS_PED_INJURED(piDartPlayers[1]) SET_ENTITY_COORDS(piDartPlayers[0], DartsPlayerPositions.vDartPlayrPos) SET_ENTITY_HEADING(piDartPlayers[0], DartGame.DartsBoard.fBoardHeading) SET_ENTITY_COORDS(piDartPlayers[1], DartsPlayerPositions.vOpponentPos) SET_ENTITY_HEADING(piDartPlayers[1], DartGame.DartsBoard.fBoardHeading) CLEAR_PED_TASKS (piDartPlayers[0]) CLEAR_PED_TASKS (piDartPlayers[1]) ENDIF DESTROY_CAM(camDartsSync) STOP_SYNCHRONIZED_ENTITY_ANIM( oiDartChallenge, INSTANT_BLEND_OUT, FALSE) DELETE_OBJECT(oiDartChallenge) IF NOT IS_BIT_SET(g_iDartsTutorialFlags, gDARTS_TUTORIAL_SHOWN) DARTS_TUTORIAL_CAM(DartGame.DartsBoard.vDartBoard, DartGame.DartsBoard.fBoardHeading, GET_TUTORIAL_CAM_COORD_OFFSET(TS_DOUBLE), GET_TUTORIAL_CAM_ROT_OFFSET(), 0, TRUE) ELSE DARTS_GAME_CAM() ENDIF STOP_AUDIO_SCENE(GET_DARTS_RAVE_SCENE(DARTSRAVE_GREETING)) CANCEL_TIMER(DialogTimer) DO_SCREEN_FADE_IN(500) DartGame.Stage = STAGE_SPLASH iSplashStage = 0 ENDIF BREAK ENDSWITCH ENDIF BREAK CASE STAGE_SPLASH SWITCH iSplashStage CASE 0 CDEBUG1LN(DEBUG_DARTS, "STAGE_SPLASH, setting up cam iSplashStage = ", iSplashStage) iAllowSkipCutsceneTime = GET_GAME_TIMER() IF NOT IS_PED_INJURED(piDartPlayers[1]) SET_ENTITY_COORDS(piDartPlayers[0], DartsPlayerPositions.vDartPlayrPos) SET_ENTITY_HEADING(piDartPlayers[0], DartGame.DartsBoard.fBoardHeading) SET_ENTITY_COORDS(piDartPlayers[1], DartsPlayerPositions.vOpponentPos) SET_ENTITY_HEADING(piDartPlayers[1], DartGame.DartsBoard.fBoardHeading) ENDIF //iSplashStage++ // skipping splash screen START_AUDIO_SCENE(GET_DARTS_RAVE_SCENE(DARTSRAVE_MENU)) iSplashStage = 0 CDEBUG1LN(DEBUG_DARTS, "Going to STAGE_TUTORIAL") DartGame.Stage = STAGE_TUTORIAL BREAK CASE 1 // print splash IF (GET_GAME_TIMER() - iAllowSkipCutsceneTime) > 1500 CDEBUG1LN(DEBUG_DARTS, "STAGE_SPLASH, printing splash iSplashStage = ", iSplashStage) SET_SCALEFORM_BIG_MESSAGE(DartsUI.siBigMessage, "DARTS_TITLE") //SET_SCALEFORM_BIG_MESSAGE(DartsUI.siBigMessage, "DARTS_TITLE", "", 4000, HUD_COLOUR_BLUELIGHT) //SET_SCALEFORM_BIG_MESSAGE_WITH_NUMBER(DartsUI.siBigMessage, "DARTS_SETS", 301, "DARTS_SETD") //SET_SCALEFORM_BIG_MESSAGE_WITH_NUMBER_IN_STRAPLINE(DartsUI.siBigMessage, "DARTS_TITLE", 301, "DARTS_CURRENT") //SET_SCALEFORM_BIG_MESSAGE_WITH_STRING_IN_STRAPLINE(DartsUI.siBigMessage, "DARTS_TITLE", "DARTS_WOPP", "DARTS_RANK") //SET_SCALEFORM_BIG_MESSAGE_WITH_PLAYER_NAME_IN_STRAPLINE(DartsUI.siBigMessage, "DARTS_TITLE", "DARTS_FIRST", GET_PLAYER_NAME(PLAYER_ID())) CDEBUG1LN(DEBUG_DARTS, "STAGE_SPLASH, player name is = ", GET_PLAYER_NAME(PLAYER_ID())) iSplashStage++ //ENDIF ENDIF BREAK CASE 2 IF NOT UPDATE_SCALEFORM_BIG_MESSAGE(DartsUI.siBigMessage, TRUE) CDEBUG1LN(DEBUG_DARTS, "STAGE_SPLASH, proceeding iSplashStage = ", iSplashStage) START_AUDIO_SCENE(GET_DARTS_RAVE_SCENE(DARTSRAVE_MENU)) iSplashStage = 0 CDEBUG1LN(DEBUG_DARTS, "Finished STAGE_TUTORIAL") DartGame.Stage = STAGE_TUTORIAL ENDIF BREAK ENDSWITCH BREAK CASE STAGE_TUTORIAL IF NOT IS_BIT_SET(g_iDartsTutorialFlags, gDARTS_TUTORIAL_SHOWN) //g_bDartsTutorialShown IF DARTS_TUTORIAL(DartsTutorialStage, DartGame.DartsBoard, DartGame.AIBrain, DartGame.TurnStage, DartGame.TutorialDarts, TutorialTimer)//DartGame) CDEBUG1LN(DEBUG_DARTS, "FINISHED STAGE_TUTORIAL") SET_BIT(g_iDartsTutorialFlags, gDARTS_TUTORIAL_SHOWN) DartGame.Stage = STAGE_INIT_MENU ENDIF ELSE CDEBUG1LN(DEBUG_DARTS, "TUTORIAL ALREADY SHOWN, SKIPPING") //SET_CAM_ACTIVE_WITH_INTERP(camDartGame, camTutorial, 1500) SET_CAM_ACTIVE(camDartGame, TRUE) DartGame.Stage = STAGE_INIT_MENU ENDIF BREAK CASE STAGE_INIT_MENU IF IS_SCREEN_FADED_OUT() DO_SCREEN_FADE_IN(500) ENDIF SWITCH iSplashStage CASE 0 IF NOT DOES_ENTITY_EXIST(FRIEND_A_PED_ID()) IF NOT IS_BIT_SET(g_iDartsTutorialFlags, gDARTS_ALT_START_POS) SET_BIT(g_iDartsTutorialFlags, gDARTS_ALT_START_POS) ELSE CLEAR_BIT(g_iDartsTutorialFlags, gDARTS_ALT_START_POS) ENDIF DARTS_SETUP_START_MENU(DartsUI)//, TRUE) iSplashStage++ ELSE DARTS_SETUP_START_MENU(DartsUI)//, TRUE) iSplashStage++ ENDIF BREAK CASE 1 //Check if the aspect ratio has changed during the minigame IF IS_PC_VERSION() IF fOldAspectRatio <> GET_ASPECT_RATIO(FALSE) fOldAspectRatio = GET_ASPECT_RATIO(FALSE) SET_CAM_FOV(camDartGame,GET_CAM_FOV_AR_BASED(fOldAspectRatio)) SET_CAM_FOV(camDartGame2,GET_CAM_FOV_AR_BASED(fOldAspectRatio)) ENDIF ENDIF IF DARTS_UPDATE_START_MENU(DartsUI, DartGame.iNumDartLegs, DartGame.iNumDartSets) STOP_AUDIO_SCENE(GET_DARTS_RAVE_SCENE(DARTSRAVE_MENU)) IF DartGame.iNumDartLegs > 0 CDEBUG1LN(DEBUG_DARTS, "INIT_MENU - legs = ", DartGame.iNumDartLegs) CDEBUG1LN(DEBUG_DARTS, "INIT_MENU - sets = ", DartGame.iNumDartSets) iSplashStage = 0 IF DartGame.iNumDartLegs > 1 OR DartGame.iNumDartSets > 1 UPDATE_SB_SETS_LEGS(DartsSB, 0,0,0,0) bUsedSetsLegs = TRUE ENDIF CLEANUP_MENU_ASSETS() DartGame.Stage = STAGE_STARTING ELIF DartGame.iNumDartLegs < 0 DartGame.Stage = STAGE_CLEANUP ENDIF ENDIF BREAK ENDSWITCH BREAK CASE STAGE_STARTING CDEBUG1LN(DEBUG_DARTS, "Got to STAGE_START") IF DO_START_GAME(DartGame, DartsSB, DartsUI) CDEBUG1LN(DEBUG_DARTS, "Re - Calculating difficulty level") DartGame.AIBrain.eDifficulty = DARTSDIFF_HARD IF g_savedGlobals.sDartsData.iTotalDartGames >= 5 AND g_savedGlobals.sDartsData.fWinPct >= 0.80 DartGame.AIBrain.eDifficulty = DARTSDIFF_VERY_HARD CDEBUG1LN(DEBUG_DARTS, "setting difficulty to VERY HARD") ELIF g_savedGlobals.sDartsData.iTotalDartGames >= 3 AND g_savedGlobals.sDartsData.fWinPct >= 0.66 DartGame.AIBrain.eDifficulty = DARTSDIFF_HARD CDEBUG1LN(DEBUG_DARTS, "setting difficulty to HARD") ELSE DartGame.AIBrain.eDifficulty = DARTSDIFF_NORMAL CDEBUG1LN(DEBUG_DARTS, "setting difficulty to MEDIUM") ENDIF CDEBUG1LN(DEBUG_DARTS, "Re - Calculating wobbles") IF SHOULD_DARTS_LEVEL_HELP_SHOW(g_savedGlobals.sDartsData.iTotalDartGames, iLevelBit) CDEBUG1LN(DEBUG_DARTS, "show the level up prompt") DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_SHOW_LEVEL_UP, TRUE) ELSE CDEBUG1LN(DEBUG_DARTS, "no level up prompt to show") ENDIF fScaledWobble = GET_WOBBLE_LEVEL(g_savedGlobals.sDartsData.iTotalDartGames) fScaledRealWobble = GET_REAL_WOBBLE_LEVEL(g_savedGlobals.sDartsData.iTotalDartGames) CDEBUG1LN(DEBUG_DARTS, "total darts games = ", g_savedGlobals.sDartsData.iTotalDartGames) CDEBUG1LN(DEBUG_DARTS, "scaled wobble = ", fScaledWobble) CDEBUG1LN(DEBUG_DARTS, "scaled real wobble = ", fScaledRealWobble) fWobbleFactor = fScaledWobble fRealWobFactor = fScaledRealWobble CDEBUG1LN(DEBUG_DARTS, "Going to STAGE_IN_PROGRESS") DartsStats[DARTS_SCLB_STAT_NUM_MATCHES]++ IF NOT IS_PED_INJURED(piDartPlayers[1]) CLEAR_PED_TASKS_IMMEDIATELY(piDartPlayers[1]) SET_ENTITY_COORDS(piDartPlayers[1], DartsPlayerPositions.vOpponentPos) SET_ENTITY_HEADING(piDartPlayers[1], DartGame.DartsBoard.fBoardHeading) ENDIF IF IS_TIMER_STARTED(ThrowTimer) CANCEL_TIMER(ThrowTimer) ENDIF START_AUDIO_SCENE(GET_DARTS_RAVE_SCENE(DARTSRAVE_MATCH)) PLAY_BOAST_AUDIO(piDartPlayers[1]) DartGame.Stage = STAGE_IN_PROGRESS DartGame.TurnStage = DPS_AIM ENDIF BREAK CASE STAGE_IN_PROGRESS //Check if the aspect ratio has changed during the minigame IF IS_PC_VERSION() IF fOldAspectRatio <> GET_ASPECT_RATIO(FALSE) fOldAspectRatio = GET_ASPECT_RATIO(FALSE) SET_CAM_FOV(camDartGame,GET_CAM_FOV_AR_BASED(fOldAspectRatio)) SET_CAM_FOV(camDartGame2,GET_CAM_FOV_AR_BASED(fOldAspectRatio)) ENDIF ENDIF // doing outro streams during gameplay to speed up start time IF NOT bOutroRequested REQUEST_ANIM_DICT("mini@dartsoutro") bOutroRequested = TRUE ENDIF IF NOT bOutroStreamed IF bOutroRequested IF NOT HAS_ANIM_DICT_LOADED("mini@dartsoutro") CDEBUG1LN(DEBUG_DARTS, "streaming outro anims") ELSE bOutroStreamed = TRUE ENDIF ENDIF ENDIF //game loop until a winner is decided DO_IN_PROGRESS(DartGame, DartsInitReticlePos, DartsSB, DartsUI, ThrowTimer)//, DartsLocation) BREAK CASE STAGE_GAME_TRANSITION SWITCH iSplashStage CASE 0 IF GET_TIMER_IN_SECONDS_SAFE(DartGame.miscTimer) > 0.5 CLEAR_HELP() CLEAR_PRINTS() //ANOTHER_GAME_CAM_MP(PLAYER_PED_ID()) ANOTHER_GAME_CAM_SETS_LEGS(PLAYER_PED_ID()) UPDATE_SB_SETS_LEGS(DartsSB, DartGame.iDartSetsWon[0], DartGame.iDartSetsWon[1], DartGame.iDartGamesWon[0], DartGame.iDartGamesWon[1]) INT idx, idy REPEAT NUM_DART_PLAYERS idx REPEAT NUM_DART_TURNS idy RESET_DART(DartGame.Darts[idx][idy]) ENDREPEAT DARTS_CLEAR_SCORES(DartsSB, idx) ENDREPEAT //big message here IF DartGame.bSetJustWon IF DartGame.bDartWinner SET_SHARD_BIG_MESSAGE(DartsUI.siMidMessage, "DARTS_WINNER", "DARTS_SETW", DEFAULT, SHARD_MESSAGE_MIDSIZED, HUD_COLOUR_YELLOW) ELSE SET_SHARD_BIG_MESSAGE(DartsUI.siMidMessage, "DARTS_LOSER", "DARTS_SETL", DEFAULT, SHARD_MESSAGE_MIDSIZED, HUD_COLOUR_RED) ENDIF DartGame.bSetJustWon = FALSE ELSE IF DartGame.bDartWinner SET_SHARD_BIG_MESSAGE(DartsUI.siMidMessage, "DARTS_WINNER", "DARTS_LEGW", DEFAULT, SHARD_MESSAGE_MIDSIZED, HUD_COLOUR_YELLOW) ELSE SET_SHARD_BIG_MESSAGE(DartsUI.siMidMessage, "DARTS_LOSER", "DARTS_LEGL", DEFAULT, SHARD_MESSAGE_MIDSIZED, HUD_COLOUR_RED) ENDIF ENDIF INT iWhichOutro FLOAT fResolution fResolution = GET_ASPECT_RATIO(TRUE) CDEBUG1LN(DEBUG_DARTS, " fResolution = ", fResolution) IF fResolution > 2.0 CDEBUG1LN(DEBUG_DARTS, " resolution is eyefinity") scenePosition = << 1992.29407, 3047.57690, 46.21517 >> sceneRotation = << 0.000, 0.000, 138.740 >> ELSE CDEBUG1LN(DEBUG_DARTS, "resolution is not eyefinity") scenePosition = << 1992.33569, 3047.92432, 46.21517 >> sceneRotation = << 0.000, 0.000, 136.740 >> ENDIF iWhichOutro = GET_WHICH_DARTS_OUTRO() //GET_RANDOM_INT_IN_RANGE(0, iAnimLimit) CDEBUG1LN(DEBUG_DARTS, " iWhichOutro = ", iWhichOutro) iSceneID = CREATE_SYNCHRONIZED_SCENE(scenePosition, sceneRotation) camDartsSync = CREATE_CAM("DEFAULT_ANIMATED_CAMERA", FALSE) PLAY_SYNCHRONIZED_CAM_ANIM(camDartsSync, iSceneID, sOutroCam[iWhichOutro], "mini@dartsoutro") SET_CAM_ACTIVE(camDartsSync, TRUE) RENDER_SCRIPT_CAMS(TRUE, FALSE) IF NOT IS_PED_INJURED(piDartPlayers[0]) AND NOT IS_PED_INJURED(piDartPlayers[1]) IF DartGame.bDartWinner BOOL bFirstGame IF (DartGame.iDartSBGamesWon[0] + DartGame.iDartSBGamesWon[1]) = 1 bFirstGame = TRUE ELSE bFirstGame = FALSE ENDIF PLAY_SOUND_FRONTEND (-1, "TENNIS_POINT_WON", "HUD_AWARDS") PLAY_WIN_AUDIO(piDartPlayers, bFirstGame) TASK_SYNCHRONIZED_SCENE (piDartPlayers[0], iSceneID, "mini@dartsoutro", sOutroWin[iWhichOutro], INSTANT_BLEND_IN, WALK_BLEND_OUT ) TASK_SYNCHRONIZED_SCENE (piDartPlayers[1], iSceneID, "mini@dartsoutro", sOutroLoss[iWhichOutro], INSTANT_BLEND_IN, WALK_BLEND_OUT ) TASK_PLAY_ANIM(PLAYER_PED_ID(), sFacialDictPlayer, sFacialClip[GET_RANDOM_INT_IN_RANGE(0, 3)], SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_SECONDARY) ELSE PLAY_SOUND_FRONTEND (-1, "OTHER_TEXT", "HUD_AWARDS") PLAY_LOSS_AUDIO(piDartPlayers) TASK_SYNCHRONIZED_SCENE (piDartPlayers[1], iSceneID, "mini@dartsoutro", sOutroWin[iWhichOutro], INSTANT_BLEND_IN, WALK_BLEND_OUT ) TASK_SYNCHRONIZED_SCENE (piDartPlayers[0], iSceneID, "mini@dartsoutro", sOutroLoss[iWhichOutro], INSTANT_BLEND_IN, WALK_BLEND_OUT ) TASK_PLAY_ANIM(piDartPlayers[1], sFacialDictPed, sFacialClip[GET_RANDOM_INT_IN_RANGE(0, 3)], SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_SECONDARY) ENDIF ENDIF iSplashStage++ ENDIF BREAK CASE 1 IF NOT UPDATE_SHARD_BIG_MESSAGE(DartsUI.siMidMessage, TRUE) iSplashStage++ ENDIF BREAK CASE 2 CANCEL_TIMER(DartGame.miscTimer) bGameOverSpeechPlayed = FALSE STOP_AUDIO_SCENE(GET_DARTS_RAVE_SCENE(DARTSRAVE_COMPLETE)) DARTS_GAME_CAM() IF DOES_CAM_EXIST(camDartsSync) DESTROY_CAM(camDartsSync) ENDIF iSplashStage = 0 DartGame.Stage = STAGE_STARTING BREAK ENDSWITCH BREAK CASE STAGE_GAME_END IF GET_TIMER_IN_SECONDS_SAFE(DartGame.miscTimer) > 0.92 //0.75 REPLAY_GAME_LOOP(DartGame, DartsUI, DartsSB, DartsEndScreen, bUsedSetsLegs) ENDIF BREAK CASE STAGE_FINISHED //game has ended //Render the pass screen, Check to see if we can cleanup when done bCanGoToCleanup = RENDER_ENDSCREEN(dartsEndScreen) IF NOT IS_ENTITY_DEAD(FRIEND_A_PED_ID()) CDEBUG1LN(DEBUG_DARTS, "on friend activity, going straight to cleanup") CLEAR_PED_TASKS(piDartPlayers[1]) DartGame.Stage = STAGE_CLEANUP ENDIF SWITCH iSplashStage CASE 0 CLEAR_PED_TASKS(piDartPlayers[0]) CDEBUG1LN(DEBUG_DARTS, "Got to STAGE_FINISHED, getting ready to up") IF NOT (bInSyncCam) CDEBUG1LN(DEBUG_DARTS, "just killing all cams") RENDER_SCRIPT_CAMS(FALSE, bInSyncCam) ELSE CDEBUG1LN(DEBUG_DARTS, "using catch up cam") STOP_RENDERING_SCRIPT_CAMS_USING_CATCH_UP() ENDIF SET_GAMEPLAY_CAM_RELATIVE_HEADING() SET_GAMEPLAY_CAM_RELATIVE_PITCH() SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) CLEAR_PRINTS() TASK_LOOK_AT_ENTITY(piDartPlayers[0], piDartPlayers[1], 5000, SLF_SLOW_TURN_RATE | SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_HIGH) RESTART_TIMER_NOW(DialogTimer) iSplashStage++ BREAK CASE 1 IF GET_TIMER_IN_SECONDS(DialogTimer) > 0.1 //1.0 IF NOT bPlayerQuitEarly //PLAY_PED_AMBIENT_SPEECH(piDartPlayers[0], "GAME_GOOD_OTHER") // add this ambient speech when it's ready ENDIF RESTART_TIMER_NOW(DialogTimer) iSplashStage++ ENDIF BREAK CASE 2 IF GET_TIMER_IN_SECONDS(DialogTimer) > 0.3 IF NOT IS_PED_INJURED(piDartPlayers[1]) IF NOT bPlayerQuitEarly PLAY_DARTS_SPEECH(piDartPlayers[0], "GENERIC_THANKS", TRUE, SPEECH_PARAMS_FORCE_FRONTEND) //PLAY_DARTS_SPEECH(piDartPlayers[1], "GENERIC_THANKS", FALSE, SPEECH_PARAMS_FORCE_FRONTEND) ENDIF ENDIF RESTART_TIMER_NOW(DialogTimer) iSplashStage++ ENDIF BREAK CASE 3 IF bCanGoToCleanup OR bPlayerQuitEarly DartGame.Stage = STAGE_CLEANUP iSplashStage++ ENDIF BREAK ENDSWITCH BREAK CASE STAGE_PLAYER_QUIT DARTS_QUIT_UI(DartsUI) IF IS_CONTROL_JUST_RELEASED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT) //OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT) PLAY_EARLY_QUIT_AUDIO(piDartPlayers[1]) CDEBUG1LN(DEBUG_DARTS, "Player chose to Quit") DartsResult = AR_playerQuit bPlayerQuitEarly = TRUE IF IS_AUDIO_SCENE_ACTIVE(GET_DARTS_RAVE_SCENE(DARTSRAVE_MATCH)) STOP_AUDIO_SCENE(GET_DARTS_RAVE_SCENE(DARTSRAVE_MATCH)) ENDIF DartGame.Stage = STAGE_FINISHED ENDIF IF IS_CONTROL_JUST_RELEASED(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL) //OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL) CDEBUG1LN(DEBUG_DARTS, "Player chose to Resume") IF DartGame.TurnStage = DPS_AIM CDEBUG1LN(DEBUG_DARTS, "Re randomizing reticle") bInitReticle = FALSE ENDIF DARTS_SET_UI_FLAG(DartsUI.iFlags, DARTS_UIFLAGS_SETUP_QUITUI, FALSE) DartGame.Stage = STAGE_IN_PROGRESS ENDIF BREAK CASE STAGE_CLEANUP CDEBUG1LN(DEBUG_DARTS, "Got to STAGE_CLEANUP, getting ready to up") CLEANUP_DARTS_GAME(DartGame, DartsUI, DartsEndScreen) BREAK ENDSWITCH ENDIF ENDWHILE ENDSCRIPT