Fix round manager. Add more todos.

This commit is contained in:
JezuzLizard 2024-03-06 23:43:16 -08:00
parent 1bf0822701
commit f7f3ed71b7
10 changed files with 159 additions and 29 deletions

View File

@ -13,14 +13,14 @@ main()
set_dvar_if_unset( "rm_special_round_chance", 33 );
set_dvar_if_unset( "rm_allow_same_round_as_last_round", 1 );
set_dvar_if_unset( "rm_allowed_special_rounds", "normal zombie_dog leaper" );
set_dvar_if_unset( "rm_allowed_special_rounds", "normal zombie_dog leaper mechz" );
set_dvar_if_unset( "rm_allowed_special_round_variants", "default rush" );
set_dvar_if_unset( "rm_forced_special_round", "" );
set_dvar_if_unset( "rm_forced_special_variant", "" );
set_dvar_if_unset( "rm_allowed_mixed_rounds_presets", "default wave" );
set_dvar_if_unset( "rm_allowed_mixed_round_variants_for_default_preset", "random" );
set_dvar_if_unset( "rm_allowed_mixed_round_variants_for_wave_preset", "normal_wave dog_wave mechz_wave brutus_wave" );
set_dvar_if_unset( "rm_allowed_mixed_round_variants_for_wave_preset", "normal_wave dog_wave mechz_wave brutus_wave leaper_wave" );
set_dvar_if_unset( "rm_forced_mixed_rounds_preset", "" );
set_dvar_if_unset( "rm_forced_mixed_rounds_variant", "" );
set_dvar_if_unset( "rm_mixed_round_chance_base", 20 );
@ -187,6 +187,13 @@ main()
scripts\zm\zm_ai_pack\mixed_variants\_brutus_wave::spawning_limit,
scripts\zm\zm_ai_pack\mixed_variants\_brutus_wave::spawning_cooldown,
scripts\zm\zm_ai_pack\mixed_variants\_brutus_wave::spawning_round_start);
register_mixed_round_preset_variant( "wave", "leaper_wave",
scripts\zm\zm_ai_pack\mixed_variants\_leaper_wave::spawning_wave,
scripts\zm\zm_ai_pack\mixed_variants\_leaper_wave::spawning_chance,
scripts\zm\zm_ai_pack\mixed_variants\_leaper_wave::spawning_limit,
scripts\zm\zm_ai_pack\mixed_variants\_leaper_wave::spawning_cooldown,
scripts\zm\zm_ai_pack\mixed_variants\_leaper_wave::spawning_round_start);
scripts\zm\zm_ai_pack\mixed_presets\_default::main();
@ -197,10 +204,29 @@ main()
scripts\zm\zm_ai_pack\mixed_variants\_normal_wave::main();
//Future variants
// random - random ais, true_random - random ais + random behavior and stats
// elemental?
// fx related
// - lightning enemies that stun you when they hit you
// - fire enemies which set you on fire dealing damage over time
// - ice enemies which slow you
// - poison enemies
// - auras that give nearby enemies buffs or debuff nearby players
// - invisible done by using camo suit material from campaign
// durable
// waves for mixed round_type
// boss related
// - enemies that override spawning system - enemies spawn near them while they are alive
// - overrides enemy types
// - gives special reward for defeating them
// - always spawns at specific rounds 20/35/50/65 etc
// - has special fx around them
// - has special abilities if possible
// - plays random boss music
// - boss health bar and name
// - randomly spawning powerups to help the players
// several default presets to cycle through
// modify aitypes player targetting - target weakest performing, strongest performing, furthest, closest, most health, least health
// Add faster sprinters as an enemy type
// ghosts phase through walls
}
should_do_special_round()
@ -340,11 +366,41 @@ determine_current_round_type()
allowed_mixed_presets_string = getdvar( "rm_allowed_mixed_rounds_presets" );
can_pick_mixed_round_type = allowed_mixed_presets_string != "";
for ( i = 0; i < possible_round_types_keys.size; i++ )
{
if ( possible_round_types_keys[ i ] == "normal" )
{
continue;
}
assert( isDefined( level.round_manager_special_rounds[ possible_round_types_keys[ i ] ] ), "Round Manager ERROR: Round type <" + possible_round_types_keys[ i ] + "> was not registered" );
if ( !isDefined( level.round_manager_special_rounds[ possible_round_types_keys[ i ] ] ) )
{
continue;
}
for ( j = 0; j < possible_variants_keys.size; j++ )
{
assert( isDefined( level.round_manager_special_rounds[ possible_round_types_keys[ i ] ][ possible_variants_keys[ j ] ] ), "Round Manager ERROR: Variant <" + possible_variants_keys[ j ] + "> is not registered for round type <" + possible_round_types_keys[ i ] + "> ");
}
}
normal_present = false;
for ( i = 0; i < possible_round_types_keys.size; i++ )
{
if ( possible_round_types_keys[ i ] == "normal" )
{
normal_present = true;
break;
}
for (;;)
{
possible_round_types = array_randomize( possible_round_types_keys );
for ( i = 0; i < possible_round_types.size; i++ )
{
if ( possible_round_types[ i ] == "normal" )
{
continue;
}
assert( isDefined( level.round_manager_special_rounds[ possible_round_types[ i ] ] ) );
possible_variants = array_randomize( possible_variants_keys );
@ -362,10 +418,8 @@ determine_current_round_type()
for ( j = 0; j < possible_variants.size; j++ )
{
assert( isDefined( level.round_manager_special_rounds[ possible_round_types[ i ] ][ possible_variants[ j ] ] ) );
if ( possible_round_types.size <= 1 || [[ level.round_manager_special_rounds[ possible_round_types[ i ] ][ possible_variants[ j ] ].chance_func ]]()
&& [[ level.round_manager_special_rounds[ possible_round_types[ i ] ][ possible_variants[ j ] ].next_instance_func ]]() <= level.round_number )
if ( possible_round_types.size <= 1 || ( [[ level.round_manager_special_rounds[ possible_round_types[ i ] ][ possible_variants[ j ] ].next_instance_func ]]() <= level.round_number || !normal_present )
&& [[ level.round_manager_special_rounds[ possible_round_types[ i ] ][ possible_variants[ j ] ].chance_func ]]() )
{
return_value.round_type = possible_round_types[ i ];
return_value.variant = possible_variants[ j ];

View File

@ -10,5 +10,5 @@ preset_chance()
round_start()
{
level.round_manager_spawn_count = 0;
level.round_manager_vars[ "spawn_count" ] = 0;
}

View File

@ -16,7 +16,7 @@ preset_chance()
round_start()
{
level.round_manager_spawn_count = 0;
level.round_manager_vars[ "spawn_count" ] = 0;
}
spawn_wave( type, custom_starting_properties, wait_for_room = true )
@ -40,7 +40,7 @@ spawn_wave( type, custom_starting_properties, wait_for_room = true )
if ( isdefined( ai ) )
{
count++;
level.round_manager_spawn_count++;
level.round_manager_vars[ "spawn_count" ]++;
}
wait( level.zombie_vars["zombie_spawn_delay"] );
}

View File

@ -0,0 +1,60 @@
#include maps\mp\zombies\_zm_utility;
#include common_scripts\utility;
#include maps\mp\_utility;
#include scripts\zm\zm_ai_pack\_utility;
main()
{
set_dvar_if_unset( "rm_mixed_preset_wave_leaper_wave_variant_spawn_limit_min", 6 );
set_dvar_if_unset( "rm_mixed_preset_wave_leaper_wave_variant_spawn_limit_max", 12 );
set_dvar_if_unset( "rm_mixed_preset_wave_leaper_wave_variant_min_round", 15 );
set_dvar_if_unset( "rm_mixed_preset_wave_leaper_wave_variant_min_cooldown", 80.0 );
set_dvar_if_unset( "rm_mixed_preset_wave_leaper_wave_variant_max_cooldown", 240.0 );
set_dvar_if_unset( "rm_mixed_preset_wave_leaper_wave_variant_chance_threshold", 1000 );
set_dvar_if_unset( "rm_mixed_preset_wave_leaper_wave_variant_chance_per_spawn_min", 5 );
set_dvar_if_unset( "rm_mixed_preset_wave_leaper_wave_variant_chance_per_spawn_max", 10 );
}
spawning_wave()
{
level.round_manager_vars[ "leaper_wave_count" ]++;
custom_starting_properties = sys::spawnstruct();
health = int( ( level.round_number / 5 ) * 400 );
if ( health > 1600 )
{
health = 1600;
}
custom_starting_properties.health = health;
scripts\zm\zm_ai_pack\mixed_presets\_wave::spawn_wave( "leaper", custom_starting_properties );
time = randomfloatrange( getdvarfloat( "rm_mixed_preset_wave_leaper_wave_variant_min_cooldown" ), getdvarfloat( "rm_mixed_preset_wave_leaper_wave_variant_max_cooldown" ) );
level.round_manager_vars[ "guaranteed_leaper_wave_time" ] = int( gettime() + ( time * 1000 ) );
}
spawning_chance()
{
return scripts\zm\zm_ai_pack\mixed_presets\_wave::spawning_chance( "leaper" );
}
spawning_limit()
{
if ( level.players.size <= 1 )
{
return getdvarint( "rm_mixed_preset_wave_leaper_wave_variant_spawn_limit_min" );
}
else
{
return getdvarint( "rm_mixed_preset_wave_leaper_wave_variant_spawn_limit_max" );
}
}
spawning_cooldown()
{
return true;
}
spawning_round_start()
{
level.round_manager_vars[ "guaranteed_leaper_wave_time" ] = level.round_start_time;
level.round_manager_vars[ "leaper_wave_count" ] = 0;
}

View File

@ -6,24 +6,23 @@
main()
{
set_dvar_if_unset( "rm_mixed_preset_default_random_variant_allowed_aitypes", "normal zombie_dog mechz brutus" );
set_dvar_if_unset( "rm_mixed_preset_default_random_variant_allowed_aitypes", "normal zombie_dog mechz brutus leaper" );
set_dvar_if_unset( "rm_mixed_preset_default_random_variant_wave_spawn_limit", 24 );
set_dvar_if_unset( "rm_mixed_preset_default_random_variant_wave_spawn_cooldown", 1 );
set_dvar_if_unset( "rm_mixed_preset_default_random_variant_mechz_spawn_chance_10000_base", 100 );
set_dvar_if_unset( "rm_mixed_preset_default_random_variant_zombie_dog_spawn_chance_10000_base", 1200 );
set_dvar_if_unset( "rm_mixed_preset_default_random_variant_brutus_spawn_chance_10000_base", 150 );
set_dvar_if_unset( "rm_mixed_preset_default_random_variant_leaper_spawn_chance_10000_base", 600 );
set_dvar_if_unset( "rm_mixed_preset_default_random_variant_mechz_spawn_chance_10000_increase_per_round", 2 );
set_dvar_if_unset( "rm_mixed_preset_default_random_variant_zombie_dog_spawn_chance_10000_increase_per_round", 6 );
set_dvar_if_unset( "rm_mixed_preset_default_random_variant_brutus_spawn_chance_10000_increase_per_round", 2 );
set_dvar_if_unset( "rm_mixed_preset_default_random_variant_leaper_spawn_chance_10000_increase_per_round", 5 );
}
spawning_random()
{
mechz_spawn_chance = getdvarint( "rm_mixed_preset_default_random_variant_mechz_spawn_chance_10000_base" );
zombie_dog_chance = getdvarint( "rm_mixed_preset_default_random_variant_zombie_dog_spawn_chance_10000_base" );
count = 0;
for (;;)
{
@ -60,7 +59,7 @@ spawning_random()
if ( isdefined( ai ) )
{
count++;
level.round_manager_spawn_count++;
level.round_manager_vars[ "spawn_count" ]++;
}
if ( count >= spawning_limit() )

View File

@ -18,8 +18,9 @@ main()
set_dvar_if_unset( "rm_mechz_rush_min_round", 45 );
set_dvar_if_unset( "rm_mechz_rush_min_spawn_wait", 1.5 );
set_dvar_if_unset( "rm_mechz_rush_max_spawn_wait", 2.5 );
set_dvar_if_unset( "rm_mechz_rush_max_mechz_alive", 12 );
set_dvar_if_unset( "rm_mechz_rush_max_mechz_round", 12 );
set_dvar_if_unset( "rm_mechz_rush_max_mechz_alive", 24 );
set_dvar_if_unset( "rm_mechz_rush_max_mechz_round", 24 );
set_dvar_if_unset( "rm_mechz_rush_max_mechz_per_player", 4 );
set_dvar_if_unset( "rm_mechz_rush_max_health_multiplier", 0.5 );
}
@ -100,13 +101,13 @@ round_wait()
round_max()
{
if ( isdefined( level.is_forever_solo_game ) && level.is_forever_solo_game )
level.mechz_zombie_per_round = 1;
else if ( level.special_round_count < 2 )
level.mechz_zombie_per_round = 1;
else if ( level.special_round_count < 5 )
level.mechz_zombie_per_round = 2;
else if ( level.special_round_count < 2 )
level.mechz_zombie_per_round = 4;
else if ( level.special_round_count < 5 )
level.mechz_zombie_per_round = 6;
else
level.mechz_zombie_per_round = 3;
level.mechz_zombie_per_round = 8;
level.zombie_total = level.mechz_zombie_per_round;
level.mechz_left_to_spawn = level.zombie_total;
@ -199,7 +200,19 @@ round_spawning_rush()
round_max_rush()
{
level.zombie_total = getdvarint( "rm_mechz_rush_max_mechz_round" );
max_per_player = getdvarint( "rm_mechz_rush_max_mechz_per_player" );
max_mechz = max_per_player * level.players.size;
max = getdvarint( "rm_mechz_rush_max_mechz_round" );
if ( max_mechz > max )
{
max_mechz = max;
}
if ( max_mechz <= 0 )
{
max_mechz = 2;
}
level.zombie_total = max_mechz;
level.mechz_left_to_spawn = level.zombie_total;
}

View File

@ -25,8 +25,11 @@ main()
pluto_sys::replacefunc( maps\mp\animscripts\zm_dog_combat::domeleeafterwait, ::domeleeafterwait_override );
pluto_sys::replacefunc( maps\mp\animscripts\zm_dog_combat::handlemeleebiteattacknotetracks, ::handlemeleebiteattacknotetracks_override );
//pluto_sys::replacefunc( maps\mp\animscripts\zm_run::setanimstatefromspeed, ::setanimstatefromspeed_override );
//pluto_sys::replacefunc( maps\mp\animscripts\zm_melee::set_zombie_melee_anim_state, ::set_zombie_melee_anim_state_override );
if ( getdvarint( "fix_zombie_move_anim_randomizing_after_melee" ) )
{
pluto_sys::replacefunc( maps\mp\animscripts\zm_run::setanimstatefromspeed, ::setanimstatefromspeed_override );
pluto_sys::replacefunc( maps\mp\animscripts\zm_melee::set_zombie_melee_anim_state, ::set_zombie_melee_anim_state_override );
}
level.script = toLower( getDvar( "mapname" ) );
level.gametype = toLower( getDvar( "g_gametype" ) );

View File

@ -513,10 +513,9 @@ playloopsound( sound_alias, fade_time )
}
/@
[DESCRIPTION]: Spawns a temp entity at CALLER's location which plays <sound_name>.
If sound is invalid sound will simply fail to play with no error.;
[DESCRIPTION]: Returns the playback time of <sound_alias>.;
[CALL_TYPE]: method;
[USAGE]: playback_time = playsound( <sound_alias> );
[USAGE]: playback_time = soundgetplaybacktime( <sound_alias> );
[PARAMS]: ARG1:<string>;
[PARAMS_NOTES]: NONE;
[RETURNS]: <int>;

View File

@ -84,6 +84,7 @@ script,scripts/zm/zm_ai_pack/mixed_presets/_default.gsc
script,scripts/zm/zm_ai_pack/mixed_presets/_wave.gsc
script,scripts/zm/zm_ai_pack/mixed_variants/_brutus_wave.gsc
script,scripts/zm/zm_ai_pack/mixed_variants/_dog_wave.gsc
script,scripts/zm/zm_ai_pack/mixed_variants/_leaper_wave.gsc
script,scripts/zm/zm_ai_pack/mixed_variants/_mechz_wave.gsc
script,scripts/zm/zm_ai_pack/mixed_variants/_normal_wave.gsc
script,scripts/zm/zm_ai_pack/mixed_variants/_random.gsc

View File

@ -12,4 +12,5 @@ elemental variants of certain special enemies at higher rounds(electric panzer,
aats
chicky-chicky comes in random variants 1. random projectiles in 360 radius, airstrike where bullet lands, turret shooter, friendly ai shooter
fix zombie move anims changing when meleeing an enemy
fix zombie move anims changing when meleeing an enemy
reactive armor powerup makes enemiesa % of their max health as damage instead of dealing full damage to the player