iw6-scripts/maps/_mortar.gsc
2024-02-13 13:20:49 +01:00

1327 lines
35 KiB
Plaintext

// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
}
hurtgen_style()
{
var_0 = getentarray( "mortar", "targetname" );
var_1 = -1;
for ( var_2 = 0; var_2 < var_0.size; var_2++ )
var_0[var_2] setup_mortar_terrain();
if ( !isdefined( level.mortar ) )
common_scripts\utility::error( "level.mortar not defined. define in level script" );
level waittill( "start_mortars" );
for (;;)
{
wait( 1 + randomfloat( 2 ) );
var_3 = randomint( var_0.size );
for ( var_2 = 0; var_2 < var_0.size; var_2++ )
{
var_4 = ( var_2 + var_3 ) % var_0.size;
var_5 = distance( level.player getorigin(), var_0[var_4].origin );
var_6 = undefined;
if ( isdefined( level.foley ) )
var_6 = distance( level.foley.origin, var_0[var_4].origin );
else
var_6 = 360;
if ( var_5 < 1600 && var_5 > 400 && var_6 > 350 && var_4 != var_1 )
{
var_0[var_4] activate_mortar( 400, 300, 25, undefined, undefined, undefined, 0 );
var_1 = var_4;
if ( var_5 < 500 )
maps\_shellshock::main( 4 );
break;
}
}
}
}
railyard_style( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9, var_10 )
{
if ( !isdefined( var_0 ) )
var_0 = 7;
if ( !isdefined( var_1 ) )
var_1 = 2200;
if ( !isdefined( var_2 ) )
var_2 = 300;
if ( !isdefined( level.istopbarrage ) )
level.istopbarrage = 0;
if ( !isdefined( var_9 ) )
var_9 = 0;
var_11 = getentarray( "mortar", "targetname" );
var_12 = -1;
for ( var_13 = 0; var_13 < var_11.size; var_13++ )
{
if ( isdefined( var_11[var_13].target ) && var_9 == 0 )
var_11[var_13] setup_mortar_terrain();
}
if ( !isdefined( level.mortar ) )
common_scripts\utility::error( "level.mortar not defined. define in level script" );
if ( isdefined( level.mortar_notify ) )
level waittill( level.mortar_notify );
for (;;)
{
if ( level.istopbarrage != 0 )
wait 1;
while ( level.istopbarrage == 0 )
{
if ( isdefined( var_10 ) )
wait( var_10 + ( randomfloat( var_0 ) + randomfloat( var_0 ) ) );
else
wait( randomfloat( var_0 ) + randomfloat( var_0 ) );
var_14 = randomint( var_11.size );
for ( var_13 = 0; var_13 < var_11.size; var_13++ )
{
var_15 = ( var_13 + var_14 ) % var_11.size;
var_16 = distance( level.player getorigin(), var_11[var_15].origin );
if ( var_16 < var_1 && var_16 > var_2 && var_15 != var_12 )
{
var_11[var_15] activate_mortar( var_3, var_4, var_5, var_6, var_7, var_8, 0 );
var_12 = var_15;
break;
}
}
}
}
}
script_mortargroup_style()
{
var_0 = [];
var_1 = [];
level.mortars = [];
var_2 = getentarray( "script_model", "classname" );
for ( var_3 = 0; var_3 < var_2.size; var_3++ )
{
if ( isdefined( var_2[var_3].script_mortargroup ) )
{
if ( !isdefined( level.mortars[var_2[var_3].script_mortargroup] ) )
level.mortars[var_2[var_3].script_mortargroup] = [];
var_4 = spawnstruct();
var_4.origin = var_2[var_3].origin;
var_4.angles = var_2[var_3].angles;
if ( isdefined( var_2[var_3].targetname ) )
var_4.targetname = var_2[var_3].targetname;
if ( isdefined( var_2[var_3].target ) )
var_4.target = var_2[var_3].target;
level.mortars[var_2[var_3].script_mortargroup][level.mortars[var_2[var_3].script_mortargroup].size] = var_4;
var_2[var_3] delete();
}
}
for ( var_3 = 0; var_3 < var_0.size; var_3++ )
{
var_0[var_3] hide();
var_0[var_3].has_terrain = 0;
}
if ( !isdefined( level.mortar ) )
level.mortar = loadfx( "fx/explosions/artilleryExp_dirt_brown" );
var_5 = common_scripts\utility::array_combine( getentarray( "trigger_multiple", "classname" ), getentarray( "trigger_radius", "classname" ) );
for ( var_3 = 0; var_3 < var_5.size; var_3++ )
{
if ( isdefined( var_5[var_3].script_mortargroup ) )
{
if ( !isdefined( level.mortars[var_5[var_3].script_mortargroup] ) )
level.mortars[var_5[var_3].script_mortargroup] = [];
var_1[var_1.size] = var_5[var_3];
}
}
for ( var_3 = 0; var_3 < var_1.size; var_3++ )
{
var_1[var_3].mortargroup = 0;
var_1[var_3] thread script_mortargroup_mortar_group();
}
var_6 = undefined;
for (;;)
{
level waittill( "mortarzone", var_7 );
if ( isdefined( var_6 ) )
var_6 notify( "wait again" );
level.mortarzone = var_7.script_mortargroup;
var_7 thread script_mortargroup_mortarzone();
var_6 = var_7;
}
}
script_mortargroup_mortarzone()
{
var_0 = [];
var_1 = gettime();
var_2 = 0;
if ( isdefined( self.script_timer ) )
{
level notify( "timed barrage" );
var_1 = gettime() + self.script_timer * 1000;
var_2 = 1;
}
if ( isdefined( self.script_radius ) )
var_3 = self.script_radius;
else
var_3 = 0;
if ( isdefined( self.script_delay_min ) && isdefined( self.script_delay_max ) )
var_4 = 1;
else
var_4 = 0;
var_5 = 0;
var_6 = 2;
var_7 = 4;
var_8 = 0;
while ( level.mortars[self.script_mortargroup].size > 0 && level.mortarzone == self.script_mortargroup || var_2 )
{
if ( var_4 )
wait( randomfloat( self.script_delay_max - self.script_delay_min ) + self.script_delay_min );
else if ( var_8 )
{
if ( var_5 < var_7 )
{
wait( randomfloat( 0.5 ) );
var_5++;
}
else
{
var_5 = 0;
var_7 = 2 + randomint( 4 );
var_8 = 0;
continue;
}
}
else if ( var_5 < var_6 )
{
var_9 = randomfloat( 2 ) + 1;
wait( var_9 );
var_5++;
}
else
{
var_5 = 0;
var_8 = 1;
var_6 = randomint( 2 ) + 3;
continue;
}
var_10 = [];
var_11 = randomint( level.mortars[self.script_mortargroup].size );
if ( randomint( 100 ) < 75 )
{
var_12 = anglestoforward( level.player.angles );
var_13 = [];
for ( var_14 = 0; var_14 < level.mortars[self.script_mortargroup].size; var_14++ )
{
if ( var_3 > 0 && distance( level.player.origin, level.mortars[self.script_mortargroup][var_14].origin ) > var_3 )
continue;
if ( is_lastblast( level.mortars[self.script_mortargroup][var_14], var_0 ) )
continue;
var_15 = vectornormalize( level.mortars[self.script_mortargroup][var_14].origin - level.player.origin );
if ( vectordot( var_12, var_15 ) > 0.3 )
var_13[var_13.size] = var_14;
}
if ( var_13.size > 0 )
var_11 = var_13[randomint( var_13.size )];
}
if ( var_0.size > 3 )
var_0 = [];
var_0[var_0.size] = level.mortars[self.script_mortargroup][var_11];
level.mortars[self.script_mortargroup][var_11] thread script_mortargroup_domortar();
if ( var_2 && gettime() > var_1 )
{
if ( isdefined( self.target ) )
{
var_16 = getent( self.target, "targetname" );
if ( isdefined( var_16 ) )
{
var_16 notify( "trigger" );
level notify( "timed barrage finished" );
}
}
break;
}
}
}
is_lastblast( var_0, var_1 )
{
for ( var_2 = 0; var_2 < var_1.size; var_2++ )
{
if ( var_0 == var_1[var_2] )
return 1;
}
return 0;
}
script_mortargroup_domortar()
{
if ( isdefined( self.targetname ) && isdefined( level.mortarthread[self.targetname] ) )
level thread [[ level.mortarthread[self.targetname] ]]( self );
else
thread activate_mortar( undefined, undefined, undefined, undefined, undefined, undefined, 1 );
self waittill( "mortar" );
if ( isdefined( self.target ) )
{
var_0 = getent( self.target, "targetname" );
if ( isdefined( var_0 ) )
var_0 notify( "trigger" );
}
}
script_mortargroup_mortar_group()
{
for (;;)
{
self waittill( "trigger" );
if ( isdefined( level.mortarzone ) && level.mortarzone == self.script_mortargroup )
continue;
level notify( "mortarzone", self );
self waittill( "wait again" );
}
}
trigger_targeted()
{
level.mortartrigger = getentarray( "mortartrigger", "targetname" );
level.mortars = getentarray( "script_origin", "classname" );
for ( var_0 = 0; var_0 < level.mortars.size; var_0++ )
{
if ( isdefined( level.mortars[var_0].script_mortargroup ) )
level.mortars[var_0] setup_mortar_terrain();
}
level.lastmortar = -1;
if ( !isdefined( level.mortar ) )
common_scripts\utility::error( "level.mortar not defined. define in level script" );
for ( var_0 = 0; var_0 < level.mortartrigger.size; var_0++ )
thread trigger_targeted_mortars( var_0 );
}
trigger_targeted_mortars( var_0 )
{
var_1 = getentarray( level.mortartrigger[var_0].target, "targetname" );
for (;;)
{
if ( level.player istouching( level.mortartrigger[var_0] ) )
{
var_2 = randomint( var_1.size );
while ( var_2 == level.lastmortar )
{
var_2 = randomint( var_1.size );
wait 0.1;
}
var_1[var_2] activate_mortar( undefined, undefined, undefined, undefined, undefined, undefined, 0 );
level.lastmortar = var_2;
}
wait( randomfloat( 3 ) + randomfloat( 4 ) );
}
}
bunker_style_mortar()
{
var_0 = [];
var_1 = undefined;
var_2 = [];
var_3 = common_scripts\utility::getstructarray( "mortar_bunker", "targetname" );
var_4 = getentarray( "mortar_bunker", "targetname" );
if ( isdefined( var_4 ) && var_4.size > 0 )
var_1 = maps\_utility::array_merge( var_3, var_4 );
else
var_1 = var_3;
for ( var_5 = 0; var_5 < var_1.size; var_5++ )
{
if ( !isdefined( var_1[var_5].script_mortargroup ) )
continue;
var_6 = -1;
var_7 = int( var_1[var_5].script_mortargroup );
for ( var_8 = 0; var_8 < var_0.size; var_8++ )
{
if ( var_7 != var_2[var_8] )
continue;
var_6 = var_8;
break;
}
if ( var_6 == -1 )
{
var_0[var_0.size] = [];
var_2[var_2.size] = var_7;
var_6 = var_0.size - 1;
}
var_0[var_6][var_0[var_6].size] = var_1[var_5];
}
for ( var_5 = 0; var_5 < var_0.size; var_5++ )
thread bunker_style_mortar_think( var_0[var_5], var_3 );
wait 0.05;
common_scripts\utility::array_thread( getentarray( "mortar_on", "targetname" ), ::bunker_style_mortar_trigger, "on" );
common_scripts\utility::array_thread( getentarray( "mortar_off", "targetname" ), ::bunker_style_mortar_trigger, "off" );
}
bunker_style_mortar_think( var_0, var_1 )
{
var_2 = undefined;
var_3 = undefined;
if ( isdefined( level.mortarmininterval ) )
var_2 = level.mortarmininterval;
else
var_2 = 4;
if ( isdefined( level.mortarmaxinterval ) )
var_3 = level.mortarmaxinterval;
else
var_3 = 6;
var_4 = int( var_0[0].script_mortargroup );
for (;;)
{
level waittill( "start_mortars " + var_4 );
thread bunker_style_mortar_activate( var_0, var_2, var_3, var_4, var_1 );
}
}
bunker_style_mortar_activate( var_0, var_1, var_2, var_3, var_4 )
{
level endon( "start_mortars " + var_3 );
level endon( "stop_mortars " + var_3 );
for (;;)
{
wait 0.05;
var_5 = common_scripts\utility::getclosest( level.player.origin, var_4 );
if ( !isdefined( level.mortarnoincomingsound ) )
common_scripts\utility::play_sound_in_space( "mortar_incoming_bunker", var_5.origin );
var_5 = common_scripts\utility::getclosest( level.player.origin, var_4 );
thread common_scripts\utility::play_sound_in_space( "exp_artillery_underground", var_5.origin );
common_scripts\utility::array_thread( var_0, ::bunker_style_mortar_explode );
if ( !isdefined( level.mortarnoquake ) )
{
if ( common_scripts\utility::cointoss() )
earthquake( 0.2, 1.5, var_5.origin, 1250 );
else
earthquake( 0.35, 2.75, var_5.origin, 1250 );
}
level notify( "mortar_hit" );
wait( randomfloatrange( var_1, var_2 ) );
var_0 = common_scripts\utility::array_removeundefined( var_0 );
}
}
bunker_style_mortar_explode( var_0, var_1 )
{
if ( !isdefined( self ) )
return;
if ( isdefined( level.mortarwithinfov ) && mortar_within_player_fov( level.mortarwithinfov ) == 0 )
return;
if ( isdefined( level.mortar_min_dist ) )
var_2 = level.mortar_min_dist;
else
var_2 = 1024;
var_3 = var_2 * var_2;
var_4 = distancesquared( level.player.origin, self.origin );
if ( var_4 > var_3 )
return;
if ( isdefined( self.classname ) && self.classname == "trigger_radius" )
{
if ( !level.player istouching( self ) && distance( level.player.origin, self.origin ) < level.mortardamagetriggerdist )
{
radiusdamage( self.origin, self.radius, 500, 500 );
self delete();
return;
}
}
else
{
playfx( level._effect["mortar"][self.script_fxid], self.origin );
if ( var_4 < 262144 )
thread common_scripts\utility::play_sound_in_space( "emt_single_ceiling_debris", self.origin );
}
}
bog_style_mortar()
{
var_0 = [];
var_1 = [];
var_2 = maps\_utility::getstructarray_delete( "mortar", "targetname" );
for ( var_3 = 0; var_3 < var_2.size; var_3++ )
{
if ( !isdefined( var_2[var_3].script_mortargroup ) )
continue;
var_4 = -1;
var_5 = int( var_2[var_3].script_mortargroup );
for ( var_6 = 0; var_6 < var_0.size; var_6++ )
{
if ( var_5 != var_1[var_6] )
continue;
var_4 = var_6;
break;
}
if ( var_4 == -1 )
{
var_0[var_0.size] = [];
var_1[var_1.size] = var_5;
var_4 = var_0.size - 1;
}
var_0[var_4][var_0[var_4].size] = var_2[var_3];
}
for ( var_3 = 0; var_3 < var_0.size; var_3++ )
thread bog_style_mortar_think( var_0[var_3] );
wait 0.05;
common_scripts\utility::array_thread( getentarray( "mortar_on", "targetname" ), ::bog_style_mortar_trigger, "on" );
common_scripts\utility::array_thread( getentarray( "mortar_off", "targetname" ), ::bog_style_mortar_trigger, "off" );
}
bog_style_mortar_think( var_0, var_1 )
{
var_2 = undefined;
var_3 = undefined;
if ( isdefined( level.mortarmininterval ) )
var_2 = level.mortarmininterval;
else
var_2 = 0.5;
if ( isdefined( level.mortarmaxinterval ) )
var_3 = level.mortarmaxinterval;
else
var_3 = 3;
var_1 = int( var_0[0].script_mortargroup );
for (;;)
{
level waittill( "start_mortars " + var_1 );
level thread bog_style_mortar_activate( var_0, var_1, var_2, var_3 );
if ( isdefined( level.bogmortarsgoonce ) )
return;
}
}
bog_style_mortar_activate( var_0, var_1, var_2, var_3 )
{
level endon( "start_mortars " + var_1 );
level endon( "stop_mortars " + var_1 );
if ( isdefined( level.mortar_min_dist ) )
var_4 = level.mortar_min_dist;
else
var_4 = 300;
var_5 = spawn( "trigger_radius", ( 0, 0, 0 ), 0, var_4, 256 );
thread bog_style_mortar_cleanup( var_5, var_1 );
for (;;)
{
for (;;)
{
wait 0.05;
var_6 = randomint( var_0.size );
if ( isdefined( var_0[var_6].cooldown ) )
continue;
var_7 = distance( level.player.origin, var_0[var_6].origin );
if ( var_7 < var_4 )
continue;
if ( isdefined( level.mortarexcluders ) && level.mortarexcluders.size > 0 )
{
var_5.origin = var_0[var_6].origin;
if ( mortars_too_close( level.mortarexcluders, var_5 ) )
continue;
}
if ( !isdefined( level.nomaxmortardist ) && var_7 > 1000 )
continue;
if ( isdefined( level.mortar_max_dist ) && var_7 > level.mortar_max_dist )
continue;
if ( isdefined( level.mortarwithinfov ) && var_0[var_6] mortar_within_player_fov( level.mortarwithinfov ) == 0 )
continue;
break;
}
if ( isdefined( level.nomortars ) && level.nomortars == 1 )
return;
var_0[var_6] thread bog_style_mortar_explode();
wait( var_2 + randomfloat( var_3 - var_2 ) );
}
}
bog_style_mortar_cleanup( var_0, var_1 )
{
level waittill( "stop_mortars " + var_1 );
var_0 delete();
}
mortars_too_close( var_0, var_1 )
{
foreach ( var_3 in level.mortarexcluders )
{
if ( !isalive( var_3 ) )
continue;
if ( !isdefined( var_3 ) )
continue;
if ( var_3 istouching( var_1 ) )
return 1;
}
return 0;
}
mortar_within_player_fov( var_0 )
{
var_1 = level.player geteye();
var_2 = ( 0, 0, 0 );
if ( isdefined( level.playermortarfovoffset ) )
var_2 = level.playermortarfovoffset;
var_3 = common_scripts\utility::within_fov( var_1, level.player getplayerangles() + var_2, self.origin, var_0 );
return var_3;
}
bog_style_mortar_explode( var_0, var_1 )
{
if ( !isdefined( level.mortardamageradius ) )
level.mortardamageradius = 250;
if ( !isdefined( level.mortarearthquakeradius ) )
level.mortarearthquakeradius = 1250;
if ( !isdefined( var_0 ) )
var_0 = 0;
thread bog_style_mortar_cooldown();
if ( !var_0 )
common_scripts\utility::play_sound_in_space( level.scr_sound["mortar"]["incomming"] );
if ( isdefined( var_1 ) )
thread common_scripts\utility::play_sound_in_space( var_1 );
else
thread common_scripts\utility::play_sound_in_space( level.scr_sound["mortar"][self.script_fxid] );
setplayerignoreradiusdamage( 1 );
radiusdamage( self.origin, level.mortardamageradius, 150, 50 );
setplayerignoreradiusdamage( 0 );
playfx( level._effect["mortar"][self.script_fxid], self.origin );
if ( isdefined( level.alwaysquake ) )
earthquake( 0.3, 1, level.player.origin, 2000 );
if ( getdvarint( "bog_camerashake" ) > 0 )
{
if ( level.player getcurrentweapon() == "dragunov" && level.player playerads() > 0.8 )
return;
earthquake( 0.25, 0.75, self.origin, level.mortarearthquakeradius );
}
}
bog_style_mortar_cooldown()
{
self.cooldown = 1;
wait( 3 + randomfloat( 2 ) );
self.cooldown = undefined;
}
bog_style_mortar_trigger( var_0 )
{
self waittill( "trigger" );
if ( var_0 == "on" )
bog_style_mortar_on( self.script_mortargroup );
else if ( var_0 == "off" )
bog_style_mortar_off( self.script_mortargroup );
}
bog_style_mortar_on( var_0 )
{
level notify( "start_mortars " + var_0 );
}
bog_style_mortar_off( var_0 )
{
level notify( "stop_mortars " + var_0 );
}
bunker_style_mortar_on( var_0 )
{
if ( !isdefined( level.mortardamagetriggerdist ) )
level.mortardamagetriggerdist = 512;
if ( !isdefined( level.mortarwithinfov ) )
level.mortarwithinfov = cos( 35 );
level notify( "start_mortars " + var_0 );
}
bunker_style_mortar_off( var_0 )
{
level waittill( "mortar_hit" );
level notify( "stop_mortars " + var_0 );
}
bunker_style_mortar_off_nowait( var_0 )
{
level notify( "stop_mortars " + var_0 );
}
bunker_style_mortar_trigger( var_0 )
{
self waittill( "trigger" );
if ( var_0 == "on" )
bunker_style_mortar_on( self.script_mortargroup );
else if ( var_0 == "off" )
bunker_style_mortar_off( self.script_mortargroup );
}
burnville_style_mortar()
{
level endon( "stop falling mortars" );
setup_mortar_terrain();
wait( randomfloat( 0.5 ) + randomfloat( 0.5 ) );
for (;;)
{
if ( distance( level.player getorigin(), self.origin ) < 600 )
{
activate_mortar( undefined, undefined, undefined, undefined, undefined, undefined, 0 );
break;
}
wait 1;
}
wait( 7 + randomfloat( 20 ) );
for (;;)
{
if ( distance( level.player getorigin(), self.origin ) < 1200 && distance( level.player getorigin(), self.origin ) > 400 )
{
activate_mortar( undefined, undefined, undefined, undefined, undefined, undefined, 0 );
wait( 3 + randomfloat( 14 ) );
}
wait 1;
}
}
setup_mortar_terrain()
{
self.has_terrain = 0;
if ( isdefined( self.target ) )
{
self.terrain = getentarray( self.target, "targetname" );
self.has_terrain = 1;
}
else
{
}
if ( !isdefined( self.terrain ) )
{
}
if ( isdefined( self.script_hidden ) )
{
if ( isdefined( self.script_hidden ) )
self.hidden_terrain = getent( self.script_hidden, "targetname" );
else if ( isdefined( self.terrain ) && isdefined( self.terrain[0].target ) )
self.hidden_terrain = getent( self.terrain[0].target, "targetname" );
if ( isdefined( self.hidden_terrain ) )
self.hidden_terrain hide();
}
else if ( isdefined( self.has_terrain ) )
{
if ( isdefined( self.terrain ) && isdefined( self.terrain[0].target ) )
self.hidden_terrain = getent( self.terrain[0].target, "targetname" );
if ( isdefined( self.hidden_terrain ) )
self.hidden_terrain hide();
}
}
activate_mortar( var_0, var_1, var_2, var_3, var_4, var_5, var_6 )
{
incoming_sound( undefined, var_6 );
level notify( "mortar" );
self notify( "mortar" );
if ( !isdefined( var_0 ) )
var_0 = 256;
if ( !isdefined( var_1 ) )
var_1 = 400;
if ( !isdefined( var_2 ) )
var_2 = 25;
radiusdamage( self.origin, var_0, var_1, var_2 );
if ( isdefined( self.has_terrain ) && self.has_terrain == 1 && isdefined( self.terrain ) )
{
for ( var_7 = 0; var_7 < self.terrain.size; var_7++ )
{
if ( isdefined( self.terrain[var_7] ) )
self.terrain[var_7] delete();
}
}
if ( isdefined( self.hidden_terrain ) )
self.hidden_terrain show();
self.has_terrain = 0;
mortar_boom( self.origin, var_3, var_4, var_5, undefined, var_6 );
}
mortar_boom( var_0, var_1, var_2, var_3, var_4, var_5 )
{
if ( !isdefined( var_1 ) )
var_1 = 0.15;
if ( !isdefined( var_2 ) )
var_2 = 2;
if ( !isdefined( var_3 ) )
var_3 = 850;
thread mortar_sound( var_5 );
if ( isdefined( var_4 ) )
playfx( var_4, var_0 );
else
playfx( level.mortar, var_0 );
earthquake( var_1, var_2, var_0, var_3 );
if ( isdefined( level.playermortar ) )
return;
if ( distance( level.player.origin, var_0 ) > 300 )
return;
level.playermortar = 1;
level notify( "shell shock player", var_2 * 4 );
maps\_shellshock::main( var_2 * 4 );
}
mortar_sound( var_0 )
{
if ( !isdefined( level.mortar_last_sound ) )
level.mortar_last_sound = -1;
for ( var_1 = randomint( 3 ) + 1; var_1 == level.mortar_last_sound; var_1 = randomint( 3 ) + 1 )
{
}
level.mortar_last_sound = var_1;
if ( !var_0 )
self playsound( "mortar_explosion" + var_1 );
else
common_scripts\utility::play_sound_in_space( "mortar_explosion" + var_1, self.origin );
}
incoming_sound( var_0, var_1 )
{
var_2 = gettime();
if ( !isdefined( level.lastmortarincomingtime ) )
level.lastmortarincomingtime = var_2;
else if ( var_2 - level.lastmortarincomingtime < 1000 )
{
wait 1;
return;
}
else
level.lastmortarincomingtime = var_2;
if ( !isdefined( var_0 ) )
var_0 = randomint( 3 ) + 1;
if ( var_0 == 1 )
{
if ( var_1 )
thread common_scripts\utility::play_sound_in_space( "mortar_incoming1", self.origin );
else
self playsound( "mortar_incoming1" );
wait 0.82;
}
else if ( var_0 == 2 )
{
if ( var_1 )
thread common_scripts\utility::play_sound_in_space( "mortar_incoming2", self.origin );
else
self playsound( "mortar_incoming2" );
wait 0.42;
}
else
{
if ( var_1 )
thread common_scripts\utility::play_sound_in_space( "mortar_incoming3", self.origin );
else
self playsound( "mortar_incoming3" );
wait 1.3;
}
}
generic_style_init()
{
level._explosion_imaxrange = [];
level._explosion_iminrange = [];
level._explosion_iblastradius = [];
level._explosion_idamagemax = [];
level._explosion_idamagemin = [];
level._explosion_fquakepower = [];
level._explosion_iquaketime = [];
level._explosion_iquakeradius = [];
}
generic_style_setradius( var_0, var_1, var_2 )
{
level._explosion_iminrange[var_0] = var_1;
level._explosion_imaxrange[var_0] = var_2;
}
generic_style_setdamage( var_0, var_1, var_2, var_3 )
{
level._explosion_iblastradius[var_0] = var_1;
level._explosion_idamagemin[var_0] = var_2;
level._explosion_idamagemax[var_0] = var_3;
}
generic_style_setquake( var_0, var_1, var_2, var_3 )
{
level._explosion_fquakepower[var_0] = var_1;
level._explosion_iquaketime[var_0] = var_2;
level._explosion_iquakeradius[var_0] = var_3;
}
generic_style( var_0, var_1, var_2, var_3, var_4, var_5, var_6 )
{
var_7 = -1;
var_8 = var_5;
var_9 = var_4;
generic_style_setradius( var_0, 300, 2200 );
if ( !isdefined( var_1 ) )
var_1 = 7;
if ( !isdefined( var_2 ) )
var_2 = 1;
if ( !isdefined( var_3 ) )
var_3 = 0;
if ( !isdefined( var_6 ) )
var_6 = 0;
if ( isdefined( level.explosion_stopnotify ) && isdefined( level.explosion_stopnotify[var_0] ) )
level endon( level.explosion_stopnotify[var_0] );
if ( !isdefined( level.bstopbarrage ) || !isdefined( level.bstopbarrage[var_0] ) )
level.bstopbarrage[var_0] = 0;
var_10 = getentarray( var_0, "targetname" );
for ( var_11 = 0; var_11 < var_10.size; var_11++ )
{
if ( isdefined( var_10[var_11].target ) && !var_6 )
var_10[var_11] setup_mortar_terrain();
}
if ( isdefined( level.explosion_startnotify ) && isdefined( level.explosion_startnotify[var_0] ) )
level waittill( level.explosion_startnotify[var_0] );
for (;;)
{
while ( !level.bstopbarrage[var_0] )
{
for ( var_12 = 0; var_12 < var_2; var_12++ )
{
if ( !isdefined( var_5 ) )
var_8 = level._explosion_imaxrange[var_0];
if ( !isdefined( var_4 ) )
var_9 = level._explosion_iminrange[var_0];
var_13 = randomint( var_10.size );
for ( var_11 = 0; var_11 < var_10.size; var_11++ )
{
var_14 = ( var_11 + var_13 ) % var_10.size;
var_15 = distance( level.player getorigin(), var_10[var_14].origin );
if ( var_15 < var_8 && var_15 > var_9 && var_14 != var_7 )
{
var_10[var_14].iminrange = var_9;
var_10[var_14] explosion_activate( var_0 );
var_7 = var_14;
break;
}
}
var_7 = -1;
if ( isdefined( level.explosion_delay ) && isdefined( level.explosion_delay[var_0] ) )
{
wait( level.explosion_delay[var_0] );
continue;
}
wait( randomfloat( var_1 ) + randomfloat( var_1 ) );
}
if ( isdefined( level.explosion_barrage_delay ) && isdefined( level.explosion_barrage_delay[var_0] ) )
{
wait( level.explosion_barrage_delay[var_0] );
continue;
}
wait( randomfloat( var_3 ) + randomfloat( var_3 ) );
}
wait 0.05;
}
}
explosion_activate( var_0, var_1, var_2, var_3, var_4, var_5, var_6 )
{
generic_style_setdamage( var_0, 256, 25, 400 );
generic_style_setquake( var_0, 0.15, 2, 850 );
if ( !isdefined( var_1 ) )
var_1 = level._explosion_iblastradius[var_0];
if ( !isdefined( var_2 ) )
var_2 = level._explosion_idamagemin[var_0];
if ( !isdefined( var_3 ) )
var_3 = level._explosion_idamagemax[var_0];
if ( !isdefined( var_4 ) )
var_4 = level._explosion_fquakepower[var_0];
if ( !isdefined( var_5 ) )
var_5 = level._explosion_iquaketime[var_0];
if ( !isdefined( var_6 ) )
var_6 = level._explosion_iquakeradius[var_0];
explosion_incoming( var_0 );
level notify( "explosion", var_0 );
var_7 = 1;
var_8 = undefined;
var_9 = self;
if ( isdefined( self.iminrange ) && distance( level.player.origin, self.origin ) < self.iminrange )
{
var_10 = getentarray( var_0, "targetname" );
for ( var_11 = 0; var_11 < var_10.size; var_11++ )
{
var_12 = distance( level.player getorigin(), var_10[var_11].origin );
if ( var_12 > self.iminrange )
{
if ( !isdefined( var_8 ) || var_12 < var_8 )
{
var_8 = var_12;
var_9 = var_10[var_11];
}
}
}
if ( !isdefined( var_8 ) )
var_7 = 0;
}
if ( var_7 )
radiusdamage( var_9.origin, var_1, var_3, var_2 );
if ( isdefined( var_9.has_terrain ) && var_9.has_terrain == 1 && isdefined( var_9.terrain ) )
{
for ( var_13 = 0; var_13 < var_9.terrain.size; var_13++ )
{
if ( isdefined( var_9.terrain[var_13] ) )
var_9.terrain[var_13] delete();
}
}
if ( isdefined( var_9.hidden_terrain ) )
var_9.hidden_terrain show();
var_9.has_terrain = 0;
var_9 explosion_boom( var_0, var_4, var_5, var_6 );
}
explosion_boom( var_0, var_1, var_2, var_3 )
{
if ( !isdefined( var_1 ) )
var_1 = 0.15;
if ( !isdefined( var_2 ) )
var_2 = 2;
if ( !isdefined( var_3 ) )
var_3 = 850;
explosion_sound( var_0 );
var_4 = self.origin;
playfx( level._effect[var_0], var_4 );
earthquake( var_1, var_2, var_4, var_3 );
if ( distance( level.player.origin, var_4 ) > 300 )
return;
level.playermortar = 1;
level notify( "shell shock player", var_2 * 4 );
maps\_shellshock::main( var_2 * 4 );
}
explosion_sound( var_0 )
{
if ( !isdefined( level._explosion_last_sound ) )
level._explosion_last_sound = 0;
for ( var_1 = randomint( 3 ) + 1; var_1 == level._explosion_last_sound; var_1 = randomint( 3 ) + 1 )
{
}
level._explosion_last_sound = var_1;
if ( level._effecttype[var_0] == "mortar" )
{
switch ( var_1 )
{
case 1:
self playsound( "mortar_explosion1" );
break;
case 2:
self playsound( "mortar_explosion2" );
break;
case 3:
self playsound( "mortar_explosion3" );
break;
}
}
else if ( level._effecttype[var_0] == "artillery" )
{
switch ( var_1 )
{
case 1:
self playsound( "mortar_explosion4" );
break;
case 2:
self playsound( "mortar_explosion5" );
break;
case 3:
self playsound( "mortar_explosion1" );
break;
}
}
else if ( level._effecttype[var_0] == "bomb" )
{
switch ( var_1 )
{
case 1:
self playsound( "mortar_explosion1" );
break;
case 2:
self playsound( "mortar_explosion4" );
break;
case 3:
self playsound( "mortar_explosion5" );
break;
}
}
}
explosion_incoming( var_0, var_1 )
{
if ( !isdefined( level._explosion_last_incoming ) )
level._explosion_last_incoming = -1;
for ( var_1 = randomint( 4 ) + 1; var_1 == level._explosion_last_incoming; var_1 = randomint( 4 ) + 1 )
{
}
level._explosion_last_incoming = var_1;
if ( level._effecttype[var_0] == "mortar" )
{
switch ( var_1 )
{
case 1:
self playsound( "mortar_incoming1" );
wait 0.82;
break;
case 2:
self playsound( "mortar_incoming2" );
wait 0.42;
break;
case 3:
self playsound( "mortar_incoming3" );
wait 1.3;
break;
default:
wait 1.75;
break;
}
}
else if ( level._effecttype[var_0] == "artillery" )
{
switch ( var_1 )
{
case 1:
self playsound( "mortar_incoming4" );
wait 0.82;
break;
case 2:
self playsound( "mortar_incoming4_new" );
wait 0.42;
break;
case 3:
self playsound( "mortar_incoming1_new" );
wait 1.3;
break;
default:
wait 1.75;
break;
}
}
else if ( level._effecttype[var_0] == "bomb" )
{
switch ( var_1 )
{
case 1:
self playsound( "mortar_incoming2_new" );
wait 1.75;
break;
case 2:
self playsound( "mortar_incoming3_new" );
wait 1.75;
break;
case 3:
self playsound( "mortar_incoming4_new" );
wait 1.75;
break;
default:
wait 1.75;
break;
}
}
}