2024-02-13 13:20:49 +01:00

1147 lines
34 KiB
Plaintext

// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
precacheanims()
{
}
getdefinitionvalue( var_0, var_1 )
{
if ( !isdefined( var_1 ) )
var_1 = 2;
var_2 = tablelookup( "mp/alien/alien_kraken_definition.csv", 0, var_0, var_1 );
if ( !isstring( var_0 ) )
{
if ( !issubstr( var_2, "." ) )
var_2 = int( var_2 );
else
var_2 = float( var_2 );
}
return var_2;
}
getarraydefinitionvalue( var_0, var_1 )
{
if ( !isdefined( var_1 ) )
var_1 = 2;
var_2 = strtok( tablelookup( "mp/alien/alien_kraken_definition.csv", 0, var_0, var_1 ), " ," );
for ( var_3 = 0; var_3 < var_2.size; var_3++ )
{
if ( !isstring( var_0 ) )
{
if ( !issubstr( var_2[var_3], "." ) )
{
var_2[var_3] = int( var_2[var_3] );
continue;
}
var_2[var_3] = float( var_2[var_3] );
}
}
return var_2;
}
getstagearraydefinitionvalues( var_0, var_1 )
{
var_2 = "kraken";
for ( var_3 = 0; var_3 < 4; var_3++ )
{
var_4 = "stage_" + ( var_3 + 1 );
level.alien_types[var_2].attributes[var_4][var_0] = getarraydefinitionvalue( var_1, 2 + var_3 );
}
}
getstagedefinitionvalues( var_0, var_1 )
{
var_2 = "kraken";
for ( var_3 = 0; var_3 < 4; var_3++ )
{
var_4 = "stage_" + ( var_3 + 1 );
level.alien_types[var_2].attributes[var_4][var_0] = getdefinitionvalue( var_1, 2 + var_3 );
}
}
gettentacledefinitionvalues( var_0, var_1 )
{
var_2 = "kraken";
var_3 = level.alien_types[var_2].attributes["tentacle_names"].size;
for ( var_4 = 0; var_4 < var_3; var_4++ )
{
var_5 = level.alien_types[var_2].attributes["tentacle_names"][var_4];
level.alien_types[var_2].attributes[var_5][var_0] = getdefinitionvalue( var_1, 2 + var_4 );
}
}
loadkrakenattributes()
{
var_0 = "kraken";
level.alien_types[var_0] = spawnstruct();
level.alien_types[var_0].attributes = [];
if ( maps\mp\alien\_utility::isplayingsolo() )
level.kraken_attribute_table = "mp/alien/alien_kraken_definition_solo.csv";
else
level.kraken_attribute_table = "mp/alien/alien_kraken_definition.csv";
level.alien_types[var_0].attributes["emissive"] = getdefinitionvalue( 21.0 );
level.alien_types[var_0].attributes["max_emissive"] = getdefinitionvalue( 22.0 );
level.alien_types[var_0].attributes["view_height"] = getdefinitionvalue( 23 );
level.alien_types[var_0].attributes["anim_scale"] = getdefinitionvalue( 20.0 );
level.alien_types[var_0].attributes["model"] = getdefinitionvalue( "2" );
level.alien_types[var_0].attributes["tentacle_model"] = getdefinitionvalue( "3" );
level.alien_types[var_0].attributes["starting_health"] = getdefinitionvalue( 24 );
level.alien_types[var_0].attributes["movement_radius"] = getdefinitionvalue( 25 );
level.alien_types[var_0].attributes["reckless_health_threshold"] = getdefinitionvalue( 30.0 );
level.alien_types[var_0].attributes["default_damage_multiplier"] = getdefinitionvalue( 70.0 );
level.alien_types[var_0].attributes["vulnerable_multiplier_1p"] = getdefinitionvalue( 71.0 );
level.alien_types[var_0].attributes["vulnerable_multiplier_2p"] = getdefinitionvalue( 72.0 );
level.alien_types[var_0].attributes["vulnerable_multiplier_3p"] = getdefinitionvalue( 73.0 );
level.alien_types[var_0].attributes["vulnerable_multiplier_4p"] = getdefinitionvalue( 74.0 );
level.alien_types[var_0].attributes["health_scalar_1p"] = getdefinitionvalue( 75 );
level.alien_types[var_0].attributes["health_scalar_2p"] = getdefinitionvalue( 76 );
level.alien_types[var_0].attributes["health_scalar_3p"] = getdefinitionvalue( 77 );
level.alien_types[var_0].attributes["posture_min_interval"] = getdefinitionvalue( 31 );
level.alien_types[var_0].attributes["posture_max_interval"] = getdefinitionvalue( 32 );
level.alien_types[var_0].attributes["tentacle_damage_multiplier"] = getdefinitionvalue( 78.0 );
level.alien_types[var_0].attributes["heated_smash_volume"] = getdefinitionvalue( "90" );
level.alien_types[var_0].attributes["tentacle_names"] = [ "L1", "L2", "R1", "R2" ];
getstagedefinitionvalues( "spawn_phase_duration", 100.0 );
getstagedefinitionvalues( "spawn_phase_health_limit", 101.0 );
getstagedefinitionvalues( "charge_phase_duration", 102.0 );
getstagedefinitionvalues( "charge_phase_health_limit", 103.0 );
getstagedefinitionvalues( "heated_phase_health_threshold", 104.0 );
getstagedefinitionvalues( "heated_phase_damage_per_second", 105.0 );
getstagedefinitionvalues( "transition_submerge_time", 106.0 );
getstagedefinitionvalues( "emerge_teleport_position", "107" );
getstagedefinitionvalues( "ship_side", "108" );
getstagedefinitionvalues( "emp_loop_duration", 109.0 );
getstagedefinitionvalues( "smash_radius", 110 );
getstagedefinitionvalues( "smash_inner_damage", 111 );
getstagedefinitionvalues( "smash_outer_damage", 112 );
getstagedefinitionvalues( "random_smash_min_interval", 113.0 );
getstagedefinitionvalues( "random_smash_max_interval", 114.0 );
getstagearraydefinitionvalues( "mass_smash_times", 115 );
getstagedefinitionvalues( "mass_smash_interval", 116 );
getstagedefinitionvalues( "emp_damage_location", "117" );
getstagedefinitionvalues( "emp_damage", 118 );
getstagedefinitionvalues( "emp_notify", "119" );
getstagedefinitionvalues( "encounter_name", "120" );
getstagearraydefinitionvalues( "spawn_times", "121" );
getstagedefinitionvalues( "heated_smash_tentacle_name", "122" );
getstagedefinitionvalues( "smash_trigger_cooldown", 123.0 );
getstagedefinitionvalues( "smash_trigger_activation_time", 124.0 );
getstagedefinitionvalues( "smash_trigger_deactivation_time", 125.0 );
getstagedefinitionvalues( "emp_shock_duration", 126 );
getstagedefinitionvalues( "emp_disable_duration", 127 );
level.kraken_safe_spot_volumes = loadkrakenvariablenumberofstringentries( "50" );
gettentacledefinitionvalues( "port_location", "200" );
gettentacledefinitionvalues( "starboard_location", "201" );
gettentacledefinitionvalues( "anim_index", 202 );
gettentacledefinitionvalues( "port_melee_triggers", "203" );
gettentacledefinitionvalues( "starboard_melee_triggers", "204" );
loadspawnwaves();
}
loadspawnwaves()
{
level.kraken_spawn_waves = [];
for ( var_0 = 300; var_0 <= 399; var_0++ )
{
var_1 = tablelookup( level.kraken_attribute_table, 0, var_0, 1 );
if ( var_1 == "" )
break;
level.kraken_spawn_waves[var_1] = [];
for ( var_2 = 2; var_2 < 10; var_2++ )
{
var_3 = tablelookup( level.kraken_attribute_table, 0, var_0, var_2 );
if ( var_3 == "" )
break;
var_4 = level.kraken_spawn_waves[var_1].size;
level.kraken_spawn_waves[var_1][var_4] = var_3;
}
}
}
loadkrakenvariablenumberofstringentries( var_0 )
{
var_1 = [];
var_2 = 0;
var_3 = int( var_0 );
for (;;)
{
var_4 = "" + ( var_3 + var_2 );
var_5 = getdefinitionvalue( var_4 );
if ( var_5 == "" )
break;
var_6 = getent( var_5, "targetname" );
if ( !isdefined( var_6 ) )
var_6 = common_scripts\utility::getstruct( var_5, "targetname" );
if ( isdefined( var_6 ) )
var_1[var_1.size] = var_6;
var_2++;
}
return var_1;
}
loadkrakenfx()
{
level._effect["kraken_water_spray_emitter"] = loadfx( "vfx/gameplay/alien/vfx_alien_kraken_water_spray_emitter" );
level._effect["kraken_rt_water_spray_emitter"] = loadfx( "vfx/gameplay/alien/vfx_alien_kraken_rt_water_spray_emitter" );
level._effect["kraken_water_stream_emitter"] = loadfx( "vfx/ae/aln_krk_h2o_strm_e" );
level._effect["kraken_water_sweep_rt_emitter"] = loadfx( "vfx/gameplay/alien/vfx_alien_kraken_water_sweep_rt_emitter" );
level._effect["kraken_water_roar_emitter1"] = loadfx( "vfx/gameplay/alien/vfx_alien_kraken_water_roar_emitter1" );
level._effect["kraken_water_stream_e_lite"] = loadfx( "vfx/gameplay/alien/vfx_alien_krak_water_stream_e_lite" );
level._effect["kraken_water_drip"] = loadfx( "vfx/gameplay/alien/vfx_alien_kraken_water_drip_emitter" );
level._effect["kraken_back_glow_01"] = loadfx( "vfx/gameplay/alien/vfx_alien_krkn_glow_back" );
level._effect["kraken_water_stream_pincers"] = loadfx( "vfx/gameplay/alien/vfx_alien_kraken_water_stream_pincers" );
level._effect["kraken_eye_glow_01"] = loadfx( "vfx/gameplay/alien/vfx_alien_kraken_eye_glow_01" );
level._effect["kraken_blood_roar_emitter"] = loadfx( "vfx/gameplay/alien/vfx_alien_kraken_blood_roar_emitter" );
level._effect["kraken_blood_roar_gurgle"] = loadfx( "vfx/gameplay/alien/vfx_alien_kraken_blood_roar_gurgle" );
}
initkraken()
{
level.agent_funcs["kraken"] = [];
level.agent_funcs["kraken"]["spawn"] = ::alienkrakenspawn;
level.agent_funcs["kraken"]["on_killed"] = ::alienkrakenkilled;
level.agent_funcs["kraken"]["on_damaged"] = ::alienkrakendamaged;
level.agent_funcs["kraken"]["on_damaged_finished"] = ::alienkrakendamagefinished;
level.custom_alien_attribute_table_init = ::loadkrakenattributes;
common_scripts\utility::flag_init( "fx_kraken_water" );
loadkrakenattributes();
loadkrakenfx();
common_scripts\utility::flag_init( "fx_kraken_water" );
level.kraken_health_padding = 100000;
}
alienkrakenspawn( var_0, var_1 )
{
var_2 = 100;
var_3 = 250;
var_4 = maps\mp\agents\_agent_common::connectnewagent( "kraken", "axis" );
if ( !isdefined( var_0 ) || !isdefined( var_1 ) )
{
}
var_4 setkrakenmodel();
var_4.onenteranimstate = ::onenterstate;
var_4 spawnagent( var_0, var_1, "alien_kraken_animclass", var_2, var_3 );
level notify( "spawned_agent", var_4 );
var_4 assignkrakenattributes();
var_4 setkrakenscriptfields( var_0 );
var_4 scragentsetclipmode( "agent" );
var_4 scragentsetphysicsmode( "noclip" );
var_4 takeallweapons();
var_5 = getkrakenhealthscalar();
var_4.health = int( level.alien_types["kraken"].attributes["starting_health"] * var_5 + 100000 );
var_4.maxhealth = int( level.alien_types["kraken"].attributes["starting_health"] * var_5 + 100000 );
var_4 scragentusemodelcollisionbounds();
var_4.alien_type = "kraken";
var_4.weakpointstate = [];
var_4.ignoreme = 1;
var_4.stage = "stage_1";
var_4.damage_multiplier = level.alien_types["kraken"].attributes["default_damage_multiplier"];
var_4.posturing = 0;
var_4.smashing = 0;
var_4.masssmashattackavailable = 0;
var_4 hide();
return var_4;
}
attachtentacles()
{
foreach ( var_1 in level.alien_types["kraken"].attributes["tentacle_names"] )
{
self.tentacles[var_1] = maps\mp\agents\alien\alien_kraken\_alien_kraken_tentacle::alienkrakententaclespawn( var_1 );
self.tentacles[var_1] hide();
}
}
getkrakenhealthscalar()
{
switch ( level.players.size )
{
case 1:
return level.alien_types["kraken"].attributes["health_scalar_1p"];
case 2:
return level.alien_types["kraken"].attributes["health_scalar_2p"];
case 3:
return level.alien_types["kraken"].attributes["health_scalar_3p"];
}
return 1.0;
}
getkrakendamagemultiplier()
{
switch ( level.players.size )
{
case 1:
return level.alien_types["kraken"].attributes["vulnerable_multiplier_1p"];
case 2:
return level.alien_types["kraken"].attributes["vulnerable_multiplier_2p"];
case 3:
return level.alien_types["kraken"].attributes["vulnerable_multiplier_3p"];
case 4:
return level.alien_types["kraken"].attributes["vulnerable_multiplier_4p"];
}
}
setkrakenmodel()
{
var_0 = level.alien_types["kraken"].attributes["model"];
self setmodel( var_0 );
self show();
self motionblurhqenable();
}
setkrakenscriptfields( var_0 )
{
self.species = "alien";
self.enablestop = 1;
maps\mp\agents\_agent_utility::activateagent();
self.spawntime = gettime();
self.attacking_player = 0;
self.spawnorigin = var_0;
}
assignkrakenattributes()
{
self.alien_type = "kraken";
self.moveplaybackrate = 1.0;
self.defaultmoveplaybackrate = self.moveplaybackrate;
self.animplaybackrate = self.moveplaybackrate;
self.xyanimscale = level.alien_types[self.alien_type].attributes["anim_scale"];
self.defaultemissive = level.alien_types[self.alien_type].attributes["emissive"];
self.maxemissive = level.alien_types[self.alien_type].attributes["max_emissive"];
thread setinitialemissive();
self scragentsetviewheight( level.alien_types[self.alien_type].attributes["view_height"] );
}
setinitialemissive()
{
self endon( "death" );
wait 1;
maps\mp\alien\_utility::set_alien_emissive( 0.2, 0.85 );
}
alienkrakenthink()
{
self.smash_allowed = 0;
setkrakenhealth();
self.phases = buildphases();
for ( self.current_stage_num = 1; self.current_stage_num <= 4; self.current_stage_num++ )
{
self.stage = "stage_" + self.current_stage_num;
common_scripts\utility::flag_set( "fx_kraken_water" );
self.current_phase = 0;
runphases();
}
thread thin_alien_herd();
playdeathanims();
self suicide();
}
thin_alien_herd()
{
var_0 = common_scripts\utility::array_combine( level.seeder_active_turrets, level.agentarray );
var_1 = getnodesinradius( ( 129, 5985, 1408 ), 300, 50, 128, "path" );
foreach ( var_3 in var_0 )
{
if ( isdefined( var_3 ) && var_3 != level.kraken )
{
if ( isalive( var_3 ) || var_3.model == "alien_spore" )
{
if ( var_3.team == "axis" && isdefined( var_3.alien_type ) && var_3.model != "alien_spore" )
var_3 thread waittil_goal_and_suicide( var_1[randomint( var_1.size )] );
else if ( var_3.model == "alien_spore" )
var_3 notify( "death" );
}
}
wait( randomfloatrange( 1, 2 ) );
}
}
waittil_goal_and_suicide( var_0 )
{
self.alien_scripted = 1;
self notify( "alien_main_loop_restart" );
common_scripts\utility::waitframe();
self scragentsetgoalnode( var_0 );
self scragentsetgoalradius( 128 );
common_scripts\utility::waittill_any_timeout( 20, "goal_reached" );
self suicide();
}
runphases()
{
while ( self.current_phase != self.phases.size )
{
var_0 = self.phases[self.current_phase];
self.current_phase++;
if ( var_0["in_final_stage"] || self.current_stage_num != 4 )
runphase( var_0["name"], var_0["func"], var_0["melee_allowed"], var_0["run_cycle"], var_0["min_health_percentage"] );
}
}
buildphases()
{
var_0 = [];
var_0[0] = setupphase( "emerge", ::runemergephase, 0, 0, "spawn_phase_health_limit", 1 );
var_0[1] = setupphase( "spawn", ::runspawnphase, 1, 1, "spawn_phase_health_limit", 1 );
var_0[2] = setupphase( "charge", ::runchargephase, 0, 0, "charge_phase_health_limit", 1 );
var_0[3] = setupphase( "heat", ::runheatedphase, 1, 1, "heated_phase_health_threshold", 1 );
var_0[4] = setupphase( "transition", ::runsubmergephase, 0, 0, "heated_phase_health_threshold", 0 );
return var_0;
}
setupphase( var_0, var_1, var_2, var_3, var_4, var_5 )
{
var_6 = [];
var_6["name"] = var_0;
var_6["func"] = var_1;
var_6["melee_allowed"] = var_2;
var_6["run_cycle"] = var_3;
var_6["min_health_percentage"] = var_4;
var_6["in_final_stage"] = var_5;
return var_6;
}
setkrakenhealth( var_0 )
{
if ( isdefined( level.players ) && level.players.size > 0 )
{
var_1 = getkrakenhealthscalar();
self.health = int( level.alien_types["kraken"].attributes["starting_health"] * var_1 + 100000 );
}
else
self.health = level.alien_types["kraken"].attributes["starting_health"];
self.maxhealth = self.health;
thread createbosshealthbar();
}
posturemonitor()
{
self endon( "death" );
self endon( "spawn_phase_complete" );
level endon( "game_ended" );
var_0 = gettime() + randomfloatrange( level.alien_types["kraken"].attributes["posture_min_interval"], level.alien_types["kraken"].attributes["posture_max_interval"] ) * 1000.0;
for (;;)
{
if ( gettime() > var_0 && !self.smashing && !self.posturing )
{
self.melee_type = "posture";
performmeleeattack( self.enemy );
while ( self.posturing )
wait 0.05;
var_0 = gettime() + randomfloatrange( level.alien_types["kraken"].attributes["posture_min_interval"], level.alien_types["kraken"].attributes["posture_max_interval"] ) * 1000.0;
}
wait 0.05;
}
}
masssmashattacktimer()
{
self endon( "death" );
self endon( "spawn_phase_complete" );
var_0 = gettime() * 0.001;
for ( var_1 = 0; var_1 < level.alien_types[self.alien_type].attributes[self.stage]["mass_smash_times"].size; var_1++ )
{
var_2 = gettime() * 0.001;
var_3 = level.alien_types[self.alien_type].attributes[self.stage]["mass_smash_times"][var_1] + var_0 - var_2;
if ( var_3 > 0 )
wait( var_3 );
masssmashattack();
}
}
masssmashattack()
{
self.masssmashattackavailable = 1;
waitforidletentacles();
var_0 = common_scripts\utility::array_randomize( level.alien_types[self.alien_type].attributes["tentacle_names"] );
for ( var_1 = 0; var_1 < var_0.size; var_1++ )
{
var_2 = var_0[var_1];
thread attemptsmashattack( self.current_smash_triggers[var_2], var_2 );
wait( level.alien_types[self.alien_type].attributes[self.stage]["mass_smash_interval"] );
}
waitforidletentacles();
self.masssmashattackavailable = 0;
}
start_cycle()
{
level.encounter_name = level.alien_types[self.alien_type].attributes[self.stage]["encounter_name"];
maps\mp\alien\_spawn_director::start_cycle( level.cycle_count );
level.cycle_count++;
}
playdeathanims()
{
self.melee_type = "death";
common_scripts\utility::exploder( 104 );
common_scripts\utility::exploder( 105 );
performmeleeattack( self.enemy );
}
runphase( var_0, var_1, var_2, var_3, var_4 )
{
self.phase = var_0;
self.smash_allowed = var_2;
self.min_health_percentage = level.alien_types[self.alien_type].attributes[self.stage][var_4];
if ( var_3 )
start_cycle();
[[ var_1 ]]();
if ( var_3 )
maps\mp\alien\_spawn_director::end_cycle();
}
runemergephase()
{
if ( self.stage == "stage_1" )
thread run_intro_emissive();
else
maps\mp\alien\_utility::set_alien_emissive_default( 2.0 );
if ( level.alien_types["kraken"].attributes[self.stage]["ship_side"] == "port" )
common_scripts\utility::exploder( 102 );
else
common_scripts\utility::exploder( 106 );
self.melee_type = "emerge";
performmeleeattack( self.enemy );
waitforextendedtentacles();
}
run_intro_emissive()
{
self endon( "death" );
var_0 = 0.85;
var_1 = 2.0;
maps\mp\alien\_utility::set_alien_emissive( var_1, var_0 );
wait 15;
maps\mp\alien\_utility::set_alien_emissive_default( var_1 );
}
runspawnphase()
{
var_0 = 0.5;
var_1 = 0.2;
maps\mp\alien\_utility::set_alien_emissive_default( 2.0 );
thread posturemonitor();
if ( level.alien_types[self.alien_type].attributes[self.stage]["mass_smash_times"].size > 0 )
thread masssmashattacktimer();
thread smashattackmonitor();
thread timedsmashattackmonitor();
initializeattacktriggers();
thread runspawnmonitor();
level notify( "dlc_vo_notify", "kraken_vo", "warn_horde" );
wait( level.alien_types[self.alien_type].attributes[self.stage]["spawn_phase_duration"] );
self notify( "spawn_phase_complete" );
self.smash_allowed = 0;
self.masssmashattackavailable = 0;
waitforidletentacles();
waitforposturetofinish();
common_scripts\utility::flag_clear( "fx_kraken_water" );
wait 0.1;
}
runspawnmonitor()
{
self endon( "spawn_phase_complete" );
var_0 = gettime() * 0.001;
for ( var_1 = 0; var_1 < level.alien_types[self.alien_type].attributes[self.stage]["spawn_times"].size; var_1++ )
{
var_2 = gettime() * 0.001;
var_3 = strtok( level.alien_types[self.alien_type].attributes[self.stage]["spawn_times"][var_1], "-" );
var_4 = int( var_3[0] ) + var_0 - var_2;
if ( var_4 > 0 )
wait( var_4 );
for (;;)
{
var_5 = findavailabletentacle();
if ( isdefined( var_5 ) )
break;
wait 0.05;
}
var_5 thread maps\mp\agents\alien\alien_kraken\_alien_kraken_tentacle::spawnattack( var_3[1] );
}
}
waitforidletentacles()
{
var_0 = 0;
while ( !var_0 )
{
var_0 = 1;
foreach ( var_2 in self.tentacles )
{
if ( istentaclespawning( var_2.tentacle_name ) || istentaclesmashing( var_2.tentacle_name ) )
{
var_0 = 0;
break;
}
}
wait 0.05;
}
}
waitforposturetofinish()
{
while ( self.posturing )
wait 0.05;
}
waitforextendedtentacles()
{
self endon( "death" );
level endon( "game_ended" );
for (;;)
{
var_0 = 1;
foreach ( var_2 in self.tentacles )
{
if ( !var_2 maps\mp\agents\alien\alien_kraken\_alien_kraken_tentacle::isextended() )
{
var_0 = 0;
break;
}
}
if ( var_0 )
return;
wait 0.05;
}
}
findavailabletentacle()
{
var_0 = randomint( self.tentacles.size );
while ( self.masssmashattackavailable )
wait 0.05;
for ( var_1 = 0; var_1 < self.tentacles.size; var_1++ )
{
var_2 = level.alien_types["kraken"].attributes["tentacle_names"][var_0];
var_3 = istentaclespawning( var_2 );
if ( !istentaclespawning( var_2 ) && !istentaclesmashing( var_2 ) )
return self.tentacles[var_2];
var_0++;
if ( var_0 >= self.tentacles.size )
var_0 = 0;
}
return undefined;
}
runchargephase()
{
common_scripts\utility::flag_clear( "fx_kraken_water" );
self.melee_type = "charge";
performmeleeattack( self.enemy );
}
runheatedphase()
{
self notify( "smash_attack_reset" );
self notify( "heat_phase_started", self.stage );
self setscriptablepartstate( "body", "heat_discharge_body_fx_01" );
var_0 = 0.2;
var_1 = 1.0;
maps\mp\alien\_utility::set_alien_emissive( var_0, var_1 );
self.melee_type = "heat";
performmeleeattack( self.enemy );
self.damage_multiplier = level.alien_types["kraken"].attributes["default_damage_multiplier"];
self.kraken_heated = 0;
self.smash_allowed = 0;
}
setupheatedsmashvolume()
{
var_0 = level.alien_types["kraken"].attributes["heated_smash_volume"];
var_1 = getent( var_0, "targetname" );
var_2 = level.alien_types["kraken"].attributes[self.stage]["heated_smash_tentacle_name"];
thread attacktriggerwait( var_1, var_2 );
}
runsubmergephase()
{
maps\mp\alien\_utility::set_alien_emissive_default( 2.0 );
if ( level.alien_types["kraken"].attributes[self.stage]["ship_side"] == "port" )
common_scripts\utility::exploder( 103 );
else
common_scripts\utility::exploder( 107 );
self.melee_type = "submerge";
performmeleeattack( self.enemy );
level thread do_kraken_tilt();
self playsound( "scn_kraken_reemerge" );
}
do_kraken_tilt()
{
foreach ( var_1 in level.players )
{
if ( isalive( var_1 ) )
earthquake( 0.75, 3, var_1.origin, 100 );
}
wait 3;
}
attemptsmashattack( var_0, var_1 )
{
self endon( "death" );
self.last_smash_attack_time = gettime();
self.melee_type = "smash";
self.smash_tentacle_name = var_1;
self.smash_trigger = var_0;
performmeleeattack( self.enemy );
self.smash_tentacle_name = undefined;
self.smash_trigger = undefined;
if ( self.phase == "heat" )
self.tentacles[var_1] thread maps\mp\agents\alien\alien_kraken\_alien_kraken_tentacle::heat();
}
timedsmashattackmonitor()
{
self endon( "death" );
self endon( "smash_attack_reset" );
var_0 = randomfloatrange( level.alien_types["kraken"].attributes[self.stage]["random_smash_min_interval"], level.alien_types["kraken"].attributes[self.stage]["random_smash_max_interval"] ) * 1000.0;
for (;;)
{
if ( canperformmelee() && gettime() - var_0 > self.last_smash_attack_time )
{
if ( attemptrandomsmashattack() )
var_0 = randomfloatrange( level.alien_types["kraken"].attributes[self.stage]["random_smash_min_interval"], level.alien_types["kraken"].attributes[self.stage]["random_smash_max_interval"] ) * 1000.0;
}
wait 0.05;
}
}
attemptrandomsmashattack()
{
var_0 = findavailabletentacle();
if ( !isdefined( var_0 ) )
return 0;
attemptsmashattack( self.current_smash_triggers[var_0.tentacle_name], var_0.tentacle_name );
return 1;
}
smashattackmonitor()
{
self endon( "death" );
self notify( "smash_attack_reset" );
self endon( "smash_attack_reset" );
self.last_smash_attack_time = gettime();
for (;;)
{
self waittill( "smash_trigger_hit", var_0, var_1 );
attemptsmashattack( var_0, var_1 );
}
}
initializeattacktriggers()
{
var_0 = level.alien_types["kraken"].attributes[self.stage]["ship_side"] + "_melee_triggers";
foreach ( var_2 in level.alien_types["kraken"].attributes["tentacle_names"] )
{
var_3 = level.alien_types["kraken"].attributes[var_2][var_0];
var_4 = getent( var_3, "targetname" );
self.current_smash_triggers[var_2] = var_4;
thread attacktriggerwait( var_4, var_2 );
}
}
attacktriggerwait( var_0, var_1 )
{
level endon( "game_ended" );
self endon( "death" );
self endon( "smash_attack_reset" );
var_2 = level.alien_types["kraken"].attributes[self.stage]["smash_trigger_cooldown"];
for (;;)
{
var_0 waittill( "touch", var_3 );
if ( !isplayer( var_3 ) )
continue;
if ( !canperformmelee() || istentaclespawning( var_1 ) )
continue;
if ( !isdefined( var_0.has_occupant ) )
{
monitortargetintrigger( var_0, var_1 );
var_4 = self.tentacles[var_1] maps\mp\agents\alien\alien_kraken\_alien_kraken_tentacle::getsmashanimlength();
wait( var_4 );
}
wait( var_2 );
}
}
istentaclespawning( var_0 )
{
return self.tentacles[var_0] maps\mp\agents\alien\alien_kraken\_alien_kraken_tentacle::isspawning();
}
istentaclesmashing( var_0 )
{
return self.tentacles[var_0] maps\mp\agents\alien\alien_kraken\_alien_kraken_tentacle::issmashing();
}
monitortargetintrigger( var_0, var_1 )
{
self endon( "death" );
self endon( "melee_attack_reset" );
var_2 = level.alien_types["kraken"].attributes[self.stage]["smash_trigger_activation_time"] * 1000.0;
var_3 = level.alien_types["kraken"].attributes[self.stage]["smash_trigger_deactivation_time"] * 1000.0;
var_0.has_occupant = 1;
var_4 = gettime();
var_5 = var_4 + var_2;
var_6 = 0;
for (;;)
{
var_7 = gettime();
if ( var_7 >= var_5 )
{
var_6 = 1;
break;
}
if ( !canperformmelee() || istentaclespawning( var_1 ) )
break;
var_8 = var_0 getistouchingentities( level.players );
if ( var_8.size != 0 )
var_4 = var_7;
else
var_9 = 1;
if ( var_4 + var_3 < var_7 )
break;
wait 0.05;
}
var_0.has_occupant = undefined;
if ( var_6 )
self notify( "smash_trigger_hit", var_0, var_1 );
}
canperformmelee()
{
return self.smash_allowed && !self.masssmashattackavailable;
}
performmeleeattack( var_0 )
{
if ( !isdefined( var_0 ) )
{
var_0 = findanenemy();
if ( !isdefined( var_0 ) )
return;
}
self scragentsetgoalpos( self.origin );
self scragentsetgoalradius( 20000 );
self scragentbeginmelee( var_0 );
self waittill( "melee_complete" );
}
findanenemy()
{
if ( isdefined( self.enemy ) )
return self.enemy;
foreach ( var_1 in level.players )
{
if ( isdefined( var_1 ) )
return var_1;
}
return undefined;
}
alienkrakenkilled( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8 )
{
}
alienkrakenprocesshitloc( var_0, var_1 )
{
if ( var_1 != "soft" )
return "armor";
return var_1;
}
bullethitarmor( var_0, var_1, var_2 )
{
if ( isplayer( var_2 ) )
var_2 thread maps\mp\gametypes\_damagefeedback::updatedamagefeedback( "hitalienarmor" );
}
alienkrakendamaged( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 )
{
if ( !maps\mp\alien\_damage::is_alien_agent_damage_allowed( var_0, var_1, var_5, var_4 ) )
return 0;
if ( var_4 == "MOD_TRIGGER_HURT" )
return 0;
if ( gethealthratio() < self.min_health_percentage )
var_2 = 0;
var_8 = alienkrakenprocesshitloc( var_6, var_8 );
var_10 = "hitalienarmor";
var_11 = 1.0;
if ( isdefined( self.damage_multiplier ) )
var_11 = self.damage_multiplier;
if ( isdefined( self.kraken_heated ) && self.kraken_heated )
{
if ( maps\mp\alien\_utility::is_true( level.zap_multiplier_active ) )
{
var_11 = var_11 + 0.4;
var_10 = "hitaliensoft";
}
else if ( var_8 == "soft" )
{
var_11 = var_11 + 0.4;
var_10 = "hitaliensoft";
}
else
var_10 = "standard";
}
else if ( maps\mp\alien\_utility::is_true( level.zap_multiplier_active ) )
{
var_11 = var_11 + 0.3;
var_10 = "hitaliensoft";
}
else if ( var_8 == "soft" )
{
var_11 = var_11 + 0.4;
var_10 = "standard";
}
var_2 = var_2 * var_11;
var_12 = var_5 == "iw6_alienminigun_mp" || var_5 == "iw6_alienminigun1_mp" || var_5 == "iw6_alienminigun2_mp" || var_5 == "iw6_alienminigun3_mp";
var_13 = var_5 == "iw6_alienminigun4_mp";
if ( var_12 || var_13 )
var_2 = var_2 * 0.45;
var_14 = var_5 == "iw6_alienmk32_mp" || var_5 == "iw6_alienmk321_mp" || var_5 == "iw6_alienmk322_mp" || var_5 == "iw6_alienmk323_mp" || var_5 == "iw6_alienmk324_mp";
if ( var_14 )
var_2 = var_2 * 0.5;
var_15 = var_5 == "alien_manned_minigun_turret_mp" || var_5 == "alien_manned_minigun_turret1_mp" || var_5 == "alien_manned_minigun_turret2_mp" || var_5 == "alien_manned_minigun_turret3_mp" || var_5 == "alien_manned_minigun_turret4_mp";
if ( var_15 )
var_2 = var_2 * 0.5;
var_16 = var_5 == "alien_manned_gl_turret_mp" || var_5 == "alien_manned_gl_turret1_mp" || var_5 == "alien_manned_gl_turret2_mp" || var_5 == "alien_manned_gl_turret3_mp" || var_5 == "alien_manned_gl_turret4_mp";
if ( var_16 )
var_2 = var_2 * 0.5;
if ( isdefined( level.custom_scale_alien_damage_func ) )
var_2 = [[ level.custom_scale_alien_damage_func ]]( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 );
if ( var_5 == "alienthrowingknife_mp" )
{
var_2 = 0;
var_0 delete();
}
else if ( !var_12 && !var_13 )
var_2 = maps\mp\alien\_damage::set_alien_damage_by_weapon_type( var_4, var_5, var_2 );
if ( isplayer( var_1 ) && !maps\mp\alien\_utility::is_trap( var_0 ) )
{
var_2 = maps\mp\alien\_damage::scale_alien_damage_by_perks( var_1, var_2, var_4, var_5 );
var_2 = maps\mp\alien\_damage::scale_alien_damage_by_weapon_type( var_1, var_2, var_4, var_5, var_8 );
}
var_2 = maps\mp\alien\_damage::scale_alien_damage_by_prestige( var_1, var_2 );
var_2 = int( var_2 );
if ( isdefined( var_1 ) )
{
if ( isdefined( var_1.owner ) && isplayer( var_1.owner ) )
var_1.owner thread maps\mp\gametypes\_damagefeedback::updatedamagefeedback( var_10 );
else
var_1 thread maps\mp\gametypes\_damagefeedback::updatedamagefeedback( var_10 );
}
if ( var_2 <= 0 )
return 0;
return self [[ maps\mp\agents\_agent_utility::agentfunc( "on_damaged_finished" ) ]]( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 );
}
alienkrakendamagefinished( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 )
{
var_3 = var_3 | level.idflags_no_knockback;
self finishagentdamage( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9, 0.0, 0 );
}
onenterstate( var_0, var_1 )
{
onexitanimstate( var_0, var_1 );
self.currentanimstate = var_1;
switch ( var_1 )
{
case "idle":
maps\mp\agents\alien\alien_kraken\_alien_kraken_idle::main();
break;
case "melee":
maps\mp\agents\alien\alien_kraken\_alien_kraken_melee::main();
break;
}
}
onexitanimstate( var_0, var_1 )
{
self notify( "killanimscript" );
switch ( var_0 )
{
case "melee":
maps\mp\agents\alien\alien_kraken\_alien_kraken_melee::endscript();
break;
}
}
createbosshealthbar()
{
var_0 = 2;
var_1 = 0;
var_2 = 0;
var_3 = 2;
setomnvar( "ui_alien_boss_icon", var_3 );
setomnvar( "ui_alien_boss_status", var_0 );
common_scripts\utility::waitframe();
setomnvar( "ui_alien_boss_progression", var_2 );
var_4 = 100000;
while ( self.health > 100000 )
{
common_scripts\utility::waittill_any( "damage", "hp_update" );
if ( !isdefined( self ) || self.health <= 0 )
break;
var_5 = gethealthratio();
var_6 = 100 - var_5 * 100;
var_7 = 0.5;
if ( abs( abs( var_4 ) - abs( var_6 ) ) > var_7 )
{
setomnvar( "ui_alien_boss_progression", var_6 );
var_4 = var_6;
}
}
setomnvar( "ui_alien_boss_status", var_1 );
}
gethealthratio()
{
return max( ( self.health - level.kraken_health_padding ) / ( self.maxhealth - level.kraken_health_padding ), 0.0 );
}
play_kraken_eyeglow1_fx()
{
wait 3.0;
playfxontag( level._effect["kraken_eye_glow_01"], level.kraken, "tag_eye" );
wait 5.0;
playfxontag( level._effect["kraken_back_glow_01"], level.kraken, "j_spineback_up" );
}
stop_kraken_eyeglow1_fx()
{
stopfxontag( level._effect["kraken_eye_glow_01"], level.kraken, "tag_eye" );
wait 1.0;
stopfxontag( level._effect["kraken_back_glow_01"], level.kraken, "j_spineback_up" );
}