USING "globals.sch" USING "flow_mission_data_public.sch" USING "finance_modifiers_public.sch" USING "player_ped_public.sch" USING "commands_hud.sch" USING "end_screen.sch" USING "screenDisplayState.sch" USING "achievement_public.sch" USING "end_screen.sch" USING "dlc_mission_stat_private.sch" #IF USE_CLF_DLC USING "mission_stat_generated_private_CLF.sch" #ENDIF #IF NOT USE_CLF_DLC USING "mission_stat_generated_private.sch" #ENDIF #IF IS_DEBUG_BUILD FUNC STRING SAFE_GET_MISSION_STAT_NAME(ENUM_MISSION_STATS e) IF e = UNSET_MISSION_STAT_ENUM RETURN "UNSET_MISSION_STAT_ENUM" ENDIF IF NOT g_MissionStatTrackingPrototypes[e].bHidden RETURN GET_MISSION_STAT_NAME(e) ELSE TEXT_LABEL str = "MS_UNKN_" str += ENUM_TO_INT(e) #IF IS_DEBUG_BUILD RETURN GET_STRING_FROM_STRING(str, 0, GET_LENGTH_OF_LITERAL_STRING(str)) #ENDIF #IF NOT IS_DEBUG_BUILD RETURN GET_FILENAME_FOR_AUDIO_CONVERSATION(str) #ENDIF ENDIF ENDFUNC #ENDIF //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // complete medals //////////////////////////////////////////////////////////////////////////////////////////////////////////////// FUNC FLOAT GET_MISSION_STAT_PERCENTAGE(INT visiblesucceeded,INT visibleattempted, BOOL criticalInvalidated = FALSE) IF criticalInvalidated RETURN 0.0 ENDIF IF visiblesucceeded = visibleattempted RETURN 100.0 ENDIF FLOAT uploadRatio = TO_FLOAT(visiblesucceeded)/TO_FLOAT(visibleattempted) FLOAT fUploadPercentage = (50.0*uploadRatio) + 50.0 fUploadPercentage = TO_FLOAT(CEIL(fUploadPercentage)) IF fUploadPercentage > 100.0 fUploadPercentage = 100.0 ENDIF RETURN fUploadPercentage ENDFUNC FUNC INT GET_STAT_MEDAL_VALUE(FLOAT percentage) IF percentage = 0 RETURN 0 ENDIF IF percentage = 100.0 RETURN 3//gold ELIF percentage > 50.0 RETURN 2//silver ENDIF RETURN 1//bronze ENDFUNC /// PURPOSE: /// Gets the hud colour of the medal passed in so it can be displayed in the pause menu /// PARAMS: /// iMedal - int of medal (1=gold, 2=silver, 3=bronze) /// RETURNS: /// HUD_COLOURS of medal FUNC HUD_COLOURS GET_MEDAL_HUD_COLOUR(INT iMedal) HUD_COLOURS eMedalColour = HUD_COLOUR_BRONZE SWITCH iMedal CASE 3 eMedalColour = HUD_COLOUR_GOLD BREAK CASE 2 eMedalColour = HUD_COLOUR_SILVER BREAK CASE 1 eMedalColour = HUD_COLOUR_BRONZE BREAK ENDSWITCH RETURN eMedalColour ENDFUNC //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // accuracy stats //////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// FUNC INT GET_MISSION_STAT_STORED_VALUE(STATSENUM e) IF ENUM_TO_INT(e) = 0 CPRINTLN(DEBUG_MISSION_STATS, "GET_MISSION_STAT_STORED_VALUE: stat unset") RETURN -1 ENDIF INT InStat IF STAT_GET_INT(e,InStat) CPRINTLN(DEBUG_MISSION_STATS, "GET_MISSION_STAT_STORED_VALUE: for stat hash ", e , " got value ", InStat) RETURN InStat-1 //value offset so 0 is meaningful as unset ELSE RETURN -1 ENDIF ENDFUNC /// PURPOSE: /// please note that this is used only to read the accuracy values /// mission stats are read with GET_MISSION_STAT_STORED_VALUE /// PARAMS: /// e - /// RETURNS: /// FUNC INT RETRIEVE_INT_STAT(STATSENUM e) INT istat STAT_GET_INT(e,istat) RETURN istat ENDFUNC PROC SET_MISSION_STAT_STORED_VALUE(INT value, ENUM_MISSION_STATS s) STATSENUM e = g_MissionStatTrackingPrototypes[s].statname IF ENUM_TO_INT(e) = 0 CERRORLN(DEBUG_MISSION_STATS, "SET_MISSION_STAT_STORED_VALUE: enum conversion failed for ",g_MissionStatTrackingPrototypes[s].statname) EXIT ENDIF g_MissionStatTrackingPrototypes[s].currentvalue = value INT InStat InStat = value+1//value offset when stored so zero serverside is -1 or unset client side CPRINTLN(DEBUG_MISSION_STATS,"SET_MISSION_STAT_STORED_VALUE: Setting mission stat ",GET_MISSION_STAT_NAME(s)," to ",inStat) STAT_SET_INT(e,InStat) IF IS_REPEAT_PLAY_ACTIVE() AND g_bMissionStatSystemBuildingReplayStats //CPRINTLN(DEBUG_MISSION_STATS, " Adding value and index to replay stat buffer incase this is a replay, ", e, " : ", value, " : ", s) ADD_REPLAY_STAT_VALUE(ENUM_TO_INT(e)) ADD_REPLAY_STAT_VALUE(value) ADD_REPLAY_STAT_VALUE(ENUM_TO_INT(s)) ENDIF ENDPROC PROC RESET_MISSION_STATS_ACCURACY_STATE() g_bMissionStatAccuracyTallied = FALSE //reset the accuracy tracking //player one CPRINTLN(DEBUG_MISSION_STATS, "Reset accuracy metrics:") //INT g_iMissionStatsSP0Hits = 0 //INT g_iMissionStatsSP0Shots = 0 //INT g_iMissionStatsSP1Hits = 0 //INT g_iMissionStatsSP1Shots = 0 //INT g_iMissionStatsSP2Hits = 0 //INT g_iMissionStatsSP2Shots = 0 g_iMissionStatsSP0Shots = RETRIEVE_INT_STAT(SP0_SHOTS) g_iMissionStatsSP0Hits = RETRIEVE_INT_STAT(SP0_HITS) g_iMissionStatsSP1Shots = RETRIEVE_INT_STAT(SP1_SHOTS) g_iMissionStatsSP1Hits = RETRIEVE_INT_STAT(SP1_HITS) g_iMissionStatsSP2Shots = RETRIEVE_INT_STAT(SP2_SHOTS) g_iMissionStatsSP2Hits = RETRIEVE_INT_STAT(SP2_HITS) CPRINTLN(DEBUG_MISSION_STATS, " Sp 0 hits/shots : ", g_iMissionStatsSP0Hits, "/", g_iMissionStatsSP0Shots) CPRINTLN(DEBUG_MISSION_STATS, " Sp 1 hits/shots : ", g_iMissionStatsSP1Hits, "/", g_iMissionStatsSP1Shots) CPRINTLN(DEBUG_MISSION_STATS, " Sp 2 hits/shots : ", g_iMissionStatsSP2Hits, "/", g_iMissionStatsSP2Shots) //SCRIPT_ASSERT("Accuracy metrics start") ENDPROC FUNC STRING GET_STRING_FROM_MISSION_STAT_TYPES(ENUM_MISSION_STAT_TYPES eType) SWITCH eType CASE MISSION_STAT_TYPE_UNSET RETURN "UNSET" CASE MISSION_STAT_TYPE_TOTALTIME RETURN "TOTALTIME" CASE MISSION_STAT_TYPE_ACTION_CAM_USE RETURN "ACTION_CAM_USE" CASE MISSION_STAT_TYPE_UNIQUE_BOOL RETURN "UNIQUE_BOOL" CASE MISSION_STAT_TYPE_WINDOWED_TIMER RETURN "WINDOWED_TIMER" CASE MISSION_STAT_TYPE_SINGLE_ENTITY_SPEED_THRESHOLD RETURN "SINGLE_ENTITY_SPEED_THRESHOLD" CASE MISSION_STAT_TYPE_SINGLE_ENTITY_DAMAGE_THRESHOLD RETURN "SINGLE_ENTITY_DAMAGE_THRESHOLD" CASE MISSION_STAT_TYPE_HEADSHOTS RETURN "HEADSHOTS" CASE MISSION_STAT_TYPE_FRACTION RETURN "FRACTION" CASE MISSION_STAT_TYPE_ACCURACY RETURN "ACCURACY" CASE MISSION_STAT_TYPE_PURE_COUNT RETURN "PURE_COUNT" CASE MISSION_STAT_TYPE_PURE_COUNT_PERCENTAGE RETURN "PURE_COUNT_PERCENTAGE" CASE MISSION_STAT_TYPE_FINANCE_DIRECT RETURN "FINANCE_DIRECT" CASE MISSION_STAT_TYPE_FINANCE_TABLE RETURN "FINANCE_TABLE" CASE MISSION_STAT_TYPE_PURE_COUNT_DISTANCE RETURN "PURE_COUNT_DISTANCE" CASE MISSION_STAT_TYPE_BULLETS_FIRED RETURN "BULLETS_FIRED" CASE MISSION_STAT_TYPE_INNOCENTS_KILLED RETURN "INNOCENTS_KILLED" CASE MISSION_STAT_TYPE_SPECIAL_ABILITY_USE RETURN "SPECIAL_ABILITY_USE" ENDSWITCH #IF IS_DEBUG_BUILD TEXT_LABEL_63 str = "UNKNOWN_" str += ENUM_TO_INT(eType) RETURN GET_STRING_FROM_STRING(str, 0, GET_LENGTH_OF_LITERAL_STRING(str)) #ENDIF #IF NOT IS_DEBUG_BUILD RETURN "" #ENDIF ENDFUNC //#IF USE_ASSASSIN_DLC //////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////// //new assassination mission stat control//////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////// //FUNC STRING GET_DLC_ASSASSINATION_TITLE_STRING(INT assassinationIndex) // // IF assassinationIndex = -1 // RETURN "INVALID" // ENDIF // // SWITCH assassinationIndex // CASE 0 RETURN "M_DApol" BREAK // CASE 1 RETURN "M_DAret" BREAK // CASE 2 RETURN "M_DAcab" BREAK // CASE 3 RETURN "M_DAgen" BREAK // CASE 4 RETURN "M_DAsub" BREAK // // CASE 5 RETURN "M_DAdrg" BREAK // CASE 6 RETURN "M_DAhel" BREAK // CASE 7 RETURN "M_DAbar" BREAK // CASE 8 RETURN "M_DAstr" BREAK // CASE 9 RETURN "M_DAvin" BREAK // // CASE 10 RETURN "M_DAhnt" BREAK // CASE 11 RETURN "M_DAsky" BREAK // ENDSWITCH // // #IF IS_DEBUG_BUILD // TEXT_LABEL_63 str = "M_INVALID_" // str += g_savedGlobalsDLC.iDLCAssassinationStage // str += " - " // str += assassinationIndex // // RETURN GET_STRING_FROM_STRING(str, 0, GET_LENGTH_OF_LITERAL_STRING(str)) // #ENDIF // #IF NOT IS_DEBUG_BUILD // RETURN "" // #ENDIF //ENDFUNC //FUNC BOOL GET_FORMATTING_TYPE_FOR_DLC_STAT(ENUM_MISSION_STAT_TYPES type, END_SCREEN_ELEMENT_FORMATTING &eFormatting) // CONST_INT iPLAYER_SINGLE_ENTITY_DAMAGE_THRESHOLD 180 // // eFormatting = ESEF_NAME_ONLY // SWITCH type //// CASE MISSION_STAT_TYPE_UNSET eFormatting = UNSET" //// // CASE MISSION_STAT_TYPE_TOTALTIME eFormatting = ESEF_TIME_M_S BREAK //// CASE MISSION_STAT_TYPE_ACTION_CAM_USE eFormatting = ACTION_CAM_USE BREAK // CASE MISSION_STAT_TYPE_UNIQUE_BOOL eFormatting = ESEF_NAME_ONLY BREAK // CASE MISSION_STAT_TYPE_WINDOWED_TIMER eFormatting = ESEF_TIME_M_S BREAK //// CASE MISSION_STAT_TYPE_SINGLE_ENTITY_SPEED_THRESHOLD eFormatting = SINGLE_ENTITY_SPEED_THRESHOLD BREAK // CASE MISSION_STAT_TYPE_SINGLE_ENTITY_DAMAGE_THRESHOLD eFormatting = ESEF_NAME_ONLY BREAK // CASE MISSION_STAT_TYPE_HEADSHOTS eFormatting = ESEF_FRACTION BREAK // CASE MISSION_STAT_TYPE_FRACTION eFormatting = ESEF_FRACTION BREAK // CASE MISSION_STAT_TYPE_ACCURACY eFormatting = ESEF_RAW_PERCENT BREAK // CASE MISSION_STAT_TYPE_PURE_COUNT eFormatting = ESEF_RAW_INTEGER BREAK // CASE MISSION_STAT_TYPE_PURE_COUNT_PERCENTAGE eFormatting = ESEF_RAW_PERCENT BREAK //// CASE MISSION_STAT_TYPE_FINANCE_DIRECT eFormatting = FINANCE_DIRECT BREAK //// CASE MISSION_STAT_TYPE_FINANCE_TABLE eFormatting = FINANCE_TABLE BREAK //// CASE MISSION_STAT_TYPE_PURE_COUNT_DISTANCE eFormatting = PURE_COUNT_DISTANCE BREAK //// CASE MISSION_STAT_TYPE_BULLETS_FIRED eFormatting = BULLETS_FIRED BREAK //// CASE MISSION_STAT_TYPE_INNOCENTS_KILLED eFormatting = INNOCENTS_KILLED BREAK //// CASE MISSION_STAT_TYPE_SPECIAL_ABILITY_USE eFormatting = SPECIAL_ABILITY_USE BREAK // // DEFAULT // TEXT_LABEL_63 str // str = "type " // str += GET_STRING_FROM_MISSION_STAT_TYPES(type) // str += " has unknown formatting" // // CPRINTLN(DEBUG_MISSION_STATS, str) // SCRIPT_ASSERT(str) // // RETURN FALSE // BREAK // ENDSWITCH // // RETURN TRUE //ENDFUNC //FUNC BOOL GET_END_SCREEN_CHECK_MARK_FOR_DLC_STAT(DLC_ASSASSINATION_STATCONFIG &config, DLC_ASSASSINATION_STATS stat, INT iTarget, END_SCREEN_CHECK_MARK_STATUS &eESCM, INT &visibleSucceeded) // INT i // REPEAT config.iRegisteredStats i // IF config.target[i] = stat // // IF config.invalidationReason[i] != MSSIR_VALID // eESCM = ESCM_INVALIDATED // RETURN TRUE // ENDIF // // IF NOT g_DLCMissionStatTrackingPrototypes[stat].less_than_threshold // // CPRINTLN(DEBUG_MISSION_STATS, "screen check: ", GET_DLC_MISSION_STAT_DEBUG_NAME(stat), " value[ ",config.StatCurrentValue[i]," ] >= target [ ", iTarget, " ]") // // IF config.StatCurrentValue[i] >= iTarget // eESCM = ESCM_CHECKED // visibleSucceeded++ // ELSE // eESCM = ESCM_UNCHECKED // ENDIF // // RETURN TRUE // ELSE // CPRINTLN(DEBUG_MISSION_STATS, "screen check: ", GET_DLC_MISSION_STAT_DEBUG_NAME(stat), " value[ ",config.StatCurrentValue[i]," ] < target [ ", iTarget, " ]") // // IF config.StatCurrentValue[i] < iTarget // eESCM = ESCM_CHECKED // visibleSucceeded++ // ELSE // eESCM = ESCM_UNCHECKED // ENDIF // // RETURN TRUE // ENDIF // ENDIF // ENDREPEAT // // eESCM = ESCM_INVALIDATED // RETURN TRUE //ENDFUNC /// PURPOSE: /// /// PARAMS: /// e - the stat to increment /// number - the value to increment it by /// overrideToValue - instead of incrementing by "number" override it to this value //PROC INFORM_DLC_MISSION_STATS_OF_INCREMENT(DLC_ASSASSINATION_STATCONFIG &config, DLC_ASSASSINATION_STATS stat, INT number = 1, BOOL overrideToValue = FALSE) // #IF IS_DEBUG_BUILD // IF NOT IS_REPEAT_PLAY_ACTIVE() // IF NOT g_savedGlobals.sFlow.isGameflowActive // EXIT // ENDIF // ENDIF // IF !g_bMissionStatSystemPrimed AND (!g_bMagDemoActive) // CPRINTLN(DEBUG_MISSION_STATS, "Mission stats system inform call fired while stats system not primed. Pass this bug to Default Levels.") // ENDIF // #ENDIF // INT i = 0 // // REPEAT config.iRegisteredStats i // IF config.target[i] = stat // IF overrideToValue // config.StatCurrentValue[i] = number // CPRINTLN(DEBUG_MISSION_STATS, "Setting mission stat ", GET_DLC_MISSION_STAT_DEBUG_NAME(stat)," to ", number) // ELSE // config.StatCurrentValue[i] += number // CPRINTLN(DEBUG_MISSION_STATS, "Incrementing mission stat ",GET_DLC_MISSION_STAT_DEBUG_NAME(stat)," by ", number, " new value ",config.StatCurrentValue[i]) // ENDIF // // EXIT // ENDIF // ENDREPEAT // //// IF config.g_MissionStatTrackingPrototypes[config.target[i]].type = MISSION_STAT_TYPE_UNIQUE_BOOL //// IF config.StatCurrentValue[i] > 1 //// config.StatCurrentValue[i] = 1 //// ENDIF //// IF config.StatCurrentValue[i] < 0 //// config.StatCurrentValue[i] = 0 //// ENDIF //// ENDIF // // // CPRINTLN(DEBUG_MISSION_STATS, "INFORM_MISSION_STATS_OF_INCREMENT Specified stat not logged: ", GET_DLC_MISSION_STAT_NAME(stat), " by ", number) // DEBUG_PRINTCALLSTACK() // // SCRIPT_ASSERT("INFORM_MISSION_STATS_OF_INCREMENT Specified stat not logged. If reporting this issue please complete the mission (s pass is fine) and note if the mission success dialog appears or not and what stats appear in it if it does. Thanks!") //ENDPROC //PROC UPDATE_DLC_ASSASSINATION_STATS(DLC_ASSASSINATION_STATCONFIG &config) //UPDATE_STATS() // // FLOAT fTimeTaken = GET_TIMER_IN_SECONDS(config.missionTimer) // fTimeTaken *= 1000.0 // // INT i = 0 // CPRINTLN(DEBUG_MISSION_STATS, "Gathering stats from ", config.iRegisteredStats) // REPEAT config.iRegisteredStats i // INT j = -1, k = 0 // // REPEAT MAX_TRACKED_MISSION_STATS k // IF config.target[i] = INT_TO_ENUM(DLC_ASSASSINATION_STATS, ENUM_TO_INT(g_MissionStatTrackingArray[k].target)) // CPRINTLN(DEBUG_MISSION_STATS, "Found matching tracked stat array at ", k, ".") // // j = k // ENDIF // ENDREPEAT // // IF g_MissionStatTrackingArray[j].invalidationReason != MSSIR_VALID // CPRINTLN(DEBUG_MISSION_STATS, "MSSIR_VALID - ", GET_STRING_FROM_MISSION_STAT_TYPES(config.type[i])) // config.invalidationReason[i] = g_MissionStatTrackingArray[j].invalidationReason // ENDIF // // SWITCH config.type[i] // CASE MISSION_STAT_TYPE_TOTALTIME // CPRINTLN(DEBUG_MISSION_STATS, "Stat ", GET_DLC_MISSION_STAT_DEBUG_NAME(config.target[i]), " has total time ", FLOOR(fTimeTaken), "ms") // INFORM_DLC_MISSION_STATS_OF_INCREMENT(config, config.target[i], FLOOR(fTimeTaken), TRUE) // BREAK // CASE MISSION_STAT_TYPE_UNIQUE_BOOL // CPRINTLN(DEBUG_MISSION_STATS, "Stat ", GET_DLC_MISSION_STAT_DEBUG_NAME(config.target[i]), " has unique bool - let the mission script set it!") // BREAK // CASE MISSION_STAT_TYPE_FRACTION // CPRINTLN(DEBUG_MISSION_STATS, "Stat ", GET_DLC_MISSION_STAT_DEBUG_NAME(config.target[i]), " has fraction - let the mission script set it!") // BREAK // CASE MISSION_STAT_TYPE_SINGLE_ENTITY_DAMAGE_THRESHOLD // CPRINTLN(DEBUG_MISSION_STATS, "Stat ", GET_DLC_MISSION_STAT_DEBUG_NAME(config.target[i]), // " has damage threshold for a single entity, inspect tracking array [", j, // "] - iTrackingDelta:", g_MissionStatTrackingArray[j].iTrackingDelta, // ", ivalue:", g_MissionStatTrackingArray[j].ivalue) // //// BOOL bFoundDamagedEntity //// bFoundDamagedEntity = FALSE // // INFORM_DLC_MISSION_STATS_OF_INCREMENT(config, config.target[i], g_MissionStatTrackingArray[j].iTrackingDelta, TRUE) //// bFoundDamagedEntity = TRUE // BREAK // CASE MISSION_STAT_TYPE_HEADSHOTS // CPRINTLN(DEBUG_MISSION_STATS, "Stat ", GET_DLC_MISSION_STAT_DEBUG_NAME(config.target[i]), " has headshot tracked!") // // BOOL bFoundHeadshotEntity // bFoundHeadshotEntity = FALSE // // INT mHS // mHS = 0 // // WHILE mHS < ENUM_TO_INT(MAX_MISSION_STATS) // AND NOT bFoundHeadshotEntity // // IF g_MissionStatTrackingPrototypes[mHS].type = MISSION_STAT_TYPE_HEADSHOTS // CPRINTLN(DEBUG_MISSION_STATS, " Tracked prototype ", mHS, " is headshot [", g_MissionStatTrackingArray[j].ivalue, "]") // // INFORM_DLC_MISSION_STATS_OF_INCREMENT(config, config.target[i], g_MissionStatTrackingArray[j].ivalue, TRUE) // bFoundHeadshotEntity = TRUE // ELSE // CPRINTLN(DEBUG_MISSION_STATS, " Tracked prototype ", mHS, " is something else (", GET_STRING_FROM_MISSION_STAT_TYPES(g_MissionStatTrackingPrototypes[mHS].type), "[", g_MissionStatTrackingArray[j].ivalue, "])!!!") // ENDIF // // mHS++ // ENDWHILE // // IF NOT bFoundHeadshotEntity // SCRIPT_ASSERT("Stat has headshot tracked???") // ELSE // // ENDIF // BREAK // CASE MISSION_STAT_TYPE_WINDOWED_TIMER // TEXT_LABEL_63 strTW // strTW = "Stat \"" // #IF IS_DEBUG_BUILD // strTW += GET_DLC_MISSION_STAT_DEBUG_NAME(config.target[i]) // #ENDIF // strTW = "Stat \"" // #IF NOT IS_DEBUG_BUILD // strTW += "DP_SOMETHING_" // strTW += ENUM_TO_INT(config.target[i]) // #ENDIF // strTW += "\" has a timed window stat" // // // BOOL bFoundTimeWindow // bFoundTimeWindow = FALSE // // CPRINTLN(DEBUG_MISSION_STATS, " Gathering tracked from ", g_iMissionStatsBeingTracked) // INT mTW // mTW = 0 // // WHILE mTW < ENUM_TO_INT(MAX_MISSION_STATS) // AND NOT bFoundTimeWindow // // IF g_MissionStatTrackingPrototypes[mTW].type = MISSION_STAT_TYPE_WINDOWED_TIMER // CPRINTLN(DEBUG_MISSION_STATS, " Tracked stat ", mTW, " is time window [", g_MissionStatTrackingArray[j].ivalue, "]") // // INFORM_DLC_MISSION_STATS_OF_INCREMENT(config, config.target[i], g_MissionStatTrackingArray[j].ivalue, TRUE) // bFoundTimeWindow = TRUE // ELSE // CPRINTLN(DEBUG_MISSION_STATS, " Tracked stat ", mTW, " is something else (", ENUM_TO_INT(g_MissionStatTrackingPrototypes[mTW].type), ")!!!") // ENDIF // // mTW++ // ENDWHILE // // IF NOT bFoundTimeWindow // CPRINTLN(DEBUG_MISSION_STATS, strTW) // SCRIPT_ASSERT(strTW) // ELSE // // ENDIF // // BREAK // // // CASE MISSION_STAT_TYPE_ACCURACY // CPRINTLN(DEBUG_MISSION_STATS, "Stat ", GET_DLC_MISSION_STAT_DEBUG_NAME(config.target[i]), " is for accuracy???") // // INT totalShots, totalHits // totalShots = 0 // totalHits = 0 // // totalShots = (RETRIEVE_INT_STAT(SP0_SHOTS) - g_iMissionStatsSP0Shots) // totalHits = (RETRIEVE_INT_STAT(SP0_HITS) - g_iMissionStatsSP0Hits) // CPRINTLN(DEBUG_MISSION_STATS, " Sp 0 hits/shots : ", totalHits, "/", totalShots) // // // totalShots += (RETRIEVE_INT_STAT(SP1_SHOTS) -g_iMissionStatsSP1Shots) // totalHits += (RETRIEVE_INT_STAT(SP1_HITS) - g_iMissionStatsSP1Hits) // CPRINTLN(DEBUG_MISSION_STATS, " +Sp 1 hits/shots : ", totalHits, "/", totalShots) // // totalShots += (RETRIEVE_INT_STAT(SP2_SHOTS) -g_iMissionStatsSP2Shots) // totalHits += (RETRIEVE_INT_STAT(SP2_HITS) - g_iMissionStatsSP2Hits) // CPRINTLN(DEBUG_MISSION_STATS, " +Sp 2 hits/shots : ", totalHits, "/", totalShots) // // //SCRIPT_ASSERT("Accuracy metrics end") // // //now use totalShots and totalHits to work out the mission accuracy // // WAIT(0) // FLOAT fPercentage // fPercentage = 100.0 // IF NOT (totalShots = 0) // // CPRINTLN(DEBUG_MISSION_STATS, " totalHits/totalShots : ", totalHits, "/", totalShots) // // FLOAT ftotal, fhits // ftotal = TO_FLOAT(totalShots) // fhits = TO_FLOAT(totalHits) // // fPercentage = TO_FLOAT(FLOOR((fhits/ftotal)*100.0)) // // IF fPercentage > 100.0 // fPercentage = 100.0 // ENDIF // // CPRINTLN(DEBUG_MISSION_STATS, " fPercentage: ", fPercentage, "%") // // ENDIF // // // overallAccuracyMetric = fPercentage // // overallBulletsMetric = totalShots // // CPRINTLN(DEBUG_MISSION_STATS, " Tracked stat ", GET_DLC_MISSION_STAT_DEBUG_NAME(config.target[i]), " has accuracy [", ROUND(fPercentage), "]") // INFORM_DLC_MISSION_STATS_OF_INCREMENT(config, config.target[i], ROUND(fPercentage), TRUE) // // BREAK // // DEFAULT // TEXT_LABEL_63 str // str = "Stat \"" // #IF IS_DEBUG_BUILD // str += GET_DLC_MISSION_STAT_DEBUG_NAME(config.target[i]) // #ENDIF // str = "Stat \"" // #IF NOT IS_DEBUG_BUILD // str += "DP_SOMETHING_" // str += ENUM_TO_INT(config.target[i]) // #ENDIF // str += "\" has an unknown type [" // str += GET_STRING_FROM_MISSION_STAT_TYPES(config.type[i]) // str += "]??" // // CPRINTLN(DEBUG_MISSION_STATS, str) // SCRIPT_ASSERT(str) // BREAK // ENDSWITCH // ENDREPEAT // //ENDPROC //PROC UPLOAD_DATA_FOR_TRACKED_DLC_STAT(MISSION_STAT_SYSTEM_INVALIDATION_REASON invalidationReason, INT ivalue, DLC_ASSASSINATION_STATS target) // IF invalidationReason = MSSIR_VALID // CPRINTLN(DEBUG_MISSION_STATS, "UPLOAD_DATA_FOR_TRACKED_DLC_STAT - ivalue:", ivalue, " target:", GET_DLC_MISSION_STAT_DEBUG_NAME(target)) // //// IF(g_DLCMissionStatTrackingPrototypes[g_DLCMissionStatTrackingArray[index].target].less_than_threshold) //// CPRINTLN(DEBUG_MISSION_STATS, "UPLOAD_DATA_FOR_TRACKED_DLC_STAT - lessthan check ",oldvalue," > ",g_DLCMissionStatTrackingArray[index].ivalue) //// //should we log the stat? is it a record, or has it never been set? //// IF oldvalue > g_DLCMissionStatTrackingArray[index].ivalue OR oldvalue < 0 //// CPRINTLN(DEBUG_MISSION_STATS, "UPLOAD_DATA_FOR_TRACKED_DLC_STAT - lessthan record, setting") // SET_DLC_MISSION_STAT_STORED_VALUE(ivalue, target) //// ENDIF //// ELSE //// CPRINTLN(DEBUG_MISSION_STATS, "UPLOAD_DATA_FOR_TRACKED_DLC_STAT - greaterthan check ",g_DLCMissionStatTrackingArray[index].ivalue," > ",oldvalue) //// IF g_DLCMissionStatTrackingArray[index].ivalue > oldvalue OR oldvalue < 0 //// CPRINTLN(DEBUG_MISSION_STATS, "UPLOAD_DATA_FOR_TRACKED_DLC_STAT - greaterthan record, setting") //// SET_DLC_MISSION_STAT_STORED_VALUE(g_DLCMissionStatTrackingArray[index].ivalue, g_DLCMissionStatTrackingArray[index].target) //// ENDIF //// ENDIF // ENDIF //ENDPROC //PROC MISSION_STAT_BLOCKING_END_OF_DLC_ASSASSINATION_SCREEN(DLC_ASSASSINATION_STATCONFIG &config) // // //lodge the values into the stat system // //BEGIN_REPLAY_STATS(47,47) // //ADD_REPLAY_STAT_VALUE(INT ValueOfStat) // //END_REPLAY_STATS() // // REQUEST_ADDITIONAL_TEXT("MISHSTA", MINIGAME_TEXT_SLOT) // WHILE NOT HAS_ADDITIONAL_TEXT_LOADED(MINIGAME_TEXT_SLOT) // CPRINTLN(DEBUG_MISSION_STATS, "Waiting additional text to load.") // WAIT(0) // ENDWHILE // // PLAY_MISSION_COMPLETE_AUDIO("FRANKLIN_BIG_01") // WHILE NOT IS_MISSION_COMPLETE_READY_FOR_UI() // CPRINTLN(DEBUG_MISSION_STATS, "Waiting mission complete audio to be ready.") // WAIT(0) // ENDWHILE // // UPDATE_DLC_ASSASSINATION_STATS(config) // // END_SCREEN_DATASET esd // esd.bShowSkipperPrompt = TRUE // SET_ENDSCREEN_DATASET_HEADER(esd, "MISHPA", GET_DLC_ASSASSINATION_TITLE_STRING(config.dlcAssassinationIndex)) // // INT visibleAttempted = config.iRegisteredStats // INT visiblesucceeded = 0 // // INT i = 0 // MISSION_STAT_SYSTEM_INVALIDATION_REASON eLastInvalidationReasonShown = MSSIR_VALID // // REPEAT config.iRegisteredStats i // INT iSuccessThreshold = g_DLCMissionStatTrackingPrototypes[config.target[i]].success_threshold // // END_SCREEN_CHECK_MARK_STATUS eEndScreenCheckMarkStatus = ESCM_CHECKED // // END_SCREEN_ELEMENT_FORMATTING eFormatting = ESEF_NAME_ONLY // IF GET_FORMATTING_TYPE_FOR_DLC_STAT(config.type[i], eFormatting) // // #IF IS_DEBUG_BUILD // INT iDebugTarget = -1 // GET_TARGET_FOR_DLC_STAT(config.target[i], iDebugTarget) // BOOL bMatchDebugTarget = TRUE // // IF g_DLCMissionStatTrackingPrototypes[config.target[i]].type != config.type[i] // CASSERTLN(DEBUG_MISSION_STATS, "type mismatch ", GET_DLC_MISSION_STAT_DEBUG_NAME(config.target[i]), " - ", GET_STRING_FROM_MISSION_STAT_TYPES(g_DLCMissionStatTrackingPrototypes[config.target[i]].type), " != ", GET_STRING_FROM_MISSION_STAT_TYPES(config.type[i]), "??") // bMatchDebugTarget = FALSE // ENDIF // IF iSuccessThreshold != iDebugTarget // CASSERTLN(DEBUG_MISSION_STATS, "target mismatch ", GET_DLC_MISSION_STAT_DEBUG_NAME(config.target[i]), " - ", iSuccessThreshold, " != ", iDebugTarget, "??") // bMatchDebugTarget = FALSE // ENDIF // // IF bMatchDebugTarget // CERRORLN(DEBUG_MISSION_STATS, "type and target ", GET_DLC_MISSION_STAT_DEBUG_NAME(config.target[i]), " match.") // ENDIF // #ENDIF // // IF config.invalidationReason[i] = MSSIR_VALID // IF GET_END_SCREEN_CHECK_MARK_FOR_DLC_STAT(config, config.target[i], iSuccessThreshold, eEndScreenCheckMarkStatus, visiblesucceeded) // ADD_ENDSCREEN_DATASET_CONTENT_ELEMENT(esd, // eFormatting, // GET_DLC_MISSION_STAT_NAME(config.target[i]), // "", // config.StatCurrentValue[i], // iSuccessThreshold, // eEndScreenCheckMarkStatus, // FALSE) // ENDIF // ELSE // STRING invalidationReason = "MTPHPERRET" // SWITCH config.invalidationReason[i] // CASE MSSIR_CHEAT_ACTIVE invalidationReason = "MTPHPERCHE" BREAK // CASE MSSIR_SKIP invalidationReason = "MTPHPERSKI" BREAK // CASE MSSIR_TAXI_USED invalidationReason = "MTPHPERTAX" BREAK // CASE MSSIR_NOT_SET invalidationReason = "MTPHPERNOREC" BREAK // ENDSWITCH // IF eLastInvalidationReasonShown = config.invalidationReason[i] // invalidationReason = "" // ENDIF // eLastInvalidationReasonShown = config.invalidationReason[i] // // ADD_ENDSCREEN_DATASET_CONTENT_ELEMENT(esd, // ESEF_RAW_STRING, // GET_DLC_MISSION_STAT_NAME(config.target[i]), // invalidationReason, // config.StatCurrentValue[i], // 0, // ESCM_INVALIDATED) // // ENDIF // ENDIF // // UPLOAD_DATA_FOR_TRACKED_DLC_STAT(config.invalidationReason[i], config.StatCurrentValue[i], config.target[i]) // // MISSION_STAT_RESET_STAT_REGISTER(i) // g_iMissionStatsBeingTracked-- // ENDREPEAT // // config.fCompletionPercent = GET_MISSION_STAT_PERCENTAGE(visiblesucceeded, visibleattempted) // // STRING resultString = "MTPHPER" // END_SCREEN_MEDAL_STATUS ems = ESMS_NO_MEDAL // SWITCH GET_STAT_MEDAL_VALUE(config.fCompletionPercent) // CASE 3 //HUD_COLOUR_GOLD // resultString = "MTPHPER_G" // ems = ESMS_GOLD // BREAK // CASE 2 //HUD_COLOUR_SILVER // resultString = "MTPHPER_S" // ems = ESMS_SILVER // BREAK // CASE 1 // HUD_COLOUR_BRONZE // resultString = "MTPHPER_B" // ems = ESMS_BRONZE // BREAK // ENDSWITCH // // //SET_ENDSCREEN_COMPLETION_LINE_STATE(esd,TRUE, "MTPHPER", ROUND(config.fCompletionPercent), 100,ESC_PERCENTAGE_COMPLETION,ESMS_NO_MEDAL) // SET_ENDSCREEN_COMPLETION_LINE_STATE(esd, TRUE, resultString, ROUND(config.fCompletionPercent),0, ESC_PERCENTAGE_COMPLETION, ems) // // // ENDSCREEN_PREPARE(esd, TRUE) // blocks here until loaded // RENDER_ENDSCREEN(esd, TRUE) // blocks here until done // // ENDSCREEN_SHUTDOWN(esd) // // // SET_RESULT_SCREEN_DISPLAYING_STATE(FALSE) // g_bMissionOverStatTrigger = FALSE // // // //ENDPROC //#ENDIF //////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////// //Old stat system/////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////// PROC RESET_MISSION_REGISTERS_FROM_START() INT i = 0 REPEAT g_iMissionStatsBeingTracked i MISSION_STAT_RESET_STAT_REGISTER(i) ENDREPEAT ENDPROC //yes public includes private in this case, is quite derp //this was moved out to auto gen also to fix header cycle FUNC INT GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS( ENUM_MISSION_STATS m ) INT i = 0 INT crewsum = 0 SWITCH m CASE FH2A_CREW_TAKE CASE FH2B_CREW_TAKE REPEAT MAX_CREW_SIZE i IF g_savedGlobals.sHeistData.sEndScreenData[g_iMissionStatSystemHeistIndex].eCrewStatus[i] = CMST_FINE crewsum += g_savedGlobals.sHeistData.sEndScreenData[g_iMissionStatSystemHeistIndex].iCrewMemberTake[i] ENDIF ENDREPEAT CPRINTLN(DEBUG_MISSION_STATS, "CREWTAKE for 1631323: Found a total of ", crewsum) RETURN crewsum ENDSWITCH i = 0 REPEAT g_iMissionStatsBeingTracked i IF g_MissionStatTrackingArray[i].target = m CPRINTLN(DEBUG_MISSION_STATS, "GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS N: Returning value ",g_MissionStatTrackingArray[i].ivalue," from register ", i, " with enum index ",m) RETURN g_MissionStatTrackingArray[i].ivalue ENDIF ENDREPEAT SCRIPT_ASSERT("GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS N: target not in the registers. Pass this bug to Default Levels.") RETURN 0 ENDFUNC /* ENUM MISSION_STAT_SYSTEM_TIME_WARP_SOURCE MSSTWS_TAXI ENDENUM */ /// PURPOSE: /// Prevent the autosave happening before the primed stats have been written to the profile /// RETURNS: /// FUNC BOOL IS_MISSION_STAT_UPLOAD_PENDING() #if USE_CLF_DLC IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("mission_stat_watchCLF")) < 1 CPRINTLN(DEBUG_MISSION_STATS, "IS_MISSION_STAT_UPLOAD_PENDING: stat watcher not running, returning false") RETURN FALSE ENDIF #endif #if USE_NRM_DLC IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("mission_stat_watchNRM")) < 1 CPRINTLN(DEBUG_MISSION_STATS, "IS_MISSION_STAT_UPLOAD_PENDING: stat watcher not running, returning false") RETURN FALSE ENDIF #endif #if not USE_CLF_DLC #if not USE_NRM_DLC IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("mission_stat_watcher")) < 1 CPRINTLN(DEBUG_MISSION_STATS, "IS_MISSION_STAT_UPLOAD_PENDING: stat watcher not running, returning false") RETURN FALSE ENDIF #endif #endif IF NOT g_bMissionStatSystemPrimed CPRINTLN(DEBUG_MISSION_STATS, "IS_MISSION_STAT_UPLOAD_PENDING: no prime, returning false") RETURN FALSE ELSE CPRINTLN(DEBUG_MISSION_STATS, "IS_MISSION_STAT_UPLOAD_PENDING: g_bMissionStatSystemUploadPending state ", g_bMissionStatSystemUploadPending) ENDIF RETURN g_bMissionStatSystemUploadPending ENDFUNC PROC RESET_STAT_SYSTEM_DEADPOOL() INT i = 0 REPEAT STAT_DEADPOOL_DEPTH i g_StatSystemDeadpool[i].entar = NULL g_StatSystemDeadpool[i].statar = UNSET_MISSION_STAT_ENUM ENDREPEAT g_StatSystemDeadpoolEntries = 0 ENDPROC PROC RESET_STAT_SYSTEM_WEPPOOL() INT i = 0 REPEAT STAT_WEPPOOL_DEPTH i g_StatSystemWeaponpool[i].statar = UNSET_MISSION_STAT_ENUM ENDREPEAT g_StatSystemWeponpoolEntries = 0 ENDPROC /// PURPOSE: /// Log a weapon that will then auto increment the given stat for each ped the player kills with it. 4 weapons may be logged at once. /// PARAMS: /// wep - the weapon /// stat - the stat PROC ADD_WEPPOOL_TRIGGER(WEAPON_TYPE wep,ENUM_MISSION_STATS stat) IF STAT_WEPPOOL_DEPTH = g_StatSystemWeponpoolEntries SCRIPT_ASSERT("ADD_WEPPOOL_TRIGGER: Wep pool has no space left") EXIT ENDIF CPRINTLN(DEBUG_MISSION_STATS, "ADD_WEPPOOL_TRIGGER: Registering wep ",wep," and stat ",stat) g_StatSystemWeaponpool[g_StatSystemWeponpoolEntries].weptar = wep g_StatSystemWeaponpool[g_StatSystemWeponpoolEntries].statar = stat ++g_StatSystemWeponpoolEntries ENDPROC /// PURPOSE: /// Log a ped that on death will trigger an increment of the given stat. /// PARAMS: /// entity - /// stat - PROC ADD_DEADPOOL_TRIGGER(ENTITY_INDEX entity,ENUM_MISSION_STATS stat) //look for null entry INT i = 0 REPEAT STAT_DEADPOOL_DEPTH i IF g_StatSystemDeadpool[i].entar = null g_StatSystemDeadpool[i].entar = entity g_StatSystemDeadpool[i].statar = stat IF i = g_StatSystemDeadpoolEntries ++g_StatSystemDeadpoolEntries ENDIF EXIT ENDIF ENDREPEAT CPRINTLN(DEBUG_MISSION_STATS, "ADD_DEADPOOL_TRIGGER: dead pool has no space left") ENDPROC /// PURPOSE /// invalidate time based stats due to time warp, this should only be used for things like the taxi time skips /// or anything else that is not part of the mission that teleports the player or changes the time /// it should only be used on things that the player can trigger. PROC MISSION_STAT_SYSTEM_ALERT_TIME_WARP()//MISSION_STAT_SYSTEM_TIME_WARP_SOURCE source CPRINTLN(DEBUG_MISSION_STATS, "MISSION_STAT_SYSTEM_ALERT_TIME_WARP: On mission time warp stat invalidation check") INT i = 0 REPEAT g_iMissionStatsBeingTracked i SWITCH g_MissionStatTrackingPrototypes[g_MissionStatTrackingArray[i].target].type CASE MISSION_STAT_TYPE_TOTALTIME g_MissionStatTrackingArray[i].invalidationReason = MSSIR_TAXI_USED BREAK CASE MISSION_STAT_TYPE_WINDOWED_TIMER IF g_bMissionStatTimeWindowGate g_MissionStatTrackingArray[i].invalidationReason = MSSIR_TAXI_USED ENDIF BREAK ENDSWITCH ENDREPEAT ENDPROC PROC TRIGGER_MISSION_STATS_UI(BOOL IgnoreFadeMode = FALSE, BOOL SuppressFadeIn = FALSE) g_bEndScreenSuppressFadeIn = SuppressFadeIn IF g_bMissionOverStatTrigger CPRINTLN(DEBUG_MISSION_STATS, "TRIGGER_MISSION_STATS_UI: already triggered") EXIT ENDIF CPRINTLN(DEBUG_MISSION_STATS, "TRIGGER_MISSION_STATS_UI: stats UI triggered") IF g_bSuppressNextStatTrigger CPRINTLN(DEBUG_MISSION_STATS, "TRIGGER_MISSION_STATS_UI: suppressed by g_bSuppressNextStatTrigger") g_bSuppressNextStatTrigger = FALSE EXIT ENDIF #if USE_CLF_DLC IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("mission_stat_watchCLF")) > 0 PRINTSTRING("TRIGGER_MISSION_STATS_UI end of mission overlay triggered! ") IF (g_bMissionOverStatTrigger) PRINTSTRING("g_bMissionOverStatTrigger state is true already.") ELSE PRINTSTRING("g_bMissionOverStatTrigger state is false, setting to true.") ENDIF PRINTNL() g_MissionStatUIIgnoreFade = IgnoreFadeMode g_bMissionOverStatTrigger = TRUE g_bMissionStatSystemUploadPending =TRUE #IF IS_DEBUG_BUILD IF NOT g_bMissionStatSystemPrimed CPRINTLN(DEBUG_MISSION_STATS, "TRIGGER_MISSION_STATS_UI: Stat watcher wasn't primed, seeing if standalone splash was primed") ENDIF #ENDIF ELSE CPRINTLN(DEBUG_MISSION_STATS, "TRIGGER_MISSION_STATS_UI mission stats triggered without the stat wacher running. Cancelling request.") ENDIF #endif #if USE_NRM_DLC IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("mission_stat_watchNRM")) > 0 PRINTSTRING("TRIGGER_MISSION_STATS_UI end of mission overlay triggered! ") IF (g_bMissionOverStatTrigger) PRINTSTRING("g_bMissionOverStatTrigger state is true already.") ELSE PRINTSTRING("g_bMissionOverStatTrigger state is false, setting to true.") ENDIF PRINTNL() g_MissionStatUIIgnoreFade = IgnoreFadeMode g_bMissionOverStatTrigger = TRUE g_bMissionStatSystemUploadPending =TRUE #IF IS_DEBUG_BUILD IF NOT g_bMissionStatSystemPrimed CPRINTLN(DEBUG_MISSION_STATS, "TRIGGER_MISSION_STATS_UI: Stat watcher wasn't primed, seeing if standalone splash was primed") ENDIF #ENDIF ELSE CPRINTLN(DEBUG_MISSION_STATS, "TRIGGER_MISSION_STATS_UI mission stats triggered without the stat wacher running. Cancelling request.") ENDIF #endif #if not USE_CLF_DLC #if not USE_NRM_DLC IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("mission_stat_watcher")) > 0 PRINTSTRING("TRIGGER_MISSION_STATS_UI end of mission overlay triggered! ") IF (g_bMissionOverStatTrigger) PRINTSTRING("g_bMissionOverStatTrigger state is true already.") ELSE PRINTSTRING("g_bMissionOverStatTrigger state is false, setting to true.") ENDIF PRINTNL() g_MissionStatUIIgnoreFade = IgnoreFadeMode g_bMissionOverStatTrigger = TRUE g_bMissionStatSystemUploadPending =TRUE #IF IS_DEBUG_BUILD IF NOT g_bMissionStatSystemPrimed CPRINTLN(DEBUG_MISSION_STATS, "TRIGGER_MISSION_STATS_UI: Stat watcher wasn't primed, seeing if standalone splash was primed") ENDIF #ENDIF ELSE CPRINTLN(DEBUG_MISSION_STATS, "TRIGGER_MISSION_STATS_UI mission stats triggered without the stat wacher running. Cancelling request.") ENDIF #endif #endif //SCRIPT_ASSERT("Stat watcher fired") ENDPROC PROC SET_TIME_TARGET_FOR_STAT_PROTOTYPE(ENUM_MISSION_STATS s, INT minutes,INT seconds) //work out the ms g_MissionStatTrackingPrototypes[s].success_threshold = (minutes*60000) + (seconds*1000) ENDPROC PROC DO_MISSION_STAT_INITIAL_CONFIGURATION() INT initrep = 0 MissionStatInfo msi #IF USE_NRM_DLC REPEAT MAX_MISSION_STATS_NRM initrep #ENDIF #IF USE_CLF_DLC REPEAT MAX_MISSION_STATS_CLF initrep #ENDIF #IF NOT USE_SP_DLC REPEAT MAX_MISSION_STATS initrep #ENDIF //.statname = INT_TO_ENUM(STATSENUM, 0) ENUM_MISSION_STATS ems = INT_TO_ENUM(ENUM_MISSION_STATS,initrep) msi.statname = INT_TO_ENUM(STATSENUM, 0) INTERNAL_GENERATED_MISSION_STAT_CONFIGURE_TYPES_AND_VALUES_FOR_INDEX(ems, msi) g_MissionStatTrackingPrototypes[initrep].type = msi.type //g_MissionStatTrackingPrototypes[initrep].currentvalue = msi.currentvalue g_MissionStatTrackingPrototypes[initrep].success_threshold = msi.success_threshold g_MissionStatTrackingPrototypes[initrep].less_than_threshold = msi.less_than_threshold g_MissionStatTrackingPrototypes[initrep].statname = msi.statname g_MissionStatTrackingPrototypes[initrep].MinRange = msi.MinRange g_MissionStatTrackingPrototypes[initrep].MaxRange = msi.MaxRange g_MissionStatTrackingPrototypes[initrep].bHidden = msi.bHidden g_MissionStatTrackingPrototypes[initrep].lb_differentiator = msi.lb_differentiator g_MissionStatTrackingPrototypes[initrep].lb_weight_PPC = msi.lb_weight_PPC g_MissionStatTrackingPrototypes[initrep].lb_min_legal = msi.lb_min_legal g_MissionStatTrackingPrototypes[initrep].lb_max_legal = msi.lb_max_legal g_MissionStatTrackingPrototypes[initrep].lb_precedence = msi.lb_precedence g_MissionStatTrackingPrototypes[initrep].currentvalue = GET_MISSION_STAT_STORED_VALUE(g_MissionStatTrackingPrototypes[initrep].statname) CPRINTLN(DEBUG_MISSION_STATS, "DO_MISSION_STAT_INITIAL_CONFIGURATION: got initial value of ", g_MissionStatTrackingPrototypes[initrep].currentvalue , " for index ", initrep ) #IF USE_NRM_DLC ENDREPEAT #ENDIF #IF USE_CLF_DLC ENDREPEAT #ENDIF #IF NOT USE_SP_DLC ENDREPEAT #ENDIF //now register stat associations with the flow. INTERNAL_GENERATED_ASSOCIATE_STATS_WITH_FLOW() ENDPROC FUNC FLOAT GET_RC_MS_PERCENTAGE(g_eRC_MissionIDs m) RETURN g_savedGlobals.sRandomChars.savedRC[m].fStatCompletion ENDFUNC PROC SET_RC_MS_PERCENTAGE(g_eRC_MissionIDs m, FLOAT fperc, BOOL bSkip = FALSE) IF bSkip g_savedGlobals.sRandomChars.savedRC[m].fStatCompletion = 50 ELSE g_savedGlobals.sRandomChars.savedRC[m].fStatCompletion = fperc ENDIF // hey andy i added this boolean here so I can tell the achievement controller to check the medals // i'm not doing this by looping through the values in the repeat play menu - aaron g_bCheckSolidGoldBabyAchievement = TRUE ENDPROC FUNC FLOAT GET_SM_MS_PERCENTAGE(SP_MISSIONS m) RETURN g_savedGlobals.sFlow.missionSavedData[m].fStatCompletion ENDFUNC PROC SET_SM_MS_PERCENTAGE(SP_MISSIONS m, FLOAT fperc, BOOL bSkip = FALSE) #if USE_CLF_DLC IF bSkip g_savedGlobalsClifford.sFlow.missionSavedData[m].fStatCompletion = 50 ELSE g_savedGlobalsClifford.sFlow.missionSavedData[m].fStatCompletion = fperc ENDIF #endif #if USE_NRM_DLC IF bSkip g_savedGlobalsnorman.sFlow.missionSavedData[m].fStatCompletion = 50 ELSE g_savedGlobalsnorman.sFlow.missionSavedData[m].fStatCompletion = fperc ENDIF #endif #if not USE_CLF_DLC #if not USE_NRM_DLC IF bSkip g_savedGlobals.sFlow.missionSavedData[m].fStatCompletion = 50 ELSE g_savedGlobals.sFlow.missionSavedData[m].fStatCompletion = fperc ENDIF #endif #endif // hey andy i added this boolean here so I can tell the achievement controller to check the medals // i'm not doing this by looping through the values in the repeat play menu - aaron g_bCheckSolidGoldBabyAchievement = TRUE ENDPROC PROC LODGE_PERCENTAGE_FOR_CURRENT_MISSION(FLOAT fperc, BOOL bSkip = FALSE) FLOAT fLastPerc IF g_LeaderboardLastMissionRCType //RC mission g_eRC_MissionIDs m = INT_TO_ENUM(g_eRC_MissionIDs,g_LeaderboardLastMissionID) fLastPerc = GET_RC_MS_PERCENTAGE(m) CPRINTLN(DEBUG_ACHIEVEMENT, "ACH10 - Lodging Percentage For RC Mission - Old %:", fLastPerc, " Current %:", fperc) IF (fLastPerc < 100.0) CPRINTLN(DEBUG_ACHIEVEMENT, "ACH10 - Previous Percentage is less than 100%") IF fperc >= 100.0 ++g_savedGlobals.sFlowCustom.iMissionGolds ENDIF ENDIF IF (fperc >= fLastPerc) SET_RC_MS_PERCENTAGE(m,fperc,bSkip) ENDIF ELIF g_LeaderboardLastMissionID = -1 SCRIPT_ASSERT("LODGE_PERCENTAGE_FOR_CURRENT_MISSION - g_LeaderboardLastMissionID is null!!!") ELSE //regular mission CPRINTLN(DEBUG_ACHIEVEMENT, "ACH10 - Lodging Percentage For SP Mission ", g_LeaderboardLastMissionID, ".") SP_MISSIONS mi = INT_TO_ENUM(SP_MISSIONS,g_LeaderboardLastMissionID) fLastPerc = GET_SM_MS_PERCENTAGE(mi) CPRINTLN(DEBUG_ACHIEVEMENT, "ACH10 - Lodging Percentage For SP Mission - Old %:", fLastPerc, " Current %:", fperc) IF fLastPerc < 100.0 CPRINTLN(DEBUG_ACHIEVEMENT, "ACH10 - Previous Percentage is less than 100%") IF fperc >= 100.0 #if USE_CLF_DLC ++g_savedGlobalsClifford.sFlowCustom.iMissionGolds #endif #if USE_NRM_DLC ++g_savedGlobalsnorman.sFlowCustom.iMissionGolds #endif #if not USE_CLF_DLC #if not USE_NRM_DLC ++g_savedGlobals.sFlowCustom.iMissionGolds #endif #endif ENDIF ENDIF IF (fperc >= fLastPerc) SET_SM_MS_PERCENTAGE(mi,fperc,bSkip) ENDIF ENDIF ENDPROC PROC CHECK_REPLAY_MISSION_STAT_STATE() //check for lodged values needing uploaded after replay IF HAVE_REPLAY_STATS_BEEN_STORED() IF GET_REPLAY_STAT_MISSION_ID() = 33 IF GET_REPLAY_STAT_MISSION_TYPE() = 33 INT statcount = GET_REPLAY_STAT_COUNT() CPRINTLN(DEBUG_MISSION_STATS, " Detected unprocessed replay stats, n : ", statcount, ".") INT OverridePerc = -1 INT endpoint = statcount-4 IF ((statcount-4)%3) = 0 // 4 stats signifying mission, percent, skip status and rc type statcount = (statcount-4)/3 INT i = 0 REPEAT statcount i INT value = GET_REPLAY_STAT_AT_INDEX((i*3)+1) ENUM_MISSION_STATS s = INT_TO_ENUM(ENUM_MISSION_STATS, GET_REPLAY_STAT_AT_INDEX((i*3)+2)) CPRINTLN(DEBUG_MISSION_STATS, " Setting mission stat stored values: ", value, " : ", s, ".") SWITCH s CASE ASS4_MIRROR_PERCENTAGE CASE ASS5_MIRROR_PERCENT CASE ASS3_MIRROR_PERCENTAGE CASE ASS1_MIRROR_PERCENT CASE ASS2_MIRROR_PERCENT OverridePerc = value BREAK ENDSWITCH SET_MISSION_STAT_STORED_VALUE(value, s) ENDREPEAT INT mishid = GET_REPLAY_STAT_AT_INDEX(endpoint) INT perc = GET_REPLAY_STAT_AT_INDEX(endpoint+1) BOOL skipStatus = FALSE IF GET_REPLAY_STAT_AT_INDEX(endpoint+2) > 0 skipStatus = TRUE ENDIF BOOL rcType = FALSE IF GET_REPLAY_STAT_AT_INDEX(endpoint+3) > 0 rcType = TRUE ENDIF g_LeaderboardLastMissionRCType = rcType g_LeaderboardLastMissionID = mishid IF OverridePerc = -1 LODGE_PERCENTAGE_FOR_CURRENT_MISSION( TO_FLOAT(perc), skipStatus) ELSE LODGE_PERCENTAGE_FOR_CURRENT_MISSION( TO_FLOAT(OverridePerc), skipStatus) ENDIF ENDIF CPRINTLN(DEBUG_MISSION_STATS, " Making autosave request after updating mission replay stats.") MAKE_AUTOSAVE_REQUEST() ENDIF #IF IS_DEBUG_BUILD ELSE CPRINTLN(DEBUG_MISSION_STATS, " Replay stats mission ID incorrect.") #ENDIF ENDIF IF GET_REPLAY_STAT_MISSION_ID() = 13 IF GET_REPLAY_STAT_MISSION_TYPE() = 37 INT statcount = GET_REPLAY_STAT_COUNT() IF statcount = 3 // Rampage data found. INT iRampage = GET_REPLAY_STAT_AT_INDEX(0) INT iMedal = GET_REPLAY_STAT_AT_INDEX(1) INT iHighScore = GET_REPLAY_STAT_AT_INDEX(2) CPRINTLN(DEBUG_MISSION_STATS, " Found stored rampage data for rampage ", iRampage, ".") CPRINTLN(DEBUG_MISSION_STATS, " Medal rank ", iMedal,".") CPRINTLN(DEBUG_MISSION_STATS, " High score ", iHighScore,".") g_savedGlobals.sRampageData.playerData[iRampage].iMedalIndex = iMedal g_savedGlobals.sRampageData.playerData[iRampage].iHighScore = iHighScore CPRINTLN(DEBUG_MISSION_STATS, " Making autosave request after updating rampage replay stats.") MAKE_AUTOSAVE_REQUEST() ENDIF ENDIF ENDIF #IF IS_DEBUG_BUILD ELSE CPRINTLN(DEBUG_MISSION_STATS, " no replay stats found") #ENDIF ENDIF ENDPROC PROC RESET_MISSION_STATS_ENTITY_WATCH() g_iEntityWatchListLoggedCount = 0 INT i = 0 REPEAT MAX_ENTITY_WATCH_LIST_ENTRIES i g_EntityWatchList[i].index = NULL ENDREPEAT ENDPROC PROC INFORM_MISSION_STATS_SYSTEM_OF_CHECKPOINT() //TODO , bank any stats that have been succeeded that are not invalidated by replay ENDPROC PROC INFORM_MISSION_STATS_OF_FINANCE_MODEL(MODEL_NAMES name, INT value) IF g_iFinanceLookupLogged = MAX_FINANCE_LOOKUP_ENTRIES SCRIPT_ASSERT("INFORM_MISSION_STATS_OF_FINANCE_MODEL maximum amount of entries logged") EXIT ENDIF g_FinanaceLookup[g_iFinanceLookupLogged].target = name g_FinanaceLookup[g_iFinanceLookupLogged].value = value ++g_iFinanceLookupLogged ENDPROC PROC INFORM_MISSION_STATS_OF_FINANCE_WATCH_RESET() g_iFinanceLookupLogged = 0 ENDPROC /* PROC PRIME_MISSION_STATS_LEADBOARD_ENUMS(LEADERBOARDS_ENUM bestrun, LEADERBOARDS_ENUM indiv) //g_bMissionScoreLeadboardPrimed = TRUE g_eTargetMissionScoreLeaderboardBestRun = bestrun g_eTargetMissionScoreLeaderboardIndivRec = indiv ENDPROC */ PROC RESET_MISSION_STATS_SYSTEM() IF g_bMissionStatSystemBlocker CPRINTLN(DEBUG_MISSION_STATS, "RESET_MISSION_STATS_SYSTEM: blocked by g_bMissionStatSystemBlocker") EXIT ENDIF CPRINTLN(DEBUG_MISSION_STATS, "RESET_MISSION_STATS_SYSTEM: CALLED by script : ", GET_THIS_SCRIPT_NAME()) //g_eTargetMissionScoreLeaderboardBestRun = LEADERBOARD_MINI_GAMES_TENNIS //Using tennis to signify //g_eTargetMissionScoreLeaderboardIndivRec = LEADERBOARD_MINI_GAMES_TENNIS //an invalid value for now //g_bMissionScoreLeadboardPrimed = FALSE //SCRIPT_ASSERT("None blocked stat sys reset") //g_LeaderboardLastMissionRCType = FALSE //g_LeaderboardLastMissionID = -1 g_bMissionStatTimeWindowClosedForGood = FALSE g_iMissionStatsBeingTracked = 0 //SCRIPT_ASSERT("Tracked stats reset") g_MissionStatSingleSpeedWatchEntity = NULL IF g_bMissionStatTimeWindowGate CPRINTLN(DEBUG_MISSION_STATS, " time window closed by RESET_MISSION_STATS_SYSTEM") ENDIF g_bMissionStatTimeWindowGate = FALSE SET_RESULT_SCREEN_DISPLAYING_STATE(FALSE) RESET_MISSION_STATS_ENTITY_WATCH() g_bTrackingInnocentsLogged = FALSE g_bMissionStatTimeDeltaReset = TRUE RESET_MISSION_STATS_ACCURACY_STATE() INFORM_MISSION_STATS_OF_FINANCE_WATCH_RESET() RESET_STAT_SYSTEM_DEADPOOL() RESET_STAT_SYSTEM_WEPPOOL() g_bMissionNoStatsNeedsSplashAndSting = FALSE g_MissionStatUIIgnoreFade = FALSE g_iMissionStatsStartTime = -1 ENDPROC PROC RESET_MISSION_STATS_INVALIDATIONS() INT i = 0 REPEAT g_iMissionStatsBeingTracked i g_MissionStatTrackingArray[i].invalidationReason = MSSIR_VALID ENDREPEAT ENDPROC PROC INFORM_MISSION_STATS_SYSTEM_OF_SHITSKIP() CPRINTLN(DEBUG_MISSION_STATS, "INFORM_MISSION_STATS_SYSTEM_OF_SHITSKIP fired with ", g_iMissionStatsBeingTracked, " being tracked") g_bMissionStatSystemResponseToShitskipNeeded = TRUE INT i = 0 REPEAT g_iMissionStatsBeingTracked i g_MissionStatTrackingArray[i].invalidationReason = MSSIR_SKIP ENDREPEAT IF g_bMissionStatTimeWindowGate CPRINTLN(DEBUG_MISSION_STATS, " time window closed by INFORM_MISSION_STATS_SYSTEM_OF_SHITSKIP") ENDIF g_bMissionStatTimeWindowGate = FALSE ENDPROC PROC INFORM_MISSION_STATS_SYSTEM_OF_RESTART() CPRINTLN(DEBUG_MISSION_STATS, "INFORM_MISSION_STATS_SYSTEM_OF_RESTART: primed restart") g_bMissionStatSystemResponseToReplayNeeded = TRUE /* IF softReset CPRINTLN(DEBUG_MISSION_STATS, "INFORM_MISSION_STATS_SYSTEM_OF_RESTART: Soft reset") g_bMissionStatSystemResponseToReplayNeeded = TRUE ELSE CPRINTLN(DEBUG_MISSION_STATS, "INFORM_MISSION_STATS_SYSTEM_OF_RESTART: Hard reset ") //only reset the values in the stats registers to their defaults INT i = 0 REPEAT g_iMissionStatsBeingTracked i MISSION_STAT_RESET_STAT_REGISTER(i)//,g_bMissionStatSystemResponseToShitskipNeeded) ENDREPEAT ENDIF*/ IF g_bMissionStatTimeWindowGate CPRINTLN(DEBUG_MISSION_STATS, " time window closed by INFORM_MISSION_STATS_SYSTEM_OF_RESTART") ENDIF g_bMissionStatTimeWindowGate = FALSE ENDPROC PROC CARRY_OUT_STATS_SYSTEM_RESPONSE_TO_RESTART() IF NOT g_bMissionStatSystemResponseToReplayNeeded CPRINTLN(DEBUG_MISSION_STATS, "CARRY_OUT_STATS_SYSTEM_RESPONSE_TO_RESTART: failed response bool unset") EXIT ENDIF //invalidate stats that are unable to go cross replay IF g_iMissionStatsBeingTracked = 0 CPRINTLN(DEBUG_MISSION_STATS, "CARRY_OUT_STATS_SYSTEM_RESPONSE_TO_RESTART: no stats being tracked, nothing to invalidate") EXIT ENDIF INT i = 0 REPEAT g_iMissionStatsBeingTracked i SWITCH g_MissionStatTrackingPrototypes[g_MissionStatTrackingArray[i].target].type CASE MISSION_STAT_TYPE_TOTALTIME CASE MISSION_STAT_TYPE_ACCURACY g_MissionStatTrackingArray[i].invalidationReason = MSSIR_CHECKPOINT CPRINTLN(DEBUG_MISSION_STATS, "CARRY_OUT_STATS_SYSTEM_RESPONSE_TO_RESTART: Invalidated time/accuracy tracking array element ", i, " \"", SAFE_GET_MISSION_STAT_NAME(g_MissionStatTrackingArray[i].target), "\"") BREAK CASE MISSION_STAT_TYPE_WINDOWED_TIMER IF g_bMissionStatTimeWindowGate g_MissionStatTrackingArray[i].invalidationReason = MSSIR_CHECKPOINT CPRINTLN(DEBUG_MISSION_STATS, "CARRY_OUT_STATS_SYSTEM_RESPONSE_TO_RESTART: Invalidated windowed timer element ", i, " \"", SAFE_GET_MISSION_STAT_NAME(g_MissionStatTrackingArray[i].target), "\"") #IF IS_DEBUG_BUILD ELSE CPRINTLN(DEBUG_MISSION_STATS, "CARRY_OUT_STATS_SYSTEM_RESPONSE_TO_RESTART: Unopened windowed timer element ", i, " \"", SAFE_GET_MISSION_STAT_NAME(g_MissionStatTrackingArray[i].target), "\"") #ENDIF ENDIF BREAK CASE MISSION_STAT_TYPE_SINGLE_ENTITY_DAMAGE_THRESHOLD IF g_MissionStatTrackingPrototypes[g_MissionStatTrackingArray[i].target].less_than_threshold IF g_MissionStatTrackingArray[i].ivalue != 0 g_MissionStatTrackingArray[i].invalidationReason = MSSIR_CHECKPOINT CPRINTLN(DEBUG_MISSION_STATS, "CARRY_OUT_STATS_SYSTEM_RESPONSE_TO_RESTART: Invalidated damage less than element ", i, " \"", SAFE_GET_MISSION_STAT_NAME(g_MissionStatTrackingArray[i].target), "\"") #IF IS_DEBUG_BUILD ELSE CPRINTLN(DEBUG_MISSION_STATS, "CARRY_OUT_STATS_SYSTEM_RESPONSE_TO_RESTART: damage less than element non zero ",i) #ENDIF ENDIF #IF IS_DEBUG_BUILD ELSE CPRINTLN(DEBUG_MISSION_STATS, "CARRY_OUT_STATS_SYSTEM_RESPONSE_TO_RESTART: damage less than element not set ",i) #ENDIF ENDIF BREAK #IF IS_DEBUG_BUILD DEFAULT CPRINTLN(DEBUG_MISSION_STATS, "CARRY_OUT_STATS_SYSTEM_RESPONSE_TO_RESTART: type is ", GET_STRING_FROM_MISSION_STAT_TYPES(g_MissionStatTrackingPrototypes[g_MissionStatTrackingArray[i].target].type), " - ", i) BREAK #ENDIF ENDSWITCH //g_MissionStatTrackingArray[i].invalidated= TRUE ENDREPEAT CPRINTLN(DEBUG_MISSION_STATS, "CARRY_OUT_STATS_SYSTEM_RESPONSE_TO_RESTART: complete ",i) g_bMissionStatSystemResponseToReplayNeeded = FALSE ENDPROC PROC INVALIDATE_STATS_IF_CHEATS_ACTIVE() //EXIT // TODO, add check for any cheats active /* INT g_iBitsetCheatsCurrentlyDisabled // Bitset which tells the cheat controller which cheats are disabled this frame. INT g_iBitsetCheatsCurrentlyActive // Bitset which keeps track of which cheats are currently active. INT g_iBitsetCheatsUsedThisSession // Bitset which keeps track of which cheats were used this session. */ IF g_iBitsetCheatsCurrentlyActive = 0 AND !g_bHasAnyCheatBeenUsed EXIT ENDIF INT i = 0 REPEAT g_iMissionStatsBeingTracked i g_MissionStatTrackingArray[i].invalidationReason = MSSIR_CHEAT_ACTIVE ENDREPEAT ENDPROC PROC TERMINATE_STAT_WATCHERCLF() IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("mission_stat_watchCLF")) > 0 IF IS_MISSION_STAT_UPLOAD_PENDING() // it might be about to upload and terminate anyway IF g_bStatsInWatchingLoop AND (!g_bMissionOverStatTrigger) // its not been triggered and its sat in watching loop, kill it g_bStatsInWatchingLoop = FALSE TERMINATE_ALL_SCRIPTS_WITH_THIS_NAME("mission_stat_watchCLF") ENDIF ELSE TERMINATE_ALL_SCRIPTS_WITH_THIS_NAME("mission_stat_watchCLF") ENDIF ENDIF ENDPROC PROC TERMINATE_STAT_WATCHERNRM() IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("mission_stat_watchNRM")) > 0 IF IS_MISSION_STAT_UPLOAD_PENDING() // it might be about to upload and terminate anyway IF g_bStatsInWatchingLoop AND (!g_bMissionOverStatTrigger) // its not been triggered and its sat in watching loop, kill it g_bStatsInWatchingLoop = FALSE TERMINATE_ALL_SCRIPTS_WITH_THIS_NAME("mission_stat_watchNRM") ENDIF ELSE TERMINATE_ALL_SCRIPTS_WITH_THIS_NAME("mission_stat_watchNRM") ENDIF ENDIF ENDPROC PROC TERMINATE_STAT_WATCHER() #if USE_CLF_DLC TERMINATE_STAT_WATCHERCLF() exit #endif #if USE_NRM_DLC TERMINATE_STAT_WATCHERNRM() exit #endif IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("mission_stat_watcher")) > 0 IF IS_MISSION_STAT_UPLOAD_PENDING() // it might be about to upload and terminate anyway IF g_bStatsInWatchingLoop AND (!g_bMissionOverStatTrigger) // its not been triggered and its sat in watching loop, kill it g_bStatsInWatchingLoop = FALSE TERMINATE_ALL_SCRIPTS_WITH_THIS_NAME("mission_stat_watcher") ENDIF ELSE TERMINATE_ALL_SCRIPTS_WITH_THIS_NAME("mission_stat_watcher") ENDIF ENDIF ENDPROC PROC FLOW_PRIME_STATS_FOR_MISSION(SP_MISSIONS mi) CPRINTLN(DEBUG_MISSION_STATS, "FLOW_PRIME_STATS_FOR_MISSION: Stats system priming for mission ", GET_SP_MISSION_DISPLAY_STRING_FROM_ID(mi), ".") BOOL bC2SpecialCase = FALSE #if USE_CLF_DLC SP_MISSIONS m = mi #endif #if USE_NRM_DLC SP_MISSIONS m = mi #endif #if not USE_SP_DLC IF mi = SP_MISSION_FINALE_C1 g_bSuppressNextStatTrigger = TRUE ENDIF SP_MISSIONS m = mi IF m = SP_MISSION_FINALE_CREDITS CPRINTLN(DEBUG_MISSION_STATS, "FLOW_PRIME_STATS_FOR_MISSION: Priming cancelled early for credits script.") EXIT ENDIF IF m = SP_MISSION_FINALE_C2 CPRINTLN(DEBUG_MISSION_STATS, "Starting finale SP_MISSION_FINALE_C2, doing special case.") m = SP_MISSION_FINALE_C1 //Finale C2 uses the stats of C1 IF g_bMissionStatSystemPrimed CPRINTLN(DEBUG_MISSION_STATS, "FLOW_PRIME_STATS_FOR_MISSION: FINALE C2 triggered while system primed, just as planned.") EXIT ENDIF bC2SpecialCase = TRUE ENDIF IF (g_bMagDemoActive) CPRINTLN(DEBUG_MISSION_STATS, "FLOW_PRIME_STATS_FOR_MISSION: Cannot prime stats system in mag demo mode!") RESET_MISSION_STATS_SYSTEM() EXIT ENDIF #ENDIF g_sMissionStatsName = GET_SP_MISSION_NAME_LABEL(m) g_bMissionStatSystemHeistMode = FALSE g_MissionStatSystemSuppressVisual = FALSE IF IS_BIT_SET(g_sMissionStaticData[m].settingsBitset, MF_INDEX_NO_PASS) CPRINTLN(DEBUG_MISSION_STATS, "FLOW_PRIME_STATS_FOR_MISSION: This mission has no visible screen.") g_MissionStatSystemSuppressVisual = TRUE ENDIF SWITCH m #IF USE_CLF_DLC CASE SP_MISSION_CLF_TRAIN CPRINTLN(DEBUG_MISSION_STATS, "FLOW_PRIME_STATS_FOR_MISSION: Mission is on the ignore list, bailing/terminating.") g_MissionStatSystemSuppressVisual = TRUE g_bMissionStatSystemResetFlag = TRUE RESET_MISSION_STATS_SYSTEM() TERMINATE_STAT_WATCHER() EXIT BREAK CASE SP_MISSION_CLF_FIN CASE SP_MISSION_CLF_SPA_1 CASE SP_MISSION_CLF_SPA_2 CASE SP_MISSION_CLF_SPA_FIN CASE SP_MISSION_CLF_IAA_TRA CASE SP_MISSION_CLF_IAA_LIE CASE SP_MISSION_CLF_IAA_JET CASE SP_MISSION_CLF_IAA_HEL CASE SP_MISSION_CLF_IAA_DRO CASE SP_MISSION_CLF_IAA_RTS CASE SP_MISSION_CLF_KOR_PRO CASE SP_MISSION_CLF_KOR_RES CASE SP_MISSION_CLF_KOR_SUB CASE SP_MISSION_CLF_KOR_SAT CASE SP_MISSION_CLF_KOR_5 CASE SP_MISSION_CLF_RUS_PLA CASE SP_MISSION_CLF_RUS_CAR CASE SP_MISSION_CLF_RUS_VAS CASE SP_MISSION_CLF_RUS_SAT CASE SP_MISSION_CLF_RUS_JET CASE SP_MISSION_CLF_RUS_CLK CASE SP_MISSION_CLF_ARA_1 CASE SP_MISSION_CLF_ARA_DEF CASE SP_MISSION_CLF_ARA_FAKE CASE SP_MISSION_CLF_ARA_TNK CASE SP_MISSION_CLF_CAS_SET CASE SP_MISSION_CLF_CAS_PR1 CASE SP_MISSION_CLF_CAS_PR2 CASE SP_MISSION_CLF_CAS_PR3 CASE SP_MISSION_CLF_CAS_HEI CASE SP_MISSION_CLF_MIL_DAM CASE SP_MISSION_CLF_MIL_PLA CASE SP_MISSION_CLF_MIL_RKT CASE SP_MISSION_CLF_JET_1 CASE SP_MISSION_CLF_JET_2 CASE SP_MISSION_CLF_JET_3 CASE SP_MISSION_CLF_JET_REP CASE SP_MISSION_CLF_ASS_POL CASE SP_MISSION_CLF_ASS_RET CASE SP_MISSION_CLF_ASS_CAB CASE SP_MISSION_CLF_ASS_GEN CASE SP_MISSION_CLF_ASS_SUB CASE SP_MISSION_CLF_ASS_HEL CASE SP_MISSION_CLF_ASS_VIN CASE SP_MISSION_CLF_ASS_HNT CASE SP_MISSION_CLF_ASS_SKY CASE SP_MISSION_CLF_RC_ALEX_GRND CASE SP_MISSION_CLF_RC_ALEX_AIR CASE SP_MISSION_CLF_RC_ALEX_UNDW CASE SP_MISSION_CLF_RC_ALEX_RWRD CASE SP_MISSION_CLF_RC_MEL_MONT CASE SP_MISSION_CLF_RC_MEL_AIRP CASE SP_MISSION_CLF_RC_MEL_WING CASE SP_MISSION_CLF_RC_MEL_DIVE CASE SP_MISSION_CLF_RC_AGN_BODY CASE SP_MISSION_CLF_RC_AGN_RCPT CASE SP_MISSION_CLF_RC_AGN_ESCP CASE SP_MISSION_CLF_RC_CLA_HACK CASE SP_MISSION_CLF_RC_CLA_DRUG CASE SP_MISSION_CLF_RC_CLA_FIN //CPRINTLN(DEBUG_MISSION_STATS, "FLOW_PRIME_STATS_FOR_MISSION: Mission is on the ignore list, bailing/terminating.") // g_MissionStatSystemSuppressVisual = TRUE // g_bMissionStatSystemResetFlag = TRUE // RESET_MISSION_STATS_SYSTEM() // TERMINATE_STAT_WATCHER() // EXIT CPRINTLN(DEBUG_MISSION_STATS, "FLOW_PRIME_STATS_FOR_MISSION: Mission with no stats but end screen visual being primed.") g_bMissionNoStatsNeedsSplashAndSting = TRUE g_bMissionStatSystemPrimed = TRUE g_bMissionStatSystemMissionStarted = TRUE BREAK // CPRINTLN(DEBUG_MISSION_STATS, "FLOW_PRIME_STATS_FOR_MISSION: Mission is a DLC assassination.") // BREAK #ENDIF #IF USE_NRM_DLC CASE SP_MISSION_NRM_SUR_START CASE SP_MISSION_NRM_SUR_AMANDA CASE SP_MISSION_NRM_SUR_TRACEY CASE SP_MISSION_NRM_SUR_MICHAEL CPRINTLN(DEBUG_MISSION_STATS, "FLOW_PRIME_STATS_FOR_MISSION: Mission is on the ignore list, bailing/terminating.") g_MissionStatSystemSuppressVisual = TRUE g_bMissionStatSystemResetFlag = TRUE RESET_MISSION_STATS_SYSTEM() TERMINATE_STAT_WATCHER() EXIT CASE SP_MISSION_NRM_SUR_HOME CASE SP_MISSION_NRM_SUR_JIMMY CASE SP_MISSION_NRM_SUR_PARTY CASE SP_MISSION_NRM_SUR_CURE CASE SP_MISSION_NRM_RESCUE_ENG CASE SP_MISSION_NRM_RESCUE_MED CASE SP_MISSION_NRM_RESCUE_GUN CASE SP_MISSION_NRM_SUP_FUEL CASE SP_MISSION_NRM_SUP_AMMO CASE SP_MISSION_NRM_SUP_MEDS CASE SP_MISSION_NRM_SUP_FOOD CASE SP_MISSION_NRM_RADIO_A CASE SP_MISSION_NRM_RADIO_B CASE SP_MISSION_NRM_RADIO_C CPRINTLN(DEBUG_MISSION_STATS, "FLOW_PRIME_STATS_FOR_MISSION: Mission with no stats but end screen visual being primed.") g_bMissionNoStatsNeedsSplashAndSting = TRUE g_bMissionStatSystemPrimed = TRUE g_bMissionStatSystemMissionStarted = TRUE BREAK #ENDIF #IF NOT USE_SP_DLC CASE SP_MISSION_PROLOGUE CPRINTLN(DEBUG_MISSION_STATS, "FLOW_PRIME_STATS_FOR_MISSION: Mission is the Proglogue which is followed by the intro title. Priming with supressed end screen.") g_bMissionStatSystemPrimed = TRUE g_MissionStatSystemSuppressVisual = TRUE BREAK CASE SP_MISSION_FINALE_A CASE SP_MISSION_FINALE_B CASE SP_MISSION_FINALE_C1 CASE SP_MISSION_FINALE_C2 CPRINTLN(DEBUG_MISSION_STATS, "FLOW_PRIME_STATS_FOR_MISSION: Mission is a finale which is followed by credits. Priming with supressed end screen.") g_bMissionStatSystemPrimed = TRUE g_MissionStatSystemSuppressVisual = TRUE BREAK CASE SP_MISSION_ASSASSIN_1 CASE SP_MISSION_ASSASSIN_2 CASE SP_MISSION_ASSASSIN_3 CASE SP_MISSION_ASSASSIN_4 CASE SP_MISSION_ASSASSIN_5 CPRINTLN(DEBUG_MISSION_STATS, "FLOW_PRIME_STATS_FOR_MISSION: Mission is an assassination. Supressing visual as the scripts display their own pass screen.") g_bMissionStatSystemPrimed = TRUE g_MissionStatSystemSuppressVisual = TRUE BREAK CASE SP_MISSION_ME_AMANDA CASE SP_MISSION_ME_JIMMY CASE SP_MISSION_ME_TRACEY CPRINTLN(DEBUG_MISSION_STATS, "FLOW_PRIME_STATS_FOR_MISSION: Mission with no stats but end screen visual being primed.") g_bMissionNoStatsNeedsSplashAndSting = TRUE g_bMissionStatSystemPrimed = TRUE g_bMissionStatSystemMissionStarted = TRUE BREAK CASE SP_MISSION_FBI_4_INTRO CASE SP_MISSION_FINALE_INTRO CASE SP_MISSION_FINALE_CREDITS CASE SP_MISSION_SHRINK_1 CASE SP_MISSION_SHRINK_2 CASE SP_MISSION_SHRINK_3 CASE SP_MISSION_SHRINK_4 CASE SP_MISSION_SHRINK_5 CASE SP_HEIST_FINALE_2_INTRO CPRINTLN(DEBUG_MISSION_STATS, "FLOW_PRIME_STATS_FOR_MISSION: Mission is on the ignore list, bailing/terminating.") g_MissionStatSystemSuppressVisual = TRUE g_bMissionStatSystemResetFlag = TRUE RESET_MISSION_STATS_SYSTEM() TERMINATE_STAT_WATCHER() EXIT BREAK CASE SP_HEIST_JEWELRY_2 CASE SP_HEIST_DOCKS_2A CASE SP_HEIST_DOCKS_2B CASE SP_HEIST_RURAL_2 CASE SP_HEIST_AGENCY_3A CASE SP_HEIST_AGENCY_3B CASE SP_HEIST_FINALE_2A CASE SP_HEIST_FINALE_2B CPRINTLN(DEBUG_MISSION_STATS, "FLOW_PRIME_STATS_FOR_MISSION: Mission is a heist, setting flag and index.") g_iMissionStatSystemHeistIndex = GET_HEIST_ID_FROM_FINALE_MISSION_ID(m) g_bMissionStatSystemHeistMode = TRUE sEndScreen.bSformeUploadDone = FALSE BREAK #ENDIF ENDSWITCH BOOL lastType = g_LeaderboardLastMissionRCType g_LeaderboardLastMissionRCType = FALSE INT last = g_LeaderboardLastMissionID g_LeaderboardLastMissionID = ENUM_TO_INT(m) IF NOT g_bMissionNoStatsNeedsSplashAndSting IF (g_LeaderboardLastMissionID != last) OR (g_iMissionStatsBeingTracked = 0) OR (lastType != g_LeaderboardLastMissionRCType) g_bHasAnyCheatBeenUsed = FALSE RESET_MISSION_STATS_SYSTEM() // #IF USE_CLF_DLC // INTERNAL_FLOW_PRIME_STATS_FOR_DLC_MISSION(m) // #ENDIF // #IF USE_NRM_DLC // INTERNAL_FLOW_PRIME_STATS_FOR_DLC_MISSION(m) // #ENDIF #IF NOT USE_SP_DLC INTERNAL_FLOW_PRIME_STATS_FOR_MISSION(m) #ENDIF CPRINTLN(DEBUG_MISSION_STATS, "FLOW_PRIME_STATS_FOR_MISSION: Stat launch priming registers l = ",last,"c = ",g_LeaderboardLastMissionID, " : rc typelast ", lastType, " rc type current ", g_LeaderboardLastMissionRCType , " : tracked ", g_iMissionStatsBeingTracked) ELSE CPRINTLN(DEBUG_MISSION_STATS, "FLOW_PRIME_STATS_FOR_MISSION: Stat launch with no register priming to maintain invalidation status") g_bMissionStatSystemPrimed = TRUE ENDIF ENDIF IF bC2SpecialCase //invalidate mission time due to checkpoint g_bMissionStatSystemResponseToReplayNeeded = TRUE //counts as a replay ENDIF g_iMissionStatsStartTime = GET_GAME_TIMER() g_bMissionStatSystemResetFlag = FALSE CARRY_OUT_STATS_SYSTEM_RESPONSE_TO_RESTART() g_bMissionStatSystemBlocker = FALSE ENDPROC #if not USE_SP_DLC PROC FLOW_PRIME_STATS_FOR_RC_MISSION(g_eRC_MissionIDs m) IF g_bMissionStatSystemResponseToShitskipNeeded = TRUE CPRINTLN(DEBUG_MISSION_STATS, "FLOW_PRIME_STATS_FOR_RC_MISSION: Post shitskip!") INFORM_MISSION_STATS_SYSTEM_OF_SHITSKIP() g_bMissionStatSystemResponseToShitskipNeeded = FALSE IF g_bMissionStatSystemPrimed CPRINTLN(DEBUG_MISSION_STATS, "FLOW_PRIME_STATS_FOR_RC_MISSION: No re prime after shitskip!") EXIT ENDIF ENDIF IF (g_bMagDemoActive) CPRINTLN(DEBUG_MISSION_STATS, "FLOW_PRIME_STATS_FOR_RC_MISSION: Cannot prime stats system in mag demo mode!") g_bMissionStatSystemResetFlag = TRUe RESET_MISSION_STATS_SYSTEM() EXIT ENDIF CPRINTLN(DEBUG_MISSION_STATS, "FLOW_PRIME_STATS_FOR_RC_MISSION: Stats system priming for RC mission") g_sMissionStatsName = GET_RC_MISSION_NAME_LABEL(m) g_bMissionStatSystemHeistMode = FALSE g_MissionStatSystemSuppressVisual = FALSE SWITCH(m) // Any that need to trigger the splash and sting CASE RC_ABIGAIL_2 CASE RC_EPSILON_1 g_bMissionNoStatsNeedsSplashAndSting = TRUE g_bMissionStatSystemPrimed = TRUE g_bMissionStatSystemMissionStarted = TRUE BREAK CASE RC_ABIGAIL_1 CASE RC_BARRY_3 CASE RC_BARRY_4 CASE RC_EPSILON_2 CASE RC_EPSILON_3 CASE RC_EPSILON_5 CASE RC_EPSILON_7 CASE RC_JOSH_1 CASE RC_MAUDE_1 CASE RC_MRS_PHILIPS_1 CASE RC_MRS_PHILIPS_2 CASE RC_NIGEL_1 CASE RC_PAPARAZZO_3 CASE RC_OMEGA_1 CASE RC_OMEGA_2 CASE RC_RAMPAGE_1 CASE RC_RAMPAGE_2 CASE RC_RAMPAGE_3 CASE RC_RAMPAGE_4 CASE RC_RAMPAGE_5 g_bMissionStatSystemResetFlag = TRUE g_MissionStatSystemSuppressVisual = TRUE CPRINTLN(DEBUG_MISSION_STATS, "FLOW_PRIME_STATS_FOR_RC_MISSION: mission is on the ignore list, bailing/terminating.") RESET_MISSION_STATS_SYSTEM() TERMINATE_STAT_WATCHER() EXIT BREAK ENDSWITCH BOOL lastType = g_LeaderboardLastMissionRCType g_LeaderboardLastMissionRCType = TRUE INT last = g_LeaderboardLastMissionID g_LeaderboardLastMissionID = ENUM_TO_INT(m) CPRINTLN(DEBUG_MISSION_STATS, "FLOW_PRIME_STATS_FOR_RC_MISSION: Launching for RC id ", m ) IF NOT g_bMissionNoStatsNeedsSplashAndSting IF (g_LeaderboardLastMissionID != last) OR (g_iMissionStatsBeingTracked = 0) OR (lastType != g_LeaderboardLastMissionRCType) g_bHasAnyCheatBeenUsed = FALSE RESET_MISSION_STATS_SYSTEM() CPRINTLN(DEBUG_MISSION_STATS, "FLOW_PRIME_STATS_FOR_RC_MISSION:Stat launch priming registers l = ",last," c = ",g_LeaderboardLastMissionID, " : rc typelast ", lastType, " rc type current ", g_LeaderboardLastMissionRCType , " : tracked ", g_iMissionStatsBeingTracked) INTERNAL_FLOW_PRIME_STATS_FOR_RC_MISSION(m) ELSE CPRINTLN(DEBUG_MISSION_STATS, "FLOW_PRIME_STATS_FOR_RC_MISSION:Stat launch with no register priming to maintain invalidation status") g_bMissionStatSystemPrimed = TRUE ENDIF ENDIF g_iMissionStatsStartTime = GET_GAME_TIMER() CARRY_OUT_STATS_SYSTEM_RESPONSE_TO_RESTART() g_bMissionStatSystemBlocker = FALSE ENDPROC #endif ////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////// //Stat system information //Ingame cutscen e watch PROC INFORM_MISSION_STATS_SYSTEM_OF_INGAME_CUTSCENE_START() //If this changes, make sure to alter the call in cutscene_public.sch. g_bMissionStatSystemSequenceStatus = TRUE ENDPROC PROC INFORM_MISSION_STATS_SYSTEM_OF_INGAME_CUTSCENE_END() //If this changes, make sure to alter the call in cutscene_public.sch. g_bMissionStatSystemSequenceStatus = FALSE ENDPROC //Duplicate version due to email confusion doh PROC INFORM_MISSION_STATS_SYSTEM_OF_INENGINE_CUTSCENE_START() g_bMissionStatSystemSequenceStatus = TRUE ENDPROC PROC INFORM_MISSION_STATS_SYSTEM_OF_INENGINE_CUTSCENE_END() g_bMissionStatSystemSequenceStatus = FALSE ENDPROC //Action cam watch PROC INFORM_MISSION_STATS_SYSTEM_OF_ACTION_CAM_START() #IF IS_DEBUG_BUILD IF NOT IS_REPEAT_PLAY_ACTIVE() IF NOT g_savedGlobals.sFlow.isGameflowActive EXIT ENDIF ENDIF IF !g_bMissionStatSystemPrimed AND (!g_bMagDemoActive) CPRINTLN(DEBUG_MISSION_STATS, "Mission stats system inform call fired while stats system not primed. Pass this bug to Default Levels.") ENDIF #ENDIF g_bMissionStatSystemActionCamWatchStatus = TRUE ENDPROC PROC INFORM_MISSION_STATS_SYSTEM_OF_ACTION_CAM_END() #IF IS_DEBUG_BUILD IF NOT IS_REPEAT_PLAY_ACTIVE() IF NOT g_savedGlobals.sFlow.isGameflowActive EXIT ENDIF ENDIF IF !g_bMissionStatSystemPrimed AND (!g_bMagDemoActive) CPRINTLN(DEBUG_MISSION_STATS, "Mission stats system inform call fired while stats system not primed. Pass this bug to Default Levels.") ENDIF #ENDIF g_bMissionStatSystemActionCamWatchStatus = FALSE ENDPROC PROC INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_OPEN(ENUM_MISSION_STATS windowstat = UNSET_MISSION_STAT_ENUM,BOOL bZero = FALSE) #IF IS_DEBUG_BUILD IF NOT IS_REPEAT_PLAY_ACTIVE() IF NOT g_savedGlobals.sFlow.isGameflowActive EXIT ENDIF ENDIF IF !g_bMissionStatSystemPrimed AND (!g_bMagDemoActive) CPRINTLN(DEBUG_MISSION_STATS, "Mission stats system inform call fired while stats system not primed. Pass this bug to Default Levels.") ENDIF #ENDIF g_eCurrentTimeWindowTarget = windowstat IF NOT g_bMissionStatTimeWindowGate g_bMissionStatTimeWindowGate = TRUE CPRINTLN(DEBUG_MISSION_STATS, " Time window opened") ENDIF IF bZero INT i REPEAT g_iMissionStatsBeingTracked i IF g_MissionStatTrackingArray[i].target = windowstat g_MissionStatTrackingArray[i].ivalue = 0 ENDIF ENDREPEAT ENDIF ENDPROC PROC INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_CLOSED(BOOL bFinalClose = FALSE, ENUM_MISSION_STATS SpecificClose = UNSET_MISSION_STAT_ENUM) #IF IS_DEBUG_BUILD IF NOT IS_REPEAT_PLAY_ACTIVE() IF NOT g_savedGlobals.sFlow.isGameflowActive EXIT ENDIF ENDIF IF !g_bMissionStatSystemPrimed AND (!g_bMagDemoActive) CPRINTLN(DEBUG_MISSION_STATS, "Mission stats system inform call fired while stats system not primed. Pass this bug to Default Levels.") ENDIF #ENDIF IF g_bMissionStatTimeWindowGate CPRINTLN(DEBUG_MISSION_STATS, " time window \"", SAFE_GET_MISSION_STAT_NAME(SpecificClose), "\" closed by INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_CLOSED, bFinalClose: ", bFinalClose) ELSE CPRINTLN(DEBUG_MISSION_STATS, " time window \"", SAFE_GET_MISSION_STAT_NAME(SpecificClose), "\" tried to be closed INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_CLOSED, but it isn't open???, bFinalClose: ", bFinalClose) ENDIF g_bMissionStatTimeWindowGate = FALSE IF bFinalClose g_bMissionStatTimeWindowClosedForGood = TRUE ENDIF INT i = 0 IF SpecificClose = UNSET_MISSION_STAT_ENUM //close all of them REPEAT g_iMissionStatsBeingTracked i IF g_MissionStatTrackingPrototypes[g_MissionStatTrackingArray[i].target].type = MISSION_STAT_TYPE_WINDOWED_TIMER g_MissionStatTrackingArray[i].windowDeltaTracking = FALSE #IF USE_TU_CHANGES CPRINTLN(DEBUG_MISSION_STATS, " stop tracking unset stat [", i, "] ", g_MissionStatTrackingArray[i].ivalue) EXIT #ENDIF ENDIF ENDREPEAT ELSE //search the registers and close the specific one //close all of them REPEAT g_iMissionStatsBeingTracked i #IF USE_TU_CHANGES IF ENUM_TO_INT(g_MissionStatTrackingArray[i].target) > 0 #ENDIF IF g_MissionStatTrackingArray[i].target = SpecificClose g_MissionStatTrackingArray[i].windowDeltaTracking = FALSE CPRINTLN(DEBUG_MISSION_STATS, " stop tracking stat ", SAFE_GET_MISSION_STAT_NAME(SpecificClose), " [", i, "] ", g_MissionStatTrackingArray[i].ivalue) EXIT ENDIF #IF USE_TU_CHANGES ENDIF #ENDIF ENDREPEAT ENDIF #IF IS_DEBUG_BUILD IF SpecificClose = UNSET_MISSION_STAT_ENUM CPRINTLN(DEBUG_MISSION_STATS, " ", SAFE_GET_MISSION_STAT_NAME(SpecificClose), " = UNSET_MISSION_STAT_ENUM, repeat for ", g_iMissionStatsBeingTracked, ".") REPEAT g_iMissionStatsBeingTracked i IF g_MissionStatTrackingPrototypes[g_MissionStatTrackingArray[i].target].type = MISSION_STAT_TYPE_WINDOWED_TIMER CPRINTLN(DEBUG_MISSION_STATS, " g_MissionStatTrackingPrototypes[", SAFE_GET_MISSION_STAT_NAME(g_MissionStatTrackingArray[i].target), ":", i, "].type = ", GET_STRING_FROM_MISSION_STAT_TYPES(g_MissionStatTrackingPrototypes[g_MissionStatTrackingArray[i].target].type), " - same!!!") ELSE CPRINTLN(DEBUG_MISSION_STATS, " g_MissionStatTrackingPrototypes[", SAFE_GET_MISSION_STAT_NAME(g_MissionStatTrackingArray[i].target), ":", i, "].type = ", GET_STRING_FROM_MISSION_STAT_TYPES(g_MissionStatTrackingPrototypes[g_MissionStatTrackingArray[i].target].type), " - different???") ENDIF ENDREPEAT CWARNINGLN(DEBUG_MISSION_STATS, "INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_CLOSED() / was unsuccessfully logged.") ELSE CPRINTLN(DEBUG_MISSION_STATS, " ", SAFE_GET_MISSION_STAT_NAME(SpecificClose), " != UNSET_MISSION_STAT_ENUM, repeat for ", g_iMissionStatsBeingTracked, ".") REPEAT g_iMissionStatsBeingTracked i IF ENUM_TO_INT(g_MissionStatTrackingArray[i].target) > 0 IF g_MissionStatTrackingArray[i].target = SpecificClose CPRINTLN(DEBUG_MISSION_STATS, " g_MissionStatTrackingArray[", i, "].target = ", SAFE_GET_MISSION_STAT_NAME(SpecificClose), " - same!!!") ELSE CPRINTLN(DEBUG_MISSION_STATS, " g_MissionStatTrackingArray[", i, "].target = ", SAFE_GET_MISSION_STAT_NAME(SpecificClose), " - different???") ENDIF ELSE CPRINTLN(DEBUG_MISSION_STATS, " g_MissionStatTrackingArray[", i, "].target = ", SAFE_GET_MISSION_STAT_NAME(SpecificClose), " - null$$$") ENDIF ENDREPEAT CWARNINGLN(DEBUG_MISSION_STATS, "INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_CLOSED(", SAFE_GET_MISSION_STAT_NAME(SpecificClose), ") / was unsuccessfully logged.") ENDIF #ENDIF ENDPROC PROC INFORM_MISSION_STATS_OF_SPEED_WATCH_ENTITY(ENTITY_INDEX in, ENUM_MISSION_STATS specific = UNSET_MISSION_STAT_ENUM) #IF IS_DEBUG_BUILD IF NOT IS_REPEAT_PLAY_ACTIVE() IF NOT g_savedGlobals.sFlow.isGameflowActive EXIT ENDIF ENDIF IF !g_bMissionStatSystemPrimed AND (!g_bMagDemoActive) AND (in != NULL) CPRINTLN(DEBUG_MISSION_STATS, "Mission stats system inform call fired while stats system not primed. Pass this bug to Default Levels.") EXIT ENDIF #ENDIF g_MissionStatSingleSpeedWatchEntity = in g_MissionStatSpeedWatchEntitySpecific = specific ENDPROC PROC INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(ENTITY_INDEX in, ENUM_MISSION_STATS specificTarget = UNSET_MISSION_STAT_ENUM) #IF IS_DEBUG_BUILD IF NOT IS_REPEAT_PLAY_ACTIVE() IF NOT g_bLoadedClifford AND NOT g_bLoadedNorman IF NOT g_savedGlobals.sFlow.isGameflowActive CPRINTLN(DEBUG_MISSION_STATS, "Mission stats system inform call fired while gameflow not active.") EXIT ENDIF ELIF g_bLoadedClifford IF NOT g_savedGlobalsClifford.sFlow.isGameflowActive CPRINTLN(DEBUG_MISSION_STATS, "Mission stats system inform call fired while CLF Trevor gameflow not active.") EXIT ENDIF ELIF g_bLoadedNorman IF NOT g_savedGlobalsnorman.sFlow.isGameflowActive CPRINTLN(DEBUG_MISSION_STATS, "Mission stats system inform call fired while norman gameflow not active.") EXIT ENDIF ENDIF ENDIF IF !g_bMissionStatSystemPrimed AND (!g_bMagDemoActive) AND (in != NULL) CPRINTLN(DEBUG_MISSION_STATS, "Mission stats system inform call fired while stats system not primed.") EXIT ENDIF #ENDIF //g_iMissionStatsBeingTracked //g_MissionStatTrackingArray[MAX_TRACKED_MISSION_STATS] g_MissionStatSingleDamageWatchEntity = in INT i REPEAT g_iMissionStatsBeingTracked i IF specificTarget = UNSET_MISSION_STAT_ENUM OR g_MissionStatTrackingArray[i].target = specificTarget IF g_MissionStatTrackingArray[i].TrackingEntity != in g_MissionStatTrackingArray[i].TrackingEntity = in g_MissionStatTrackingArray[i].bTrackingEntityChanged = TRUE g_MissionStatTrackingArray[i].iTrackingDelta = 0 #IF IS_DEBUG_BUILD IF in != NULL CPRINTLN(DEBUG_MISSION_STATS, "Mission stats system inform for damaged entity ", GET_MODEL_NAME_FOR_DEBUG(GET_ENTITY_MODEL(in)), " in slot ", i) ELSE CPRINTLN(DEBUG_MISSION_STATS, "Mission stats system inform for damaged entity NULL in slot ", i) ENDIF #ENDIF // IS_DEBUG_BUILD ENDIF ENDIF ENDREPEAT ENDPROC PROC INFORM_MISSION_STATS_OF_HEADSHOT_WATCH_ENTITY(ENTITY_INDEX in, BOOL ignoreDuplicates = FALSE) #IF IS_DEBUG_BUILD IF NOT IS_REPEAT_PLAY_ACTIVE() IF NOT g_savedGlobals.sFlow.isGameflowActive EXIT ENDIF ENDIF IF !g_bMissionStatSystemPrimed AND (!g_bMagDemoActive) CPRINTLN(DEBUG_MISSION_STATS, "Mission stats system inform call fired while stats system not primed. Pass this bug to Default Levels.") EXIT ENDIF #ENDIF INT di = 0 #IF IS_DEBUG_BUILD IF in = NULL SCRIPT_ASSERT("INFORM_MISSION_STATS_OF_HEADSHOT_WATCH_ENTITY: Entity passed in is null. ") EXIT ENDIF IF NOT DOES_ENTITY_EXIST(in) SCRIPT_ASSERT("INFORM_MISSION_STATS_OF_HEADSHOT_WATCH_ENTITY: Entity passed in does not exist. ") EXIT ENDIF REPEAT MAX_ENTITY_WATCH_LIST_ENTRIES di IF g_EntityWatchList[di].index != NULL IF g_EntityWatchList[di].index = in IF ignoreDuplicates CPRINTLN(DEBUG_MISSION_STATS, "Mission passed a duplicate into INFORM_MISSION_STATS_OF_HEADSHOT_WATCH_ENTITY") ELSE SCRIPT_ASSERT("INFORM_MISSION_STATS_OF_HEADSHOT_WATCH_ENTITY: Entity is already in the list. ") ENDIF EXIT ENDIF ENDIF ENDREPEAT #ENDIF IF ignoreDuplicates//do check for duplicates in release mode if this is the case REPEAT MAX_ENTITY_WATCH_LIST_ENTRIES di IF g_EntityWatchList[di].index != NULL IF g_EntityWatchList[di].index = in EXIT ENDIF ENDIF ENDREPEAT ENDIF IF MAX_ENTITY_WATCH_LIST_ENTRIES = g_iEntityWatchListLoggedCount SCRIPT_ASSERT("INFORM_MISSION_STATS_OF_HEADSHOT_WATCH_ENTITY: No space left to log entity") EXIT ENDIF INT foundindex = -1 INT i = 0 WHILE (foundindex = -1) AND (i != MAX_ENTITY_WATCH_LIST_ENTRIES) IF g_EntityWatchList[i].index = NULL foundindex = i ENDIF ++i ENDWHILE IF foundindex = -1 SCRIPT_ASSERT("INFORM_MISSION_STATS_OF_HEADSHOT_WATCH_ENTITY: No free index found") EXIT ENDIF g_EntityWatchList[foundindex].index = in g_EntityWatchList[foundindex].type = MISSION_STAT_TYPE_HEADSHOTS CPRINTLN(DEBUG_MISSION_STATS, "INFORM_MISSION_STATS_OF_HEADSHOT_WATCH_ENTITY: add ", GET_MODEL_NAME_FOR_DEBUG(GET_ENTITY_MODEL(in)), " [", NATIVE_TO_INT(in), "] to slot ", foundindex, ".") ++g_iEntityWatchListLoggedCount ENDPROC /// PURPOSE: /// /// PARAMS: /// in - PROC REMOVE_HEADSHOT_WATCH_ENTITY_FROM_MISSION_STATS(ENTITY_INDEX in) INT di = 0 REPEAT MAX_ENTITY_WATCH_LIST_ENTRIES di IF g_EntityWatchList[di].index = in g_EntityWatchList[di].index = NULL g_EntityWatchList[di].type = MISSION_STAT_TYPE_UNSET CPRINTLN(DEBUG_MISSION_STATS, "REMOVE_HEADSHOT_WATCH_ENTITY_FROM_MISSION_STATS: remove ", GET_MODEL_NAME_FOR_DEBUG(GET_ENTITY_MODEL(in)), " [", NATIVE_TO_INT(in), "] from slot ", di, ".") --g_iEntityWatchListLoggedCount EXIT ENDIF ENDREPEAT SCRIPT_ASSERT("REMOVE_HEADSHOT_WATCH_ENTITY_FROM_MISSION_STATS - entity not in watchlist") ENDPROC /// PURPOSE: /// /// PARAMS: /// e - the stat to increment /// number - the value to increment it by /// overrideToValue - instead of incrementing by "number" override it to this value PROC INFORM_MISSION_STATS_OF_INCREMENT(ENUM_MISSION_STATS e, INT number = 1, BOOL overrideToValue = FALSE) #IF IS_DEBUG_BUILD IF NOT IS_REPEAT_PLAY_ACTIVE() IF NOT g_savedGlobals.sFlow.isGameflowActive EXIT ENDIF ENDIF IF !g_bMissionStatSystemPrimed AND (!g_bMagDemoActive) CPRINTLN(DEBUG_MISSION_STATS, "Mission stats system inform call fired while stats system not primed. Pass this bug to Default Levels.") ENDIF #ENDIF INT i = 0 REPEAT g_iMissionStatsBeingTracked i IF g_MissionStatTrackingArray[i].target = e IF overrideToValue g_MissionStatTrackingArray[i].ivalue = number //CPRINTLN(DEBUG_MISSION_STATS, "Setting mission stat ",e," to ", number) ELSE g_MissionStatTrackingArray[i].ivalue += number //CPRINTLN(DEBUG_MISSION_STATS, "Incrementing mission stat ",e," by ", number, " new value ",g_MissionStatTrackingArray[i].ivalue) ENDIF EXIT ENDIF ENDREPEAT #IF USE_TU_CHANGES IF g_MissionStatTrackingArray[i].target != UNSET_MISSION_STAT_ENUM #ENDIF IF g_MissionStatTrackingPrototypes[g_MissionStatTrackingArray[i].target].type = MISSION_STAT_TYPE_UNIQUE_BOOL IF g_MissionStatTrackingArray[i].ivalue > 1 g_MissionStatTrackingArray[i].ivalue = 1 ENDIF IF g_MissionStatTrackingArray[i].ivalue < 0 g_MissionStatTrackingArray[i].ivalue = 0 ENDIF ENDIF #IF USE_TU_CHANGES ENDIF #ENDIF #IF IS_DEBUG_BUILD SAVE_STRING_TO_DEBUG_FILE("look at ") SAVE_INT_TO_DEBUG_FILE(g_iMissionStatsBeingTracked) SAVE_STRING_TO_DEBUG_FILE(" stats for \"") SAVE_STRING_TO_DEBUG_FILE(SAFE_GET_MISSION_STAT_NAME(e)) SAVE_STRING_TO_DEBUG_FILE("\"") SAVE_NEWLINE_TO_DEBUG_FILE() REPEAT g_iMissionStatsBeingTracked i SAVE_STRING_TO_DEBUG_FILE(" g_MissionStatTrackingArray[") SAVE_INT_TO_DEBUG_FILE(i) SAVE_STRING_TO_DEBUG_FILE("].target = ") SAVE_STRING_TO_DEBUG_FILE(SAFE_GET_MISSION_STAT_NAME(g_MissionStatTrackingArray[i].target)) SAVE_NEWLINE_TO_DEBUG_FILE() ENDREPEAT SAVE_NEWLINE_TO_DEBUG_FILE() #ENDIF CPRINTLN(DEBUG_MISSION_STATS, "Failed incrementing mission stat ", SAFE_GET_MISSION_STAT_NAME(e) ," by ", number, " new value ",g_MissionStatTrackingArray[i].ivalue) SCRIPT_ASSERT("INFORM_MISSION_STATS_OF_INCREMENT Specified stat not logged. If reporting this issue please complete the mission (s pass is fine) and note if the mission success dialog appears or not and what stats appear in it if it does. Thanks!") ENDPROC PROC INFORM_MISSION_STATS_OF_TIME_TOTAL_CHANGE(ENUM_MISSION_STATS e, INT ms) #IF IS_DEBUG_BUILD IF NOT IS_REPEAT_PLAY_ACTIVE() IF NOT g_savedGlobals.sFlow.isGameflowActive EXIT ENDIF ENDIF IF !g_bMissionStatSystemPrimed AND (!g_bMagDemoActive) CPRINTLN(DEBUG_MISSION_STATS, "INFORM_MISSION_STATS_OF_TIME_TOTAL_CHANGE: Mission stats system inform call fired while stats system not primed. Pass this bug to Default Levels.") ENDIF #ENDIF INT i = 0 REPEAT g_iMissionStatsBeingTracked i IF g_MissionStatTrackingArray[i].target = e g_MissionStatTrackingArray[i].ivalue = ms CPRINTLN(DEBUG_MISSION_STATS, "INFORM_MISSION_STATS_OF_TIME_TOTAL_CHANGE: Setting mission stat ",e," to ", ms) EXIT ENDIF ENDREPEAT SCRIPT_ASSERT("INFORM_MISSION_STATS_OF_INCREMENT Specified stat not logged. If reporting this issue please complete the mission (s pass is fine) and note if the mission success dialog appears or not and what stats appear in it if it does. Thanks!") ENDPROC PROC INFORM_MISSION_STATS_OF_DISTANCE(ENUM_MISSION_STATS e, FLOAT distance) #IF IS_DEBUG_BUILD IF NOT IS_REPEAT_PLAY_ACTIVE() IF NOT g_savedGlobals.sFlow.isGameflowActive EXIT ENDIF ENDIF IF !g_bMissionStatSystemPrimed AND (!g_bMagDemoActive) CPRINTLN(DEBUG_MISSION_STATS, "Mission stats system inform call fired while stats system not primed. Pass this bug to Default Levels.") ENDIF #ENDIF INT i = 0 REPEAT g_iMissionStatsBeingTracked i IF g_MissionStatTrackingArray[i].target = e g_MissionStatTrackingArray[i].fvalue = distance EXIT ENDIF ENDREPEAT ENDPROC PROC INFORM_MISSION_STATS_OF_FINANCIAL_DAMAGE(INT dollars) #IF IS_DEBUG_BUILD IF NOT IS_REPEAT_PLAY_ACTIVE() IF NOT g_savedGlobals.sFlow.isGameflowActive EXIT ENDIF ENDIF IF !g_bMissionStatSystemPrimed AND (!g_bMagDemoActive) CPRINTLN(DEBUG_MISSION_STATS, "Mission stats system inform call fired while stats system not primed. Pass this bug to Default Levels.") ENDIF #ENDIF INT i = 0 REPEAT g_iMissionStatsBeingTracked i IF g_MissionStatTrackingPrototypes[g_MissionStatTrackingArray[i].target].type = MISSION_STAT_TYPE_FINANCE_DIRECT g_MissionStatTrackingArray[i].ivalue += dollars ENDIF ENDREPEAT ENDPROC ////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////// //Stat system configuration /// PURPOSE: /// Tell the stat system a mission detected boolean stat has been successfully completed /// PARAMS: /// e - An enum mission stat that is set to boolean type in the mission stat system PROC INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(ENUM_MISSION_STATS e) #IF IS_DEBUG_BUILD IF NOT IS_REPEAT_PLAY_ACTIVE() IF NOT g_savedGlobals.sFlow.isGameflowActive EXIT ENDIF ENDIF IF !g_bMissionStatSystemPrimed AND (!g_bMagDemoActive) CPRINTLN(DEBUG_MISSION_STATS, "Mission stats system inform call fired while stats system not primed. Pass this bug to Default Levels.") ENDIF #ENDIF #IF IS_DEBUG_BUILD IF NOT g_MissionStatTrackingPrototypes[e].bHidden CPRINTLN(DEBUG_MISSION_STATS, GET_THIS_SCRIPT_NAME(), ": attempting register stat : ", SAFE_GET_MISSION_STAT_NAME(e), " \"", GET_STRING_FROM_TEXT_FILE(SAFE_GET_MISSION_STAT_NAME(e)),"\" - bool just happened") ELSE CPRINTLN(DEBUG_MISSION_STATS, GET_THIS_SCRIPT_NAME(), ": attempting register stat : STAT_MISS_HIDDEN_", ENUM_TO_INT(e), " - bool just happened") ENDIF #ENDIF g_bMissionStatSystemResetFlag = FALSE //incase this was not suppressed previously //check target is a bool stat IF NOT (g_MissionStatTrackingPrototypes[e].type = MISSION_STAT_TYPE_UNIQUE_BOOL) SCRIPT_ASSERT("INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED being called on a mission stat that is not a bool stat") EXIT ENDIF //check for stat being tracked BOOL set = FALSE INT i = 0 REPEAT g_iMissionStatsBeingTracked i //if it is then set it IF g_MissionStatTrackingArray[i].target = e set = TRUE g_MissionStatTrackingArray[i].ivalue = 1 g_MissionStatTrackingArray[i].fvalue = 0.0 IF g_MissionStatTrackingArray[i].invalidationReason = MSSIR_SKIP //g_MissionStatTrackingArray[i].invalidationReason = MSSIR_VALID #IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION_STATS, GET_THIS_SCRIPT_NAME(), ":Invalidating shitskipped stat: ", e) #ENDIF ENDIF ENDIF ENDREPEAT IF NOT set SCRIPT_ASSERT("INFORM_STAT_SYSTEM_OF_BOOL_STAT_SUCCESS called but no stat of type is in list!") ENDIF ENDPROC /// PURPOSE: Updated the last completed mission stat used to name saved games. /// PROC SET_LAST_COMPLETED_MISSION_STAT(STRING sMissionNameLabel, INT iPlayerInvolvedBitset) //Set character independent stats. STAT_SET_GXT_LABEL(SP_LAST_MISSION_NAME, sMissionNameLabel) //Set character specific stats. IF IS_BIT_SET(iPlayerInvolvedBitset, ENUM_TO_INT(CHAR_MICHAEL)) STAT_SET_GXT_LABEL(SP0_LAST_MISSION_NAME, sMissionNameLabel) ENDIF IF IS_BIT_SET(iPlayerInvolvedBitset, ENUM_TO_INT(CHAR_FRANKLIN)) STAT_SET_GXT_LABEL(SP1_LAST_MISSION_NAME, sMissionNameLabel) ENDIF IF IS_BIT_SET(iPlayerInvolvedBitset, ENUM_TO_INT(CHAR_TREVOR)) STAT_SET_GXT_LABEL(SP2_LAST_MISSION_NAME, sMissionNameLabel) ENDIF ENDPROC /// PURPOSE: /// /// PARAMS: /// e - The mission stat enum to lookup /// RETURNS: /// The mission stat type FUNC ENUM_MISSION_STAT_TYPES GET_MISSION_STAT_TYPE(ENUM_MISSION_STATS e) RETURN g_MissionStatTrackingPrototypes[e].type ENDFUNC FUNC BOOL Is_Mission_DLC_Mission(SP_MISSIONS eMissionIndex, INT iDLCStage) #IF USE_CLF_DLC eMissionIndex = eMissionIndex RETURN TRUE #ENDIF #IF USE_NRM_DLC eMissionIndex = eMissionIndex RETURN TRUE #ENDIF IF iDLCStage = 0 RETURN FALSE ENDIF #if not USE_CLF_DLC #if not USE_NRM_DLC IF eMissionIndex != SP_MISSION_ASSASSIN_1 AND eMissionIndex != SP_MISSION_ASSASSIN_2 AND eMissionIndex != SP_MISSION_ASSASSIN_3 AND eMissionIndex != SP_MISSION_ASSASSIN_4 AND eMissionIndex != SP_MISSION_ASSASSIN_5 RETURN FALSE ENDIF #endif #endif RETURN TRUE ENDFUNC /// PURPOSE: /// Used for display, handles unset values gracefully /// PARAMS: /// e - The mission stat enum to lookup /// RETURNS: /// The mission stat FUNC INT GET_MISSION_STAT_FRIENDLY_VALUE( ENUM_MISSION_STATS paramStat) INT i = GET_MISSION_STAT_STORED_VALUE(g_MissionStatTrackingPrototypes[paramStat].statname)//g_MissionStatTrackingPrototypes[e].currentvalue IF i > -2 RETURN i ENDIF RETURN 0 ENDFUNC PROC SET_SCALEFORM_DATA_FOR_TIME_STAT(INT paramValue, INT paramIndex, INT paramPassed, STRING paramNameLabel, ENUM_MISSION_STATS paramStat, SCALEFORM_INDEX paramMovie = NULL) INT iMinutes = FLOOR(TO_FLOAT(paramValue)/60000.0) INT iSeconds = FLOOR(TO_FLOAT(paramValue)/1000.0) - (iMinutes*60) IF paramMovie != NULL BEGIN_SCALEFORM_MOVIE_METHOD(paramMovie,"SET_DATA_SLOT") ELSE BEGIN_SCALEFORM_MOVIE_METHOD_ON_FRONTEND("SET_DATA_SLOT") SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(2) ENDIF SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(paramIndex) SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(paramPassed) SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(4) SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iMinutes) SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iSeconds) // show stat descriptions in pause menu IF paramMovie = NULL BEGIN_TEXT_COMMAND_SCALEFORM_STRING("PM_RP_STATD") ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(paramNameLabel) ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(GET_MISSION_STAT_DESCRIPTION(paramStat)) END_TEXT_COMMAND_SCALEFORM_STRING() ELSE SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(paramNameLabel) ENDIF END_SCALEFORM_MOVIE_METHOD() ENDPROC PROC SET_SCALEFORM_DATA_FOR_BOOL_STAT(INT paramIndex, INT paramPassed, STRING paramNameLabel, ENUM_MISSION_STATS paramStat, SCALEFORM_INDEX paramMovie = NULL) IF paramMovie != NULL BEGIN_SCALEFORM_MOVIE_METHOD(paramMovie,"SET_DATA_SLOT") ELSE BEGIN_SCALEFORM_MOVIE_METHOD_ON_FRONTEND("SET_DATA_SLOT") SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(2) ENDIF SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(paramIndex) SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(paramPassed) // show stat descriptions in pause menu IF paramMovie = NULL BEGIN_TEXT_COMMAND_SCALEFORM_STRING("PM_RP_STATD") ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(paramNameLabel) ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(GET_MISSION_STAT_DESCRIPTION(paramStat)) END_TEXT_COMMAND_SCALEFORM_STRING() ELSE SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(paramNameLabel) ENDIF END_SCALEFORM_MOVIE_METHOD() ENDPROC PROC SET_SCALEFORM_DATA_FOR_PERCENTAGE_STAT(INT paramValue, INT paramMaxValue, INT paramIndex, INT paramPassed, STRING paramNameLabel, ENUM_MISSION_STATS paramStat, SCALEFORM_INDEX paramMovie = NULL) FLOAT fSuccessPercentage = (TO_FLOAT(paramValue)/TO_FLOAT(paramMaxValue))*100.0 CPRINTLN(DEBUG_MISSION_STATS, "SET_SCALEFORM_DATA_FOR_PERCENTAGE_STAT: ",paramValue," / ",paramMaxValue," = ", fSuccessPercentage) IF paramMovie != NULL BEGIN_SCALEFORM_MOVIE_METHOD(paramMovie,"SET_DATA_SLOT") ELSE BEGIN_SCALEFORM_MOVIE_METHOD_ON_FRONTEND("SET_DATA_SLOT") SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(2) ENDIF SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(paramIndex) SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(paramPassed) SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(3) SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(CEIL(fSuccessPercentage))//1503127 // show stat descriptions in pause menu IF paramMovie = NULL BEGIN_TEXT_COMMAND_SCALEFORM_STRING("PM_RP_STATD") ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(paramNameLabel) ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(GET_MISSION_STAT_DESCRIPTION(paramStat)) END_TEXT_COMMAND_SCALEFORM_STRING() ELSE SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(paramNameLabel) ENDIF END_SCALEFORM_MOVIE_METHOD() ENDPROC PROC SET_SCALEFORM_DATA_FOR_FRACTION_STAT(INT paramValue, INT paramMaxValue, INT paramIndex, INT paramPassed, STRING paramNameLabel, ENUM_MISSION_STATS paramStat, SCALEFORM_INDEX paramMovie = NULL) IF paramMovie != NULL BEGIN_SCALEFORM_MOVIE_METHOD(paramMovie,"SET_DATA_SLOT") ELSE BEGIN_SCALEFORM_MOVIE_METHOD_ON_FRONTEND("SET_DATA_SLOT") SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(2) ENDIF INT val = paramValue IF val > paramMaxValue val = paramMaxValue ENDIF CPRINTLN(DEBUG_MISSION_STATS, "SET_SCALEFORM_DATA_FOR_FRACTION_STAT: ",paramValue," -> ",val) SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(paramIndex) SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(paramPassed) SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(5) SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(val) SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(paramMaxValue) // show stat descriptions in pause menu IF paramMovie = NULL BEGIN_TEXT_COMMAND_SCALEFORM_STRING("PM_RP_STATD") ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(paramNameLabel) ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(GET_MISSION_STAT_DESCRIPTION(paramStat)) END_TEXT_COMMAND_SCALEFORM_STRING() ELSE SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(paramNameLabel) ENDIF END_SCALEFORM_MOVIE_METHOD() ENDPROC PROC SET_SCALEFORM_DATA_FOR_INT_STAT(INT paramValue, INT paramIndex, INT paramPassed, STRING paramNameLabel, ENUM_MISSION_STATS paramStat, SCALEFORM_INDEX paramMovie = NULL) IF paramMovie != NULL BEGIN_SCALEFORM_MOVIE_METHOD(paramMovie,"SET_DATA_SLOT") ELSE BEGIN_SCALEFORM_MOVIE_METHOD_ON_FRONTEND("SET_DATA_SLOT") SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(2) ENDIF SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(paramIndex) SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(paramPassed) SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(1) SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(paramValue) // show stat descriptions in pause menu IF paramMovie = NULL BEGIN_TEXT_COMMAND_SCALEFORM_STRING("PM_RP_STATD") ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(paramNameLabel) ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(GET_MISSION_STAT_DESCRIPTION(paramStat)) END_TEXT_COMMAND_SCALEFORM_STRING() ELSE SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(paramNameLabel) ENDIF END_SCALEFORM_MOVIE_METHOD() ENDPROC PROC SET_SCALEFORM_DATA_FOR_MONETARY_STAT(INT paramValue, INT paramIndex, INT paramPassed, STRING paramNameLabel, ENUM_MISSION_STATS paramStat, SCALEFORM_INDEX paramMovie = NULL) IF paramMovie != NULL BEGIN_SCALEFORM_MOVIE_METHOD(paramMovie,"SET_DATA_SLOT") ELSE BEGIN_SCALEFORM_MOVIE_METHOD_ON_FRONTEND("SET_DATA_SLOT") SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(2) ENDIF SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(paramIndex) SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(paramPassed) SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(6) SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(paramValue) // show stat descriptions in pause menu IF paramMovie = NULL BEGIN_TEXT_COMMAND_SCALEFORM_STRING("PM_RP_STATD") ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(paramNameLabel) ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(GET_MISSION_STAT_DESCRIPTION(paramStat)) END_TEXT_COMMAND_SCALEFORM_STRING() ELSE SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(paramNameLabel) ENDIF END_SCALEFORM_MOVIE_METHOD() ENDPROC PROC SET_SCALEFORM_DATA_FOR_INVALID_STAT(INT paramValue, INT paramIndex, INT paramPassed, STRING paramNameLabel, ENUM_MISSION_STATS paramStat, SCALEFORM_INDEX paramMovie = NULL) IF paramMovie != NULL BEGIN_SCALEFORM_MOVIE_METHOD(paramMovie,"SET_DATA_SLOT") ELSE BEGIN_SCALEFORM_MOVIE_METHOD_ON_FRONTEND("SET_DATA_SLOT") SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(2) ENDIF SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(paramIndex) SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(paramPassed) SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(0) //Invalid stat type SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(paramValue) // show stat descriptions in pause menu IF paramMovie = NULL BEGIN_TEXT_COMMAND_SCALEFORM_STRING("PM_RP_STATD") ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(paramNameLabel) ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(GET_MISSION_STAT_DESCRIPTION(paramStat)) END_TEXT_COMMAND_SCALEFORM_STRING() ELSE SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(paramNameLabel) ENDIF END_SCALEFORM_MOVIE_METHOD() endproc FUNC BOOL GET_MISSION_STAT_PASS_STATUS_FOR_VALUE(ENUM_MISSION_STATS paramStat, INT value) #IF IS_DEBUG_BUILD IF NOT g_MissionStatTrackingPrototypes[paramStat].bHidden CPRINTLN(DEBUG_MISSION_STATS, " GET_MISSION_STAT_PASS_STATUS_FOR_VALUE : stat ", SAFE_GET_MISSION_STAT_NAME(paramStat), " \"", GET_STRING_FROM_TEXT_FILE(GET_MISSION_STAT_NAME(paramStat)),"\" : value ", value) ELSE CPRINTLN(DEBUG_MISSION_STATS, " GET_MISSION_STAT_PASS_STATUS_FOR_VALUE : stat ", ENUM_TO_INT(paramStat), ": value ", value) ENDIF #ENDIF IF value < 0 CPRINTLN(DEBUG_MISSION_STATS, " value smaller than zero") RETURN FALSE ENDIF //MissionStatInfo eStatInfo = SWITCH g_MissionStatTrackingPrototypes[paramStat].type //stat types that can never pass with zero or less than as the value CASE MISSION_STAT_TYPE_TOTALTIME CASE MISSION_STAT_TYPE_ACTION_CAM_USE CASE MISSION_STAT_TYPE_WINDOWED_TIMER CASE MISSION_STAT_TYPE_SINGLE_ENTITY_SPEED_THRESHOLD CASE MISSION_STAT_TYPE_SPECIAL_ABILITY_USE IF value < 1 CPRINTLN(DEBUG_MISSION_STATS, " unset stat value. fail") RETURN FALSE ENDIF BREAK ENDSWITCH IF value = HIGHEST_INT CPRINTLN(DEBUG_MISSION_STATS, " Stat shitskip value detected, invalidated") RETURN FALSE ENDIF //#1624877 - allow it to be any value greater than zero if Franklin owns the mod shop IF (paramStat = FINPC1_MOD_GAUNTLET OR paramStat = FINPC2_MOD_GAUNTLET OR paramStat = FINPC3_MOD_GAUNTLET) AND g_savedGlobals.sPropertyData.propertyOwnershipData[PROPERTY_CAR_MOD_SHOP].charOwner = GET_CURRENT_PLAYER_PED_ENUM() CPRINTLN(DEBUG_MISSION_STATS, " Change stat for ", paramStat, " as Franklin owns a garage.") g_MissionStatTrackingPrototypes[paramStat].success_threshold = 0 ENDIF IF g_MissionStatTrackingPrototypes[paramStat].less_than_threshold CPRINTLN(DEBUG_MISSION_STATS, " GET_MISSION_STAT_PASS_STATUS_FOR_VALUE lessthan : stat ",value," < ", g_MissionStatTrackingPrototypes[paramStat].success_threshold) IF value < g_MissionStatTrackingPrototypes[paramStat].success_threshold RETURN TRUE ENDIF ELSE CPRINTLN(DEBUG_MISSION_STATS, " GET_MISSION_STAT_PASS_STATUS_FOR_VALUE more or equal : stat ",value," >= ", g_MissionStatTrackingPrototypes[paramStat].success_threshold) IF value >= g_MissionStatTrackingPrototypes[paramStat].success_threshold RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC FUNC INT GET_MISSION_STAT_PASS_STATUS(ENUM_MISSION_STATS paramStat) //Generic calculation to see if this stat has met its passed criteria. IF GET_MISSION_STAT_PASS_STATUS_FOR_VALUE(paramStat, GET_MISSION_STAT_STORED_VALUE(g_MissionStatTrackingPrototypes[paramStat].statname)) RETURN 1 ENDIF RETURN 0 ENDFUNC FUNC BOOL SET_SCALEFORM_DATA_FOR_MISSION_STAT(ENUM_MISSION_STATS paramStat, INT paramIndex, SCALEFORM_INDEX paramMovie = NULL) IF paramMovie != NULL IF NOT HAS_SCALEFORM_MOVIE_LOADED(paramMovie) SCRIPT_ASSERT("SET_SCALEFORM_DATA_FOR_MISSION_STAT: Command was called before the required scaleform was loaded. Aborting.") RETURN FALSE ENDIF ENDIF MissionStatInfo sStatInfo INT iPassed IF g_MissionStatTrackingPrototypes[paramStat].bHidden SCRIPT_ASSERT("Called on a stat with hidden setting, this will probably result in undefined stats appearing in the list. Pass this bug to Default Levels..") RETURN TRUE//hidden stats don't have ingame strings, skip them. But don't count as failed ENDIF sStatInfo = g_MissionStatTrackingPrototypes[paramStat] iPassed = GET_MISSION_STAT_PASS_STATUS(paramStat) SWITCH paramStat CASE ASS1_MIRROR_TIME CASE ASS1_MIRROR_CASH CASE ASS1_MIRROR_PERCENT CASE ASS1_MIRROR_MEDAL CASE ASS2_MIRROR_TIME CASE ASS2_MIRROR_PERCENT CASE ASS2_MIRROR_MEDAL CASE ASS2_MIRROR_CASH CASE ASS3_MIRROR_TIME CASE ASS3_MIRROR_CASH CASE ASS3_MIRROR_PERCENTAGE CASE ASS3_MIRROR_MEDAL CASE ASS4_MIRROR_TIME CASE ASS4_MIRROR_CASH CASE ASS4_MIRROR_PERCENTAGE CASE ASS4_MIRROR_MEDAL CASE ASS5_MIRROR_TIME CASE ASS5_MIRROR_CASH CASE ASS5_MIRROR_PERCENT CASE ASS5_MIRROR_MEDAL iPassed = -1 BREAK ENDSWITCH INT paramValue STRING paramNameLabel paramValue = GET_MISSION_STAT_FRIENDLY_VALUE(paramStat) paramNameLabel = GET_MISSION_STAT_NAME(paramStat) CDEBUG1LN(debug_mission_stats,"Stat val ",paramValue," ind ",paramIndex," pas ",iPassed," nameL ",paramNameLabel," stat ",ENUM_TO_INT(paramStat)) //B* 1762462, 1927403: Mark invalidated stats as not passed, gray-out IF paramValue = -1 SET_SCALEFORM_DATA_FOR_INVALID_STAT( paramValue, paramIndex,0,paramNameLabel,paramStat,paramMovie) iPassed = 0 ELSE //Operate based on stat type. SWITCH sStatInfo.type CASE MISSION_STAT_TYPE_TOTALTIME SET_SCALEFORM_DATA_FOR_TIME_STAT( paramValue, paramIndex, iPassed, "MTTIME", paramStat, paramMovie) BREAK CASE MISSION_STAT_TYPE_ACTION_CAM_USE SET_SCALEFORM_DATA_FOR_TIME_STAT( paramValue, paramIndex, iPassed, paramNameLabel, paramStat, paramMovie) BREAK CASE MISSION_STAT_TYPE_UNIQUE_BOOL SET_SCALEFORM_DATA_FOR_BOOL_STAT( paramIndex, iPassed, paramNameLabel, paramStat, paramMovie) BREAK CASE MISSION_STAT_TYPE_SPECIAL_ABILITY_USE CASE MISSION_STAT_TYPE_WINDOWED_TIMER SET_SCALEFORM_DATA_FOR_TIME_STAT( paramValue, paramIndex, iPassed, paramNameLabel, paramStat, paramMovie) BREAK CASE MISSION_STAT_TYPE_SINGLE_ENTITY_SPEED_THRESHOLD SET_SCALEFORM_DATA_FOR_PERCENTAGE_STAT( paramValue, sStatInfo.success_threshold, paramIndex, iPassed, paramNameLabel, paramStat, paramMovie) BREAK CASE MISSION_STAT_TYPE_SINGLE_ENTITY_DAMAGE_THRESHOLD SET_SCALEFORM_DATA_FOR_BOOL_STAT( paramIndex, iPassed, paramNameLabel, paramStat, paramMovie) BREAK CASE MISSION_STAT_TYPE_HEADSHOTS SET_SCALEFORM_DATA_FOR_FRACTION_STAT( paramValue, sStatInfo.success_threshold, paramIndex, iPassed, paramNameLabel, paramStat, paramMovie) BREAK CASE MISSION_STAT_TYPE_FRACTION SET_SCALEFORM_DATA_FOR_FRACTION_STAT( paramValue, sStatInfo.success_threshold, paramIndex, iPassed, paramNameLabel, paramStat, paramMovie) BREAK CASE MISSION_STAT_TYPE_ACCURACY SET_SCALEFORM_DATA_FOR_PERCENTAGE_STAT( paramValue, 100,//sStatInfo.success_threshold, paramIndex, iPassed, paramNameLabel, paramStat, paramMovie) BREAK CASE MISSION_STAT_TYPE_INNOCENTS_KILLED CASE MISSION_STAT_TYPE_PURE_COUNT CASE MISSION_STAT_TYPE_PURE_COUNT_DISTANCE //TODO this needs it's own scaleform upload call CASE MISSION_STAT_TYPE_BULLETS_FIRED SET_SCALEFORM_DATA_FOR_INT_STAT(paramValue, paramIndex, iPassed, paramNameLabel, paramStat, paramMovie) BREAK CASE MISSION_STAT_TYPE_PURE_COUNT_PERCENTAGE SET_SCALEFORM_DATA_FOR_PERCENTAGE_STAT( paramValue, 100, paramIndex, iPassed, paramNameLabel, paramStat, paramMovie) BREAK CASE MISSION_STAT_TYPE_FINANCE_DIRECT CASE MISSION_STAT_TYPE_FINANCE_TABLE SET_SCALEFORM_DATA_FOR_MONETARY_STAT( paramValue, paramIndex, iPassed, paramNameLabel, paramStat, paramMovie) BREAK CASE MISSION_STAT_TYPE_UNSET CPRINTLN(DEBUG_MISSION_STATS, "Missing stat type ", sStatInfo.type ," for stat ", paramNameLabel, " with index ", paramStat) SCRIPT_ASSERT("SET_SCALEFORM_DATA_FOR_MISSION_STAT: Stat passed had an unset type. Bug Andrew K!") BREAK ENDSWITCH ENDIF IF iPassed = 0 RETURN FALSE ENDIF RETURN TRUE ENDFUNC FUNC FLOAT SET_SCALEFORM_DATA_FOR_MISSION_STAT_TOTALS_ESD(END_SCREEN_DATASET &esd, INT visiblesucceeded,INT visibleattempted, BOOL bSkipDetected) //MISSION_STAT_SYSTEM_INVALIDATION_REASON reason = MSSIR_CHECKPOINT) // CPRINTLN(DEBUG_MISSION_STATS, "Setting percentage and medal using SET_SCALEFORM_DATA_FOR_MISSION_STAT_TOTALS_ESD") FLOAT fUploadPercentage = GET_MISSION_STAT_PERCENTAGE(visiblesucceeded,visibleattempted) INT medal = GET_STAT_MEDAL_VALUE(fUploadPercentage) IF bSkipDetected fUploadPercentage = 50 medal = 1 ENDIF IF(fUploadPercentage = 0) SET_ENDSCREEN_COMPLETION_LINE_STATE(esd, TRUE, "MTPHPER", 0,0, ESC_PERCENTAGE_COMPLETION, ESMS_NO_MEDAL) RETURN fUploadPercentage ENDIF END_SCREEN_MEDAL_STATUS ems = ESMS_NO_MEDAL SWITCH GET_MEDAL_HUD_COLOUR(medal) CASE HUD_COLOUR_GOLD ems = ESMS_GOLD BREAK CASE HUD_COLOUR_SILVER ems = ESMS_SILVER BREAK CASE HUD_COLOUR_BRONZE ems = ESMS_BRONZE BREAK ENDSWITCH //TEXT_LABEL showstring = "MTPHPER" SWITCH GET_MEDAL_HUD_COLOUR(medal) CASE HUD_COLOUR_GOLD SET_ENDSCREEN_COMPLETION_LINE_STATE(esd, TRUE, "MTPHPER",//_G", ROUND(fUploadPercentage),0, ESC_PERCENTAGE_COMPLETION, ems) BREAK CASE HUD_COLOUR_SILVER SET_ENDSCREEN_COMPLETION_LINE_STATE(esd, TRUE, "MTPHPER",//_S", ROUND(fUploadPercentage),0, ESC_PERCENTAGE_COMPLETION, ems) BREAK CASE HUD_COLOUR_BRONZE SET_ENDSCREEN_COMPLETION_LINE_STATE(esd, TRUE, "MTPHPER",//_B", ROUND(fUploadPercentage),0, ESC_PERCENTAGE_COMPLETION, ems) BREAK ENDSWITCH RETURN fUploadPercentage ENDFUNC FUNC FLOAT SET_SCALEFORM_DATA_FOR_MISSION_STAT_TOTALS(INT visiblesucceeded,INT visibleattempted, BOOL bSkipDetected, INT iOverridePercent, INT iOverrideMedal) //BOOL purerun, //MISSION_STAT_SYSTEM_INVALIDATION_REASON reason = MSSIR_CHECKPOINT) CPRINTLN(DEBUG_MISSION_STATS, "Setting percentage and medal using SET_SCALEFORM_DATA_FOR_MISSION_STAT_TOTALS") FLOAT fUploadPercentage = GET_MISSION_STAT_PERCENTAGE(visiblesucceeded,visibleattempted) INT medal = GET_STAT_MEDAL_VALUE(fUploadPercentage) IF bSkipDetected fUploadPercentage = 50 medal = 1 ENDIF IF iOverrideMedal > -1 medal = iOverrideMedal CPRINTLN(DEBUG_MISSION_STATS, "Medal overriden to : ",medal) ENDIF IF iOverridePercent > -1 fUploadPercentage = TO_FLOAT(iOverridePercent) CPRINTLN(DEBUG_MISSION_STATS, "Percentage overriden to : ",fUploadPercentage) ENDIF CDEBUG1LN(debug_mission_stats,"Miss totals: visSuc ",visiblesucceeded,", visAtempt ",visibleAttempted,", p% ",fUploadPercentage,", medal ",medal,", skip",bSkipDetected) IF medal = 0 BEGIN_SCALEFORM_MOVIE_METHOD_ON_FRONTEND("SET_DESCRIPTION") SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(2) SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(0) SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fUploadPercentage) SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("MTPHPER") END_SCALEFORM_MOVIE_METHOD() ELSE // normal version is now SET_SCALEFORM_DATA_FOR_MISSION_STAT_TOTALS_ESD // pause menu version BEGIN_SCALEFORM_MOVIE_METHOD_ON_FRONTEND("SET_DESCRIPTION") SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(2) SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(GET_MEDAL_HUD_COLOUR(medal))) SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fUploadPercentage) //IF purerun //SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("MTPHPER") SWITCH GET_MEDAL_HUD_COLOUR(medal) CASE HUD_COLOUR_GOLD SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("MTPHPER_G") BREAK CASE HUD_COLOUR_SILVER SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("MTPHPER_S") BREAK CASE HUD_COLOUR_BRONZE SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("MTPHPER_B") BREAK ENDSWITCH //ELSE //SET_SCALEFORM_UPLOAD_STAT_INVALIDATION_REASON_STRING(reason) //ENDIF END_SCALEFORM_MOVIE_METHOD() ENDIF RETURN fUploadPercentage ENDFUNC #IF IS_DEBUG_BUILD PROC DEBUG_SET_MISSION_STAT_TO_COMPLETED_VALUE(ENUM_MISSION_STATS paramStat) //Naive first pass implementation! g_MissionStatTrackingPrototypes[paramStat].currentvalue = g_MissionStatTrackingPrototypes[paramStat].success_threshold IF g_MissionStatTrackingPrototypes[paramStat].less_than_threshold g_MissionStatTrackingPrototypes[paramStat].currentvalue-- ENDIF //B* 1870062: Set overridden assassination pass stats to 100% SWITCH paramStat CASE ASS1_MIRROR_PERCENT CASE ASS2_MIRROR_PERCENT CASE ASS3_MIRROR_PERCENTAGE CASE ASS4_MIRROR_PERCENTAGE CASE ASS5_MIRROR_PERCENT g_MissionStatTrackingPrototypes[paramStat].currentvalue = 100 BREAK ENDSWITCH SWITCH paramStat CASE ASS1_MIRROR_MEDAL CASE ASS2_MIRROR_MEDAL CASE ASS3_MIRROR_MEDAL CASE ASS4_MIRROR_MEDAL CASE ASS5_MIRROR_MEDAL g_MissionStatTrackingPrototypes[paramStat].currentvalue = 3 BREAK ENDSWITCH //stored value that was previously missing SET_MISSION_STAT_STORED_VALUE(g_MissionStatTrackingPrototypes[paramStat].currentvalue, paramStat) ENDPROC #ENDIF