1147 lines
34 KiB
Plaintext
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" );
|
|
}
|