From ae7cfb991a8a20d74c772c50a76e46f7b2a8bd5c Mon Sep 17 00:00:00 2001 From: JezuzLizard Date: Mon, 27 Mar 2023 21:38:25 -0700 Subject: [PATCH] Add missing return values to check_complete functions. Fix mistakes in scripts. Create bot objective glob and add objectives on map to the glob. Don't create 3 separate threads for bot think. --- scripts/sp/T4ZM_zbots_main.gsc | 228 +++++++++++++++++++---- scripts/sp/bots/actions/combat.gsc | 16 +- scripts/sp/bots/actions/movement.gsc | 18 +- scripts/sp/bots/actions/objective.gsc | 26 +-- scripts/sp/bots/bot_actions_common.gsc | 61 +++--- scripts/sp/bots/bot_objective_common.gsc | 110 +++++++++++ scripts/sp/bots/bot_utility.gsc | 2 +- 7 files changed, 374 insertions(+), 87 deletions(-) create mode 100644 scripts/sp/bots/bot_objective_common.gsc diff --git a/scripts/sp/T4ZM_zbots_main.gsc b/scripts/sp/T4ZM_zbots_main.gsc index 9d25848..7e8a792 100644 --- a/scripts/sp/T4ZM_zbots_main.gsc +++ b/scripts/sp/T4ZM_zbots_main.gsc @@ -1,9 +1,9 @@ #include common_scripts\utility; #include maps\_utility; -#include maps\_zombiemode_utility; - +#include maps\so\zm_common\_zm_utility; #include scripts\sp\bots\bot_actions_common; +#include scripts\sp\bots\bot_objective_common; #include scripts\sp\bots\bot_difficulty_presets_common; #include scripts\sp\bots\bot_personality_presets_common; #include scripts\sp\bots\actions\combat; @@ -12,9 +12,8 @@ main() { - //3 separate bot think threads //Objective group is for things to go to usually allowing the bot to kill zombies on the way and survive as normal - //Objectives can be canceled/postponed by combat thread, movement thread or by other objectives + //Objectives can be canceled/postponed by combat, movement or by other objectives register_bot_action( "objective", "magicbox", ::bot_magicbox_purchase, ::bot_magicbox_process_order, ::bot_should_purchase_magicbox, ::bot_check_complete_magicbox, ::bot_set_complete_magicbox, ::bot_magicbox_purchase_on_completion, ::bot_magicbox_purchase_should_cancel, ::bot_magicbox_purchase_on_cancel, ::bot_magicbox_purchase_should_postpone, ::bot_magicbox_purchase_on_postpone, ::bot_magicbox_purchase_priority ); register_bot_action( "objective", "wallbuy", ::bot_wallbuy_purchase, ::bot_wallbuy_process_order, ::bot_should_purchase_wallbuy, ::bot_check_complete_wallbuy, ::bot_set_complete_wallbuy, ::bot_wallbuy_purchase_on_completion, ::bot_wallbuy_purchase_should_cancel, ::bot_wallbuy_purchase_on_cancel, ::bot_wallbuy_purchase_should_postpone, ::bot_wallbuy_purchase_on_postpone, ::bot_wallbuy_purchase_priority ); register_bot_action( "objective", "wallbuyammo", ::bot_wallbuy_ammo_purchase, ::bot_wallbuyammo_process_order, ::bot_should_purchase_wallbuy_ammo, ::bot_check_complete_wallbuy_ammo, ::bot_set_complete_wallbuy_ammo, ::bot_wallbuy_ammo_purchase_on_completion, ::bot_wallbuy_ammo_purchase_should_cancel, ::bot_wallbuy_ammo_purchase_on_cancel, ::bot_wallbuy_ammo_purchase_should_postpone, ::bot_wallbuy_ammo_purchase_on_postpone, ::bot_wallbuy_ammo_purchase_priority ); @@ -24,12 +23,12 @@ main() register_bot_action( "objective", "trap", ::bot_trap_purchase, ::bot_trap_process_order, ::bot_should_purchase_trap, ::bot_check_complete_trap_purchase, ::bot_set_complete_trap_purchase, ::bot_trap_purchase_on_completion, ::bot_trap_purchase_should_cancel, ::bot_trap_purchase_on_cancel, ::bot_trap_purchase_should_postpone, ::bot_trap_purchase_on_postpone, ::bot_trap_purchase_priority ); register_bot_action( "objective", "packapunch", ::bot_packapunch_purchase, ::bot_packapunch_process_order, ::bot_should_purchase_packapunch, ::bot_check_complete_packapunch_purchase, ::bot_set_complete_packapunch_purchase, ::bot_packapunch_purchase_on_completion, ::bot_packapunch_purchase_should_cancel, ::bot_packapunch_purchase_on_cancel, ::bot_packapunch_purchase_should_postpone, ::bot_packapunch_purchase_on_postpone, ::bot_packapunch_purchase_priority ); register_bot_action( "objective", "revive", ::bot_revive_player, ::bot_revive_process_order, ::bot_should_revive_player, ::bot_check_complete_revive_player, ::bot_set_complete_revive_player, ::bot_revive_player_on_completion, ::bot_revive_player_should_cancel, ::bot_revive_player_on_cancel, ::bot_revive_player_should_postpone, ::bot_revive_player_on_postpone, ::bot_revive_player_priority ); - register_bot_action( "objective", "grabbuildable", ::bot_grab_buildable, ::bot_grab_buildable_process_order, ::bot_should_grab_buildable, ::bot_check_complete_grab_buildable, ::bot_set_complete_grab_buildable, ::bot_grab_buildable_on_completion, ::bot_grab_buildable_should_cancel, ::bot_grabbuild_buildable_on_cancel, ::bot_grab_buildable_should_postpone, ::bot_grab_buildable_on_postpone, ::bot_grab_buildable_priority ); - register_bot_action( "objective", "buildbuildable", ::bot_build_buildable, ::bot_build_buildable_process_order, ::bot_should_build_buildable, ::bot_check_complete_build_buildable, ::bot_set_complete_build_buildable, ::bot_build_buildable_on_completion, ::bot_build_buildable_should_cancel, ::bot_build_buildable_on_cancel, ::bot_build_buildable_should_postpone, ::bot_build_buildable_on_postpone, ::bot_build_buildable_priority ); - register_bot_action( "objective", "part", ::bot_grab_part, ::bot_part_process_order, ::bot_should_grab_part, ::bot_check_complete_grab_part, ::bot_set_complete_grab_part, ::bot_part_on_completion, ::bot_part_should_cancel, ::bot_part_on_cancel, ::bot_part_should_postpone, ::bot_part_on_postpone, ::bot_part_priority ); + //register_bot_action( "objective", "grabbuildable", ::bot_grab_buildable, ::bot_grab_buildable_process_order, ::bot_should_grab_buildable, ::bot_check_complete_grab_buildable, ::bot_set_complete_grab_buildable, ::bot_grab_buildable_on_completion, ::bot_grab_buildable_should_cancel, ::bot_grabbuild_buildable_on_cancel, ::bot_grab_buildable_should_postpone, ::bot_grab_buildable_on_postpone, ::bot_grab_buildable_priority ); + //register_bot_action( "objective", "buildbuildable", ::bot_build_buildable, ::bot_build_buildable_process_order, ::bot_should_build_buildable, ::bot_check_complete_build_buildable, ::bot_set_complete_build_buildable, ::bot_build_buildable_on_completion, ::bot_build_buildable_should_cancel, ::bot_build_buildable_on_cancel, ::bot_build_buildable_should_postpone, ::bot_build_buildable_on_postpone, ::bot_build_buildable_priority ); + //register_bot_action( "objective", "part", ::bot_grab_part, ::bot_part_process_order, ::bot_should_grab_part, ::bot_check_complete_grab_part, ::bot_set_complete_grab_part, ::bot_part_on_completion, ::bot_part_should_cancel, ::bot_part_on_cancel, ::bot_part_should_postpone, ::bot_part_on_postpone, ::bot_part_priority ); register_bot_action( "objective", "powerup", ::bot_grab_powerup, ::bot_powerup_process_order, ::bot_should_grab_powerup, ::bot_check_complete_grab_powerup, ::bot_set_complete_grab_powerup, ::bot_powerup_on_completion, ::bot_powerup_should_cancel, ::bot_powerup_on_cancel, ::bot_powerup_should_postpone, ::bot_powerup_on_postpone, ::bot_powerup_priority ); - //Combat thread actions + //Combat actions //These all need definitions register_bot_action( "combat", "aimatsinglenormalzombie", ::bot_aimatsinglenormalzombie, ::bot_aimatsinglenormalzombie_process_order ::bot_should_aimatsinglenormalzombie, ::bot_check_complete_aimatsinglenormalzombie, ::bot_set_complete_aimatsinglenormalzombie, ::bot_aimatsinglenormalzombie_on_completion, ::bot_aimatsinglenormalzombie_should_cancel, ::bot_aimatsinglenormalzombie_on_cancel, ::bot_aimatsinglenormalzombie_should_postpone, ::bot_aimatsinglenormalzombie_on_postpone, ::bot_aimatsinglenormalzombie_priority ); register_bot_action( "combat", "shootsinglenormalzombie", ::bot_shootsinglenormalzombie, ::bot_shootsinglenormalzombie_process_order ::bot_should_shootsinglenormalzombie, ::bot_check_complete_shootsinglenormalzombie, ::bot_set_complete_shootsinglenormalzombie, ::bot_shootsinglenormalzombie_on_completion, ::bot_shootsinglenormalzombie_should_cancel, ::bot_shootsinglenormalzombie_on_cancel, ::bot_shootsinglenormalzombie_should_postpone, ::bot_shootsinglenormalzombie_on_postpone, ::bot_shootsinglenormalzombie_priority ); @@ -40,7 +39,7 @@ main() register_bot_action( "combat", "shootmultipledogzombies", ::bot_shootmultipledogzombies, ::bot_shootmultipledogzombies_process_order ::bot_should_shootmultipledogzombies, ::bot_check_complete_shootmultipledogzombies, ::bot_set_complete_shootmultipledogzombies, ::bot_shootmultipledogzombies_on_completion, ::bot_shootmultipledogzombies_should_cancel, ::bot_shootmultipledogzombies_on_cancel, ::bot_shootmultipledogzombies_should_postpone, ::bot_shootmultipledogzombies_on_postpone, ::bot_shootmultipledogzombies_priority ); register_bot_action( "combat", "meleesingledogzombie", ::bot_meleesingledogzombie, ::bot_meleesingledogzombie_process_order ::bot_should_meleesingledogzombie, ::bot_check_complete_meleesingledogzombie, ::bot_set_complete_meleesingledogzombie, ::bot_meleesingledogzombie_on_completion, ::bot_meleesingledogzombie_should_cancel, ::bot_meleesingledogzombie_on_cancel, ::bot_meleesingledogzombie_should_postpone, ::bot_meleesingledogzombie_on_postpone, ::bot_meleesingledogzombie_priority ); - //Movement thread actions + //Movement actions //These all need definitions register_bot_action( "movement", "movetoobjective", ::bot_movetoobjective, ::bot_movetoobjective_process_order ::bot_should_movetoobjective, ::bot_check_complete_movetoobjective, ::bot_set_complete_movetoobjective, ::bot_movetoobjective_on_completion, ::bot_movetoobjective_should_cancel, ::bot_movetoobjective_on_cancel, ::bot_movetoobjective_should_postpone, ::bot_movetoobjective_on_postpone, ::bot_movetoobjective_priority ); register_bot_action( "movement", "train", ::bot_train, ::bot_train_process_order ::bot_should_train, ::bot_check_complete_train, ::bot_set_complete_train, ::bot_train_on_completion, ::bot_train_should_cancel, ::bot_train_on_cancel, ::bot_train_should_postpone, ::bot_train_on_postpone, ::bot_train_priority ); @@ -84,14 +83,100 @@ main() level.zbot_path_nodes = getAllNodes(); - level thread store_powerups_dropped(); level thread spawn_bots(); + + level thread on_player_connect(); +} + +on_player_connect() +{ + i = 0; + while ( true ) + { + level waittill( "connected", player ); + player.id = i; + i++; + } } //TODO: Make postponing save the settings for the action so when the action is being executed again the bot tries to do/get the same thing +//TODO: Make global canceling and postponing functionality +//TODO: Make shared global objective and normal objective globs work init() { + if ( isDefined( level.chests ) && level.chests.size > 0 ) + { + for ( i = 0; i < level.chests.size; i++ ) + { + level.chests[ i ].id = i; + } + level thread watch_magicbox_objectives(); + } + + weapon_spawns = GetEntArray( "weapon_upgrade", "targetname" ); + + if ( isDefined( weapon_spawns ) && weapon_spawns.size > 0 ) + { + for( i = 0; i < weapon_spawns.size; i++ ) + { + weapon_spawns[ i ].id = i; + add_possible_bot_objective( "wallbuy", i, false, weapon_spawns[ i ] ); + add_possible_bot_objective( "wallbuyammo", i, false, weapon_spawns[ i ] ); + } + } + + vending_triggers = GetEntArray( "zombie_vending", "targetname" ); + + if ( isDefined( vending_triggers ) && vending_triggers.size > 0 ) + { + for ( i = 0; i < vending_triggers.size; i++ ) + { + vending_triggers[ i ].id = i; + add_possible_bot_objective( "perk", i, false, vending_triggers[ i ] ); + } + } + + //TODO: See if its possible to automatically detect if a door is blocking an objective + zombie_doors = GetEntArray( "zombie_door", "targetname" ); + + if ( isDefined( zombie_doors ) && zombie_doors.size > 0 ) + { + for ( i = 0; i < zombie_doors.size; i++ ) + { + zombie_doors[ i ].id = i; + add_possible_bot_objective( "door", i, true, zombie_doors[ i ] ); + } + level thread watch_door_objectives( zombie_doors ); + } + + zombie_debris = GetEntArray( "zombie_debris", "targetname" ); + + if ( isDefined( zombie_debris ) && zombie_debris.size > 0 ) + { + for ( i = 0; i < zombie_debris.size; i++ ) + { + zombie_debris.id = i; + add_possible_bot_objective( "debris", i, true, zombie_debris[ i ] ); + } + level thread watch_debris_objectives( zombie_debris ); + } + + vending_upgrade_trigger = GetEntArray("zombie_vending_upgrade", "targetname"); + + if ( isDefined( vending_upgrade_trigger ) && vending_upgrade_trigger.size > 0 ) + { + for ( i = 0; i < vending_upgrade_trigger.size; i++ ) + { + vending_upgrade_trigger[ i ].id = i; + add_possible_bot_objective( "packapunch", i, false, vending_upgrade_trigger[ i ] ); + } + } + + level thread watch_for_downed_players(); + + level thread store_powerups_dropped(); + parse_bot_weapon_stats_from_table(); } @@ -123,17 +208,13 @@ spawn_bots() bot.action_queue[ "combat" ] = []; bot.action_queue[ "movement" ] = []; bot register_action_queue_actions(); - bot thread bot_objective_think(); - bot thread bot_combat_think(); - bot thread bot_movement_think(); + bot thread bot_think(); bot_count++; } } -bot_objective_think() +bot_think() { - group_name = "objective"; - level endon( "end_game" ); self endon( "disconnect" ); @@ -148,33 +229,27 @@ bot_objective_think() wait 1; continue; } + + group_name = "objective"; + self pick_actions_to_add_to_queue( group_name ); self process_next_queued_action(); self check_if_action_is_completed_in_group( group_name ); self check_if_action_should_be_postponed_in_group( group_name ); self check_if_action_should_be_canceled_in_group( group_name ); - } -} -bot_combat_think() -{ - group_name = "combat"; + group_name = "movement"; - level endon( "end_game" ); - self endon( "disconnect" ); + self pick_actions_to_add_to_queue( group_name ); + self process_next_queued_action(); - self waittill( "spawned_player" ); + self check_if_action_is_completed_in_group( group_name ); + self check_if_action_should_be_postponed_in_group( group_name ); + self check_if_action_should_be_canceled_in_group( group_name ); + + group_name = "combat"; - while ( true ) - { - wait 0.25; - if ( !bot_valid( self ) ) - { - self.action_queue = []; - wait 1; - continue; - } self pick_actions_to_add_to_queue( group_name ); self process_next_queued_action(); @@ -221,11 +296,53 @@ bot_movement_think() } } +watch_door_objectives( zombie_doors ) +{ + level endon( "end_game" ); + + for ( doors_opened_count = 0; doors_opened_count < zombie_doors.size; doors_opened_count++ ) + { + level waittill( "door_opened", door, player ); + free_bot_objective( "door", door.id ); + } +} + +watch_debris_objectives( zombie_debris ) +{ + level endon( "end_game" ); + + for ( debris_opened_count = 0; debris_opened_count < zombie_debris.size; debris_opened_count++ ) + { + level waittill( "door_opened", debris, player ); + free_bot_objective( "door", debris.id ); + } +} + +watch_magicbox_objectives() +{ + level endon( "end_game" ); + + prev_magicbox = maps\so\zm_common\_zm_magicbox::get_active_magicbox(); + while ( true ) + { + cur_magicbox = maps\so\zm_common\_zm_magicbox::get_active_magicbox(); + if ( prev_magicbox != cur_magicbox ) + { + add_possible_bot_objective( "magicbox", cur_magicbox.id, false, cur_magicbox ); + free_bot_objective( "magicbox", prev_magicbox.id ); + prev_magicbox = cur_magicbox; + } + wait 1; + } +} + store_powerups_dropped() { + level endon( "end_game" ); + level.zbots_powerups = []; level.zbots_powerups_targeted_for_grab = []; - id_num = 0; + id = 0; while ( true ) { level waittill( "powerup_dropped", powerup ); @@ -233,11 +350,54 @@ store_powerups_dropped() { continue; } + powerup.id = id; + add_possible_bot_objective( "powerup", id, true, powerup ); assign_priority_to_powerup( powerup ); level.zbots_powerups = sort_array_by_priority_field( level.zbots_powerups, powerup ); + id++; } } +free_powerups_dropped() +{ + level endon( "end_game" ); + + while ( true ) + { + level waittill( "powerup_freed", powerup ); + free_bot_objective( "powerup", powerup.id ); + } +} + +watch_for_downed_players() +{ + level endon( "end_game" ); + + while ( true ) + { + level waittill( "player_entered_laststand", player ); + if ( !isDefined( player ) ) + { + continue; + } + add_possible_bot_objective( "revive", player.id, true, player ); + player thread free_revive_objective_when_needed(); + } +} + +free_revive_objective_when_needed() +{ + level endon( "end_game" ); + + id = self.id; + while ( isDefined( self ) && isDefined( self.revivetrigger ) ) + { + wait 0.05; + } + + free_bot_objective( "revive", id ); +} + doBotMovement_loop() { move_To = self.bot.moveTo; diff --git a/scripts/sp/bots/actions/combat.gsc b/scripts/sp/bots/actions/combat.gsc index f7b563f..8652d6f 100644 --- a/scripts/sp/bots/actions/combat.gsc +++ b/scripts/sp/bots/actions/combat.gsc @@ -15,7 +15,7 @@ bot_should_aimatsinglenormalzombie() bot_check_complete_aimatsinglenormalzombie() { - + return false; } bot_set_complete_aimatsinglenormalzombie() @@ -70,7 +70,7 @@ bot_should_shootsinglenormalzombie() bot_check_complete_shootsinglenormalzombie() { - + return false; } bot_set_complete_shootsinglenormalzombie() @@ -125,7 +125,7 @@ bot_should_aimatmultiplenormalzombies() bot_check_complete_aimatmultiplenormalzombies() { - + return false; } bot_set_complete_aimatmultiplenormalzombies() @@ -180,7 +180,7 @@ bot_should_shootmultiplenormalzombies() bot_check_complete_shootmultiplenormalzombies() { - + return false; } bot_set_complete_shootmultiplenormalzombies() @@ -235,7 +235,7 @@ bot_should_meleesinglenormalzombie() bot_check_complete_meleesinglenormalzombie() { - + return false; } bot_set_complete_meleesinglenormalzombie() @@ -290,7 +290,7 @@ bot_should_shootsingledogzombie() bot_check_complete_shootsingledogzombie() { - + return false; } bot_set_complete_shootsingledogzombie() @@ -345,7 +345,7 @@ bot_should_shootmultipledogzombies() bot_check_complete_shootmultipledogzombies() { - + return false; } bot_set_complete_shootmultipledogzombies() @@ -400,7 +400,7 @@ bot_should_meleesingledogzombie() bot_check_complete_meleesingledogzombie() { - + return false; } bot_set_complete_meleesingledogzombie() diff --git a/scripts/sp/bots/actions/movement.gsc b/scripts/sp/bots/actions/movement.gsc index fa7fd2e..a00f502 100644 --- a/scripts/sp/bots/actions/movement.gsc +++ b/scripts/sp/bots/actions/movement.gsc @@ -10,17 +10,21 @@ bot_movetoobjective_process_order() bot_should_movetoobjective() { + if ( isDefined( self.action_queue[ "objective" ][ 0 ] ) ) + { + return true; + } return false; } bot_check_complete_movetoobjective() { - + return self.zbot_actions_in_queue[ "movement" ][ "movetoobjective" ].completed; } bot_set_complete_movetoobjective() { - + self.zbot_actions_in_queue[ "movement" ][ "movetoobjective" ].completed = true; } bot_movetoobjective_on_completion() @@ -40,6 +44,10 @@ bot_movetoobjective_on_cancel() bot_movetoobjective_should_postpone() { + if ( self bot_should_flee() ) + { + return true; + } return false; } @@ -70,7 +78,7 @@ bot_should_train() bot_check_complete_train() { - + return false; } bot_set_complete_train() @@ -125,7 +133,7 @@ bot_should_camp() bot_check_complete_camp() { - + return false; } bot_set_complete_camp() @@ -180,7 +188,7 @@ bot_should_flee() bot_check_complete_flee() { - + return false; } bot_set_complete_flee() diff --git a/scripts/sp/bots/actions/objective.gsc b/scripts/sp/bots/actions/objective.gsc index e5aaccf..65f526b 100644 --- a/scripts/sp/bots/actions/objective.gsc +++ b/scripts/sp/bots/actions/objective.gsc @@ -47,7 +47,7 @@ bot_should_purchase_magicbox() bot_check_complete_magicbox() { - + return false; } bot_set_complete_magicbox() @@ -116,7 +116,7 @@ bot_should_purchase_wallbuy() bot_check_complete_wallbuy() { - + return false; } bot_set_complete_wallbuy() @@ -171,7 +171,7 @@ bot_should_purchase_wallbuy_ammo() bot_check_complete_wallbuy_ammo() { - + return false; } bot_set_complete_wallbuy_ammo() @@ -226,7 +226,7 @@ bot_should_purchase_perk() bot_check_complete_perk_purchase() { - + return false; } bot_set_complete_perk_purchase() @@ -281,7 +281,7 @@ bot_should_purchase_door() bot_check_complete_door_purchase() { - + return false; } bot_set_complete_door_purchase() @@ -336,7 +336,7 @@ bot_should_purchase_debris() bot_check_complete_debris_purchase() { - + return false; } bot_set_complete_debris_purchase() @@ -391,7 +391,7 @@ bot_should_purchase_trap() bot_check_complete_trap_purchase() { - + return false; } bot_set_complete_trap_purchase() @@ -446,7 +446,7 @@ bot_should_purchase_packapunch() bot_check_complete_packapunch_purchase() { - + return false; } bot_set_complete_packapunch_purchase() @@ -501,7 +501,7 @@ bot_should_revive_player() bot_check_complete_revive_player() { - + return false; } bot_set_complete_revive_player() @@ -556,7 +556,7 @@ bot_should_grab_buildable() bot_check_complete_grab_buildable() { - + return false; } bot_set_complete_grab_buildable() @@ -611,7 +611,7 @@ bot_should_build_buildable() bot_check_complete_build_buildable() { - + return false; } bot_set_complete_build_buildable() @@ -676,7 +676,7 @@ bot_part_should_cancel() bot_check_complete_grab_part() { - + return false; } bot_set_complete_grab_part() @@ -773,7 +773,7 @@ bot_should_grab_powerup() bot_check_complete_grab_powerup() { - + return false; } bot_set_complete_grab_powerup() diff --git a/scripts/sp/bots/bot_actions_common.gsc b/scripts/sp/bots/bot_actions_common.gsc index 47526bb..ab2f864 100644 --- a/scripts/sp/bots/bot_actions_common.gsc +++ b/scripts/sp/bots/bot_actions_common.gsc @@ -3,43 +3,49 @@ */ #include common_scripts\utility; #include maps\_utility; -#include maps\_zombiemode_utility; +#include maps\so\zm_common\_zm_utility; -register_bot_action( group, action_name, action_func, action_process_order_func, should_do_func, check_if_complete_func, set_complete_func, on_completion_func, should_cancel_func, on_cancel_func, should_postpone_func, on_postpone_func, priority_func ) +register_bot_action( group_name, action_name, action_func, action_process_order_func, should_do_func, check_if_complete_func, set_complete_func, on_completion_func, should_cancel_func, on_cancel_func, should_postpone_func, on_postpone_func, priority_func ) { if ( !isDefined( level.zbots_actions ) ) { level.zbots_actions = []; } - if ( !isDefined( level.zbots_actions[ action_name ] ) ) + if ( !isDefined( level.zbots_actions[ group_name ] ) ) { - level.zbots_actions[ action_name ] = []; + level.zbots_actions[ group_name ] = []; } - level.zbots_actions[ action_name ] = spawnStruct(); - level.zbots_actions[ action_name ].group = group; - level.zbots_actions[ action_name ].action = action_func; - level.zbots_actions[ action_name ].should_do_func = should_do_func; - level.zbots_actions[ action_name ].action_process_order_func = action_process_order_func; - level.zbots_actions[ action_name ].check_if_complete_func = check_if_complete_func; - level.zbots_actions[ action_name ].set_complete_func = set_complete_func; - level.zbots_actions[ action_name ].on_completion_func = on_completion_func; - level.zbots_actions[ action_name ].should_cancel_func = should_cancel_func; - level.zbots_actions[ action_name ].on_cancel_func = on_cancel_func; - level.zbots_actions[ action_name ].should_postpone_func = should_postpone_func; - level.zbots_actions[ action_name ].on_postpone_func = on_postpone_func; - level.zbots_actions[ action_name ].priority_func = priority_func; + if ( !isDefined( level.zbots_actions[ group_name ][ action_name ] ) ) + { + level.zbots_actions[ group_name ][ action_name ] = spawnStruct(); + } + level.zbots_actions[ group_name ][ action_name ].action = action_func; + level.zbots_actions[ group_name ][ action_name ].should_do_func = should_do_func; + level.zbots_actions[ group_name ][ action_name ].action_process_order_func = action_process_order_func; + level.zbots_actions[ group_name ][ action_name ].check_if_complete_func = check_if_complete_func; + level.zbots_actions[ group_name ][ action_name ].set_complete_func = set_complete_func; + level.zbots_actions[ group_name ][ action_name ].on_completion_func = on_completion_func; + level.zbots_actions[ group_name ][ action_name ].should_cancel_func = should_cancel_func; + level.zbots_actions[ group_name ][ action_name ].on_cancel_func = on_cancel_func; + level.zbots_actions[ group_name ][ action_name ].should_postpone_func = should_postpone_func; + level.zbots_actions[ group_name ][ action_name ].on_postpone_func = on_postpone_func; + level.zbots_actions[ group_name ][ action_name ].priority_func = priority_func; } initialize_bot_actions_queue() { - keys = getArrayKeys( level.zbots_actions ); - for ( i = 0; i < keys.size; i++ ) + group_keys = getArrayKeys( level.zbots_actions ); + for ( i = 0; i < group_keys.size; i++ ) { - self register_bot_objective_action_for_queue( keys[ i ], level.zbots_actions[ keys[ i ] ].group ); + action_keys = getArrayKeys( level.zbots_actions[ group_keys[ i ] ] ); + for ( j = 0; j < action_keys.size; j++ ) + { + self register_bot_objective_action_for_queue( group_keys[ i ], action_keys[ j ] ); + } } } -register_bot_objective_action_for_queue( action_name ) +register_bot_objective_action_for_queue( group_name, action_name ) { if ( !isDefined( self.zbot_actions_in_queue ) ) { @@ -49,7 +55,10 @@ register_bot_objective_action_for_queue( action_name ) { self.zbot_actions_in_queue[ group_name ] = []; } - self.zbot_actions_in_queue[ group_name ][ action_name ] = spawnStruct(); + if ( !isDefined( self.zbot_actions_in_queue[ group_name ][ action_name ] ) ) + { + self.zbot_actions_in_queue[ group_name ][ action_name ] = spawnStruct(); + } self.zbot_actions_in_queue[ group_name ][ action_name ].postponed = false; self.zbot_actions_in_queue[ group_name ][ action_name ].canceled = false; self.zbot_actions_in_queue[ group_name ][ action_name ].queued = false; @@ -91,6 +100,7 @@ wait_for_action_completion( group_name, action_name ) { self.zbot_actions_in_queue[ group_name ][ self.action_queue[ group_name ][ 0 ].action_name ].postponed = false; self.zbot_actions_in_queue[ group_name ][ self.action_queue[ group_name ][ 0 ].action_name ].queued = false; + self.zbot_actions_in_queue[ group_name ][ self.action_queue[ group_name ][ 0 ].action_name ].completed = false; self.action_queue[ group_name ][ 0 ] = undefined; self thread [[ self.action_queue[ group_name ][ 0 ].on_completion_func ]](); } @@ -98,6 +108,7 @@ wait_for_action_completion( group_name, action_name ) { self.zbot_actions_in_queue[ group_name ][ self.action_queue[ group_name ][ 0 ].action_name ].postponed = false; self.zbot_actions_in_queue[ group_name ][ self.action_queue[ group_name ][ 0 ].action_name ].queued = false; + self.zbot_actions_in_queue[ group_name ][ self.action_queue[ group_name ][ 0 ].action_name ].completed = false; self.action_queue[ group_name ][ 0 ] = undefined; self thread [[ self.action_queue[ group_name ][ 0 ].on_cancel_func ]](); } @@ -127,6 +138,8 @@ copy_default_action_settings_to_queue( group_name, action_name ) pick_actions_to_add_to_queue( group_name ) { + action_keys = getArrayKeys( level.zbots_actions[ group_name ] ); + //TODO: Use process order funcs to determine the order of actions being added to the queue //For now just randomize the order of the keys /* @@ -136,10 +149,6 @@ pick_actions_to_add_to_queue( group_name ) } */ - action_keys = getArrayKeys( level.zbots_actions[ group_name ] ); - - action_keys = array_randomize( action_keys ); - for ( i = 0; i < action_keys.size; i++ ) { if ( !self.zbot_actions_in_queue[ group_name ][ action_keys[ i ] ].queued && [[ level.zbots_actions[ group_name ][ action_keys[ i ] ].should_do_func ]]() ) diff --git a/scripts/sp/bots/bot_objective_common.gsc b/scripts/sp/bots/bot_objective_common.gsc new file mode 100644 index 0000000..b645461 --- /dev/null +++ b/scripts/sp/bots/bot_objective_common.gsc @@ -0,0 +1,110 @@ +add_possible_bot_objective( objective_group, id, is_global_shared, target_ent ) +{ + if ( !isDefined( level.zbot_objective_glob ) ) + { + level.zbot_objective_glob = []; + } + if ( !isDefined( level.zbot_objective_glob[ objective_group ] ) ) + { + level.zbot_objective_glob[ objective_group ] = spawnStruct(); + level.zbot_objective_glob[ objective_group ].active_objectives = []; + } + + objective_struct = spawnStruct(); + objective_struct.group = objective_group; + objective_struct.id = id; + objective_struct.is_global_shared = is_global_shared; + objective_struct.target_ent = target_ent; + objective_struct.owner = undefined; + + level.zbot_objective_glob[ objective_group ].active_objectives[ "obj_id_" + id ] = objective_struct; +} + +set_bot_objective_blocked_by_objective( primary_objective_group, primary_id, blocked_by_objective_group, blocked_by_id ) +{ + primary_active_objectives = level.zbot_objective_glob[ primary_objective_group ].active_objectives; + + primary_objective = primary_active_objectives[ "obj_id_" + primary_id ]; + + primary_objective_exists = isDefined( primary_objective ); + + assert( primary_objective_exists, "Objective with " + primary_id + " id does not point to a objective in group " + primary_objective_group ); + if ( !primary_objective_exists ) + { + return; + } + if ( primary_objective_group == blocked_by_objective_group ) + { + assert( primary_id != blocked_by_id, "Objective with " + primary_id + " id should not be the same as the blocked_by_id if the objectives are in the same group of " + primary_objective_group ); + if ( primary_id == blocked_by_id ) + { + return; + } + + blocking_objective = primary_active_objectives[ "obj_id_" + blocked_by_id ]; + + blocking_objective_exists = isDefined( blocking_objective ); + + assert( blocking_objective_exists, "Objective with " + blocked_by_id + " id does not point to a objective in group " + blocked_by_objective_group ); + if ( !blocking_objective_exists ) + { + return; + } + + primary_objective.blocking_objective = blocking_objective; + } + else + { + secondary_active_objectives = level.zbot_objective_glob[ blocked_by_objective_group ].active_objectives; + + blocking_objective = secondary_active_objectives[ "obj_id_" + blocked_by_id ]; + + blocking_objective_exists = isDefined( blocking_objective ); + + assert( blocking_objective_exists, "Objective with " + blocked_by_id + " id does not point to a objective in group " + blocked_by_objective_group ); + if ( !blocking_objective_exists ) + { + return; + } + + primary_objective.blocking_objective = blocking_objective; + } +} + +set_bot_global_shared_objective_owner( objective_group, new_owner, id ) +{ + active_objectives = level.zbot_objective_glob[ objective_group ].active_objectives; + + objective = active_objectives[ "obj_id_" + id ]; + + objective_exists = isDefined( objective ); + assert( objective_exists, "Objective with " + id + " id number does not point to a objective in group " + objective_group ); + if ( !objective_exists ) + { + return; + } + + assert( objective.is_global_shared, "Objective with " + id + " id number cannot be set an owner because is_global_shared field is false in group" + objective_group ); + if ( !objective.is_global_shared ) + { + return; + } + + objective.owner = new_owner; +} + +free_bot_objective( objective_group, id ) +{ + active_objectives = level.zbot_global_shared_objective_glob[ objective_group ].active_objectives; + + objective = active_objectives[ "obj_id_" + id ]; + + objective_exists = isDefined( objective ); + assert( objective_exists, "Objective with " + id + " id number does not point to a objective in group " + objective_group ); + if ( !objective_exists ) + { + return; + } + + objective = undefined; +} \ No newline at end of file diff --git a/scripts/sp/bots/bot_utility.gsc b/scripts/sp/bots/bot_utility.gsc index 49abecd..e708748 100644 --- a/scripts/sp/bots/bot_utility.gsc +++ b/scripts/sp/bots/bot_utility.gsc @@ -1,6 +1,6 @@ #include common_scripts\utility; #include maps\_utility; -#include maps\_zombiemode_utility; +#include maps\so\zm_common\_zm_utility; register_stats_for_bot_weapon( weapon, score ) {