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

1722 lines
54 KiB
Plaintext

#include maps\mp\alien\_utility;
#include common_scripts\utility;
#include maps\mp\_utility;
GOAL_SPEND_CURRENCY = 10000;
GOAL_SPEND_CURRENCY_20K = 20000;
KILL_LEPER_DURATION = 30; // 30 seconds
MELEE_GOONS_AMOUNT = 5;
MELEE_SPITTER_AMOUNT = 1;
KILL_WITH_PROPANE_AMOUNT = 10;
KILL_WITH_TRAPS_AMOUNT = 10;
KILL_WHILE_PRONE_AMOUNT = 10;
KILL_WITH_TURRETS_AMNT = 10;
KILL_AIRBORNE_AMNT = 5;
KILL_WITH_WEAPON_AMT = 10;
SPEND_NO_MONEY_DURATION = 120;
NO_RELOAD_DURATION = 60;
NO_ABILITIES_DURATION = 90;
init_challenge_type()
{
level.challenge_data = [];
if ( !isDefined( level.challenge_scalar_func ) )
level.challenge_scalar_func = ::default_challenge_scalar_func;
if ( isDefined ( level.challenge_registration_func))
{
[[level.challenge_registration_func]]();
}
if ( is_true( level.include_default_challenges ) )
{
// level._effect["challenge_ring_800"] = loadfx ( "vfx/gameplay/alien/vfx_challenge_ring_800" );
register_challenge( "spend_10k",GOAL_SPEND_CURRENCY, false, undefined, undefined , ::activate_spend_currency, ::deactivate_spend_currency, undefined, ::update_spend_currency );
register_challenge( "spend_20k",GOAL_SPEND_CURRENCY_20K, false, undefined, undefined , ::activate_spend_currency, ::deactivate_spend_currency, undefined, ::update_spend_currency );
register_challenge( "kill_leper",KILL_LEPER_DURATION, false, undefined, undefined, ::activate_kill_leper, ::deactivate_kill_leper, undefined, ::update_kill_leper );
register_challenge( "spend_no_money", SPEND_NO_MONEY_DURATION, true, undefined, undefined, ::activate_spend_no_money, ::default_resetSuccess, undefined, ::update_spend_no_money );
register_challenge( "no_reloads", NO_RELOAD_DURATION, true, undefined, undefined, ::activate_no_reloads, ::default_resetSuccess, undefined, ::update_no_reloads );
register_challenge( "no_abilities", NO_ABILITIES_DURATION, true, undefined, undefined, ::activate_no_abilities, ::default_resetSuccess, undefined, ::update_no_abilities );
register_challenge( "take_no_damage", undefined, true, undefined, undefined, ::default_resetSuccess, ::default_resetSuccess, undefined, ::update_take_no_damage );
register_challenge( "melee_5_goons", MELEE_GOONS_AMOUNT, false, undefined, undefined, ::activate_melee_goons, ::deactivate_melee_goons, undefined, ::update_melee_goons );
register_challenge( "melee_spitter", MELEE_SPITTER_AMOUNT, false, undefined, undefined, ::activate_melee_spitter, ::deactivate_melee_spitter, undefined, ::update_melee_spitter );
register_challenge( "no_stuck_drill", undefined, true, undefined, undefined, ::default_resetSuccess, ::default_resetSuccess, undefined, ::update_no_stuck_drill );
register_challenge( "kill_10_with_propane",KILL_WITH_PROPANE_AMOUNT,false,undefined,undefined,::activate_kill_10_with_propane,::deactivate_kill_10_with_propane,undefined,::update_kill_10_with_propane );
register_challenge( "stay_prone",KILL_WHILE_PRONE_AMOUNT,false,undefined,undefined,::activate_stay_prone,::deactivate_stay_prone,undefined,::update_stay_prone );
register_challenge( "kill_10_with_traps",KILL_WITH_TRAPS_AMOUNT,false,undefined,undefined,::activate_kill_10_with_traps,::deactivate_kill_10_with_traps,undefined,::update_kill_10_with_traps );
register_challenge( "avoid_minion_explosion",undefined,true,undefined,undefined,::activate_avoid_minion_exp,::deactivate_avoid_minion_exp,undefined,::update_avoid_minion_exp );
register_challenge( "75_percent_accuracy",undefined,true,::seventyfive_percent_accuracy_success_test,undefined,::activate_percent_accuracy,::deactivate_percent_accuracy,undefined,::update_75_percent_accuracy );
register_challenge( "pistols_only",KILL_WITH_WEAPON_AMT,false,undefined,undefined,::activate_use_weapon_challenge,::default_resetSuccess,undefined,::update_pistols_only );
register_challenge( "shotguns_only",KILL_WITH_WEAPON_AMT,false,undefined,undefined,::activate_use_weapon_challenge,::deactivate_weapon_challenge_waypoints,undefined,::update_shotguns_only );
register_challenge( "snipers_only",KILL_WITH_WEAPON_AMT,false,undefined,undefined,::activate_use_weapon_challenge,::deactivate_weapon_challenge_waypoints,undefined,::update_snipers_only );
register_challenge( "lmgs_only",KILL_WITH_WEAPON_AMT,false,undefined,undefined,::activate_use_weapon_challenge,::deactivate_weapon_challenge_waypoints,undefined,::update_lmgs_only );
register_challenge( "ar_only",KILL_WITH_WEAPON_AMT,false,undefined,undefined,::activate_use_weapon_challenge,::deactivate_weapon_challenge_waypoints,undefined,::update_ar_only );
register_challenge( "smg_only",KILL_WITH_WEAPON_AMT,false,undefined,undefined,::activate_use_weapon_challenge,::deactivate_weapon_challenge_waypoints,undefined,::update_smgs_only );
register_challenge( "kill_10_with_turrets",KILL_WITH_TURRETS_AMNT,false,undefined,undefined,::activate_kill_10_with_turrets,::deactivate_kill_10_with_turrets,undefined,::update_kill_10_with_turrets );
register_challenge( "kill_airborne_aliens",KILL_AIRBORNE_AMNT,false,undefined,undefined,::activate_kill_airborne_aliens,::deactivate_kill_airborne_aliens,undefined,::update_kill_airborne_aliens );
register_challenge( "melee_only",undefined,true,undefined,undefined,::activate_melee_only,::deactivate_melee_only,undefined,::update_melee_only);
register_challenge( "50_percent_accuracy",undefined,true,::fifty_percent_accuracy_success_test,undefined,::activate_percent_accuracy,::deactivate_percent_accuracy,undefined,::update_50_percent_accuracy );
register_challenge( "stay_within_area",10,false,undefined,::pre_activate_stay_within_area,::activate_stay_within_area,::deactivate_stay_within_area,undefined,::update_stay_within_area );
register_challenge ( "kill_10_in_30",10,false,undefined,undefined,::activate_kill_10_in_30,::default_resetSuccess,undefined,::update_kill_10_in_30 );
//special challenges for the blocker hives
//register_challenge( "no_spitter_damage",undefined,true,undefined,undefined,::activate_no_spitter_damage,::deactivate_no_spitter_damage,undefined,::update_no_spitter_damage);
register_challenge( "protect_player",undefined,true,undefined,undefined,::activate_protect_a_player,::deactivate_protect_a_player,undefined,::update_protect_a_player );
register_challenge( "no_laststand", undefined, true, undefined, undefined, ::default_resetSuccess, ::default_resetSuccess, undefined, ::update_no_laststand );
register_challenge( "no_bleedout", undefined, true, undefined, undefined, ::default_resetSuccess, ::default_resetSuccess, undefined, ::update_no_bleedout );
register_challenge( "challenge_failed",undefined,false,undefined,undefined,::default_resetSuccess,::default_resetSuccess,undefined,undefined);
register_challenge( "challenge_success",undefined,false,undefined,undefined,::default_resetSuccess,::default_resetSuccess,undefined,undefined );
register_challenge( "barrier_hive",undefined,false,undefined,undefined,::default_resetSuccess,::default_resetSuccess,undefined,undefined );
}
init_alien_challenges_from_table();
//default level variables for storing challenge states so hojoiners can participate in challenges
level.current_challenge_index = -1;
level.current_challenge_progress_max = -1;
level.current_challenge_progress_current = -1;
level.current_challenge_percent = -1;
level.current_challenge_target_player = -1;
level.current_challenge_timer = -1;
level.current_challenge_scalar = -1;
level.current_challenge_title = -1;
level.current_challenge_pre_challenge = 0;
//level flag to record whether all challenges are completed for achievement
level.all_challenge_completed = true;
level.pre_challenge_active = false;
level.num_challenge_completed = 0;
}
register_challenge( ref, goal, default_success , successFunc, canActivateFunc, activateFunc, deactivateFunc, failActivateFunc, updateFunc, rewardFunc,failFunc )
{
challenge_struct = spawnStruct();
challenge_struct.ref = ref;
challenge_struct.goal = goal;
challenge_struct.default_success = default_success;
challenge_struct.isSuccessFunc = ::default_isSuccessFunc;
if ( isDefined ( successFunc ) )
challenge_struct.isSuccessFunc = successFunc;
challenge_struct.canActivateFunc = ::default_canActivateFunc;
if ( isDefined ( canActivateFunc ) )
challenge_struct.canActivateFunc = canActivateFunc;
challenge_struct.activateFunc = activateFunc;
challenge_struct.deactivateFunc = deactivateFunc;
challenge_struct.failActivateFunc = ::default_failActivateFunc;
if ( isDefined ( failActivateFunc ) )
challenge_struct.failActivateFunc = failActivateFunc;
challenge_struct.updateFunc = updateFunc;
challenge_struct.rewardFunc = ::default_rewardFunc;
if( IsDefined( rewardFunc ) )
challenge_struct.rewardFunc = rewardFunc;
challenge_struct.failFunc = ::default_failFunc;
if ( isDefined ( failFunc ) )
challenge_struct.failFunc = failFunc;
level.challenge_data [ ref ] = challenge_struct;
}
init_alien_challenges_from_table()
{
CHALLENGE_TABLE = level.alien_challenge_table; // spawn node info lookup table
TABLE_INDEX = 0;
TABLE_CHALLENGE_START_INDEX = 1;
TABLE_CHALLENGE_END_INDEX = 99;
TABLE_CHALLENGE_REF = 1; // The reference name for the challenge
TABLE_CHALLENGE_ALLOWED_CYCLES = 2; // The allowed cycles that this challenge can appear in
TABLE_ALLOWEDINSOLO = 6; // is this challenge allowed in solo mode
TABLE_CHALLENGE_PRECHALLENGE_TEXT = 7; // text to appear during the pre-challenge period
TABLE_CHALLENGE_ALLOWED_HIVES = 8; // hives during which the challenge can appear ( checked against the allowed cycle )
for ( entryIndex = TABLE_CHALLENGE_START_INDEX; entryIndex <= TABLE_CHALLENGE_END_INDEX; entryIndex++ )
{
challengeID = tablelookup( CHALLENGE_TABLE, TABLE_INDEX, entryIndex, TABLE_CHALLENGE_REF );
if ( challengeID == "" )
break;
allowed_cycles = tablelookup( CHALLENGE_TABLE, TABLE_INDEX, entryIndex, TABLE_CHALLENGE_ALLOWED_CYCLES );
allowed_hives = tablelookup( CHALLENGE_TABLE, TABLE_INDEX, entryIndex, TABLE_CHALLENGE_ALLOWED_HIVES );
level.challenge_data[ challengeID ].allowed_cycles = allowed_cycles; //strtok( allowed_cycles," " );
level.challenge_data[ challengeID ].allowedinsolo = int ( tablelookup( CHALLENGE_TABLE, TABLE_INDEX, entryIndex, TABLE_ALLOWEDINSOLO ) );
level.challenge_data[ challengeID ].allowed_hives = allowed_hives; //strtok( allowed_hives," " );
}
}
//=======================================================
// default
//=======================================================
default_canActivateFunc() { return true; }
default_failActivateFunc() { AssertMsg ( "Fail to activate challenge: " + self.ref ); }
default_isSuccessFunc() { return self.success; }
default_failFunc() {}
default_resetSuccess() { self.success = self.default_success; }
default_rewardFunc()
{
CHALLENGE_COMPLETE_SKILL_POINT = 1;
foreach ( player in level.players )
player maps\mp\alien\_persistence::give_player_points ( CHALLENGE_COMPLETE_SKILL_POINT );
}
//=======================================================
// spend_currency
//=======================================================
activate_spend_currency() { activate_spend_money_progress(); }
deactivate_spend_currency() { reset_spend_money_progress(); }
reset_spend_money_progress()
{
default_resetSuccess();
self.current_progress = 0;
}
activate_spend_money_progress()
{
default_resetSuccess();
self.current_progress = 0;
self.goal = self.goal * 1000;
update_challenge_progress ( 0, self.goal );
}
update_spend_currency ( currency_spent, unused_2, unused_3, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
{
self.current_progress += currency_spent;
if ( self.current_progress >= self.goal )
self.success = true;
update_challenge_progress ( self.current_progress, self.goal );
if ( self.success )
maps\mp\alien\_challenge::deactivate_current_challenge();
}
//=======================================================
// kill_leper
//=======================================================
activate_kill_leper()
{
default_resetSuccess();
// Make sure the cycle has been initialized
if ( !isDefined( level.current_cycle ) )
{
level waittill( "alien_cycle_started" );
}
self.leper = maps\mp\alien\_spawn_director::spawn_alien( "leper" );
self.leper thread leper_watch_death();
self.leper thread maps\mp\agents\alien\_alien_leper::leper_challenge_despawn( self.goal );
challenge_time = int ( gettime() + 30000 );
foreach ( player in level.players )
{
player SetClientOmnvar ( "ui_intel_timer", challenge_time );
}
level.current_challenge_timer = 30;
level thread update_current_challenge_timer();
}
deactivate_kill_leper()
{
default_resetSuccess();
if ( IsAlive( self.leper ) )
{
self.leper thread maps\mp\agents\alien\_alien_leper::leper_despawn();
self.leper = undefined;
}
}
leper_watch_death()
{
self waittill( "death", attacker, cause, weapon );
if ( isDefined( attacker ) && ( isPlayer( attacker) || isDefined( attacker.classname ) && attacker.classname == "misc_turret" && isDefined( attacker.owner ) && attacker.owner IsUsingTurret() ))
{
// win!
maps\mp\alien\_challenge::update_challenge( "kill_leper", "success" );
}
else
{
maps\mp\alien\_challenge::update_challenge( "kill_leper", "fail" );
}
level notify( "stop_challenge_timer" );
level.current_challenge_timer = -1;
}
update_kill_leper ( leper_state, unused_2, unused_3, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
{
if ( leper_state == "success" )
{
self.success = true;
}
maps\mp\alien\_challenge::deactivate_current_challenge();
}
//=======================================================
// spend_no_money
//=======================================================
activate_spend_no_money()
{
default_resetSuccess();
challenge_time = int ( gettime() + self.goal * 1000 );
foreach ( player in level.players )
{
player SetClientOmnvar ( "ui_intel_timer", challenge_time );
}
level.current_challenge_timer = self.goal;
level thread update_current_challenge_timer();
level thread spend_no_money_timer( self );
}
spend_no_money_timer( challenge )
{
level endon( "game_ended" );
challenge endon( "fail" );
wait ( challenge.goal );
challenge.success = true;
level notify( "stop_challenge_timer" );
maps\mp\alien\_challenge::deactivate_current_challenge();
}
update_spend_no_money( spent_money, unused_2, unused_3, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
{
self.success = false;
self notify( "fail" );
level notify( "stop_challenge_timer" );
maps\mp\alien\_challenge::deactivate_current_challenge();
}
//=======================================================
// no_reloads
//=======================================================
activate_no_reloads()
{
default_resetSuccess();
challenge_time = int ( gettime() + self.goal * 1000 );
level.current_challenge_timer = self.goal;
level thread update_current_challenge_timer();
level thread no_reload_timer( self );
foreach( player in level.players )
{
player SetClientOmnvar ( "ui_intel_timer", challenge_time );
player thread wait_for_reload();
}
}
no_reload_timer( challenge )
{
level endon ( "stop_watching_reload" );
wait( challenge.goal );
challenge.success = true;
maps\mp\alien\_challenge::deactivate_current_challenge();
level notify( "stop_challenge_timer" );
level notify( "stop_watching_reload" );
}
wait_for_reload()
{
level endon ( "stop_watching_reload" );
self waittill( "reload" ); //self is player
maps\mp\alien\_challenge::update_challenge( "no_reloads" );
level notify ( "stop_watching_reload" );
}
update_no_reloads( unused_1, unused_2, unused_3, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
{
self.success = false;
maps\mp\alien\_challenge::deactivate_current_challenge();
level notify( "stop_challenge_timer" );
}
//=======================================================
// no_abilities
//=======================================================
activate_no_abilities()
{
default_resetSuccess();
challenge_time = int ( gettime() + self.goal * 1000 );
level.current_challenge_timer = self.goal;
level thread update_current_challenge_timer();
level thread no_abilities_timer( self );
foreach( player in level.players )
{
player SetClientOmnvar ( "ui_intel_timer", challenge_time );
player thread wait_for_ability_use();
}
}
no_abilities_timer( challenge )
{
level endon( "stop_watching_ability_use" );
wait( challenge.goal );
challenge.success = true;
maps\mp\alien\_challenge::deactivate_current_challenge();
level notify( "stop_challenge_timer" );
level notify( "stop_watching_ability_use" );
}
wait_for_ability_use()
{
level endon ( "stop_watching_ability_use" );
self waittill_any( "action_finish_used" , "class_skill_used" ); //self is player, this is the notify we get when the player uses a combat resource
maps\mp\alien\_challenge::update_challenge( "no_abilities" );
level notify ( "stop_watching_ability_use" );
}
update_no_abilities( unused_1, unused_2, unused_3, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
{
self.success = false;
maps\mp\alien\_challenge::deactivate_current_challenge();
level notify( "stop_challenge_timer" );
}
//=======================================================
// take_no_damage
//=======================================================
update_take_no_damage ( unused_1, unused_2, unused_3, unused_4 , unused_5, unused_6, unused_7, unused_8, unused_9 )
{
self.success = false;
maps\mp\alien\_challenge::deactivate_current_challenge();
}
nodamage_rewardFunc()
{
NODAMAGE_REWARD_POINT = 250;
foreach ( player in level.players )
player thread maps\mp\alien\_persistence::give_player_currency( NODAMAGE_REWARD_POINT );
}
//=======================================================
// melee_goons
//=======================================================
activate_melee_goons()
{
reset_melee_goons_progress();
update_challenge_progress ( 0, self.goal );
}
deactivate_melee_goons() { reset_melee_goons_progress(); }
reset_melee_goons_progress()
{
default_resetSuccess();
self.current_progress = 0;
}
update_melee_goons ( goons_killed, unused_2, unused_3, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
{
self.current_progress += goons_killed; //self is the current struct return ( self.current_progress >= self.goal );
if ( self.current_progress >= self.goal )
self.success = true;
remaining = ( self.goal - self.current_progress );
update_challenge_progress ( self.current_progress, self.goal );
if ( self.success )
maps\mp\alien\_challenge::deactivate_current_challenge();
}
//=======================================================
// melee_spitter
//=======================================================
activate_melee_spitter() { reset_melee_spitter_progress(); }
deactivate_melee_spitter() { reset_melee_spitter_progress(); }
reset_melee_spitter_progress()
{
default_resetSuccess();
self.current_progress = 0;
}
update_melee_spitter ( spitter_killed, unused_2, unused_3, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
{
self.current_progress += spitter_killed; //self is the current struct return ( self.current_progress >= self.goal );
if ( self.current_progress >= self.goal )
self.success = true;
if ( self.success )
maps\mp\alien\_challenge::deactivate_current_challenge();
}
//=======================================================
// no_stuck_drill
//=======================================================
update_no_stuck_drill ( unused_1, unused_2, unused_3, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
{
self.success = false;
maps\mp\alien\_challenge::deactivate_current_challenge();
}
//=======================================================
// no_laststand
//=======================================================
update_no_laststand ( unused_1, unused_2, unused_3, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
{
self.success = false;
maps\mp\alien\_challenge::deactivate_current_challenge();
}
//=======================================================
// no_bleedout
//=======================================================
update_no_bleedout( unused_1, unused_2, unused_3, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
{
self.success = false;
maps\mp\alien\_challenge::deactivate_current_challenge();
}
//=======================================================
// kill 10 with propane tanks
//=======================================================
activate_kill_10_with_propane()
{
reset_kill_10_with_propane_progress();
update_challenge_progress ( 0, self.goal );
}
deactivate_kill_10_with_propane() { reset_kill_10_with_propane_progress(); }
reset_kill_10_with_propane_progress()
{
default_resetSuccess();
self.current_progress = 0;
}
update_kill_10_with_propane ( aliens_killed, unused_2, unused_3, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
{
self.current_progress += aliens_killed; //self is the current struct return ( self.current_progress >= self.goal );
if ( self.current_progress >= self.goal )
self.success = true;
remaining = ( self.goal - self.current_progress );
update_challenge_progress ( self.current_progress, self.goal );
if ( self.success )
maps\mp\alien\_challenge::deactivate_current_challenge();
}
//=======================================================
// kill 10 with propane tanks
//=======================================================
activate_kill_10_with_traps()
{
reset_kill_10_with_traps_progress();
update_challenge_progress ( 0, self.goal );
}
deactivate_kill_10_with_traps() { reset_kill_10_with_traps_progress(); }
reset_kill_10_with_traps_progress()
{
default_resetSuccess();
self.current_progress = 0;
}
update_kill_10_with_traps ( aliens_killed, unused_2, unused_3, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
{
self.current_progress += aliens_killed; //self is the current struct return ( self.current_progress >= self.goal );
if ( self.current_progress >= self.goal )
self.success = true;
remaining = ( self.goal - self.current_progress );
update_challenge_progress ( self.current_progress, self.goal );
if ( self.success )
maps\mp\alien\_challenge::deactivate_current_challenge();
}
//=======================================================
// stay_prone
//=======================================================
activate_stay_prone()
{
reset_stay_prone_progress();
update_challenge_progress ( 0, self.goal );
}
deactivate_stay_prone() { reset_stay_prone_progress(); }
reset_stay_prone_progress()
{
default_resetSuccess();
self.current_progress = 0;
}
update_stay_prone( aliens_killed, unused_2, unused_3, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
{
self.current_progress += aliens_killed; //self is the current struct return ( self.current_progress >= self.goal );
if ( self.current_progress >= self.goal )
self.success = true;
remaining = ( self.goal - self.current_progress );
update_challenge_progress ( self.current_progress, self.goal );
if ( self.success )
maps\mp\alien\_challenge::deactivate_current_challenge();
}
//=======================================================
// protect a player
//=======================================================
activate_protect_a_player()
{
default_resetSuccess();
//choose a random player
alive_players = [];
foreach ( player in level.players )
{
if ( isAlive ( player ) && !player is_in_laststand() )
alive_players[alive_players.size] = player;
}
targetPlayer = random( alive_players );
foreach ( player in level.players )
{
entnum = targetPlayer GetEntityNumber();
player SetClientOmnvar( "ui_intel_target_player", entnum );
}
level.current_challenge_target_player = targetplayer GetEntityNumber();
targetplayer maps\mp\_entityheadIcons::setHeadIcon( targetplayer.team, "waypoint_defend", (0,0,72), 4, 4, undefined, undefined, undefined, true, undefined, false );
level thread watch_target_player( targetPlayer, self );
level thread watch_drill_detonated( targetPlayer,self );
}
watch_target_player( player, challenge )
{
level endon("drill_detonated");
player waittill_any( "death","last_stand","disconnect" );
player remove_head_icon();
challenge.success = false;
update_protect_a_player();
}
update_protect_a_player ()
{
maps\mp\alien\_challenge::deactivate_current_challenge();
foreach ( player in level.players )
{
player SetClientOmnvar( "ui_intel_target_player", -1 );
}
level.current_challenge_target_player = -1;
}
watch_drill_detonated( player, challenge )
{
player endon( "death" );
player endon( "last_stand" );
player endon( "disconnect" );
level waittill( "drill_detonated" );
player remove_head_icon();
update_protect_a_player();
}
remove_head_icon()
{
foreach ( key, headIcon in self.entityHeadIcons )
{
if( !isDefined( headIcon ) )
continue;
headIcon destroy();
}
}
deactivate_protect_a_player()
{
default_resetSuccess();
}
//=======================================================
// avoid minion explosions
//=======================================================
activate_avoid_minion_exp()
{
default_resetSuccess();
}
deactivate_avoid_minion_exp()
{
default_resetSuccess();
}
update_avoid_minion_exp( unused_1, unused_2, unused_3, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
{
self.success = false;
maps\mp\alien\_challenge::deactivate_current_challenge();
}
//=======================================================
// 75% accuracy
//=======================================================
update_75_percent_accuracy( unused_1, unused_2, unused_3, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
{
self.total_shots_hit++;
}
seventyfive_percent_accuracy_success_test( unused_1, unused_2, unused_3, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
{
return self.current_accuracy >= 75;
}
//=======================================================
// 50% accuracy
//=======================================================
fifty_percent_accuracy_success_test( unused_1, unused_2, unused_3, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
{
return self.current_accuracy >= 50;
}
update_50_percent_accuracy( hit, unused_2, unused_3, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
{
self.total_shots_hit++;
}
activate_percent_accuracy()
{
default_resetSuccess();
self.total_shots_fired = 0;
self.total_shots_hit = 0;
self.current_accuracy = 0;
self.is_updating = false;
level thread track_percent_accuracy_shots_fired( self );
level thread update_percent_accuracy( self );
update_challenge_percent( 0 );
}
deactivate_percent_accuracy()
{
default_resetSuccess();
self.total_shots_fired = 0;
self.total_shots_hit = 0;
level notify( "deactivate_track_accuracy" );
}
//=======================================================
//activation function for "kill x with weapon type" challenges
//=======================================================
activate_use_weapon_challenge()
{
setup_challenge_waypoints( self );
default_resetSuccess();
self.current_progress = 0;
update_challenge_progress ( 0, self.goal );
}
//=======================================================
// pistols_only
//=======================================================
update_pistols_only( weapon, sMeansOfDeath, arc_death, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
{
if ( getweaponclass( weapon ) == "weapon_pistol" || is_true ( arc_death ) )
self.current_progress++;
update_challenge_progress ( self.current_progress , self.goal );
if ( self.current_progress >= self.goal )
{
self.success = true;
maps\mp\alien\_challenge::deactivate_current_challenge();
}
}
//=======================================================
// shotguns_only
//=======================================================
update_shotguns_only( weapon ,sMeansOfDeath, arc_death, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
{
if ( getweaponclass( weapon ) == "weapon_shotgun" || is_true ( arc_death ) )
self.current_progress++;
update_challenge_progress ( self.current_progress , self.goal );
if ( self.current_progress >= self.goal )
{
self.success = true;
maps\mp\alien\_challenge::deactivate_current_challenge();
}
}
//=======================================================
// snipers_only
//=======================================================
update_snipers_only( weapon ,sMeansOfDeath, arc_death, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
{
if ( getweaponclass( weapon ) == "weapon_sniper" || is_true ( arc_death ) )
self.current_progress++;
update_challenge_progress ( self.current_progress , self.goal );
if ( self.current_progress >= self.goal )
{
self.success = true;
maps\mp\alien\_challenge::deactivate_current_challenge();
}
}
//=======================================================
// lmgs_only
//=======================================================
update_lmgs_only( weapon ,sMeansOfDeath, arc_death, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
{
if ( getweaponclass( weapon ) == "weapon_lmg" || is_true ( arc_death ) )
self.current_progress++;
update_challenge_progress ( self.current_progress , self.goal );
if ( self.current_progress >= self.goal )
{
self.success = true;
maps\mp\alien\_challenge::deactivate_current_challenge();
}
}
//=======================================================
// ar_only
//=======================================================
update_ar_only( weapon ,sMeansOfDeath, arc_death, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
{
if ( getweaponclass( weapon ) == "weapon_assault" || is_true ( arc_death ) )
self.current_progress++;
update_challenge_progress ( self.current_progress , self.goal );
if ( self.current_progress >= self.goal )
{
self.success = true;
maps\mp\alien\_challenge::deactivate_current_challenge();
}
}
//=======================================================
// smg_only
//=======================================================
update_smgs_only( weapon ,sMeansOfDeath, arc_death, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
{
if ( getweaponclass( weapon ) == "weapon_smg" || is_true ( arc_death ) )
self.current_progress++;
update_challenge_progress ( self.current_progress , self.goal );
if ( self.current_progress >= self.goal )
{
self.success = true;
maps\mp\alien\_challenge::deactivate_current_challenge();
}
}
//=======================================================
// kill_10_with_turrets
//=======================================================
activate_kill_10_with_turrets()
{
reset_kill_10_with_turrets_progress();
update_challenge_progress ( 0, self.goal );
}
deactivate_kill_10_with_turrets() { reset_kill_10_with_turrets_progress(); }
reset_kill_10_with_turrets_progress()
{
default_resetSuccess();
self.current_progress = 0;
}
update_kill_10_with_turrets ( aliens_killed, unused_2, unused_3, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
{
self.current_progress += aliens_killed; //self is the current struct return ( self.current_progress >= self.goal );
if ( self.current_progress >= self.goal )
self.success = true;
remaining = ( self.goal - self.current_progress );
update_challenge_progress ( self.current_progress, self.goal );
if ( self.success )
maps\mp\alien\_challenge::deactivate_current_challenge();
}
//=======================================================
// kill_airborne_aliens
//=======================================================
activate_kill_airborne_aliens()
{
reset_kill_airborne_aliens_progress();
update_challenge_progress ( 0, self.goal );
}
deactivate_kill_airborne_aliens() { reset_kill_airborne_aliens_progress(); }
reset_kill_airborne_aliens_progress()
{
default_resetSuccess();
self.current_progress = 0;
}
update_kill_airborne_aliens ( aliens_killed, unused_2, unused_3, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
{
self.current_progress += aliens_killed; //self is the current struct return ( self.current_progress >= self.goal );
if ( self.current_progress >= self.goal )
self.success = true;
remaining = ( self.goal - self.current_progress );
update_challenge_progress ( self.current_progress, self.goal );
if ( self.success )
maps\mp\alien\_challenge::deactivate_current_challenge();
}
//=======================================================
// melee only
//=======================================================
activate_melee_only() { reset_melee_only_progress(); }
deactivate_melee_only() { reset_melee_only_progress(); }
reset_melee_only_progress()
{
default_resetSuccess();
}
update_melee_only ( unused_1, unused_2, unused_3, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
{
self.success = false;
maps\mp\alien\_challenge::deactivate_current_challenge();
}
//=======================================================
// stay within area
//=======================================================
pre_activate_stay_within_area()
{
ring_location = get_challenge_ring_location( level.current_hive_name );
trace = BulletTrace( ring_location + (0,0,20), ring_location - (0,0,20), false,undefined,true,false,true,true );
self.ring_ent = spawn ( "script_model",trace["position"] );
self.ring_ent setmodel( "tag_origin" );
wait( 0.1 );
self.ring_fx = PlayFXOnTag(level._effect["challenge_ring"], self.ring_ent, "tag_origin" );
return true;
}
activate_stay_within_area()
{
default_resetSuccess();
self.current_progress = 0;
self.distance_check = 150*150;
update_challenge_progress ( 0, self.goal );
}
update_stay_within_area ( alien_pos, player_pos, unused_3, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
{
if ( abs( player_pos[2] - self.ring_ent.origin[2] ) > 75 )
return; //player is too far above/below the challenge zone
dist = distancesquared ( player_pos, self.ring_ent.origin );
if ( dist > self.distance_check ) //make sure that you are not too far above/below the challenge zone
return;
self.current_progress ++;
if ( self.current_progress >= self.goal )
{
self.success = true;
}
remaining = ( self.goal - self.current_progress );
update_challenge_progress ( self.current_progress, self.goal );
if ( self.success )
maps\mp\alien\_challenge::deactivate_current_challenge();
}
deactivate_stay_within_area()
{
level notify( "ring_challenge_ended" );
self.current_progress = 0;
self.ring_ent delete();
self.ring_fx = undefined;
if( isDefined( level.ring_waypoint_icon ))
level.ring_waypoint_icon destroy();
default_resetSuccess();
}
//=======================================================
// kill 10 in 30
//=======================================================
activate_kill_10_in_30()
{
default_resetSuccess();
self.current_progress = 0;
challenge_time = int ( gettime() + 30000 );
foreach ( player in level.players )
{
player SetClientOmnvar ( "ui_intel_timer", challenge_time );
}
level.current_challenge_timer = 30;
level thread update_current_challenge_timer();
update_challenge_progress ( 0, self.goal );
level thread kill_10_in_30_timer( self );
}
kill_10_in_30_timer( challenge )
{
level endon( "game_ended" );
self endon( "success" );
wait ( 30 );
self.success = false;
maps\mp\alien\_challenge::deactivate_current_challenge();
}
update_kill_10_in_30( num_killed, unused_2, unused_3, unused_4, unused_5, unused_6, unused_7, unused_8, unused_9 )
{
self.current_progress+= num_killed;
if ( self.current_progress >= self.goal )
{
self.success = true;
self notify( "success" );
}
remaining = ( self.goal - self.current_progress );
update_challenge_progress ( self.current_progress, self.goal );
if ( self.success )
maps\mp\alien\_challenge::deactivate_current_challenge();
}
/*
=============
///ScriptDocBegin
"Name: update_alien_death_challenges()"
"Summary: Update any challenges related to aliens dying a specifc way"
"Module: Alien"
"Example: update_alien_death_challenges( eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration )"
"SPMP: multiplayer"
///ScriptDocEnd
=============
*/
update_alien_death_challenges( eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration )
{
if ( !isDefined( level.current_challenge ) )
return;
current_challenge = level.current_challenge;
//for DLC challenges
if ( isDefined( level.custom_death_challenge_func ) )
{
continue_processing_challenges = self [[level.custom_death_challenge_func]]( eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration );
if ( !is_true ( continue_processing_challenges ) )
return;
}
attacker_is_player = isDefined ( eAttacker ) && isPlayer ( eAttacker );
attacker_defined = isDefined ( eAttacker );
inflictor_is_player = IsDefined ( eInflictor ) && isPlayer( eInflictor );
inflictor_defined = isDefined ( eInflictor );
alien_type = self get_alien_type();
weapon_defined = isDefined( sWeapon );
explosive_kill = false;
if ( weapon_defined )
{
explosive_kill = is_explosive_kill( sWeapon );
}
is_trap_kill = false;
if( inflictor_defined )
is_trap_kill = is_trap( eInflictor );
switch ( current_challenge )
{
case "pistols_only":
case "shotguns_only":
case "snipers_only":
case "lmgs_only":
case "ar_only":
case "smg_only":
if ( weapon_defined && sMeansOfDeath != "MOD_MELEE" )
{
isArcDeath = is_arc_death( eInflictor, eAttacker, attacker_defined, attacker_is_player, inflictor_defined,inflictor_is_player);
if ( !inflictor_defined || inflictor_is_player || isArcDeath ) //don't allow non-player damage to affect the weapons challenges
{
if ( isArcDeath )
maps\mp\alien\_challenge::update_challenge( current_challenge, sWeapon, sMeansofDeath, isArcDeath );
else
maps\mp\alien\_challenge::update_challenge( current_challenge, sWeapon, sMeansofDeath );
}
}
break;
case "melee_5_goons":
if ( alien_type == "goon" && attacker_is_player && sMeansOfDeath == "MOD_MELEE" )
maps\mp\alien\_challenge::update_challenge( "melee_5_goons", 1 );
break;
case "melee_spitter":
if ( alien_type == "spitter" && attacker_is_player && sMeansOfDeath == "MOD_MELEE" )
maps\mp\alien\_challenge::update_challenge( "melee_spitter", 1 );
break;
case "melee_only":
if ( attacker_is_player && sMeansOfDeath != "MOD_MELEE" )
maps\mp\alien\_challenge::update_challenge( "melee_only" );
break;
case "kill_airborne_aliens":
if ( attacker_is_player && isDefined( self.trajectoryActive ) && self.trajectoryActive )
maps\mp\alien\_challenge::update_challenge( "kill_airborne_aliens", 1 );
else if ( attacker_is_player && ( is_true ( self.in_air ) || alien_type == "bomber" ) && sMeansOfDeath != "MOD_SUICIDE" )
maps\mp\alien\_challenge::update_challenge( "kill_airborne_aliens", 1 );
else if ( attacker_is_player && alien_type == "ancestor" )
maps\mp\alien\_challenge::update_challenge( "kill_airborne_aliens", 1 );
break;
case "stay_prone":
if ( ( attacker_is_player || inflictor_is_player )&& eAttacker GetStance() == "prone" )
maps\mp\alien\_challenge::update_challenge( "stay_prone", 1 );
break;
case "kill_10_with_turrets":
if ( attacker_is_player && weapon_defined && maps\mp\alien\_damage::isAlienTurret( sWeapon ) )
maps\mp\alien\_challenge::update_challenge( "kill_10_with_turrets", 1 );
else if ( attacker_defined && isDefined( eAttacker.classname ) && eAttacker.classname == "misc_turret" && weapon_defined && maps\mp\alien\_damage::isAlienTurret( sWeapon ) )
maps\mp\alien\_challenge::update_challenge( "kill_10_with_turrets", 1 );
break;
case "stay_within_area":
if ( attacker_is_player )
maps\mp\alien\_challenge::update_challenge( "stay_within_area", self.origin, eAttacker.origin );
break;
case "kill_10_in_30":
if ( attacker_is_player )
maps\mp\alien\_challenge::update_challenge( "kill_10_in_30", 1 );
break;
case "kill_10_with_propane":
if ( weapon_defined && sWeapon == "alienpropanetank_mp" ) //killed with propane tank explosion
maps\mp\alien\_challenge::update_challenge( "kill_10_with_propane", 1 );
else if ( inflictor_defined && isDefined( eInflictor.classname) && eInflictor.classname == "trigger_radius" ) //killed with lingering fire damage from propane tank explosion
maps\mp\alien\_challenge::update_challenge( "kill_10_with_propane", 1 );
break;
case "kill_10_with_traps":
if ( is_trap_kill )
maps\mp\alien\_challenge::update_challenge( "kill_10_with_traps", 1 );
break;
}
}
is_arc_death( eInflictor, eAttacker,attacker_defined, attacker_is_player, inflictor_defined, inflictor_is_player )
{
return ( attacker_defined &&
attacker_is_player &&
inflictor_defined &&
!inflictor_is_player &&
IsDefined( eAttacker.stun_struct )&&
IsDefined( eAttacker.stun_struct.attack_bolt )&&
eInflictor == eAttacker.stun_struct.attack_bolt );
}
update_alien_damage_challenge( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, timeOffset, alien )
{
if ( !IsDefined( level.current_challenge ) )
return;
if ( level.current_challenge == "melee_only" && sMeansOfDeath != "MOD_MELEE" && !is_flaming_stowed_riotshield_damage( sMeansOfDeath, sWeapon, eInflictor ) && IsPlayer( eAttacker ) )
{
maps\mp\alien\_challenge::update_challenge( "melee_only" );
}
if ( isDefined ( eAttacker ) && isPlayer( eAttacker ) )
{
//for DLC challenges
if ( isDefined( level.custom_damage_challenge_func ) )
{
continue_processing_challenges = self [[level.custom_damage_challenge_func]]( eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, alien );
if ( !is_true ( continue_processing_challenges ) )
return;
}
eAttacker endon( "disconnect" );
waitframe();
if ( isDefined ( eAttacker.fired_weapon ) ) //for tracking accuracy challenges
{
if ( isDefined ( sWeapon ) && sWeapon == "alienpropanetank_mp" || sWeapon == "spore_pet_beam_mp" )
{
return;
}
if ( isDefined ( eInflictor) && isDefined( eInflictor.classname) && eInflictor.classname == "trigger_radius" ) //killed with lingering fire damage from propane tank explosion
{
return;
}
if ( isDefined ( sMeansOfDeath ) && sMeansOfDeath == "MOD_MELEE" )
{
return;
}
if ( iDFlags & 8 ) //no bullet penetration kills for accuracy, screws it up
{
return;
}
if ( maps\mp\alien\_damage::isAlienNonMannedTurret( sWeapon ) ) //no accuracy tracking with the automated turrets
{
return;
}
if ( sMeansOfDeath == "MOD_EXPLOSIVE_BULLET" && sHitLoc == "none" ) //explosive bullet damage - doesn't count
{
return;
}
if ( isDefined( sWeapon ) && sWeapon == "alienims_projectile_mp" )
{
return;
}
if ( isDefined ( sWeapon ) && getWeaponClass( sWeapon ) == "weapon_shotgun" )
{
eAttacker.fired_weapon = undefined;
}
if ( IsDefined( level.current_challenge ) )
{
if ( level.current_challenge == "75_percent_accuracy" )
maps\mp\alien\_challenge::update_challenge( "75_percent_accuracy", 1 );
else if ( level.current_challenge == "50_percent_accuracy" )
maps\mp\alien\_challenge::update_challenge( "50_percent_accuracy", 1 );
}
eAttacker.fired_weapon = undefined;
}
}
}
is_explosive_kill( sWeapon )
{
switch ( sWeapon )
{
case "aliensemtex_mp":
case "alienbetty_mp":
case "alienclaymore_mp":
case "iw6_alienmk32_mp":
case "iw6_alienmk321_mp":
case "iw6_alienmk322_mp":
case "iw6_alienmk323_mp":
case "iw6_alienmk324_mp":
return true;
default:
return false;
}
}
clear_last_alien_damaged_time()
{
self endon( "disconnect" );
wait( .05 );
self.last_alien_damaged_time = undefined;
}
update_alien_weapon_challenges ( weapon, sMeansOfDeath )
{
if ( !isDefined ( level.current_challenge ) )
return;
switch ( level.current_challenge )
{
case "pistols_only":
case "shotguns_only":
case "snipers_only":
case "lmgs_only":
case "ar_only":
case "smg_only":
maps\mp\alien\_challenge::update_challenge( level.current_challenge, weapon, sMeansofDeath );
break;
default:
return;
}
}
update_challenge_progress ( current_val, max_val )
{
foreach ( player in level.players )
{
player SetClientOmnvar ( "ui_intel_progress_current",int( current_val ) );
player setClientOmnvar ( "ui_intel_progress_max",int ( max_val ) );
}
level.current_challenge_progress_max = max_val;
level.current_challenge_progress_current = current_val;
}
update_challenge_percent ( percent )
{
foreach ( player in level.players )
{
player SetClientOmnvar ( "ui_intel_percent",percent );
}
level.current_challenge_percent = percent;
}
update_percent_accuracy( challenge )
{
level endon( "deactivate_track_accuracy" );
last_accuracy = 0;
last_accuracy_count = 0;
while ( 1 )
{
if ( (challenge.total_shots_hit == 0 && challenge.total_shots_fired == 0) || challenge.total_shots_fired < 1 )
{
wait( 0.25);
continue;
}
accuracy = int ( ( challenge.total_shots_hit/challenge.total_shots_fired ) * 10000 );
//cap accuracy at no greater than 100% ( can go above 100% if you kill more than 1 alien with 1 bullet )
if ( accuracy > 10000 )
accuracy = 10000;
trimmed_accuracy = accuracy / 100;
challenge.current_accuracy = trimmed_accuracy;
if ( accuracy == last_accuracy )
{
last_accuracy_count++;
if ( last_accuracy_count > 2 ) //don't update the challenge until the value has stabilized for 3 frames
{
update_challenge_percent( accuracy );
last_accuracy_count = 0;
}
}
else
{
last_accuracy_count = 0;
}
wait .05;
last_accuracy = accuracy;
}
}
fail_challenge( challenge )
{
challenge.success = false;
maps\mp\alien\_challenge::deactivate_current_challenge();
}
track_percent_accuracy_shots_fired( challenge )
{
foreach ( player in level.players )
{
if ( !isAlive ( player ) )
continue;
player thread track_percent_accuracy_shots_fired_internal( challenge );
}
}
track_percent_accuracy_shots_fired_internal( challenge )
{
level endon( "deactivate_track_accuracy" );
self endon( "disconnect" );
self endon( "death" );
self childthread track_percent_accuracy_misc_shots_fired( challenge ); //for tracking turrets and other misc weapon fires
while ( 1 )
{
self waittill( "weapon_fired", wpn );
if ( !weapon_should_count_towards_accuracy_challenge( wpn ) )
continue;
self.fired_weapon = true;
challenge.total_shots_fired++;
}
}
track_percent_accuracy_misc_shots_fired( challenge )
{
level endon( "deactivate_track_accuracy" );
self endon( "disconnect" );
self endon( "death" );
while ( 1 )
{
self waittill_any( "turret_fire","nx1_large_fire" );
self.fired_weapon = true;
challenge.total_shots_fired++;
}
}
update_current_challenge_timer()
{
level endon( "stop_challenge_timer" );
while ( level.current_challenge_timer > 0 )
{
wait ( .1 );
level.current_challenge_timer = level.current_challenge_timer - 0.1;
}
}
weapon_should_count_towards_accuracy_challenge( wpn )
{
switch ( wpn )
{
case "alienbomb_mp":
case "alienclaymore_mp":
case "bouncingbetty_mp":
case "alientrophy_mp":
case "deployable_vest_marker_mp":
case "aliendeployable_crate_marker_mp":
case "alienpropanetank_mp":
case "alien_turret_marker_mp":
case "switchblade_laptop_mp":
case "mortar_detonator_mp":
return false;
}
return true;
}
get_challenge_scalar( challenge_name )
{
return [[level.challenge_scalar_func]]( challenge_name );
}
default_challenge_scalar_func( challenge_name )
{
switch ( challenge_name )
{
case "pistols_only":
case "snipers_only":
case "shotguns_only":
case "ar_only":
case "smg_only":
case "lmgs_only":
switch ( level.players.size )
{
case 1: return 15;
case 2: return 20;
case 3:
case 4: return 25;
}
case "kill_10_with_propane":
case "kill_10_with_traps":
case "kill_10_with_turrets":
switch ( level.players.size )
{
case 1: return 5;
case 2:
case 3:
case 4: return 10;
}
case "kill_10_in_30":
switch ( level.players.size )
{
case 1: return 5;
case 2:
case 3:
case 4: return 10;
}
case "stay_within_area":
switch ( level.players.size )
{
case 1: return 10;
case 2:
case 3:
case 4: return 20;
}
case "kill_airborne_aliens":
switch ( level.players.size )
{
case 1: return 3;
case 2:
case 3:
case 4: return 5;
}
case "stay_prone":
switch ( level.players.size )
{
case 1: return 15;
case 2:
case 3:
case 4: return 25;
}
case "spend_20k": //the string contains "$X,000" so we don't need to pass in the whole number
switch ( level.players.size )
{
case 1: return 6;
case 2: return 10;
case 3: return 15;
case 4: return 20;
}
case "spend_10k": //the string contains "$X,000" so we don't need to pass in the whole number
switch ( level.players.size )
{
case 1: return 6;
case 2:
case 3:
case 4: return 10;
}
case "melee_5_goons":
switch ( level.players.size )
{
case 1: return 5;
case 2: return 10;
case 3: return 10;
case 4: return 15;
}
}
return undefined;
}
show_barrier_hive_intel()
{
CONST_CHALLENGE_HIVE_INTEL = 52; //challenge table entry
CONST_BARRIER_HIVE_TITLE = 2; // omnvar entry to show barrier hive title in the challenge window
foreach ( player in level.players )
{
player SetClientOmnvar("ui_intel_title", CONST_BARRIER_HIVE_TITLE );
player SetClientOmnvar("ui_intel_active_index", CONST_CHALLENGE_HIVE_INTEL );
}
level.current_challenge_title = CONST_BARRIER_HIVE_TITLE;
level.current_challenge_index = CONST_CHALLENGE_HIVE_INTEL;
}
hide_barrier_hive_intel()
{
foreach ( player in level.players )
{
player SetClientOmnvar("ui_intel_active_index",-1 );
player SetClientOmnvar("ui_intel_title", -1 );
}
level.current_challenge_title = -1;
level.current_challenge_index = -1;
}
get_challenge_ring_location( hive_name )
{
if( isDefined( level.challenge_ring_location_func ) )
return [[level.challenge_ring_location_func]]( hive_name );
return undefined;
}
create_challenge_waypoints( item )
{
wayPoint_SHADER = "waypoint_alien_weapon_challenge";
wayPoint_WIDTH = 14;
wayPoint_HEIGHT = 14;
wayPoint_ALPHA = 0.75;
wayPoint_POS = item.origin;
if ( level.script == "mp_alien_armory" )
wayPoint_ALPHA = 0;
waypoint_icon = maps\mp\alien\_hud::make_wayPoint( wayPoint_SHADER, wayPoint_WIDTH, wayPoint_HEIGHT, wayPoint_ALPHA, wayPoint_POS );
return waypoint_icon;
}
setup_challenge_waypoints( challenge )
{
current_area = get_current_area_name();
current_challenge = level.current_challenge;
if ( current_challenge == "pistols_only" )
return;
challenge_weapons = get_challenge_weapons ( current_area, current_challenge );
self.challenge_weapons = [];
foreach ( weapon in challenge_weapons )
{
self.challenge_weapons[ self.challenge_weapons.size ] = getBaseWeaponName( weapon );
}
}
get_challenge_weapons ( current_area, current_challenge )
{
challenge_weapon_class = get_weapon_class_for_current_challenge( current_challenge );
if ( !IsDefined (challenge_weapon_class) && current_challenge == "semi_autos_only" )
{
challenge_weapon_class = [ "weapon_dmr", "weapon_sniper" ];
}
possible_weapons = [];
waypoints = [];
foreach ( item in level.world_items )
{
if ( level.script == "mp_alien_armory" )
{
if ( IsDefined ( item.script_noteworthy ) && item.script_noteworthy == "weapon_iw6_aliendlc15_mp" )
{
item.areas = [];
item.areas [0] = "checkpoint";
}
}
if ( IsDefined ( item.areas ) && item.areas[ 0 ] == current_area )
{
if ( !IsDefined ( item.script_noteworthy ) )
continue;
base_weapon = GetSubStr ( item.script_noteworthy, 7 );
WeaponClass = getWeaponClass( base_weapon );
if ( IsArray ( challenge_weapon_class ) )
{
if ( array_contains ( challenge_weapon_class, WeaponClass ) )
{
possible_weapons[ possible_weapons.size ] = base_weapon;
waypoint = create_challenge_waypoints( item );
waypoints[ waypoints.size ] = waypoint;
}
}
else
{
if ( challenge_weapon_class != WeaponClass )
continue;
possible_weapons[ possible_weapons.size ] = base_weapon;
waypoint = create_challenge_waypoints( item );
waypoints[ waypoints.size ] = waypoint;
}
}
}
self.waypoints = waypoints;
return possible_weapons;
}
get_weapon_class_for_current_challenge( current_challenge )
{
switch ( current_challenge )
{
case "ar_only": return "weapon_assault";
case "snipers_only": return "weapon_sniper";
case "smg_only": return "weapon_smg";
case "lmgs_only": return "weapon_lmg";
case "shotguns_only": return "weapon_shotgun";
}
}
deactivate_weapon_challenge_waypoints()
{
if ( IsDefined ( self ) && IsDefined ( self.waypoints ) )
{
foreach ( waypoint in self.waypoints )
{
waypoint Destroy ();
}
}
default_resetSuccess();
}
//self = an alien
focus_fire_update_alien_outline( player )
{
foreach ( player in level.players )
{
if ( array_contains ( self.damaged_by_players, player ) )
{
if ( isDefined( player.isFeral ) && player.isFeral )
{
maps\mp\alien\_outline_proto::enable_outline_for_player( self, player, 4, false, "high" );
}
else
{
maps\mp\alien\_outline_proto::disable_outline_for_player( self, player ); //remove outline once damaged
}
}
else
{
maps\mp\alien\_outline_proto::enable_outline_for_player( self, player, 0, false, "high" ); //show white outline to players who haven't shot the alien
}
}
}