iw6-scripts-dev/maps/mp/alien/_achievement.gsc
2024-12-11 11:28:08 +01:00

331 lines
10 KiB
Plaintext

#include common_scripts\utility;
GOAL_KILL_WITH_TRAP = 50;
GOAL_ESCAPE_IN_TIME = 90000; // 1 minute and 30 second in ms
GOAL_ESCAPE_1ST_TIME = 1;
GOAL_ESCAPE_ALL_CHALLENGE = 1;
GOAL_ESCAPE_ALL_PLAYERS = 4;
GOAL_ESCAPE_WITH_NERF_ON = 1;
GOAL_SCAVENGE_ITEM = 40;
init_player_achievement()
{
self.achievement_list = [];
if ( isDefined( level.achievement_registration_func ) )
[[level.achievement_registration_func]]();
if ( maps\mp\alien\_utility::is_true( level.include_default_achievements ) )
register_default_achievements();
}
register_default_achievements()
{
// reference goal init_func should_update_func is_goal_reached_func complete_in_casual
register_achievement( "KILL_WITH_TRAP" , GOAL_KILL_WITH_TRAP, ::default_init , ::should_update_kill_with_trap , ::equal_to_goal );
register_achievement( "ESCAPE_ALL_PLAYERS" , GOAL_ESCAPE_ALL_PLAYERS, ::default_init , ::default_should_update , ::at_least_goal );
register_achievement( "ESCAPE_IN_TIME" , GOAL_ESCAPE_IN_TIME, ::default_init , ::default_should_update , ::at_least_goal );
register_achievement( "ESCAPE_1ST_TIME" , GOAL_ESCAPE_1ST_TIME, ::default_init , ::default_should_update , ::at_least_goal );
register_achievement( "ESCAPE_ALL_CHALLENGE" , GOAL_ESCAPE_ALL_CHALLENGE, ::default_init , ::should_update_all_challenge , ::at_least_goal );
register_achievement( "ESCAPE_WITH_NERF_ON" , GOAL_ESCAPE_WITH_NERF_ON, ::default_init , ::default_should_update , ::at_least_goal );
register_achievement( "REACH_CITY" , 1, ::default_init , ::default_should_update , ::at_least_goal );
register_achievement( "REACH_CABIN" , 1, ::default_init , ::default_should_update , ::at_least_goal );
register_achievement( "SCAVENGE_ITEM" , GOAL_SCAVENGE_ITEM, ::default_init , ::default_should_update , ::equal_to_goal );
}
register_achievement( reference, goal, init_func, should_update_func, is_goal_reached_func, complete_in_casual )
{
achievement = spawnStruct();
achievement [[init_func]]( goal, should_update_func, is_goal_reached_func, complete_in_casual );
self.achievement_list[reference] = achievement;
}
default_init( goal, should_update_func, is_goal_reached_func, complete_in_casual )
{
self.progress = 0;
self.goal = goal;
self.should_update_func = should_update_func;
self.is_goal_reached_func = is_goal_reached_func;
self.achievement_completed = false;
if( isDefined( complete_in_casual ) )
self.complete_in_casual =complete_in_casual;
}
default_should_update( unused_1, unused_2, unused_3, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9, unused_10 )
{
return true;
}
update_progress( progress_amount )
{
self.progress += progress_amount;
}
at_least_goal()
{
return ( self.progress >= self.goal );
}
equal_to_goal()
{
return ( self.progress == self.goal );
}
is_completed()
{
return ( self.achievement_completed );
}
can_complete_in_causal()
{
return ( maps\mp\alien\_utility::is_true( self.complete_in_casual ) );
}
mark_completed()
{
self.achievement_completed = true;
}
is_valid_achievement( achievement )
{
return ( isDefined ( achievement ) );
}
update_achievement( reference, progress_amt, param_1, param_2, param_3, param_4, param_5, param_6, param_7, param_8, param_9, param_10 )
{
achievement = self.achievement_list[reference];
/#//<TODO J.C.> Move this back into release build
if(maps\mp\alien\_utility::is_chaos_mode())
return;
#/
if ( !is_valid_achievement( achievement ) )
return;
if ( achievement is_completed() )
return;
if ( maps\mp\alien\_utility::is_casual_mode() && !achievement can_complete_in_causal() )
return;
if ( achievement [[achievement.should_update_func]]( param_1, param_2, param_3, param_4, param_5, param_6, param_7, param_8, param_9, param_10 ) )
{
achievement update_progress( progress_amt );
if ( achievement [[achievement.is_goal_reached_func]]() )
{
/#
maps\mp\alien\_debug::debug_print_achievement_unlocked( reference, progress_amt );
//self IPrintLnBold( "ACHIEVEMENT: " + reference );
#/
self giveAchievement( reference );
achievement mark_completed();
}
}
}
/////////////////////////////////////////
// Related to aliens killed
/////////////////////////////////////////
update_alien_kill_achievements( eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration )
{
if ( isdefined( level.update_alien_kill_achievements_func ) )
[[ level.update_alien_kill_achievements_func ]]( eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration );
if ( !isDefined( eAttacker ) || !isPlayer( eAttacker ) )
return;
eAttacker update_achievement( "KILL_WITH_TRAP", 1, eInflictor );
}
should_update_kill_with_trap( eInflictor, unused_2, unused_3, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9, unused_10 )
{
if ( maps\mp\alien\_utility::is_trap( eInflictor ) )
return true;
return false;
}
///////////////////////////////////////
// Related to escape
///////////////////////////////////////
update_escape_achievements( players_escaped, escape_time_remains )
{
escape_player_count = players_escaped.size;
foreach ( player in players_escaped )
{
times_escaped = player maps\mp\alien\_persistence::get_player_escaped();
num_nerf_selected = player maps\mp\alien\_prestige::get_num_nerf_selected();
player update_personal_escape_achievements( escape_player_count, escape_time_remains, times_escaped, num_nerf_selected );
}
}
update_personal_escape_achievements( escape_player_count, escape_time_remains, times_escaped, num_nerf_selected )
{
self update_achievement( "ESCAPE_ALL_PLAYERS" , escape_player_count );
self update_achievement( "ESCAPE_IN_TIME" , escape_time_remains );
self update_achievement( "ESCAPE_1ST_TIME" , times_escaped );
self update_achievement( "ESCAPE_ALL_CHALLENGE", 1 );
self update_achievement( "ESCAPE_WITH_NERF_ON" , num_nerf_selected );
}
should_update_all_challenge( unused_1, unused_2, unused_3, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9, unused_10 )
{
return level.all_challenge_completed;
}
/////////////////////////////////////////
// Related to kill blocker hive
/////////////////////////////////////////
update_blocker_hive_achievements( hive_name )
{
switch( hive_name )
{
case "lodge_lung_3":
update_achievement_all_players( "REACH_CITY", 1 );
break;
case "city_lung_5":
update_achievement_all_players( "REACH_CABIN", 1 );
break;
default:
break;
}
}
update_achievement_all_players( reference, progress_amt )
{
foreach( player in level.players )
{
player update_achievement( reference, progress_amt );
}
}
/////////////////////////////////////////
// Related to scavenge item
/////////////////////////////////////////
update_scavenge_achievement()
{
self update_achievement( "SCAVENGE_ITEM", 1 );
}
/////////////////////////////////////////
// Kill alien based on weapon
/////////////////////////////////////////
update_achievement_damage_weapon( sWeapon )
{
if ( isdefined( level.update_achievement_damage_weapon_func ) )
self [[ level.update_achievement_damage_weapon_func ]] ( sWeapon );
}
// packNum is 0-indexed
eggAllFoundForPack( packNum )
{
self endon( "disconnect" );
level endon( "game_ended" );
println( "calculating eggstra xp..." );
//wait until the first hive is killed to give any awards.`
level waittill_any( "regular_hive_destroyed", "obelisk_destroyed", "outpost_encounter_completed" );
//legacy variable - if its equal to 1015 then we have already awarded xp for packNum 0.
legacyState = self GetCoopPlayerData( "alienPlayerStats", "deaths" );
eggState = self GetCoopPlayerDataReservedInt( "eggstra_state_flags" );
packEggState = ( eggState >> ( packnum * 4 ) ) & 15;
if ( packEggstate == 15 )
{
//if we got here then the player has found all the eggs for packNum.
eggstra_award_flags = self GetCoopPlayerDataReservedInt( "eggstra_award_flags" );
hasModifiedFlags = false;
//update the new flags to reflect the legacy state
//if we already awarded pack 0 xp, change eggstra_award_flags to reflect this
if ( legacyState == 1015 && (( eggstra_award_flags & ( 1 << 0 )) != 1 ))
{
//mark the xp award as already given out. This is pack 0, so or a 1 into the 0th slot of the award_flags
eggstra_award_flags |= ( 1 << 0 );
hasModifiedFlags = true;
}
// checks if we have given the xp award yet.
if (( eggstra_award_flags & ( 1 << packNum )) == 0 )
{
//if we got here we have not awarded it yet.
eggstra_award_flags |= ( 1 << packNum );
hasModifiedFlags = true;
self SetClientOmnvar( "ui_alien_eggstra_xp", true );
self thread maps\mp\alien\_persistence::wait_and_give_player_xp ( 10000, 5.0 ); //Give player 10,000 Egg-stra XP
}
//update the award flags
if ( hasModifiedFlags == true )
self SetCoopPlayerDataReservedInt( "eggstra_award_flags", eggstra_award_flags );
//needs updated to be a generic call.
self update_mp_eggs_achievement( packnum );
}
}
update_mp_eggs_achievement( dlc_num )
{
switch ( dlc_num )
{
case 0:
self update_achievement( "GOT_THEEGGSTRA_XP", 1 );
break;
case 1:
self update_achievement( "GOT_THEEGGSTRA_XP_DLC2", 1 );
break;
case 2:
self update_achievement( "GOT_THEEGGSTRA_XP_DLC3", 1 );
break;
case 3:
self update_achievement( "GOT_THEEGGSTRA_XP_DLC4", 1 );
break;
default:
break;
}
}
// Related to scavenge item
update_intel_achievement(dlc_num)
{
dlc_num = 0;
map_name = getdvar("ui_mapname" );
if(map_name == "mp_alien_armory")
dlc_num = 1;
if(map_name == "mp_alien_beacon")
dlc_num = 2;
if(map_name == "mp_alien_dlc3")
dlc_num = 3;
if(map_name == "mp_alien_last")
dlc_num = 4;
switch ( dlc_num )
{
case 1:
self update_achievement( "FOUND_ALL_INTELS", 1 );
break;
case 2:
self update_achievement( "FOUND_ALL_INTELS_MAYDAY", 1 );
break;
case 3:
self update_achievement( "AWAKENING_ALL_INTEL", 1 );
break;
case 4:
self update_achievement( "LAST_ALL_INTEL", 1 );
default:
break;
}
}