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" ) );