2024-12-11 11:28:08 +01:00

597 lines
16 KiB
Plaintext

#include maps\mp\gametypes\_hud_util;
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\alien\_persistence;
#include maps\mp\alien\_perk_utility;
//<TODO JC> When ship, all of those HUD elements should be replaced/handled by LUA
CREDIT_GAIN_DEFAULT_FONT_SIZE = 1.38;
SPLITSCREEN_CREDIT_GAIN_DEFAULT_FONT_SIZE = 1.2;
init()
{
register_end_game_string_index();
}
playPainOverlay( attacker, weapon_name, direction )
{
// No pain overlay for the player while in Vanguard
if ( isUsingRemote() && maps\mp\alien\_utility::is_true( self.vanguard_num ) )
return;
damage_direction = get_damage_direction( direction );
if ( is_spitter_spit( weapon_name ) ) {
self play_spitter_pain_overlay(damage_direction);
} else if ( is_spitter_gas( weapon_name ) ) {
self play_spitter_pain_overlay( "center" );
} else if ( is_elite_attack( attacker ) ) {
// play_slash_pain_overlay( damage_direction );
PlayFXOnTagForClients( level._effect[ "vfx_melee_blood_spray" ], self, "tag_eye", self );
} else {
self play_basic_pain_overlay( damage_direction );
}
}
get_damage_direction( direction )
{
COS_15 = 0.965;
possible_directions = ["left", "center", "right"];
if ( !isDefined( direction ) )
return possible_directions[randomInt( possible_directions.size )];
direction *= -1; //change direction to be based on the player's view
self_forward = anglesToForward( self.angles );
forward_dot_product = VectorDot( direction, self_forward );
if ( forward_dot_product > COS_15 )
return "center";
self_right = anglesToRight( self.angles );
right_dot_product = VectorDot( direction, self_right );
if ( right_dot_product > 0 )
return "right";
else
return "left";
}
play_basic_pain_overlay( damage_direction )
{
if ( damage_direction == "left" )
PlayFXOnTagForClients( level._effect[ "vfx_blood_hit_left" ], self, "tag_eye", self );
else if ( damage_direction == "center" )
PlayFXOnTagForClients( level._effect[ "vfx_melee_blood_spray" ], self, "tag_eye", self );
else if ( damage_direction == "right" )
PlayFXOnTagForClients( level._effect[ "vfx_blood_hit_right" ], self, "tag_eye", self );
else
AssertMsg( "Unknown damage_direction: " + damage_direction );
}
play_spitter_pain_overlay( damage_direction )
{
if ( damage_direction == "left" )
PlayFXOnTagForClients( level._effect[ "vfx_alien_spitter_hit_left" ], self, "tag_eye", self );
else if ( damage_direction == "center" )
PlayFXOnTagForClients( level._effect[ "vfx_alien_spitter_hit_center" ], self, "tag_eye", self );
else if ( damage_direction == "right" )
PlayFXOnTagForClients( level._effect[ "vfx_alien_spitter_hit_right" ], self, "tag_eye", self );
else
AssertMsg( "Unknown damage_direction: " + damage_direction );
}
play_slash_pain_overlay( damage_direction )
{
if ( damage_direction == "center" ) // We currently do not have a center HUD overlay for slash center
damage_direction = random_pick_R_or_L();
if ( damage_direction == "left" )
PlayFXOnTagForClients( level._effect[ "vfx_blood_hit_left" ], self, "tag_eye", self );
else if ( damage_direction == "right" )
PlayFXOnTagForClients( level._effect[ "vfx_blood_hit_right" ], self, "tag_eye", self );
else
AssertMsg( "Unknown damage_direction: " + damage_direction );
}
play_goo_pain_overlay( damage_direction )
{
if ( damage_direction == "left" )
PlayFXOnTagForClients( level._effect[ "vfx_alien_spitter_hit_left" ], self, "tag_eye", self );
else if ( damage_direction == "center" )
PlayFXOnTagForClients( level._effect[ "vfx_alien_spitter_hit_center" ], self, "tag_eye", self );
else if ( damage_direction == "right" )
PlayFXOnTagForClients( level._effect[ "vfx_alien_spitter_hit_right" ], self, "tag_eye", self );
else
AssertMsg( "Unknown damage_direction: " + damage_direction );
}
random_pick_R_or_L()
{
if ( cointoss() )
return "right";
else
return "left";
}
is_spitter_spit( weapon_name )
{
if ( !isDefined( weapon_name ) )
return false;
return ( weapon_name == "alienspit_mp" );
}
is_spitter_gas( weapon_name )
{
if ( !isDefined( weapon_name ) )
return false;
return ( weapon_name == "alienspit_gas_mp" );
}
is_elite_attack( attacker )
{
if ( !isDefined( attacker ) || !attacker maps\mp\alien\_utility::is_alien_agent() )
return false;
return ( attacker maps\mp\alien\_utility::get_alien_type() == "elite" );
}
//===========================================
// lastStandUpdateReviveIconColorAlien
//===========================================
lastStandUpdateReviveIconColorAlien( bleedOutTime )
{
self endon( "death" );
level endon( "game_ended" );
wait bleedOutTime / 3;
self.color = (1.0, 0.64, 0.0);
wait bleedOutTime / 3;
self.color = (1.0, 0.0, 0.0);
}
makeReviveIcon( owner, color, bleedOutTime )
{
reviveIcon = newTeamHudElem( owner.team );
reviveIcon setShader( "waypoint_alien_revive", 8, 8 );
reviveIcon setWaypoint( true, true );
reviveIcon SetTargetEnt( self );
reviveIcon.color = color;
reviveIcon thread deleteReviveIcon( owner );
if ( isDefined ( bleedOutTime ) )
reviveIcon thread lastStandUpdateReviveIconColorAlien( bleedOutTime );
return reviveIcon;
}
deleteReviveIcon( owner )
{
self endon ( "death" );
owner waittill_any( "disconnect", "revive", "death" );
self destroy();
}
hideHudElementOnGameEnd( hudElement )
{
level waittill("game_ended");
if ( isDefined( hudElement ) )
hudElement.alpha = 0;
}
blocker_hive_hp_bar()
{
submitted_health = 100000; // initial large value to get through initial delta comparison
while ( isdefined( self ) && self.health > 0 )
{
self waittill_notify_or_timeout( "damage", 2 );
if ( !isDefined ( self ) || self.health <= 0 )
break;
hp_ratio = max( 0.005, self.health / self.maxhealth );
inverse_health = 100 - hp_ratio * 100;
// omnvar throttle
throttle = 0.5;
if ( abs( abs( submitted_health ) - abs( inverse_health ) ) > throttle )
{
// inverse_health is ( max - health remaining ) for LUI
SetOmnvar ( "ui_alien_boss_progression", inverse_health );
submitted_health = inverse_health;
}
}
SetOmnvar ( "ui_alien_boss_status", 0 );
}
blocker_hive_chopper_hp_bar()
{
while ( isdefined( self ) && self.health > 0 )
{
self waittill_notify_or_timeout( "damage", 2 );
if ( !isDefined ( self ) || self.health <= 0 )
break;
hp_ratio = self.health / self.maxhealth;
health_remaining = hp_ratio * 100;
}
}
init_player_hud_onconnect()
{
VisionSetPain( "near_death_mp" );
/#
self.hud_laststand_count = self create_hud_laststand_count( 0, -20, 1.0 );
#/
}
/#
// Temp HUD for displaying the number of times the player drops into last stand
create_hud_laststand_count( xpos, ypos, scale )
{
self.hud_laststand_counter = 0;
hud_score = self maps\mp\gametypes\_hud_util::createFontString( "objective", scale );
hud_score maps\mp\gametypes\_hud_util::setPoint( "BOTTOM LEFT", "BOTTOM LEFT", xpos, ypos );
hud_score.color = ( 1, 1, 0 );
hud_score.glowAlpha = 1;
hud_score.sort = 1;
hud_score.hideWhenInMenu = true;
hud_score.archived = true;
hud_score.label = &"";
hud_score setValue( 0 );
if ( getDvarInt( "debug_alien_laststand_hud", 0 ) == 1 )
hud_score.alpha = 1;
else
hud_score.alpha = 0;
return hud_score;
}
update_hud_laststand_count()
{
self.hud_laststand_counter++;
self.hud_laststand_count setValue( self.hud_laststand_counter );
}
#/
createSpendHintHUD( resource, rank ,message )
{
if ( !isDefined ( message ) )
self setLowerMessage( "spend_hint", &"ALIEN_COLLECTIBLES_PULL_TO_SPEND" );
else
self setLowerMessage( "spend_hint", message );
self thread hideSpendHintIcon();
}
hideSpendHintIcon()
{
self endon ( "death" );
self endon ( "disconnect" );
self waittill_any_timeout( 3, "action_finish_used","player_action_slot_restart", "kill_spendhint" );
self clearLowerMessage( "spend_hint" );
}
intro_black_screen()
{
self endon( "disconnect" );
self endon( "stop_intro" );
self.introscreen_overlay = newClientHudElem( self );
self.introscreen_overlay.x = 0;
self.introscreen_overlay.y = 0;
self.introscreen_overlay setshader( "black", 640, 480 );
self.introscreen_overlay.alignX = "left";
self.introscreen_overlay.alignY = "top";
self.introscreen_overlay.sort = 1;
self.introscreen_overlay.horzAlign = "fullscreen";
self.introscreen_overlay.vertAlign = "fullscreen";
self.introscreen_overlay.alpha = 1;
self.introscreen_overlay.foreground = true;
level waittill( "introscreen_over" );
self.introscreen_overlay FadeOverTime( 3 );
self.introscreen_overlay.alpha = 0;
wait ( 3.5);
self.introscreen_overlay Destroy();
}
introscreen_corner_line( string, index_key )
{
if ( !IsDefined( level.intro_offset ) )
level.intro_offset = 0;
else
level.intro_offset++;
y = cornerline_height();
font_scale = 1.6;
if ( level.splitscreen )
font_scale = 2;
hudelem = NewHudElem();
hudelem.x = 20;
hudelem.y = y;
hudelem.alignX = "left";
hudelem.alignY = "bottom";
hudelem.horzAlign = "left";
hudelem.vertAlign = "bottom";
hudelem.sort = 3;// force to draw after the background
hudelem.foreground = true;
hudelem SetText( string );
hudelem.alpha = 1;
hudelem.hidewheninmenu = true;
hudelem.fontScale = font_scale;// was 1.6 and 2.4, larger font change
hudelem.color = ( 0.8, 1.0, 0.8 );
hudelem.font = "default";
hudelem.glowColor = ( 0.3, 0.6, 0.3 );
hudelem.glowAlpha = 1;
hudelem setPulseFX( 35, 4000, 1000 );
return hudelem;
}
cornerline_height()
{
offset = -92;
if ( level.splitscreen )
offset = -110;
return( ( ( level.intro_offset ) * 20 ) - 92 );
}
displayAlienGameEnd( winner, endReasonTextIndex )
{
foreach ( player in level.players )
{
if ( isDefined( player.connectedPostGame ) || player.pers["team"] == "spectator" )
continue;
player thread alienOutcomeNotify( winner, endReasonTextIndex );
player thread freezeControlsWrapper( true );
}
level notify ( "game_win", winner );
maps\mp\gametypes\_gamelogic::roundEndWait( level.postRoundTime, true );
}
alienOutcomeNotify( winner, end_reason_text_index )
{
self endon ( "disconnect" );
self notify ( "reset_outcome" );
wait ( 0.5 );
team = self.pers["team"];
if ( !IsDefined( team ) || (team != "allies" && team != "axis") )
team = "allies";
// wait for notifies to finish
while ( self maps\mp\gametypes\_hud_message::isDoingSplash() )
wait 0.05;
self endon ( "reset_outcome" );
if ( IsDefined( self.pers["team"] ) && winner == team )
outcome_title_index = get_end_game_string_index( "win" );
else
outcome_title_index = get_end_game_string_index( "fail" );
self setClientOmnvar( "ui_round_end_title" , outcome_title_index );
self setClientOmnvar( "ui_round_end_reason" , end_reason_text_index );
self setClientOmnvar( "ui_alien_show_eog_score", true );
}
register_end_game_string_index()
{
if ( isDefined( level.end_game_string_override ) )
[[ level.end_game_string_override ]]();
else
register_default_end_game_string_index();
}
register_default_end_game_string_index()
{
level.end_game_string_index = [];
//<NOTE J.C.> When LUA is ready to take over, those string references will be changed into indexes and set via
// proper omnvar. The actual string references are in RoundEndHud.lua
// for ui_round_end_title
level.end_game_string_index["win"] = 1; // &"ALIEN_COLLECTIBLES_MISSION_WIN";
level.end_game_string_index["fail"] = 2; // &"ALIEN_COLLECTIBLES_MISSION_FAIL";
// for ui_round_end_reason
level.end_game_string_index["all_escape"] = 1; // &"ALIEN_COLLECTIBLES_MISSION_WIN_ALL_ESCAPE";
level.end_game_string_index["some_escape"] = 2; // &"ALIEN_COLLECTIBLES_MISSION_WIN_CASUALTY";
level.end_game_string_index["fail_escape"] = 3; // &"ALIEN_COLLECTIBLES_MISSION_FAIL_ESCAPE";
level.end_game_string_index["drill_destroyed"] = 4; // &"ALIEN_COLLECTIBLES_MISSION_FAIL_DRILL_DESTROYED";
level.end_game_string_index["kia"] = 5; // &"ALIEN_COLLECTIBLES_MISSION_FAIL_KILLED_IN_ACTION";
level.end_game_string_index["host_end"] = 6; // &"ALIEN_COLLECTIBLES_MISSION_FAIL_HOST_END";
level.end_game_string_index["gas_fail"] = 7; // &"ALIEN_PICKUPS_BEACON_GAS_FAIL";
level.end_game_string_index["generator_destroyed"] = 8; // &"MP_ALIEN_LAST_GENERATOR_DESTROYED";
}
get_end_game_string_index( key )
{
return level.end_game_string_index[key];
}
show_encounter_scores()
{
level endon( "game_ended " );
SetOmnvar( "ui_alien_show_encounter_score", true );
wait 1.0; // Allow LUI to catch the change notification
SetOmnvar( "ui_alien_show_encounter_score", false );
}
reset_player_encounter_LUA_omnvars( player )
{
CONST_ENCOUNTER_SCORE_MAX_NUM_ROW = 8;
for ( row_number = 1; row_number <= CONST_ENCOUNTER_SCORE_MAX_NUM_ROW; row_number++ )
{
title_omnvar_name = "ui_alien_encounter_title_row_" + row_number;
score_omnvar_name = "ui_alien_encounter_score_row_" + row_number;
player setClientOmnvar( title_omnvar_name, 0 );
player setClientOmnvar( score_omnvar_name, 0 );
}
}
set_LUA_encounter_score_row( player, row_number, row_title, row_score )
{
omnvar_title_name = "ui_alien_encounter_title_row_" + row_number;
omnvar_score_name = "ui_alien_encounter_score_row_" + row_number;
player setClientOmnvar( omnvar_title_name, row_title );
player setClientOmnvar( omnvar_score_name, row_score );
}
set_LUA_EoG_score_row( player, row_number, row_title, row_score )
{
omnvar_title_name = "ui_alien_eog_title_row_" + row_number;
omnvar_score_name = "ui_alien_eog_score_row_" + row_number;
player setClientOmnvar( omnvar_title_name, row_title );
player setClientOmnvar( omnvar_score_name, row_score );
}
make_wayPoint( shader, icon_width, icon_height, icon_alpha, location )
{
icon = NewHudElem();
icon SetShader( shader, icon_width, icon_height );
icon.alpha = icon_alpha;
icon SetWayPoint( true, true );
icon.x = location[0];
icon.y = location[1];
icon.z = location[2];
return icon;
}
///////////////////////////////////////////////////////
// Chaos HUD external interface
///////////////////////////////////////////////////////
chaos_HUD_init()
{
level.last_combo_meter_reset_time = 0;
}
set_combo_counter( value )
{
SetOmnvar( "ui_alien_chaos_combo_counter", value );
}
set_score_streak( value )
{
SetOmnvar( "ui_alien_chaos_score_streak", value );
}
set_total_score( value )
{
SetOmnvar( "ui_alien_chaos_total_score", value );
}
reset_combo_meter( combo_duration )
{
if ( is_combo_meter_reset_this_frame() )
return;
foreach( player in level.players )
{
now = gettime();
player SetClientOmnvar( "ui_alien_chaos_combo_meter_start", now );
player SetClientOmnvar( "ui_alien_chaos_combo_meter_end", now + int ( combo_duration * 1000 ) );
}
}
is_combo_meter_reset_this_frame()
{
current_time = getTime();
previous_time = level.last_combo_meter_reset_time;
level.last_combo_meter_reset_time = current_time;
return ( current_time == previous_time );
}
set_grace_period_clock( grace_period_end_time )
{
setOmnvar( "ui_alien_chaos_grace_period", grace_period_end_time );
}
unset_grace_period_clock()
{
setOmnvar( "ui_alien_chaos_grace_period", 0 );
}
set_has_combo_freeze( player, has_combo_freeze )
{
player setClientOmnvar( "ui_alien_chaos_has_meter_freeze", has_combo_freeze );
}
freeze_combo_meter( duration )
{
current_time = gettime();
SetOmnvar( "ui_alien_chaos_meter_freeze_start", current_time );
SetOmnvar( "ui_alien_chaos_meter_freeze_end", current_time + duration * 1000 );
}
unfreeze_combo_meter()
{
SetOmnvar( "ui_alien_chaos_meter_freeze_start", 0 );
SetOmnvar( "ui_alien_chaos_meter_freeze_end", 0 );
}
set_event_count( event_id, event_count )
{
foreach( player in level.players )
player SetClientOmnvar( "ui_alien_eog_score_row_" + event_id, event_count );
}
set_has_chaos_class_skill_bonus( player, class_index )
{
player setClientOmnvar( "ui_alien_chaos_class_skill_bonus", class_index );
}
unset_has_chaos_class_skill_bonus( player )
{
player setClientOmnvar( "ui_alien_chaos_class_skill_bonus", 0 );
}
set_last_stand_timer( player, duration )
{
player setClientOmnvar( "ui_laststand_end_milliseconds", gettime() + ( duration * 1000 ) );
}
clear_last_stand_timer( player )
{
player setClientOmnvar( "ui_laststand_end_milliseconds", 0 );
}
turn_on_drill_meter_HUD( drill_duration_sec )
{
// Make drill meter move
SetOmnvar( "ui_alien_drill_state", 1 );
// Set UI drill end time
drill_end_time_ms = int ( gettime() + drill_duration_sec * 1000 );
SetOmnvar ( "ui_alien_drill_start_milliseconds" , gettime() );
SetOmnvar( "ui_alien_drill_end_milliseconds", drill_end_time_ms );
}
update_drill_health( drill_health )
{
SetOmnvar( "ui_alien_drill_health_text", drill_health );
}