iw6-lui/lui/mp_menus/operationsutils.dec.lua
2024-09-12 17:25:45 +02:00

1094 lines
35 KiB
Lua

StandardChallengeColumns = {
Ref = 0,
Name = 1,
Desc = 2,
Label = 3,
Weight = 4,
Filter = 5,
UnlockLevel = 6,
ChallengeUnlock = 7,
PrestigeShotUnlock = 8,
Target1 = 9,
XP1 = 10,
Target2 = 11,
XP2 = 12,
Target3 = 13,
XP3 = 14,
Target4 = 15,
XP4 = 16,
Target5 = 17,
XP5 = 18,
Target6 = 19,
XP6 = 20,
Target7 = 21,
XP7 = 22,
Target8 = 23,
XP8 = 24,
Target9 = 25,
XP9 = 26,
SP1 = 27,
SP2 = 28,
SP3 = 29,
SP4 = 30,
SP5 = 31,
SP6 = 32,
SP7 = 33,
SP8 = 34,
SP9 = 35
}
AllChallengesTable = {
File = "mp/allChallengesTable.csv",
Cols = StandardChallengeColumns
}
DailyChallengesTable = {
File = "mp/dailyChallengesTable.csv",
Cols = StandardChallengeColumns
}
WeekleyChallengesTable = {
File = "mp/weekleyChallengesTable.csv",
Cols = StandardChallengeColumns
}
OperationGroups = {
File = "mp/OperationsTable.csv",
Cols = {
Idx = 0,
Ref = 1,
Name = 2,
Desc = 3,
File = 4,
FormattedName = 5
},
MaxGroups = 6
}
AnynonOpsTable = {
Cols = {
Idx = 0,
Ref = 1
},
MaxOps = 500,
MaxAvailOps = 10
}
WeaponChallenge = {
ChallengesPerClass = 12,
ChallengeSuffixes = {
weapon_assault = {
"",
"_crouch",
"_assists",
"_defender",
"_noattach",
"_longshot",
"_consecutive",
"_pointblank",
"_reload",
"_sliding",
"_leaning",
"_allcamo"
},
weapon_smg = {
"",
"_crouch",
"_assists",
"_defender",
"_noattach",
"_hipfire",
"_consecutive",
"_pointblank",
"_reload",
"_sliding",
"_leaning",
"_allcamo"
},
weapon_lmg = {
"",
"_crouch",
"_assists",
"_defender",
"_noattach",
"_hipfire",
"_consecutive",
"_pointblank",
"_penetrate",
"_sliding",
"_leaning",
"_allcamo"
},
weapon_dmr = {
"",
"_crouch",
"_assists",
"_defender",
"_longshot",
"_headshot",
"_consecutive",
"_noattach",
"_reload",
"_pointblank",
"_leaning",
"_allcamo"
},
weapon_sniper = {
"",
"_crouch",
"_noattach",
"_defender",
"_prone",
"_oneshotkill",
"_consecutive",
"_pointblank",
"_reload",
"_penetrate",
"_leaning",
"_allcamo"
},
weapon_shotgun = {
"",
"_crouch",
"_assist",
"_defender",
"_noattach",
"_hipfire",
"_consecutive",
"_pointblank",
"_reload",
"_sliding",
"_headshot",
"_allcamo"
},
weapon_riot = {
"",
"_crouch",
"_assist",
"_damage",
"_throwingknife",
"_c4",
"_pistol",
"_explosive",
"_backsmasher",
"_consecutive",
"_noperks",
"_allcamo"
}
}
}
WeaponChallengeTable = {
File = "mp/challenges/challengeTable_WeaponOps.csv",
Cols = AnynonOpsTable.Cols
}
OperationsTimeoutRewards = {
{
req = 5,
reward = 5
},
{
req = 10,
reward = 10
},
{
req = 15,
reward = 15
},
{
req = 20,
reward = 20
},
{
req = 25,
reward = 25
}
}
TierStrings = {
"@LUA_MENU_ROMAN_ONE",
"@LUA_MENU_ROMAN_TWO",
"@LUA_MENU_ROMAN_THREE",
"@LUA_MENU_ROMAN_FOUR",
"@LUA_MENU_ROMAN_FIVE",
"@LUA_MENU_ROMAN_SIX",
"@LUA_MENU_ROMAN_SEVEN",
"@LUA_MENU_ROMAN_EIGHT",
"@LUA_MENU_ROMAN_NINE"
}
CostOfNewOperations = 1
OperationUtilsCache = {
SortTypes = {
"Alphabetical",
"Progress"
},
SortTypeNames = {
"LUA_MENU_MP_OP_SORT_TYPE_ALPHA",
"LUA_MENU_MP_OP_SORT_TYPE_PROGRESS"
},
CurrentSortType = nil,
Types = {
Groups = "groups",
OpData = "op_data",
OpRows = "op_rows",
WeaponOps = "weapon_ops"
},
CurrentSortType = 1
}
MaxTrackedOperations = 10
local f0_local0 = 528
function parseChallengeName( f1_arg0 )
local f1_local0 = f1_arg0
local f1_local1 = 1
if f1_arg0 ~= "" then
local f1_local2 = string.len( f1_arg0 )
local f1_local3 = string.sub( f1_arg0, 1, f1_local2 - 2 )
local f1_local4 = string.sub( f1_arg0, f1_local2 - 1, f1_local2 - 1 )
local f1_local5 = tonumber( string.sub( f1_arg0, f1_local2 ) )
if f1_local4 == "_" and TierStrings[f1_local5] ~= nil then
f1_local1 = f1_local5
f1_local0 = f1_local3
else
DebugPrint( "ref " .. f1_arg0 .. "does not contain valid tier, defaulting to tier 1" )
end
end
return f1_local0, f1_local1
end
function getUnlockInfoStrings( f2_arg0, f2_arg1, f2_arg2, f2_arg3 )
local f2_local0, f2_local1 = parseChallengeName( f2_arg0 )
local f2_local2 = operationGetNameWithTierPostFix( f2_local0, f2_local1 )
local f2_local3 = getGroupRefForOperation( f2_local0 )
local f2_local4 = Engine.Localize( GetFieldForOperationsGroup( f2_local3, OperationGroups.Cols.FormattedName ), f2_local2 )
local f2_local5 = nil
local f2_local6 = f2_local3 and f2_local3 ~= ""
local f2_local7 = false
if f2_local6 then
f2_local7 = f2_local1 < getOperationState( f2_arg1, f2_local0 )
end
if f2_local6 and not f2_local7 and f2_arg3 and not isOpActive( f2_arg1, f2_local0 ) then
f2_local5 = Engine.Localize( "@LUA_MENU_OP_INACTIVE" )
else
local f2_local8 = operationGetTargetForTier( f2_local0, f2_local1, f2_arg2 )
if f2_local0 == "ch_longersprint_pro" then
f2_local8 = math.floor( f2_local8 / f0_local0 )
end
f2_local5 = operationGetDesc( f2_local0, f2_local8 )
end
return f2_local4, f2_local5
end
function getGroupRefForOperation( f3_arg0 )
local f3_local0 = ""
for f3_local1 = 1, OperationGroups.MaxGroups, 1 do
local f3_local4 = Engine.TableLookup( OperationGroups.File, OperationGroups.Cols.Idx, tostring( f3_local1 - 1 ), OperationGroups.Cols.Ref )
if isOperationInGroup( f3_arg0, f3_local4 ) then
f3_local0 = f3_local4
break
end
end
return f3_local0
end
function isOperationInGroup( f4_arg0, f4_arg1 )
local f4_local0 = AnynonOpsTable.MaxOps
local f4_local1 = GetFieldForOperationsGroup( f4_arg1, OperationGroups.Cols.File )
for f4_local2 = 1, f4_local0, 1 do
if Engine.TableLookup( f4_local1, AnynonOpsTable.Cols.Idx, tostring( f4_local2 - 1 ), AnynonOpsTable.Cols.Ref ) == f4_arg0 then
return true
end
end
return false
end
function GetFieldForOperationsGroup( f5_arg0, f5_arg1 )
local f5_local0 = assert
local f5_local1
if f5_arg1 < OperationGroups.Cols.Idx or f5_arg1 > OperationGroups.Cols.FormattedName then
f5_local1 = false
else
f5_local1 = true
end
f5_local0( f5_local1, "Invalid column in GetFieldForOperationsGroup( groupRef, column )" )
return Engine.TableLookup( OperationGroups.File, OperationGroups.Cols.Ref, f5_arg0, f5_arg1 )
end
function GetFieldForChallenge( f6_arg0, f6_arg1 )
local f6_local0 = assert
local f6_local1
if f6_arg1 < AllChallengesTable.Cols.Ref or f6_arg1 > AllChallengesTable.Cols.SP9 then
f6_local1 = false
else
f6_local1 = true
end
f6_local0( f6_local1, "Invalid column in GetFieldForChallenge( challenge_ref, column )" )
if not CanAcessOperationCache() then
return Engine.TableLookup( AllChallengesTable.File, AllChallengesTable.Cols.Ref, f6_arg0, f6_arg1 )
else
return Engine.TableLookupByRow( AllChallengesTable.File, GetCachedChallengeTableRowForOp( f6_arg0 ), f6_arg1 )
end
end
function GetFieldForDailyChallenge( f7_arg0, f7_arg1 )
local f7_local0 = assert
local f7_local1
if f7_arg1 < DailyChallengesTable.Cols.Ref or f7_arg1 > DailyChallengesTable.Cols.XP9 then
f7_local1 = false
else
f7_local1 = true
end
f7_local0( f7_local1, "Invalid column in GetFieldForDailyChallenge( challenge_ref, column )" )
return Engine.TableLookup( DailyChallengesTable.File, DailyChallengesTable.Cols.Ref, f7_arg0, f7_arg1 )
end
function GetFieldForWeekleyChallenge( f8_arg0, f8_arg1 )
local f8_local0 = assert
local f8_local1
if f8_arg1 < WeekleyChallengesTable.Cols.Ref or f8_arg1 > WeekleyChallengesTable.Cols.XP9 then
f8_local1 = false
else
f8_local1 = true
end
f8_local0( f8_local1, "Invalid column in GetFieldForWeekleyChallenge( challenge_ref, column )" )
return Engine.TableLookup( WeekleyChallengesTable.File, WeekleyChallengesTable.Cols.Ref, f8_arg0, f8_arg1 )
end
function GetGroupIndex( f9_arg0 )
return tonumber( GetFieldForOperationsGroup( f9_arg0, OperationGroups.Cols.Idx ) )
end
function GetTrackedOp( f10_arg0, f10_arg1 )
return Engine.GetPlayerDataEx( f10_arg0, CoD.StatsGroup.Ranked, "currentChallenges", 0, f10_arg1 )
end
function GetOperationForWeapon( f11_arg0, f11_arg1, f11_arg2, f11_arg3 )
local f11_local0 = assert
local f11_local1
if f11_arg3 < 0 or f11_arg3 >= WeaponChallenge.ChallengesPerClass then
f11_local1 = false
else
f11_local1 = true
end
f11_local0( f11_local1 )
return "ch_" .. f11_arg2 .. WeaponChallenge.ChallengeSuffixes[f11_arg1][f11_arg3 + 1]
end
function GetOperationForWeaponFromCache( f12_arg0, f12_arg1, f12_arg2, f12_arg3 )
local f12_local0 = GetOperationCache( OperationUtilsCache.Types.WeaponOps )
if not f12_local0[f12_arg2] then
CacheWeaponOps( f12_arg0, f12_arg1, f12_arg2 )
end
assert( f12_local0[f12_arg2] ~= nil )
local f12_local1 = f12_local0[f12_arg2].sortedRefLists
local f12_local2 = OperationUtilsCache.SortTypes
return f12_local1[OperationUtilsCache.SortTypes[OperationUtilsCache.CurrentSortType]][f12_arg3]
end
function GetOpForGroup( f13_arg0, f13_arg1, f13_arg2 )
return GetOpForGroupIndex( f13_arg0, GetGroupIndex( f13_arg1 ), f13_arg2 )
end
function GetOpForGroupIndex( f14_arg0, f14_arg1, f14_arg2 )
local f14_local0 = Engine.TableLookup( OperationGroups.File, OperationGroups.Cols.Idx, f14_arg1, OperationGroups.Cols.File )
if f14_local0 == "" then
return ""
else
return Engine.TableLookupByRow( f14_local0, f14_arg2, AnynonOpsTable.Cols.Ref )
end
end
function GetCachedOpForGroup( f15_arg0, f15_arg1, f15_arg2 )
return GetOperationFromCache( f15_arg0, GetGroupIndex( f15_arg1 ), f15_arg2 )
end
function SetTrackedOp( f16_arg0, f16_arg1, f16_arg2 )
Engine.SetPlayerDataEx( f16_arg0, CoD.StatsGroup.Ranked, "currentChallenges", 0, f16_arg1, f16_arg2 )
end
function GetAllOpGroupRefs()
local f17_local0 = {}
for f17_local1 = 1, OperationGroups.MaxGroups, 1 do
local f17_local4 = Engine.TableLookup( OperationGroups.File, OperationGroups.Cols.Idx, tostring( f17_local1 - 1 ), OperationGroups.Cols.Ref )
if f17_local4 == "" then
break
end
f17_local0[f17_local1] = f17_local4
end
return f17_local0
end
function GetOpsInGroup( f18_arg0, f18_arg1 )
local f18_local0 = Engine.TableLookup( OperationGroups.File, OperationGroups.Cols.Idx, GetGroupIndex( f18_arg1 ), OperationGroups.Cols.File )
if f18_local0 == "" then
return {}
end
local f18_local1 = {}
for f18_local2 = 1, AnynonOpsTable.MaxOps, 1 do
local f18_local5 = Engine.TableLookupByRow( f18_local0, f18_local2, AnynonOpsTable.Cols.Ref )
if f18_local5 ~= "" then
f18_local1[f18_local2] = f18_local5
end
end
return f18_local1
end
function GetCachedOpsInGroup( f19_arg0, f19_arg1 )
return GetGroupOperationsFromCache( f19_arg0, GetGroupIndex( f19_arg1 ) )
end
function GetWeaponOpsForClass( f20_arg0 )
return WeaponChallenge.ChallengeSuffixes[f20_arg0]
end
function isOpActive( f21_arg0, f21_arg1 )
return true
end
function IsOpTracked( f22_arg0, f22_arg1 )
for f22_local0 = 0, MaxTrackedOperations - 1, 1 do
if f22_arg1 == GetTrackedOp( f22_arg0, f22_local0 ) then
return true
end
end
return false
end
function ClearProgressForOp( f23_arg0, f23_arg1 )
Engine.SetPlayerDataEx( f23_arg0, CoD.StatsGroup.Ranked, "challengeProgress", f23_arg1, 0 )
end
function GetNumOpsInGroupFile( f24_arg0 )
local f24_local0 = 0
for f24_local1 = 0, 500, 1 do
if Engine.TableLookup( f24_arg0, AnynonOpsTable.Cols.Idx, tostring( f24_local1 ), AnynonOpsTable.Cols.Ref ) == "" then
break
end
f24_local0 = f24_local0 + 1
end
return f24_local0
end
function InitOperationsData( f25_arg0 )
for f25_local5, f25_local6 in ipairs( GetAllOpGroupRefs() ) do
for f25_local4 = 0, AnynonOpsTable.MaxOps, 1 do
local f25_local3 = GetOpForGroup( f25_arg0, f25_local6, f25_local4 )
if f25_local3 and f25_local3 ~= "" then
Engine.SetPlayerDataEx( f25_arg0, CoD.StatsGroup.Ranked, "challengeState", f25_local3, 1 )
end
end
end
for f25_local0 = 0, MaxTrackedOperations - 1, 1 do
f25_local6 = nil
if f25_local0 < 5 then
f25_local6 = GetOpForGroupIndex( f25_arg0, f25_local0, 0 )
else
local f25_local4 = Cac.WeaponTypes.Primary[f25_local0 - 4]
assert( #Cac.Weapons[f25_local4] >= 2 )
f25_local6 = "ch_" .. Cac.Weapons[f25_local4][2]
end
assert( f25_local6 )
Engine.SetPlayerDataEx( f25_arg0, CoD.StatsGroup.Ranked, "currentChallenges", 0, f25_local0, f25_local6 )
end
end
function AwardSquadPoints( f26_arg0, f26_arg1 )
if 0 < f26_arg1 then
Engine.SetPlayerDataEx( f26_arg0, CoD.StatsGroup.Ranked, "unlockPoints", Engine.GetPlayerDataEx( f26_arg0, CoD.StatsGroup.Ranked, "unlockPoints" ) + f26_arg1 )
Engine.SetPlayerDataEx( f26_arg0, CoD.StatsGroup.Ranked, "squadMembers", 0, "commendationsEarned", Engine.GetPlayerDataEx( f26_arg0, CoD.StatsGroup.Ranked, "squadMembers", 0, "commendationsEarned" ) + f26_arg1 )
end
end
function GetOperationData( f27_arg0, f27_arg1 )
local f27_local0 = isWeaponOperation( f27_arg1 )
local f27_local1 = 3000
local f27_local2 = {
Ref = f27_arg1,
Name = "",
Desc = "",
Label = "",
Progress = 0,
MaxProgress = 0,
PercentProgress = 0,
RewardXP = 0,
RewardCurrency = 0,
RewardImage = nil,
RewardType = nil,
ExtraRewardImages = nil,
ExtraRewardTypes = nil,
ProgressText = "",
OpState = 0,
NumTiers = 0,
ActiveTier = 0,
Completed = false,
Name = operationGetName( f27_arg1 )
}
if f27_local2.Name == nil then
DebugPrint( "its nil" )
end
if f27_local2.Name ~= "" then
f27_local2.NumTiers = operationGetNumTiers( f27_arg1 )
f27_local2.OpState = getOperationState( f27_arg0, f27_arg1 )
f27_local2.ActiveTier = getTierForActiveOperation( f27_arg0, f27_arg1 )
f27_local2.Completed = f27_local2.ActiveTier < f27_local2.OpState
local f27_local3
if f27_local0 then
f27_local3 = weaponOperationGetNameWithTierPostFix( f27_arg1, f27_local2.ActiveTier )
if not f27_local3 then
else
f27_local2.Name = f27_local3
f27_local3 = operationGetTargetForTier( f27_arg1, f27_local2.ActiveTier )
local f27_local4 = operationGetXPRewardForTier( f27_arg1, f27_local2.ActiveTier )
f27_local2.RewardXP = f27_local4
f27_local2.Progress = operationGetProgress( f27_arg0, f27_arg1 )
f27_local2.MaxProgress = tonumber( f27_local3 )
f27_local2.PercentProgress = f27_local2.Progress / f27_local2.MaxProgress
if f27_arg1 == "ch_longersprint_pro" then
local f27_local5 = math.floor( f27_local2.Progress / f0_local0 )
local f27_local6 = math.floor( f27_local2.MaxProgress / f0_local0 )
f27_local2.Desc = operationGetDesc( f27_arg1, f27_local6 )
f27_local2.Progress = f27_local5
f27_local2.MaxProgress = f27_local6
elseif f27_local0 and string.find( f27_arg1, "_allcamo" ) then
f27_local2.Progress, f27_local2.MaxProgress = Cac.CountCamosForGold( f27_arg0, getWeaponOperationWeaponName( f27_arg1 ) )
f27_local2.Completed = f27_local7 <= f27_local6
f27_local2.PercentProgress = f27_local2.Progress / f27_local2.MaxProgress
f27_local2.Desc = operationGetDesc( f27_arg1, f27_local3 )
else
f27_local2.Desc = operationGetDesc( f27_arg1, f27_local3 )
end
if f27_local0 then
f27_local2.Label = operationGetLabel( f27_arg1 )
end
f27_local2.ProgressText = tostring( f27_local2.Progress ) .. "/" .. tostring( f27_local2.MaxProgress )
f27_local2.RewardCurrency = operationGetSPRewardForTier( f27_arg1, f27_local2.ActiveTier )
local f27_local5 = math.floor( f27_local4 / f27_local1 )
if f27_local2.RewardCurrency ~= "" then
f27_local2.RewardCurrency = f27_local5 + tonumber( f27_local2.RewardCurrency )
else
f27_local2.RewardCurrency = f27_local5
end
local f27_local6 = getUnlocksByChallenge( f27_arg1, f27_local2.ActiveTier )
if #f27_local6 > 0 then
if isUnlockItem( f27_local6[1].type ) then
f27_local2.RewardImage = RegisterMaterial( getMaterialForUnlockItem( f27_local6[1].type, f27_local6[1].item ) )
f27_local2.RewardType = f27_local6[1].type
table.remove( f27_local6, 1 )
end
for f27_local7 = 1, #f27_local6, 1 do
if isUnlockItem( f27_local6[f27_local7].type ) then
if not f27_local2.ExtraRewardImages then
f27_local2.ExtraRewardImages = {}
f27_local2.ExtraRewardTypes = {}
end
table.insert( f27_local2.ExtraRewardImages, RegisterMaterial( getMaterialForUnlockItem( f27_local6[f27_local7].type, f27_local6[f27_local7].item ) ) )
table.insert( f27_local2.ExtraRewardTypes, f27_local6[f27_local7].type )
end
end
end
end
end
f27_local3 = operationGetNameWithTierPostFix( f27_arg1, f27_local2.ActiveTier )
end
return f27_local2
end
function GetCachedOperationData( f28_arg0, f28_arg1 )
local f28_local0 = GetOperationCache( OperationUtilsCache.Types.OpData )
if not f28_local0[f28_arg1] then
f28_local0[f28_arg1] = GetOperationData( f28_arg0, f28_arg1 )
end
return f28_local0[f28_arg1]
end
function getUnlocksByChallenge( f29_arg0, f29_arg1 )
if isWeaponOperation( f29_arg0 ) then
return getUnlocksByWeaponChallenge( f29_arg0, f29_arg1 )
end
local f29_local0 = f29_arg0 .. "_" .. f29_arg1
local f29_local1 = {}
local f29_local2 = ""
local f29_local3 = ""
local f29_local4 = ""
local f29_local5 = 0
while true do
f29_local3 = Engine.TableLookupByRow( UnlockTable.File, f29_local5, UnlockTable.Cols.ItemId )
f29_local2 = Engine.TableLookupByRow( UnlockTable.File, f29_local5, UnlockTable.Cols.Challenge )
if f29_local3 == "" then
return f29_local1
elseif f29_local2 == f29_local0 then
f29_local4 = Engine.TableLookupByRow( UnlockTable.File, f29_local5, UnlockTable.Cols.Type )
if f29_local4 == "Patch" then
table.insert( f29_local1, 1, {
row = f29_local5,
item = f29_local3,
type = f29_local4
} )
else
table.insert( f29_local1, {
row = f29_local5,
item = f29_local3,
type = f29_local4
} )
end
end
f29_local5 = f29_local5 + 1
end
end
function getUnlocksByWeaponChallenge( f30_arg0, f30_arg1 )
local f30_local0 = tostring( f30_arg1 )
local f30_local1 = getWeaponOperationSuffix( f30_arg0 )
local f30_local2 = getWeaponOperationWeaponClass( f30_arg0 )
if not f30_local2 or f30_local2 == "" or not f30_local1 then
return {}
end
local f30_local3 = string.len( f30_local2 )
local f30_local4 = {}
for f30_local5 = 0, CamoReticleUnlockTable.MaxRows, 1 do
if Engine.TableLookupByRow( CamoReticleUnlockTable.File, f30_local5, CamoReticleUnlockTable.Cols.ChallengeRef ) == f30_local1 then
local f30_local8 = Engine.TableLookupByRow( CamoReticleUnlockTable.File, f30_local5, CamoReticleUnlockTable.Cols.CamoReticleRef )
if string.sub( f30_local8, 0, f30_local3 ) == f30_local2 then
if Engine.TableLookupByRow( CamoReticleUnlockTable.File, f30_local5, CamoReticleUnlockTable.Cols.Tier ) == f30_local0 then
table.insert( f30_local4, 1, {
item = string.sub( f30_local8, f30_local3 + 2 ),
type = "Camo"
} )
break
end
end
end
end
return f30_local4
end
function operationIsComplete( f31_arg0 )
return f31_arg0.MaxProgress <= f31_arg0.Progress
end
function operationGetNumTiers( f32_arg0 )
local f32_local0 = 0
local f32_local1 = 9
for f32_local2 = 1, f32_local1, 1 do
if GetFieldForChallenge( f32_arg0, AllChallengesTable.Cols["Target" .. f32_local2] ) == "" then
break
end
f32_local0 = f32_local0 + 1
end
return f32_local0
end
function operationGetNameWithTierPostFix( f33_arg0, f33_arg1 )
local f33_local0 = operationGetName( f33_arg0 )
if operationGetNumTiers( f33_arg0 ) > 1 then
f33_local0 = Engine.Localize( "@LUA_MENU_CHALLENGE_AND_TIER", f33_local0, Engine.Localize( TierStrings[f33_arg1] ) )
end
return f33_local0
end
function weaponOperationGetNameWithTierPostFix( f34_arg0, f34_arg1 )
return Engine.Localize( "LUA_MENU_MP_WEAPON_OP_PREFIX", operationGetLabel( f34_arg0 ) .. (getWeaponOperationSuffix( f34_arg0 ) and "" or " ") .. Engine.Localize( TierStrings[f34_arg1] ), operationGetName( f34_arg0 ) )
end
function operationGetName( f35_arg0 )
local f35_local0 = GetFieldForChallenge( f35_arg0, AllChallengesTable.Cols.Name )
if f35_local0 == "" then
DebugPrint( "Warning, challenge " .. f35_arg0 .. " not found in the challenges table" )
return f35_local0
else
return Engine.Localize( f35_local0 )
end
end
function operationGetDesc( f36_arg0, f36_arg1 )
return Engine.Localize( GetFieldForChallenge( f36_arg0, AllChallengesTable.Cols.Desc ), f36_arg1, "" )
end
function operationGetLabel( f37_arg0 )
return Engine.Localize( GetFieldForChallenge( f37_arg0, AllChallengesTable.Cols.Label ), "", "" )
end
function getTierForActiveOperation( f38_arg0, f38_arg1 )
local f38_local0 = Engine.GetPlayerDataEx( f38_arg0, CoD.StatsGroup.Ranked, "challengeState", f38_arg1 )
local f38_local1 = operationGetNumTiers( f38_arg1 )
if not f38_local0 then
f38_local0 = 0
end
if f38_local1 < f38_local0 then
local f38_local2 = f38_local1
end
return f38_local2 or f38_local0
end
function getOperationState( f39_arg0, f39_arg1 )
return Engine.GetPlayerDataEx( f39_arg0, CoD.StatsGroup.Ranked, "challengeState", f39_arg1 )
end
function operationGetTargetForTier( f40_arg0, f40_arg1, f40_arg2 )
local f40_local0 = 0
if f40_arg2 then
else
f40_local0 = GetFieldForChallenge( f40_arg0, AllChallengesTable.Cols["Target" .. f40_arg1] )
end
f40_local0 = f40_local0 + GetFieldForChallenge( f40_arg0, AllChallengesTable.Cols["Target" .. f40_arg1] )
f40_arg1 = f40_arg1 - 1
repeat
f40_local0 = f40_local0 + GetFieldForChallenge( f40_arg0, AllChallengesTable.Cols["Target" .. f40_arg1] )
f40_arg1 = f40_arg1 - 1
repeat
f40_local0 = f40_local0 + GetFieldForChallenge( f40_arg0, AllChallengesTable.Cols["Target" .. f40_arg1] )
f40_arg1 = f40_arg1 - 1
repeat
f40_local0 = f40_local0 + GetFieldForChallenge( f40_arg0, AllChallengesTable.Cols["Target" .. f40_arg1] )
f40_arg1 = f40_arg1 - 1
repeat
f40_local0 = f40_local0 + GetFieldForChallenge( f40_arg0, AllChallengesTable.Cols["Target" .. f40_arg1] )
f40_arg1 = f40_arg1 - 1
repeat
-- ERROR: Infinite loop detected
until f40_arg1 <= 0
until f40_arg1 <= 0
until f40_arg1 <= 0
until f40_arg1 <= 0
until f40_arg1 <= 0
end
function operationGetXPRewardForTier( f41_arg0, f41_arg1 )
return GetFieldForChallenge( f41_arg0, AllChallengesTable.Cols["XP" .. f41_arg1] )
end
function operationGetSPRewardForTier( f42_arg0, f42_arg1 )
return GetFieldForChallenge( f42_arg0, AllChallengesTable.Cols["SP" .. f42_arg1] )
end
function operationGetProgress( f43_arg0, f43_arg1 )
return Engine.GetPlayerDataEx( f43_arg0, CoD.StatsGroup.Ranked, "challengeProgress", f43_arg1 )
end
function OperationGetReqs( f44_arg0, f44_arg1 )
local f44_local0 = ""
local f44_local1 = ""
local f44_local2 = ""
local f44_local3 = ""
local f44_local4 = ""
local f44_local5 = 1500
for f44_local6 = 0, f44_local5, 1 do
f44_local3 = Engine.TableLookupByRow( UnlockTable.File, f44_local6, UnlockTable.Cols.ItemId )
if f44_local3 == "" then
break
elseif f44_local3 == f44_arg0 and Engine.TableLookupByRow( UnlockTable.File, f44_local6, UnlockTable.Cols.Type ) == f44_arg1 then
f44_local1 = Engine.TableLookupByRow( UnlockTable.File, f44_local6, UnlockTable.Cols.Rank )
f44_local0 = Engine.TableLookupByRow( UnlockTable.File, f44_local6, UnlockTable.Cols.Challenge )
f44_local2 = Engine.TableLookupByRow( UnlockTable.File, f44_local6, UnlockTable.Cols.ExtRank )
break
end
end
return f44_local0, f44_local1, f44_local2
end
function operationGetMatchCompleted( f45_arg0 )
local f45_local0 = {}
for f45_local1 = 0, 4, 1 do
local f45_local4 = Engine.GetPlayerDataEx( f45_arg0, CoD.StatsGroup.Common, "round", "operationsCompleted", f45_local1 )
if f45_local4 ~= "" then
table.insert( f45_local0, {
opRef = f45_local4,
tier = getTierForActiveOperation( f45_arg0, f45_local4 )
} )
end
end
return f45_local0
end
function isUnlockItem( f46_arg0 )
if not (f46_arg0 == "ClanTag" or not Cac.Customization.FieldIndexes[f46_arg0]) or f46_arg0 == "Camo" then
return true
else
return false
end
end
function getNameForUnlockItem( f47_arg0, f47_arg1 )
assert( isUnlockItem( f47_arg0 ) )
local f47_local0 = ""
if f47_arg0 == "Camo" then
f47_local0 = Engine.TableLookup( CamoTable.File, CamoTable.Cols.Ref, f47_arg1, CamoTable.Cols.Name )
else
f47_local0 = Cac.Customization.Fields[Cac.Customization.FieldIndexes[f47_arg0]].GetName( f47_arg1 )
end
return f47_local0
end
function getMaterialForUnlockItem( f48_arg0, f48_arg1 )
assert( isUnlockItem( f48_arg0 ) )
local f48_local0 = ""
if f48_arg0 == "Camo" then
f48_local0 = Engine.TableLookup( CamoTable.File, CamoTable.Cols.Ref, f48_arg1, CamoTable.Cols.Image )
else
f48_local0 = Cac.Customization.Fields[Cac.Customization.FieldIndexes[f48_arg0]].GetUIMaterial( f48_arg1 )
end
return f48_local0
end
function getLocNameForUnlockType( f49_arg0 )
assert( isUnlockItem( f49_arg0 ) )
if f49_arg0 == "Camo" then
return Engine.Localize( "@MENU_CAMO_CAPS" )
else
return Engine.Localize( "@LUA_MENU_CUSTOMIZATION_FIELD_" .. Cac.Customization.Fields[Cac.Customization.FieldIndexes[f49_arg0]].LocName .. "_CAPS" )
end
end
function isWeaponOperation( f50_arg0 )
return Engine.TableLookup( WeaponChallengeTable.File, WeaponChallengeTable.Cols.Ref, f50_arg0, WeaponChallengeTable.Cols.Idx ) ~= ""
end
function getWeaponOperationWeaponName( f51_arg0 )
assert( isWeaponOperation( f51_arg0 ) )
local f51_local0 = GetFieldForChallenge( f51_arg0, AllChallengesTable.Cols.Filter )
assert( f51_local0 ~= "" )
return f51_local0
end
function getWeaponOperationWeaponClass( f52_arg0 )
local f52_local0 = getWeaponOperationWeaponName( f52_arg0 )
for f52_local7, f52_local8 in pairs( Cac.Weapons ) do
for f52_local4, f52_local5 in ipairs( f52_local8 ) do
if f52_local5 == f52_local0 then
return f52_local7
end
end
end
end
function getWeaponOperationSuffix( f53_arg0 )
return string.sub( f53_arg0, string.len( getWeaponOperationWeaponName( f53_arg0 ) ) + 4 )
end
function CanAcessOperationCache()
local f54_local0 = LUI.FlowManager.IsInStack
local f54_local1 = Engine.GetLuiRoot()
return f54_local0( f54_local1.flowManager, "operations_main_menu" )
end
function GetOperationCache( f55_arg0 )
local f55_local0 = LUI.FlowManager.GetMenuScopedDataByMenuName( "operations_main_menu" )
assert( f55_local0 )
if not f55_local0[f55_arg0] then
f55_local0[f55_arg0] = {}
end
return f55_local0[f55_arg0]
end
function OperationCacheSortFunction( f56_arg0, f56_arg1 )
return f56_arg0.sortValue < f56_arg1.sortValue
end
function OperationCacheReverseSortFunction( f57_arg0, f57_arg1 )
return f57_arg1.sortValue < f57_arg0.sortValue
end
function CacheOperationGroupInfo( f58_arg0, f58_arg1 )
local f58_local0 = GetOperationCache( OperationUtilsCache.Types.Groups )
if f58_local0[f58_arg1] then
return
end
f58_local0[f58_arg1] = {}
f58_local0[f58_arg1].sortedRefLists = {}
local f58_local1 = {}
local f58_local2 = {}
local f58_local3 = Engine.TableLookup( OperationGroups.File, OperationGroups.Cols.Idx, f58_arg1, OperationGroups.Cols.File )
local f58_local4 = nil
if f58_local3 ~= "" then
for f58_local5 = 0, AnynonOpsTable.MaxOps, 1 do
local f58_local8 = Engine.TableLookupByRow( f58_local3, f58_local5, AnynonOpsTable.Cols.Ref )
if f58_local8 ~= "" then
local f58_local9 = GetCachedOperationData( f58_arg0, f58_local8 )
f58_local1[f58_local5 + 1] = {
ref = f58_local8,
sortValue = Engine.Localize( GetFieldForChallenge( f58_local8, AllChallengesTable.Cols.Name ) )
}
f58_local2[f58_local5 + 1] = {
ref = f58_local8,
sortValue = f58_local9.PercentProgress
}
end
end
table.sort( f58_local1, OperationCacheSortFunction )
table.sort( f58_local2, OperationCacheReverseSortFunction )
local f58_local5 = {}
f58_local0[f58_arg1].sortedRefLists.Alphabetical = f58_local5
local f58_local6 = {}
f58_local0[f58_arg1].sortedRefLists.Progress = f58_local6
for f58_local7 = 1, #f58_local1, 1 do
f58_local5[f58_local7] = f58_local1[f58_local7].ref
f58_local6[f58_local7] = f58_local2[f58_local7].ref
end
end
end
function CacheWeaponOps( f59_arg0, f59_arg1, f59_arg2 )
local f59_local0 = GetOperationCache( OperationUtilsCache.Types.WeaponOps )
local f59_local1 = GetOperationCache( OperationUtilsCache.Types.OpRows )
if f59_local0[f59_arg2] ~= nil then
return
end
f59_local0[f59_arg2] = {}
local f59_local2 = {}
local f59_local3 = {}
for f59_local8, f59_local9 in pairs( WeaponChallenge.ChallengeSuffixes[f59_arg1] ) do
local f59_local10 = "ch_" .. f59_arg2 .. f59_local9
local f59_local11 = Engine.TableLookupGetRowNum( AllChallengesTable.File, AllChallengesTable.Cols.Ref, f59_local10 )
if f59_local11 and f59_local11 ~= -1 then
f59_local1[f59_local10] = f59_local11
end
local f59_local7 = GetCachedOperationData( f59_arg0, f59_local10 )
f59_local2[#f59_local2 + 1] = {
ref = f59_local10,
sortValue = f59_local7.Name
}
f59_local3[#f59_local3 + 1] = {
ref = f59_local10,
sortValue = f59_local7.PercentProgress
}
end
f59_local0[f59_arg2].sortedRefLists = {}
table.sort( f59_local2, OperationCacheSortFunction )
table.sort( f59_local3, OperationCacheReverseSortFunction )
f59_local4 = {}
f59_local0[f59_arg2].sortedRefLists.Alphabetical = f59_local4
f59_local5 = {}
f59_local0[f59_arg2].sortedRefLists.Progress = f59_local5
for f59_local6 = 1, #f59_local2, 1 do
f59_local4[f59_local6] = f59_local2[f59_local6].ref
f59_local5[f59_local6] = f59_local3[f59_local6].ref
end
end
function GetGroupOperationsFromCache( f60_arg0, f60_arg1 )
local f60_local0 = GetOperationCache( OperationUtilsCache.Types.Groups )
if not f60_local0[f60_arg1] then
CacheOperationGroupInfo( f60_arg0, f60_arg1 )
end
assert( f60_local0[f60_arg1] ~= nil )
return f60_local0[f60_arg1].sortedRefLists[OperationUtilsCache.SortTypes[OperationUtilsCache.CurrentSortType]]
end
function GetOperationFromCache( f61_arg0, f61_arg1, f61_arg2 )
local f61_local0 = GetOperationCache( OperationUtilsCache.Types.Groups )
if not f61_local0[f61_arg1] then
CacheOperationGroupInfo( f61_arg0, f61_arg1 )
end
assert( f61_local0[f61_arg1] ~= nil )
local f61_local1 = f61_local0[f61_arg1].sortedRefLists
local f61_local2 = OperationUtilsCache.SortTypes
return f61_local1[OperationUtilsCache.SortTypes[OperationUtilsCache.CurrentSortType]][f61_arg2]
end
function GetCachedChallengeTableRowForOp( f62_arg0 )
local f62_local0 = GetOperationCache( OperationUtilsCache.Types.OpRows )
if not f62_local0[f62_arg0] then
f62_local0[f62_arg0] = Engine.TableLookupGetRowNum( AllChallengesTable.File, AllChallengesTable.Cols.Ref, f62_arg0 )
end
return f62_local0[f62_arg0]
end
function RandomizeOperationData( f63_arg0 )
if not Engine.IsDevelopmentBuild() then
return
end
for f63_local0 = 0, 1000, 1 do
local f63_local3 = Engine.TableLookupByRow( AllChallengesTable.File, f63_local0, AllChallengesTable.Cols.Ref )
if f63_local3 and f63_local3 ~= "" then
local f63_local4 = operationGetNumTiers( f63_local3 )
local f63_local5 = f63_local4
local f63_local6 = math.floor( math.random() * f63_local4 + 1 )
local f63_local7 = operationGetTargetForTier( f63_local3, f63_local6 )
Engine.SetPlayerDataEx( f63_arg0, CoD.StatsGroup.Ranked, "challengeState", f63_local3, f63_local6 )
local f63_local8 = math.floor( math.random() * 6 )
if f63_local8 < 3 then
Engine.SetPlayerDataEx( f63_arg0, CoD.StatsGroup.Ranked, "challengeProgress", f63_local3, math.floor( math.random() * f63_local7 ) )
end
if f63_local8 == 4 then
Engine.SetPlayerDataEx( f63_arg0, CoD.StatsGroup.Ranked, "challengeProgress", f63_local3, f63_local7 )
end
if f63_local8 == 5 then
Engine.SetPlayerDataEx( f63_arg0, CoD.StatsGroup.Ranked, "challengeProgress", f63_local3, 0 )
end
end
end
end
function ValidateOperations( f64_arg0 )
if Engine.HasActiveLocalClient( f64_arg0 ) then
ConvertOldTrackedOpertions( f64_arg0 )
local f64_local0 = "ch_iw6_riotshield_damage"
local f64_local1 = getTierForActiveOperation( f64_arg0, f64_local0 )
local f64_local2 = operationGetNumTiers( f64_local0 )
if f64_local1 == f64_local2 then
local f64_local3 = operationGetProgress( f64_arg0, f64_local0 )
local f64_local4 = tonumber( operationGetTargetForTier( f64_local0, f64_local2 ) )
if f64_local3 < 0 or f64_local4 <= f64_local3 then
Engine.SetPlayerDataEx( f64_arg0, CoD.StatsGroup.Ranked, "challengeProgress", f64_local0, f64_local4 - 1 )
end
end
local f64_local3 = "ch_hijacker"
local f64_local4 = getTierForActiveOperation( f64_arg0, f64_local3 )
local f64_local5 = operationGetNumTiers( f64_local3 )
if f64_local4 == f64_local5 then
local f64_local6 = Engine.GetPlayerDataEx( f64_arg0, CoD.StatsGroup.Ranked, "challengeProgress", f64_local3 )
if f64_local6 < 0 or tonumber( operationGetTargetForTier( f64_local3, f64_local5 ) ) <= f64_local6 then
Engine.SetPlayerDataEx( f64_arg0, CoD.StatsGroup.Ranked, "challengeState", f64_local3, f64_local5 + 1 )
Engine.SetPlayerDataEx( f64_arg0, CoD.StatsGroup.Ranked, "challengeProgress", f64_local3, 0 )
end
end
end
end
function ConvertOldTrackedOpertions( f65_arg0 )
if Engine.HasActiveLocalClient( f65_arg0 ) then
local f65_local0 = true
for f65_local1 = 0, 4, 1 do
local f65_local4 = f65_local1
local f65_local5 = Engine.GetPlayerDataEx( f65_arg0, CoD.StatsGroup.Ranked, "activeChallenges", 0 )
if not f65_local5 or f65_local5 == "" then
f65_local0 = false
break
end
end
if f65_local0 then
for f65_local5, f65_local9 in ipairs( GetAllOpGroupRefs() ) do
for f65_local8 = 0, AnynonOpsTable.MaxOps, 1 do
local f65_local6 = GetOpForGroup( f65_arg0, f65_local9, f65_local8 )
if f65_local6 and f65_local6 ~= "" then
if Engine.GetPlayerDataEx( f65_arg0, CoD.StatsGroup.Ranked, "challengeState", f65_local6 ) == 0 then
Engine.SetPlayerDataEx( f65_arg0, CoD.StatsGroup.Ranked, "challengeState", f65_local6, 1 )
end
local f65_local7 = getTierForActiveOperation( f65_arg0, f65_local6 )
if tonumber( operationGetTargetForTier( f65_local6, f65_local7 ) ) <= Engine.GetPlayerDataEx( f65_arg0, CoD.StatsGroup.Ranked, "challengeProgress", f65_local6 ) and f65_local7 <= operationGetNumTiers( f65_local6 ) then
Engine.SetPlayerDataEx( f65_arg0, CoD.StatsGroup.Ranked, "challengeState", f65_local6, f65_local7 + 1 )
Engine.SetPlayerDataEx( f65_arg0, CoD.StatsGroup.Ranked, "challengeProgress", f65_local6, 0 )
end
end
end
end
for f65_local2 = 0, MaxTrackedOperations - 1, 1 do
f65_local9 = nil
if f65_local2 < 5 then
f65_local9 = Engine.GetPlayerDataEx( f65_arg0, CoD.StatsGroup.Ranked, "activeChallenges", f65_local2 )
assert( f65_local9 and f65_local9 ~= "" )
Engine.SetPlayerDataEx( f65_arg0, CoD.StatsGroup.Ranked, "activeChallenges", f65_local2, "" )
else
local f65_local8 = Cac.WeaponTypes.Primary[f65_local2 - 4]
local f65_local10 = -1
local f65_local11 = ""
for f65_local12 = 1, #Cac.Weapons[f65_local8], 1 do
local f65_local14 = Cac.Weapons[f65_local8][f65_local12]
local f65_local15 = Engine.GetPlayerDataEx( f65_arg0, CoD.StatsGroup.Ranked, "weaponStats", f65_local14, "kills" )
if f65_local10 < f65_local15 then
f65_local11 = f65_local14
f65_local10 = f65_local15
end
end
f65_local9 = "ch_" .. f65_local11
end
Engine.SetPlayerDataEx( f65_arg0, CoD.StatsGroup.Ranked, "currentChallenges", 0, f65_local2, f65_local9 )
end
end
end
end