1049 lines
32 KiB
Plaintext
1049 lines
32 KiB
Plaintext
#include maps\_utility;
|
|
#include common_scripts\utility;
|
|
|
|
emptyMissionDifficultyStr = "00000000000000000000000000000000000000000000000000";
|
|
|
|
SOTABLE_COL_INDEX = 0;
|
|
SOTABLE_COL_REF = 1;
|
|
SOTABLE_COL_NAME = 2;
|
|
SOTABLE_COL_GROUP = 13;
|
|
SOTABLE_COL_UNLOCK = 5;
|
|
|
|
main()
|
|
{
|
|
missionSettings = [];
|
|
|
|
// levels and missions are listed in order
|
|
missionIndex = 0;// only one missionindex( vignettes in CoD2, no longer exist but I'm going to use this script anyway because it's got good stuff in it. - Nate
|
|
|
|
// addLevel( levelName, keepWeapons,achievement, skipsSuccess, veteran_achievement )
|
|
missionSettings = createMission( "THE_PRICE_OF_WAR" );
|
|
missionSettings addLevel( "trainer", false, "BACK_IN_THE_SADDLE", true, "FIRST_DAY_OF_SCHOOL" );
|
|
missionSettings addLevel( "roadkill", false, "DANGER_CLOSE", true, "FIRST_DAY_OF_SCHOOL" );
|
|
missionSettings addLevel( "cliffhanger", false, "COLD_SHOULDER", true, "BLACK_DIAMOND" );
|
|
missionSettings addLevel( "airport", false, undefined, true, undefined );
|
|
missionSettings addLevel( "favela", false, "TAGEM_AND_BAGEM", true, "TURISTAS" );
|
|
missionSettings addLevel( "invasion", false, "ROYAL_WITH_CHEESE", true, "RED_DAWN" );
|
|
missionSettings addLevel( "favela_escape", false, undefined, true, "TURISTAS" );
|
|
missionSettings addLevel( "arcadia", false, undefined, true, "RED_DAWN" );
|
|
missionSettings addLevel( "oilrig", false, undefined, true, "PRISONER_627" );
|
|
missionSettings addLevel( "gulag", false, "SOAP_ON_A_ROPE", true, "PRISONER_627" );
|
|
missionSettings addLevel( "dcburning", false, undefined, true, "HOME_COMING" );
|
|
missionSettings addLevel( "contingency", false, "DESPERATE_TIMES", true, "ENDS_JUSTIFY_THE_MEANS" );
|
|
missionSettings addLevel( "dcemp", true, undefined, true, "HOME_COMING" );
|
|
missionSettings addLevel( "dc_whitehouse", false, "HOUSTON_WE_HAVE_A_PROBLEM", true, "HOME_COMING" );
|
|
missionSettings addLevel( "estate", false, "THE_PAWN", true, "QUEEN_TAKES_ROOK" );
|
|
missionSettings addLevel( "boneyard", false, "OUT_OF_THE_FRYING_PAN", true, "QUEEN_TAKES_ROOK" );
|
|
missionSettings addLevel( "af_caves", true, undefined, true, "OFF_THE_GRID" );
|
|
missionSettings addLevel( "af_chase", true, undefined, true, "OFF_THE_GRID" );
|
|
missionSettings addLevel( "ending", false, "FOR_THE_RECORD", true, "OFF_THE_GRID" );
|
|
|
|
//
|
|
|
|
|
|
// need to add SO maps differently, need to save script vars
|
|
//--------
|
|
/*
|
|
TO DO:
|
|
*/
|
|
|
|
level.specOpsGroups = [];
|
|
|
|
setupSoGroup( "so_alpha" );
|
|
setupSoGroup( "so_bravo" );
|
|
setupSoGroup( "so_charlie" );
|
|
setupSoGroup( "so_delta" );
|
|
setupSoGroup( "so_echo" );
|
|
|
|
if( is_specialop() )
|
|
{
|
|
specOpsSettings = createMission( "SPECIAL_OPS" );
|
|
//addSpecOpLevel( levelName, achievement, veteran_achievement )
|
|
specOpsSettings addSpecOpLevel( "so_showers_gulag" , false, false ); // offset: 0
|
|
specOpsSettings addSpecOpLevel( "so_killspree_invasion" , false, false ); // offset: 1
|
|
specOpsSettings addSpecOpLevel( "so_ac130_co_hunted" , false, false ); // offset: 2
|
|
specOpsSettings addSpecOpLevel( "so_killspree_favela" , false, false ); // offset: 3
|
|
specOpsSettings addSpecOpLevel( "so_assault_oilrig" , false, false ); // offset: 4
|
|
specOpsSettings addSpecOpLevel( "so_defense_invasion" , false, false ); // offset: 5
|
|
specOpsSettings addSpecOpLevel( "so_escape_airport" , false, false ); // offset: 6
|
|
specOpsSettings addSpecOpLevel( "so_forest_contingency" , false, false ); // offset: 7
|
|
specOpsSettings addSpecOpLevel( "so_download_arcadia" , false, false ); // offset: 8
|
|
specOpsSettings addSpecOpLevel( "so_demo_so_bridge" , false, false ); // offset: 9
|
|
specOpsSettings addSpecOpLevel( "so_crossing_so_bridge" , false, false ); // offset: 10
|
|
specOpsSettings addSpecOpLevel( "so_snowrace1_cliffhanger" , false, false ); // offset: 11
|
|
specOpsSettings addSpecOpLevel( "so_snowrace2_cliffhanger" , false, false ); // offset: 12
|
|
specOpsSettings addSpecOpLevel( "so_rooftop_contingency" , false, false ); // offset: 13
|
|
specOpsSettings addSpecOpLevel( "so_sabotage_cliffhanger" , false, false ); // offset: 14
|
|
specOpsSettings addSpecOpLevel( "so_defuse_favela_escape" , false, false ); // offset: 15
|
|
specOpsSettings addSpecOpLevel( "so_takeover_estate" , false, false ); // offset: 16
|
|
specOpsSettings addSpecOpLevel( "so_takeover_oilrig" , false, false ); // offset: 17
|
|
specOpsSettings addSpecOpLevel( "so_intel_boneyard" , false, false ); // offset: 18
|
|
specOpsSettings addSpecOpLevel( "so_juggernauts_favela" , false, false ); // offset: 19
|
|
specOpsSettings addSpecOpLevel( "so_hidden_so_ghillies" , false, false ); // offset: 20
|
|
specOpsSettings addSpecOpLevel( "so_chopper_invasion" , false, false ); // offset: 21
|
|
specOpsSettings addSpecOpLevel( "so_killspree_trainer" , false, false ); // offset: 22
|
|
|
|
level.specOpsSettings = specOpsSettings;
|
|
}
|
|
|
|
//--------
|
|
|
|
/*
|
|
missionSettings addLevel( "cargoship", false, "MAKE_THE_JUMP", true, "THE_PACKAGE" );
|
|
missionSettings addLevel( "coup", false, undefined, true );
|
|
missionSettings addLevel( "blackout", false, "COMPLETE_BLACKOUT", true, "THE_RESCUE" );
|
|
missionSettings addLevel( "armada", false, undefined, true, "THE_SEARCH" );
|
|
missionSettings addLevel( "bog_a", false, "SAVE_THE_BACON", true, "THE_BOG" );
|
|
missionSettings addLevel( "hunted", false, undefined, true, "THE_ESCAPE" );
|
|
missionSettings addLevel( "ac130", false, "BRING_EM_HOME", true, "THE_ESCAPE" );
|
|
missionSettings addLevel( "bog_b", false, undefined, true, "THE_BOG" );
|
|
missionSettings addLevel( "airlift", false, undefined, true, "THE_FIRST_HORSEMAN" );
|
|
missionSettings addLevel( "aftermath", false, undefined, true );
|
|
missionSettings addLevel( "village_assault", false, "COMPLETE_VILLAGE_ASSAULT", true, "THE_SECOND_HORSEMAN" );
|
|
missionSettings addLevel( "scoutsniper", true, undefined, true, "THE_SHOT" );
|
|
missionSettings addLevel( "sniperescape", false, "PIGGYBACK_RIDE", true, "THE_SHOT" );
|
|
missionSettings addLevel( "village_defend", false, undefined, true, "THE_THIRD_HORSEMAN" );
|
|
missionSettings addLevel( "ambush", false, "DESPERATE_MEASURES", true, "THE_THIRD_HORSEMAN" );
|
|
missionSettings addLevel( "icbm", true, undefined, true, "THE_ULTIMATUM" );
|
|
missionSettings addLevel( "launchfacility_a", true, undefined, true, "THE_ULTIMATUM" );
|
|
missionSettings addLevel( "launchfacility_b", true, undefined, true, "THE_ULTIMATUM" );
|
|
missionSettings addLevel( "jeepride", false, "WIN_THE_WAR", true, "THE_FOURTH_HORSEMAN" );
|
|
missionSettings addLevel( "airplane", false, undefined, undefined, "MILE_HIGH_CLUB" );
|
|
*/
|
|
|
|
level.missionSettings = missionSettings;
|
|
|
|
/#
|
|
thread ui_debug_clearall();
|
|
#/
|
|
}
|
|
|
|
setupSoGroup( so_ref )
|
|
{
|
|
level.specOpsGroups[ so_ref ] = spawnStruct();
|
|
level.specOpsGroups[ so_ref ].ref = so_ref;
|
|
level.specOpsGroups[ so_ref ].num = int( tablelookup( "sp/specopstable.csv", SOTABLE_COL_REF, so_ref, SOTABLE_COL_INDEX ) ) - 1000;
|
|
//level.specOpsGroups[ so_ref ].string_name = tablelookup( "sp/specopstable.csv", SOTABLE_COL_REF, so_ref, SOTABLE_COL_NAME );
|
|
level.specOpsGroups[ so_ref ].unlock = int( tablelookup( "sp/specopstable.csv", SOTABLE_COL_REF, so_ref, SOTABLE_COL_UNLOCK ) );
|
|
}
|
|
|
|
|
|
_nextmission( endgame )
|
|
{
|
|
/#
|
|
if( getdvarint("nextmission_disable") )
|
|
{
|
|
iprintlnbold( "Nextmission Here, but disabled!" );
|
|
return;
|
|
}
|
|
#/
|
|
|
|
//are we watching credits?
|
|
if ( level.script == "ending" && level.level_mode != "credits_1" )
|
|
{
|
|
setsaveddvar( "ui_nextMission", "0" );
|
|
missionSuccess( "trainer" );
|
|
return;
|
|
}
|
|
|
|
if( !isdefined( endgame ) )
|
|
endgame = false;
|
|
|
|
level notify( "nextmission" );
|
|
level.nextmission = true;
|
|
level.player enableinvulnerability();
|
|
|
|
levelIndex = undefined;
|
|
|
|
setsaveddvar( "ui_nextMission", "1" );
|
|
setdvar( "ui_showPopup", "0" );
|
|
setdvar( "ui_popupString", "" );
|
|
|
|
if( level.script == "ending" )
|
|
{
|
|
level.script = "af_chase";
|
|
_nextmission( true );
|
|
level.script = "ending";
|
|
}
|
|
|
|
levelIndex = level.missionSettings getLevelIndex( level.script );
|
|
|
|
maps\_gameskill::auto_adust_zone_complete( "aa_main_" + level.script );
|
|
|
|
if ( !isDefined( levelIndex ) )
|
|
{
|
|
// run the same mission again if the nextmission is not defiend.
|
|
MissionSuccess( level.script );
|
|
return;
|
|
}
|
|
|
|
if ( level.script != "ending" && !( level.script == "af_chase" && endgame ) )
|
|
maps\_utility::level_end_save();
|
|
|
|
if( level.script != "af_chase" || endgame )
|
|
{
|
|
// update mission difficulty and highest completed profile values
|
|
level.missionSettings setLevelCompleted( levelIndex );
|
|
|
|
if ( (level.player GetLocalPlayerProfileData( "highestMission" )) < levelindex + 1 && ( level.script == "ending" ) && getdvarint( "mis_cheat" ) == 0 )
|
|
{
|
|
setdvar( "ui_sp_unlock", "0" );// set reset value to 0
|
|
setdvar( "ui_sp_unlock", "1" );
|
|
}
|
|
|
|
/#
|
|
PrintLn( ">> SP PERCENT UPDATE - _nextmission()" );
|
|
#/
|
|
completion_percentage = updateSpPercent();
|
|
|
|
/#
|
|
if( getdvarint( "ui_debug_setlevel" ) != 0 )
|
|
{
|
|
_setHighestMissionIfNotCheating( getdvarint( "ui_debug_clearlevel" ) );
|
|
level.missionSettings setLevelCompleted( max( 0, getdvarint( "ui_debug_clearlevel" ) - 1 ) );
|
|
|
|
setdvar( "ui_debug_setlevel", "" );
|
|
}
|
|
|
|
// Debug prints
|
|
if ( completion_percentage < level.player GetLocalPlayerProfileData( "percentCompleteSP" ) )
|
|
PrintLn( ">> SP DEBUG: [ WARNING! NEW:" + completion_percentage + "% < OLD:" + level.player GetLocalPlayerProfileData( "percentCompleteSP" ) + "% ]\n" );
|
|
|
|
PrintLn( ">> SP DEBUG: [ setlevel:" + getdvarint( "ui_debug_setlevel" ) + " clearall:" + getdvarint( "ui_debug_clearall" ) + " ]" );
|
|
PrintLn( ">> SP PLAYER DIFFICULTY: [" + (level.player GetLocalPlayerProfileData( "missionHighestDifficulty" )) + "]" );
|
|
PrintLn( ">> SP PERCENTAGE COMPLETED: [" + completion_percentage/100 + "%]" );
|
|
PrintLn( ">> SP LEVEL INDEX: [" + levelIndex + "]" );
|
|
PrintLn( ">> SP LEVEL NAME: [" + level.script + "]" );
|
|
PrintLn( ">> SP LEVELS COMPLETED: [" + (level.player GetLocalPlayerProfileData( "highestMission" )) + "]" );
|
|
PrintLn( ">> SP MAX LEVELS: [" + level.missionSettings.levels.size + "]" );
|
|
#/
|
|
|
|
UpdateGamerProfile();
|
|
|
|
if ( level.missionSettings hasAchievement( levelIndex ) )
|
|
maps\_utility::giveachievement_wrapper( level.missionSettings getAchievement( levelIndex ) );
|
|
|
|
if ( level.missionSettings hasLevelVeteranAward( levelIndex ) && getLevelCompleted( levelIndex ) == 4
|
|
&& level.missionSettings check_other_hasLevelVeteranAchievement( levelIndex ) )
|
|
maps\_utility::giveachievement_wrapper( level.missionSettings getLevelVeteranAward( levelIndex ) );
|
|
|
|
if ( level.missionSettings hasMissionHardenedAward() &&
|
|
level.missionSettings getLowestSkill() > 2 )
|
|
giveachievement_wrapper( level.missionSettings getHardenedAward() );
|
|
|
|
nextLevelIndex = level.missionSettings.levels.size;
|
|
}
|
|
if( level.script == "af_chase" && endgame )
|
|
return;
|
|
|
|
if( level.script == "ending" && level.level_mode == "credits_1" )
|
|
flag_wait( "af_chase_nextmission" );
|
|
|
|
if ( level.script == "airplane" || level.script == "ending" )
|
|
{
|
|
setsaveddvar( "ui_nextMission", "0" );
|
|
//setdvar( "ui_victoryquote", "@VICTORYQUOTE_IW_THANKS_FOR_PLAYING" );
|
|
missionSuccess( "trainer" );
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
nextLevelIndex = levelIndex + 1;
|
|
}
|
|
|
|
if ( arcadeMode() )
|
|
{
|
|
if ( !getdvarint( "arcademode_full" ) )
|
|
{
|
|
setsaveddvar( "ui_nextMission", "0" );
|
|
missionSuccess( level.script );
|
|
return;
|
|
}
|
|
|
|
if ( level.script == "cargoship" )
|
|
{
|
|
changelevel( "blackout", level.missionSettings getKeepWeapons( levelIndex ) );
|
|
return;
|
|
}
|
|
else
|
|
if ( level.script == "airlift" )
|
|
{
|
|
changelevel( "village_assault", level.missionSettings getKeepWeapons( levelIndex ) );
|
|
return;
|
|
}
|
|
else
|
|
if ( level.script == "jeepride" )
|
|
{
|
|
changelevel( "airplane", level.missionSettings getKeepWeapons( levelIndex ) );
|
|
return;
|
|
}
|
|
}
|
|
|
|
if ( level.missionSettings skipssuccess( levelIndex ) )
|
|
changelevel( level.missionSettings getLevelName( nextLevelIndex ), level.missionSettings getKeepWeapons( levelIndex ) );
|
|
else
|
|
missionSuccess( level.missionSettings getLevelName( nextLevelIndex ), level.missionSettings getKeepWeapons( levelIndex ) );
|
|
|
|
// DEMO BUILD
|
|
// */
|
|
}
|
|
|
|
updateSpPercent()
|
|
{
|
|
completion_percentage = int( getTotalpercentCompleteSP()*100 );
|
|
|
|
if( getdvarint( "mis_cheat" ) == 0 )
|
|
{
|
|
assertex( ( completion_percentage >= 0 && completion_percentage <= 10000 ), "SP's Completion percentage [ " + completion_percentage + "% ] is outside of 0 to 100 range!" );
|
|
level.player SetLocalPlayerProfileData( "percentCompleteSP", completion_percentage );
|
|
}
|
|
|
|
return completion_percentage;
|
|
}
|
|
|
|
getTotalpercentCompleteSP()
|
|
{
|
|
/*
|
|
SP STATS:
|
|
|
|
Game Progression 60% -50
|
|
Hardened Progress 60% -25
|
|
Veteran Progress 60% -10
|
|
Intel Items 21/45 -15
|
|
--------------------------------
|
|
Total x% -100
|
|
Play Time ##:##:##
|
|
*/
|
|
|
|
stat_progression = max( getStat_easy(), getStat_regular() ); // easy is always higher than regular anyways...
|
|
stat_progression_ratio = 0.5/1;
|
|
/#
|
|
PrintLn( ">> SP STAT REGULAR: " + stat_progression + "%" + "(" + stat_progression_ratio*100 + "%)" );
|
|
#/
|
|
|
|
stat_hardened = getStat_hardened();
|
|
stat_hardened_ratio = 0.25/1;
|
|
/#
|
|
PrintLn( ">> SP STAT HARDENED: " + stat_hardened + "%" + "(" + stat_hardened_ratio*100 + "%)" );
|
|
#/
|
|
|
|
stat_veteran = getStat_veteran();
|
|
stat_veteran_ratio = 0.1/1;
|
|
/#
|
|
PrintLn( ">> SP STAT VETERAN: " + stat_veteran + "%" + "(" + stat_veteran_ratio*100 + "%)" );
|
|
#/
|
|
|
|
stat_intel = getStat_intel();
|
|
stat_intel_ratio = 0.15/1;
|
|
/#
|
|
PrintLn( ">> SP STAT INTEL: " + stat_intel + "%" + "(" + stat_intel_ratio*100 + "%)" );
|
|
#/
|
|
|
|
assertex( ( stat_progression_ratio + stat_hardened_ratio + stat_veteran_ratio + stat_intel_ratio ) <= 1.0, "Total sum of SP progress breakdown contributes to more than 100%!" );
|
|
|
|
total_progress = 0.0;
|
|
total_progress += stat_progression_ratio*stat_progression;
|
|
total_progress += stat_hardened_ratio*stat_hardened;
|
|
total_progress += stat_veteran_ratio*stat_veteran;
|
|
total_progress += stat_intel_ratio*stat_intel;
|
|
|
|
assertex( total_progress <= 100.0, "Total Percentage calculation is out of bound, larger then 100%" );
|
|
/#
|
|
PrintLn( ">> SP STAT TOTAL: " + total_progress + "%" );
|
|
#/
|
|
|
|
return total_progress;
|
|
}
|
|
|
|
// recruit and regular difficulty
|
|
getStat_progression( difficulty )
|
|
{
|
|
assert( isdefined( level.missionSettings ) );
|
|
assert( isdefined( level.script ) );
|
|
|
|
difficulty_string = (level.player GetLocalPlayerProfileData( "missionHighestDifficulty" ));
|
|
|
|
levels = 0;
|
|
notplayed = [];
|
|
skipped = false;
|
|
// level.missionSettings.levels.size - 1 : the minus one is to remove the credits level
|
|
for ( i = 0; i < level.missionSettings.levels.size-1; i++ )
|
|
{
|
|
if ( int( difficulty_string[ i ] ) >= difficulty )
|
|
levels++;
|
|
}
|
|
|
|
completion = ( levels/(level.missionsettings.levels.size-1) )*100;
|
|
return completion; // 0->100
|
|
}
|
|
|
|
getStat_easy()
|
|
{
|
|
easy = 1;
|
|
return getStat_progression( easy ); // 0->100
|
|
}
|
|
|
|
getStat_regular()
|
|
{
|
|
regular = 2;
|
|
return getStat_progression( regular ); // 0->100
|
|
}
|
|
|
|
getStat_hardened()
|
|
{
|
|
hardened = 3;
|
|
return getStat_progression( hardened ); // 0->100
|
|
}
|
|
|
|
getStat_veteran()
|
|
{
|
|
veteran = 4;
|
|
return getStat_progression( veteran ); // 0->100
|
|
}
|
|
|
|
getStat_intel()
|
|
{
|
|
total_intel_items = 45;
|
|
intel_percentage = ( (level.player GetLocalPlayerProfileData( "cheatPoints" ) )/total_intel_items )*100;
|
|
return intel_percentage; // 0->100
|
|
}
|
|
|
|
//allMissionsCompleted( difficulty )
|
|
//{
|
|
// difficulty += 10;
|
|
// for ( index = 0; index < level.missionSettings.size; index++ )
|
|
// {
|
|
// missionDvar = getMissionDvarString( index );
|
|
// if ( getdvarInt( missionDvar ) < difficulty )
|
|
// return( false );
|
|
// }
|
|
// return( true );
|
|
//}
|
|
|
|
getLevelCompleted( levelIndex )
|
|
{
|
|
return int( (level.player GetLocalPlayerProfileData( "missionHighestDifficulty" ))[ levelIndex ] );
|
|
}
|
|
|
|
getSoLevelCompleted( levelIndex )
|
|
{
|
|
return int( (level.player GetLocalPlayerProfileData( "missionSOHighestDifficulty" ))[ levelIndex ] );
|
|
}
|
|
|
|
setSoLevelCompleted( levelIndex )
|
|
{
|
|
levelOffset = levelIndex;
|
|
|
|
foreach( player in level.players )
|
|
{
|
|
if ( isdefined( player.eog_noreward ) && player.eog_noreward )
|
|
continue;
|
|
|
|
specOpsString = player GetLocalPlayerProfileData( "missionSOHighestDifficulty" );
|
|
|
|
if ( !isdefined( specOpsString ) )
|
|
continue;
|
|
|
|
if ( isdefined( player.award_no_stars ) )
|
|
continue;
|
|
|
|
pre_total_stars = 0;
|
|
for ( i = 0; i < specOpsString.size; i++ )
|
|
pre_total_stars += max( 0, int( specOpsString[ i ] ) - 1 );
|
|
|
|
if ( specOpsString.size == 0 )
|
|
specOpsString = emptyMissionDifficultyStr;
|
|
|
|
// if profile has no zeros for unplayed levels, we need to populate it with zeros
|
|
while( levelOffset >= specOpsString.size )
|
|
specOpsString += "0";
|
|
|
|
assertex( isdefined( level.specops_reward_gameskill ), "Game skill not setup correctly for coop." );
|
|
gameskill = level.specops_reward_gameskill;
|
|
|
|
if ( isdefined( player.forcedGameSkill ) )
|
|
gameskill = player.forcedGameSkill;
|
|
|
|
if ( int( specOpsString[ levelOffset ] ) > gameskill )
|
|
continue;
|
|
|
|
newString = "";
|
|
for ( index = 0; index < specOpsString.size; index++ )
|
|
{
|
|
if ( index != levelOffset )
|
|
newString += specOpsString[ index ];
|
|
else
|
|
newString += gameskill + 1;
|
|
}
|
|
|
|
post_total_stars = 0;
|
|
for ( i = 0; i < newString.size; i++ )
|
|
post_total_stars += max( 0, int( newString[ i ] ) - 1 );
|
|
|
|
delta_total_stars = post_total_stars - pre_total_stars;
|
|
if ( delta_total_stars > 0 )
|
|
{
|
|
player.eog_firststar = is_first_difficulty_star( newString );
|
|
player.eog_newstar = true;
|
|
player.eog_newstar_value = delta_total_stars;
|
|
|
|
foreach ( group in level.specOpsGroups )
|
|
{
|
|
if ( group.unlock == 0 )
|
|
continue;
|
|
|
|
if ( level.ps3 && isSplitscreen() && isdefined( level.player2 ) && player == level.player2 )
|
|
continue;
|
|
|
|
if ( pre_total_stars < group.unlock && post_total_stars >= group.unlock )
|
|
{
|
|
player.eog_unlock = true;
|
|
player.eog_unlock_value = group.ref;
|
|
|
|
if ( getdvarint( "solo_play" ) && ( player == level.player ) )
|
|
setdvar( "ui_last_opened_group", 0 );
|
|
}
|
|
}
|
|
|
|
if ( post_total_stars >= 69 )
|
|
{
|
|
player.eog_unlock = true;
|
|
player.eog_unlock_value = "so_completed";
|
|
music_stop( 1 );
|
|
}
|
|
}
|
|
|
|
if ( player maps\_specialops_code::can_save_to_profile() || ( isSplitscreen() && level.ps3 && isdefined( level.player2 ) && player == level.player2 ) )
|
|
player SetLocalPlayerProfileData( "missionSOHighestDifficulty", newString );
|
|
}
|
|
}
|
|
|
|
is_first_difficulty_star( specOpsString )
|
|
{
|
|
string_size = specOpsString.size;
|
|
if ( string_size > level.specOpsSettings.levels.size )
|
|
string_size = level.specOpsSettings.levels.size;
|
|
|
|
stars = 0;
|
|
for ( i=0; i<string_size; i++ )
|
|
{
|
|
if ( int( tablelookup( "sp/specopstable.csv", 0, i, 14 ) ) )
|
|
stars += max ( 0, int( specOpsString[i] ) - 1 );
|
|
}
|
|
|
|
// returns false if the current level does not require difficulty selection
|
|
if( int( tablelookup( "sp/specOpsTable.csv", 1, level.script, 14 ) ) == 0 )
|
|
return false;
|
|
|
|
return stars == 1;
|
|
}
|
|
|
|
setLevelCompleted( levelIndex )
|
|
{
|
|
missionString = ( level.player GetLocalPlayerProfileData( "missionHighestDifficulty" ) );
|
|
|
|
newString = "";
|
|
for ( index = 0; index < missionString.size; index++ )
|
|
{
|
|
if ( index != levelIndex )
|
|
{
|
|
newString += missionString[ index ];
|
|
}
|
|
else
|
|
{
|
|
if ( level.gameskill + 1 > int( missionString[ levelIndex ] ) )
|
|
newString += level.gameskill + 1;
|
|
else
|
|
newString += missionString[ index ];
|
|
}
|
|
}
|
|
|
|
// levels completed after skipping levels in order will not get its progress recorded, becuase player was hacking or doing devmap
|
|
finalString = "";
|
|
skip = false;
|
|
highest = 0;
|
|
for ( i = 0; i < newString.size; i++ )
|
|
{
|
|
if ( int( newString[ i ] ) == 0 || skip )
|
|
{
|
|
finalString += "0";
|
|
skip = true;
|
|
}
|
|
else
|
|
{
|
|
finalString += newString[ i ];
|
|
highest++;
|
|
}
|
|
}
|
|
|
|
_setHighestMissionIfNotCheating( highest );
|
|
_setMissionDiffStringIfNotCheating( finalString );
|
|
}
|
|
|
|
|
|
_setHighestMissionIfNotCheating( mission )
|
|
{
|
|
//if ( maps\_cheat::is_cheating() || flag( "has_cheated" ) )
|
|
// return;
|
|
if ( getdvar( "mis_cheat" ) == "1" )
|
|
return;
|
|
|
|
level.player SetLocalPlayerProfileData( "highestMission", mission );
|
|
}
|
|
|
|
|
|
_setMissionDiffStringIfNotCheating( missionsDifficultyString )
|
|
{
|
|
if ( getdvar( "mis_cheat" ) == "1" )
|
|
return;
|
|
|
|
level.player SetLocalPlayerProfileData( "missionHighestDifficulty", missionsDifficultyString );
|
|
}
|
|
|
|
|
|
getLevelSkill( levelIndex )
|
|
{
|
|
levelOffset = levelIndex;
|
|
|
|
missionString = (level.player GetLocalPlayerProfileData( "missionHighestDifficulty" ));
|
|
return( int( missionString[ levelOffset ] ) );
|
|
}
|
|
|
|
|
|
getMissionDvarString( missionIndex )
|
|
{
|
|
if ( missionIndex < 9 )
|
|
return( "mis_0" + ( missionIndex + 1 ) );
|
|
else
|
|
return( "mis_" + ( missionIndex + 1 ) );
|
|
}
|
|
|
|
|
|
getLowestSkill()
|
|
{
|
|
missionString = (level.player GetLocalPlayerProfileData( "missionHighestDifficulty" ));
|
|
lowestSkill = 4;
|
|
|
|
//hack here. excluding the last level, airplane. normally wouldn't have the -1 on the size.
|
|
for ( index = 0; index < self.levels.size - 1; index++ )
|
|
{
|
|
if ( int( missionString[ index ] ) < lowestSkill )
|
|
lowestSkill = int( missionString[ index ] );
|
|
}
|
|
return( lowestSkill );
|
|
}
|
|
|
|
|
|
createMission( HardenedAward )
|
|
{
|
|
mission = spawnStruct();
|
|
mission.levels = [];
|
|
mission.prereqs = [];
|
|
// mission.slideShow = slideShow;
|
|
mission.HardenedAward = HardenedAward;
|
|
return( mission );
|
|
}
|
|
|
|
addLevel( levelName, keepWeapons, achievement, skipsSuccess, veteran_achievement )
|
|
{
|
|
assert( isdefined( keepweapons ) );
|
|
levelIndex = self.levels.size;
|
|
self.levels[ levelIndex ] = spawnStruct();
|
|
self.levels[ levelIndex ].name = levelName;
|
|
self.levels[ levelIndex ].keepWeapons = keepWeapons;
|
|
self.levels[ levelIndex ].achievement = achievement;
|
|
self.levels[ levelIndex ].skipsSuccess = skipsSuccess;
|
|
self.levels[ levelIndex ].veteran_achievement = veteran_achievement;
|
|
}
|
|
|
|
addSpecOpLevel( levelName, achievement, veteran_achievement )
|
|
{
|
|
levelIndex = self.levels.size;
|
|
self.levels[ levelIndex ] = spawnStruct();
|
|
self.levels[ levelIndex ].name = levelName;
|
|
self.levels[ levelIndex ].achievement = achievement;
|
|
self.levels[ levelIndex ].veteran_achievement = veteran_achievement;
|
|
|
|
level_group = tablelookup( "sp/specopstable.csv", SOTABLE_COL_REF, level.script, SOTABLE_COL_GROUP );
|
|
if ( level_group == "" )
|
|
return;
|
|
|
|
if( !isdefined( level.specOpsGroups[ level_group ].group_members ) )
|
|
level.specOpsGroups[ level_group ].group_members = [];
|
|
|
|
member_size = level.specOpsGroups[ level_group ].group_members.size;
|
|
level.specOpsGroups[ level_group ].group_members[ member_size ] = levelName;
|
|
}
|
|
|
|
addPreReq( missionIndex )
|
|
{
|
|
preReqIndex = self.prereqs.size;
|
|
self.prereqs[ preReqIndex ] = missionIndex;
|
|
}
|
|
|
|
getLevelIndex( levelName )
|
|
{
|
|
for ( levelIndex = 0; levelIndex < self.levels.size; levelIndex++ )
|
|
{
|
|
if ( self.levels[ levelIndex ].name != levelName )
|
|
continue;
|
|
|
|
return( levelIndex );
|
|
}
|
|
return( undefined );
|
|
}
|
|
|
|
getLevelName( levelIndex )
|
|
{
|
|
return( self.levels[ levelIndex ].name );
|
|
}
|
|
|
|
getKeepWeapons( levelIndex )
|
|
{
|
|
return( self.levels[ levelIndex ].keepWeapons );
|
|
}
|
|
|
|
getAchievement( levelIndex )
|
|
{
|
|
return( self.levels[ levelIndex ].achievement );
|
|
}
|
|
|
|
getLevelVeteranAward( levelIndex )
|
|
{
|
|
return( self.levels[ levelIndex ].veteran_achievement );
|
|
}
|
|
|
|
hasLevelVeteranAward( levelIndex )
|
|
{
|
|
if ( isDefined( self.levels[ levelIndex ].veteran_achievement ) )
|
|
return( true );
|
|
else
|
|
return( false );
|
|
}
|
|
|
|
hasAchievement( levelIndex )
|
|
{
|
|
if ( isDefined( self.levels[ levelIndex ].achievement ) )
|
|
return( true );
|
|
else
|
|
return( false );
|
|
}
|
|
|
|
check_other_hasLevelVeteranAchievement( levelIndex )
|
|
{
|
|
//check for other levels that have the same Hardened achievement.
|
|
//If they have it and other level has been completed at a hardened level check passes.
|
|
|
|
for ( i = 0; i < self.levels.size; i++ )
|
|
{
|
|
if ( i == levelIndex )
|
|
continue;
|
|
if ( ! hasLevelVeteranAward( i ) )
|
|
continue;
|
|
if ( self.levels[ i ].veteran_achievement == self.levels[ levelIndex ].veteran_achievement )
|
|
if ( getLevelCompleted( i ) < 4 )
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
skipsSuccess( levelIndex )
|
|
{
|
|
if ( !isDefined( self.levels[ levelIndex ].skipsSuccess ) )
|
|
return false;
|
|
return true;
|
|
}
|
|
|
|
|
|
getHardenedAward()
|
|
{
|
|
return( self.HardenedAward );
|
|
}
|
|
|
|
|
|
hasMissionHardenedAward()
|
|
{
|
|
if ( isDefined( self.HardenedAward ) )
|
|
return( true );
|
|
else
|
|
return( false );
|
|
}
|
|
|
|
getNextLevelIndex()
|
|
{
|
|
for ( index = 0; index < self.levels.size; index++ )
|
|
{
|
|
if ( !self getLevelSkill( index ) )
|
|
return( index );
|
|
}
|
|
return( 0 );
|
|
}
|
|
|
|
force_all_complete()
|
|
{
|
|
println( "tada!" );
|
|
missionString = (level.player GetLocalPlayerProfileData( "missionHighestDifficulty" ));
|
|
newString = "";
|
|
for ( index = 0; index < missionString.size; index++ )
|
|
{
|
|
if ( index < 20 )
|
|
newString += 2;
|
|
else
|
|
newstring += 0;
|
|
}
|
|
level.player SetLocalPlayerProfileData( "missionHighestDifficulty", newString );
|
|
level.player SetLocalPlayerProfileData( "highestMission", 20 );
|
|
}
|
|
/#
|
|
ui_debug_clearall()
|
|
{
|
|
for(;;)
|
|
{
|
|
if( getdvarint( "ui_debug_clearall" ) )
|
|
{
|
|
clearall();
|
|
level.player SetLocalPlayerProfileData( "percentCompleteSP", 0 );
|
|
|
|
foreach( player in level.players )
|
|
{
|
|
player SetLocalPlayerProfileData( "missionspecops", 0 );
|
|
player SetLocalPlayerProfileData( "missionsohighestdifficulty", "00000000000000000000000000000000000000000000000000" );
|
|
player SetLocalPlayerProfileData( "percentCompleteSO", 0 );
|
|
|
|
best_time_name = tablelookup( "sp/specOpsTable.csv", 1, level.script, 9 );
|
|
if ( isdefined( best_time_name ) && best_time_name != "" )
|
|
player SetLocalPlayerProfileData( best_time_name, 0 );
|
|
}
|
|
|
|
setdvar( "ui_debug_clearall", "" );
|
|
}
|
|
|
|
wait 0.05;
|
|
}
|
|
}
|
|
#/
|
|
clearall()
|
|
{
|
|
level.player SetLocalPlayerProfileData( "missionHighestDifficulty", emptyMissionDifficultyStr );
|
|
level.player SetLocalPlayerProfileData( "highestMission", 1 );
|
|
}
|
|
|
|
credits_end()
|
|
{
|
|
changelevel( "airplane", false );
|
|
}
|
|
|
|
coop_eog_summary()
|
|
{
|
|
playerNum = 1;
|
|
accuracy = [];
|
|
difficulty = [];
|
|
diffString[ 0 ] = "@MENU_RECRUIT";
|
|
diffString[ 1 ] = "@MENU_REGULAR";
|
|
diffString[ 2 ] = "@MENU_HARDENED";
|
|
diffString[ 3 ] = "@MENU_VETERAN";
|
|
|
|
thread maps\_ambient::use_eq_settings( "specialop_fadeout", level.eq_mix_track );
|
|
thread maps\_ambient::blend_to_eq_track( level.eq_mix_track, 10 );
|
|
|
|
//----------------------------------------------
|
|
// Set all stat dvars so menu can display stats
|
|
//----------------------------------------------
|
|
foreach ( player in level.players )
|
|
{
|
|
// Names
|
|
setdvar( "player_" + playerNum + "_name", player.playername );
|
|
|
|
// Kills
|
|
setdvar( "player_" + playerNum + "_kills", player.stats[ "kills" ] );
|
|
|
|
// Difficulty
|
|
difficultyIndex = difficulty.size;
|
|
difficulty[ difficultyIndex ] = player get_player_gameskill();
|
|
|
|
assert( isdefined( diffString[ difficulty[ difficultyIndex ] ] ) );
|
|
setdvar( "player_" + playerNum + "_difficulty", diffString[ difficulty[ difficultyIndex ] ] );
|
|
|
|
playerNum++ ;
|
|
}
|
|
|
|
// Time
|
|
if ( !isdefined( level.challenge_start_time ) )
|
|
{
|
|
// If the mission never started, force it to a time of 0.
|
|
level.challenge_start_time = 0;
|
|
level.challenge_end_time = 0;
|
|
}
|
|
|
|
assertex( isdefined( level.challenge_start_time ), "Special Ops missions need to ensure level.challenge_start_time is set before displaying stats." );
|
|
assertex( isdefined( level.challenge_end_time ), "Special Ops missions need to ensure level.challenge_end_time is set before displaying stats." );
|
|
|
|
seconds = ( level.challenge_end_time - level.challenge_start_time ) * 0.001;
|
|
setdvar( "elapsed_mission_time", convert_to_time_string( seconds, true ) );
|
|
|
|
// callback that sets custom data for eog summary
|
|
if( isdefined( level.eog_summary_callback ) )
|
|
{
|
|
setdvar( "ui_eog_success_heading_player1", "" );
|
|
setdvar( "ui_eog_success_heading_player2", "" );
|
|
create_custom_eog_defaults();
|
|
[[level.eog_summary_callback]]();
|
|
}
|
|
|
|
if( isdefined( level.custom_eog_summary ) && level.custom_eog_summary )
|
|
setdvar( "ui_eog_custom", 1 );
|
|
else
|
|
setdvar( "ui_eog_custom", 0 );
|
|
|
|
//----------------------------------------------
|
|
// Open summary menus on all players
|
|
//----------------------------------------------
|
|
|
|
// opens up end-of-game summary menu for player gameplay performance
|
|
if ( is_coop() )
|
|
{
|
|
reset_eog_popup_dvars();
|
|
// setup eog popups that shows stars earned, unlocks, and new best time
|
|
// player 1
|
|
if( isdefined( level.player.eog_firststar ) && level.player.eog_firststar )
|
|
setdvar( "ui_first_star_player1", level.player.eog_firststar );
|
|
|
|
if( isdefined( level.player.eog_newstar ) && level.player.eog_newstar )
|
|
setdvar( "ui_eog_player1_stars", level.player.eog_newstar_value );
|
|
|
|
if( isdefined( level.player.eog_unlock ) && level.player.eog_unlock )
|
|
setdvar( "ui_eog_player1_unlock", level.player.eog_unlock_value );
|
|
|
|
if( isdefined( level.player.eog_besttime ) && level.player.eog_besttime )
|
|
setdvar( "ui_eog_player1_besttime", level.player.eog_besttime_value );
|
|
|
|
if( isdefined( level.player.eog_noreward ) && level.player.eog_noreward )
|
|
setdvar( "ui_eog_player1_noreward", level.player.eog_noreward );
|
|
|
|
// player 2
|
|
if( isdefined( level.player2.eog_firststar ) && level.player2.eog_firststar )
|
|
setdvar( "ui_first_star_player2", level.player2.eog_firststar );
|
|
|
|
if( isdefined( level.player2.eog_newstar ) && level.player2.eog_newstar )
|
|
setdvar( "ui_eog_player2_stars", level.player2.eog_newstar_value );
|
|
|
|
if( isdefined( level.player2.eog_unlock ) && level.player2.eog_unlock )
|
|
setdvar( "ui_eog_player2_unlock", level.player2.eog_unlock_value );
|
|
|
|
if( isdefined( level.player2.eog_besttime ) && level.player2.eog_besttime )
|
|
setdvar( "ui_eog_player2_besttime", level.player2.eog_besttime_value );
|
|
|
|
if( isdefined( level.player2.eog_noreward ) && level.player2.eog_noreward )
|
|
setdvar( "ui_eog_player2_noreward", level.player2.eog_noreward );
|
|
|
|
wait 0.05;
|
|
level.player openpopupmenu( "coop_eog_summary" );
|
|
level.player2 openpopupmenu( "coop_eog_summary2" );
|
|
}
|
|
else
|
|
{
|
|
reset_eog_popup_dvars();
|
|
|
|
// setup eog popups that shows stars earned, unlocks, and new best time
|
|
if( isdefined( level.player.eog_firststar ) && level.player.eog_firststar )
|
|
setdvar( "ui_first_star_player1", level.player.eog_firststar );
|
|
|
|
if( isdefined( level.player.eog_newstar ) && level.player.eog_newstar )
|
|
setdvar( "ui_eog_player1_stars", level.player.eog_newstar_value );
|
|
|
|
if( isdefined( level.player.eog_unlock ) && level.player.eog_unlock )
|
|
setdvar( "ui_eog_player1_unlock", level.player.eog_unlock_value );
|
|
|
|
if( isdefined( level.player.eog_besttime ) && level.player.eog_besttime )
|
|
setdvar( "ui_eog_player1_besttime", level.player.eog_besttime_value );
|
|
|
|
wait 0.05;
|
|
level.player openpopupmenu( "sp_eog_summary" );
|
|
}
|
|
}
|
|
|
|
create_custom_eog_defaults()
|
|
{
|
|
// Don't use any defaults.
|
|
if ( isdefined( level.custom_eog_no_defaults ) && level.custom_eog_no_defaults )
|
|
return;
|
|
|
|
foreach ( player in level.players )
|
|
{
|
|
// Time
|
|
if ( !isdefined( level.custom_eog_no_time ) || !level.custom_eog_no_time )
|
|
player use_custom_eog_default_time();
|
|
|
|
// Difficulty
|
|
if ( !isdefined( level.custom_eog_no_skill ) || !level.custom_eog_no_skill )
|
|
player use_custom_eog_default_difficulty();
|
|
|
|
// Kills
|
|
if ( !isdefined( level.custom_eog_no_kills ) || !level.custom_eog_no_kills )
|
|
player use_custom_eog_default_kills();
|
|
|
|
if ( is_coop_online() )
|
|
{
|
|
// Partner's stats
|
|
if ( !isdefined( level.custom_eog_no_partner ) || !level.custom_eog_no_partner )
|
|
{
|
|
other_player = get_other_player( player );
|
|
player use_custom_eog_default_difficulty( other_player );
|
|
player use_custom_eog_default_kills( other_player );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
use_custom_eog_default_time()
|
|
{
|
|
seconds = ( level.challenge_end_time - level.challenge_start_time ) * 0.001;
|
|
time_string = convert_to_time_string( seconds, true );
|
|
self add_custom_eog_summary_line( "@SPECIAL_OPS_UI_TIME", time_string );
|
|
}
|
|
|
|
use_custom_eog_default_difficulty( player )
|
|
{
|
|
msg = "@SPECIAL_OPS_UI_DIFFICULTY_OTHER";
|
|
if ( !isdefined( player ) )
|
|
{
|
|
player = self;
|
|
msg = "@SPECIAL_OPS_UI_DIFFICULTY";
|
|
}
|
|
|
|
difficulty_string = undefined;
|
|
switch( player.gameskill )
|
|
{
|
|
case 0:
|
|
case 1: difficulty_string = "@MENU_REGULAR"; break;
|
|
case 2: difficulty_string = "@MENU_HARDENED"; break;
|
|
case 3: difficulty_string = "@MENU_VETERAN"; break;
|
|
}
|
|
self add_custom_eog_summary_line( msg, difficulty_string );
|
|
}
|
|
|
|
use_custom_eog_default_kills( player )
|
|
{
|
|
msg = "@SPECIAL_OPS_UI_KILLS_OTHER";
|
|
if ( !isdefined( player ) )
|
|
{
|
|
player = self;
|
|
msg = "@SPECIAL_OPS_UI_KILLS";
|
|
}
|
|
|
|
self add_custom_eog_summary_line( msg, player.stats[ "kills" ] );
|
|
}
|
|
|
|
reset_eog_popup_dvars()
|
|
{
|
|
setdvar( "ui_eog_player1_stars", "" );
|
|
setdvar( "ui_eog_player1_unlock", "" );
|
|
setdvar( "ui_eog_player1_besttime", "" );
|
|
setdvar( "ui_eog_player1_noreward", "" );
|
|
|
|
setdvar( "ui_eog_player2_stars", "" );
|
|
setdvar( "ui_eog_player2_unlock", "" );
|
|
setdvar( "ui_eog_player2_besttime", "" );
|
|
setdvar( "ui_eog_player2_noreward", "" );
|
|
}
|