Files
Recompilable-gscs-for-BO2-z…/zm_transit_patch/maps/mp/zm_transit_ambush.gsc
2020-08-30 17:40:45 -07:00

296 lines
6.4 KiB
Plaintext

#include maps/mp/zombies/_zm_powerups;
#include maps/mp/zombies/_zm_game_module;
#include maps/mp/zm_transit_bus;
#include maps/mp/zm_transit_utility;
#include maps/mp/zombies/_zm_utility;
#include maps/mp/_utility;
#include common_scripts/utility;
main()
{
level.numroundssincelastambushround = 0;
level.numbusstopssincelastambushround = 0;
level.numambushrounds = 0;
level.ambushpercentageperstop = 10;
level.ambushpercentageperround = 25;
flag_init( "ambush_round", 0 );
flag_init( "ambush_safe_area_active", 0 );
initambusheffects();
thread ambushroundkeeper();
/#
adddebugcommand( "devgui_cmd "Zombies:1/Bus:14/Ambush Round:6/Always:1" "zombie_devgui ambush_round always"\n" );
adddebugcommand( "devgui_cmd "Zombies:1/Bus:14/Ambush Round:6/Never:2" "zombie_devgui ambush_round never"\n" );
#/
}
initambusheffects()
{
level._effect[ "ambush_bus_fire" ] = loadfx( "env/fire/fx_fire_md" );
}
shouldstartambushround()
{
/#
if ( level.ambushpercentageperstop == 100 )
{
return 1;
}
if ( getDvarInt( "zombie_cheat" ) == 2 )
{
return 0;
#/
}
if ( level.numbusstopssincelastambushround < 2 )
{
}
randint = randomintrange( 0, 100 );
percentchance = level.numbusstopssincelastambushround * level.ambushpercentageperstop;
if ( randint < percentchance )
{
}
percentchance = level.numroundssincelastambushround * level.ambushpercentageperround;
if ( randint < percentchance )
{
}
if ( maps/mp/zm_transit_bus::busgasempty() )
{
return 1;
}
return 0;
}
isambushroundactive()
{
if ( flag_exists( "ambush_round" ) )
{
return flag( "ambush_round" );
}
}
is_ambush_round_spawning_active()
{
if ( flag_exists( "ambush_safe_area_active" ) )
{
return flag( "ambush_safe_area_active" );
}
}
ambushstartround()
{
flag_set( "ambush_round" );
ambushroundthink();
}
ambushendround()
{
level.the_bus.issafe = 1;
maps/mp/zm_transit_bus::busgasadd( 60 );
level.numbusstopssincelastambushround = 0;
level.numroundssincelastambushround = 0;
flag_clear( "ambush_round" );
}
cancelambushround()
{
flag_clear( "ambush_round" );
flag_clear( "ambush_safe_area_active" );
maps/mp/zm_transit_utility::try_resume_zombie_spawning();
bbprint( "zombie_events", "category %s type %s round %d", "DOG", "stop", level.round_number );
level.the_bus notify( "ambush_round_fail_safe" );
}
ambushroundspawning()
{
level.numambushrounds++;
wait 6;
level.the_bus.issafe = 0;
}
limitedambushspawn()
{
if ( level.numambushrounds < 3 )
{
dogcount = level.dog_targets.size * 6;
}
else
{
dogcount = level.dog_targets.size * 8;
}
setupdogspawnlocs();
level thread ambushroundspawnfailsafe( 20 );
while ( get_current_zombie_count() > 0 )
{
wait 1;
}
level notify( "end_ambushWaitFunction" );
}
ambushroundthink()
{
module = maps/mp/zombies/_zm_game_module::get_game_module( level.game_module_nml_index );
if ( isDefined( module.hub_start_func ) )
{
level thread [[ module.hub_start_func ]]( "nml" );
level notify( "game_mode_started" );
}
level thread ambushroundspawning();
ambushwaitfunction();
ambushendround();
}
ambushwaitfunction()
{
}
ambushpointfailsafe()
{
level.the_bus endon( "ambush_point" );
level.the_bus waittill( "reached_stop_point" );
cancelambushround();
}
ambushroundspawnfailsafe( timer )
{
ambushroundtimelimit = timer;
currentambushtime = 0;
while ( currentambushtime < ambushroundtimelimit )
{
if ( !flag( "ambush_round" ) )
{
return;
}
wait 1;
currentambushtime++;
}
level notify( "end_ambushWaitFunction" );
wait 5;
dogs = getaispeciesarray( "all", "zombie_dog" );
i = 0;
while ( i < dogs.size )
{
if ( isDefined( dogs[ i ].marked_for_death ) && dogs[ i ].marked_for_death )
{
i++;
continue;
}
else
{
if ( is_magic_bullet_shield_enabled( dogs[ i ] ) )
{
i++;
continue;
}
else
{
dogs[ i ] dodamage( dogs[ i ].health + 666, dogs[ i ].origin );
}
}
i++;
}
}
ambushdoghealthincrease()
{
switch( level.numambushrounds )
{
case 1:
level.dog_health = 400;
break;
case 2:
level.dog_health = 900;
break;
case 3:
level.dog_health = 1300;
break;
case 4:
level.dog_health = 1600;
break;
default:
level.dog_health = 1600;
break;
}
}
ambushroundaftermath()
{
power_up_origin = level.the_bus gettagorigin( "tag_body" );
if ( isDefined( power_up_origin ) )
{
level thread maps/mp/zombies/_zm_powerups::specific_powerup_drop( "full_ammo", power_up_origin );
}
}
ambushroundeffects()
{
wait 2;
level thread ambushlightningeffect( "tag_body" );
wait 0,5;
level thread ambushlightningeffect( "tag_wheel_back_left" );
wait 0,5;
level thread ambushlightningeffect( "tag_wheel_back_right" );
wait 0,5;
level thread ambushlightningeffect( "tag_wheel_front_left" );
wait 0,5;
level thread ambushlightningeffect( "tag_wheel_front_right" );
wait 1,5;
fxent0 = spawnandlinkfxtotag( level._effect[ "ambush_bus_fire" ], level.the_bus, "tag_body" );
fxent1 = spawnandlinkfxtotag( level._effect[ "ambush_bus_fire" ], level.the_bus, "tag_wheel_back_left" );
fxent2 = spawnandlinkfxtotag( level._effect[ "ambush_bus_fire" ], level.the_bus, "tag_wheel_back_right" );
fxent3 = spawnandlinkfxtotag( level._effect[ "ambush_bus_fire" ], level.the_bus, "tag_wheel_front_left" );
fxent4 = spawnandlinkfxtotag( level._effect[ "ambush_bus_fire" ], level.the_bus, "tag_wheel_front_right" );
level waittill( "end_ambushWaitFunction" );
fxent0 delete();
fxent1 delete();
fxent2 delete();
fxent3 delete();
fxent4 delete();
}
ambushlightningeffect( tag )
{
fxentlighting = spawnandlinkfxtotag( level._effect[ "lightning_dog_spawn" ], level.the_bus, tag );
wait 5;
fxentlighting delete();
}
setupdogspawnlocs()
{
level.enemy_dog_locations = [];
currentzone = undefined;
ambush_zones = getentarray( "ambush_volume", "script_noteworthy" );
i = 0;
while ( i < ambush_zones.size )
{
touching = 0;
b = 0;
while ( b < level.the_bus.bounds_origins.size && !touching )
{
bounds = level.the_bus.bounds_origins[ b ];
touching = bounds istouching( ambush_zones[ i ] );
b++;
}
if ( touching )
{
currentzone = ambush_zones[ i ];
break;
}
else
{
i++;
}
}
/#
assert( isDefined( currentzone ), "Bus needs to be in an ambush zone for an ambush round: " + level.the_bus.origin );
#/
level.enemy_dog_locations = getstructarray( currentzone.target, "targetname" );
}
ambushroundkeeper()
{
while ( 1 )
{
level waittill( "between_round_over" );
level.numroundssincelastambushround++;
}
}