From f7f3ed71b798fc0977cda1268bdc8946a895ddb4 Mon Sep 17 00:00:00 2001 From: JezuzLizard Date: Wed, 6 Mar 2024 23:43:16 -0800 Subject: [PATCH] Fix round manager. Add more todos. --- .../scripts/zm/zm_ai_pack/_round_manager.gsc | 68 +++++++++++++++++-- .../zm/zm_ai_pack/mixed_presets/_default.gsc | 2 +- .../zm/zm_ai_pack/mixed_presets/_wave.gsc | 4 +- .../mixed_variants/_leaper_wave.gsc | 60 ++++++++++++++++ .../zm/zm_ai_pack/mixed_variants/_random.gsc | 9 ++- .../scripts/zm/zm_ai_pack/rounds/_mechz.gsc | 29 +++++--- zm_ai_pack/scripts/zm/zm_ai_pack_mod_main.gsc | 7 +- zm_ai_pack/sys.gsc | 5 +- zm_ai_pack/zone_source/mod.zone | 1 + zm_coolweps/TODO.txt | 3 +- 10 files changed, 159 insertions(+), 29 deletions(-) create mode 100644 zm_ai_pack/scripts/zm/zm_ai_pack/mixed_variants/_leaper_wave.gsc diff --git a/zm_ai_pack/scripts/zm/zm_ai_pack/_round_manager.gsc b/zm_ai_pack/scripts/zm/zm_ai_pack/_round_manager.gsc index 93923bc..cd9f1b7 100644 --- a/zm_ai_pack/scripts/zm/zm_ai_pack/_round_manager.gsc +++ b/zm_ai_pack/scripts/zm/zm_ai_pack/_round_manager.gsc @@ -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 ]; diff --git a/zm_ai_pack/scripts/zm/zm_ai_pack/mixed_presets/_default.gsc b/zm_ai_pack/scripts/zm/zm_ai_pack/mixed_presets/_default.gsc index 51e3779..be92ec8 100644 --- a/zm_ai_pack/scripts/zm/zm_ai_pack/mixed_presets/_default.gsc +++ b/zm_ai_pack/scripts/zm/zm_ai_pack/mixed_presets/_default.gsc @@ -10,5 +10,5 @@ preset_chance() round_start() { - level.round_manager_spawn_count = 0; + level.round_manager_vars[ "spawn_count" ] = 0; } \ No newline at end of file diff --git a/zm_ai_pack/scripts/zm/zm_ai_pack/mixed_presets/_wave.gsc b/zm_ai_pack/scripts/zm/zm_ai_pack/mixed_presets/_wave.gsc index f04911a..765a091 100644 --- a/zm_ai_pack/scripts/zm/zm_ai_pack/mixed_presets/_wave.gsc +++ b/zm_ai_pack/scripts/zm/zm_ai_pack/mixed_presets/_wave.gsc @@ -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"] ); } diff --git a/zm_ai_pack/scripts/zm/zm_ai_pack/mixed_variants/_leaper_wave.gsc b/zm_ai_pack/scripts/zm/zm_ai_pack/mixed_variants/_leaper_wave.gsc new file mode 100644 index 0000000..ba7f01a --- /dev/null +++ b/zm_ai_pack/scripts/zm/zm_ai_pack/mixed_variants/_leaper_wave.gsc @@ -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; +} \ No newline at end of file diff --git a/zm_ai_pack/scripts/zm/zm_ai_pack/mixed_variants/_random.gsc b/zm_ai_pack/scripts/zm/zm_ai_pack/mixed_variants/_random.gsc index 3a5ac45..219c121 100644 --- a/zm_ai_pack/scripts/zm/zm_ai_pack/mixed_variants/_random.gsc +++ b/zm_ai_pack/scripts/zm/zm_ai_pack/mixed_variants/_random.gsc @@ -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() ) diff --git a/zm_ai_pack/scripts/zm/zm_ai_pack/rounds/_mechz.gsc b/zm_ai_pack/scripts/zm/zm_ai_pack/rounds/_mechz.gsc index 279d720..999bdc3 100644 --- a/zm_ai_pack/scripts/zm/zm_ai_pack/rounds/_mechz.gsc +++ b/zm_ai_pack/scripts/zm/zm_ai_pack/rounds/_mechz.gsc @@ -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; } diff --git a/zm_ai_pack/scripts/zm/zm_ai_pack_mod_main.gsc b/zm_ai_pack/scripts/zm/zm_ai_pack_mod_main.gsc index 1a78dc5..c2eb702 100644 --- a/zm_ai_pack/scripts/zm/zm_ai_pack_mod_main.gsc +++ b/zm_ai_pack/scripts/zm/zm_ai_pack_mod_main.gsc @@ -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" ) ); diff --git a/zm_ai_pack/sys.gsc b/zm_ai_pack/sys.gsc index d5aff5e..b3c414c 100644 --- a/zm_ai_pack/sys.gsc +++ b/zm_ai_pack/sys.gsc @@ -513,10 +513,9 @@ playloopsound( sound_alias, fade_time ) } /@ - [DESCRIPTION]: Spawns a temp entity at CALLER's location which plays . - If sound is invalid sound will simply fail to play with no error.; + [DESCRIPTION]: Returns the playback time of .; [CALL_TYPE]: method; - [USAGE]: playback_time = playsound( ); + [USAGE]: playback_time = soundgetplaybacktime( ); [PARAMS]: ARG1:; [PARAMS_NOTES]: NONE; [RETURNS]: ; diff --git a/zm_ai_pack/zone_source/mod.zone b/zm_ai_pack/zone_source/mod.zone index 3a1d38c..c1f10b6 100644 --- a/zm_ai_pack/zone_source/mod.zone +++ b/zm_ai_pack/zone_source/mod.zone @@ -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 diff --git a/zm_coolweps/TODO.txt b/zm_coolweps/TODO.txt index 7fe1017..042f49e 100644 --- a/zm_coolweps/TODO.txt +++ b/zm_coolweps/TODO.txt @@ -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 \ No newline at end of file +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 \ No newline at end of file