way too many changes to list, oops. big rewrite.
This commit is contained in:
@ -1,45 +1,47 @@
|
||||
class_name TargetFinder extends Node
|
||||
|
||||
enum TARGETING_STRATEGY {
|
||||
RANDOM = 0,
|
||||
MOST_PROGRESSED = 1,
|
||||
}
|
||||
|
||||
@export var tower: Tower
|
||||
@export var max_targets: int = 1
|
||||
@export var targeting_strategy: TARGETING_STRATEGY = TARGETING_STRATEGY.MOST_PROGRESSED
|
||||
|
||||
var target_cache: EnemyController
|
||||
var multiple_targets_cache: Array[EnemyController]
|
||||
#TODO: this was the quantum cache, so uh, maybe thats a godot bug ?
|
||||
#var multiple_targets_cache: Array[EnemyController]
|
||||
#var has_target: bool :
|
||||
#get:
|
||||
#return targets.size() > 0
|
||||
#set(_value):
|
||||
#return
|
||||
#
|
||||
#var targets: Array[EnemyController] :
|
||||
#get:
|
||||
#return get_multiple_targets()
|
||||
#set(_value):
|
||||
#return
|
||||
#
|
||||
#
|
||||
#func get_multiple_targets() -> Array[EnemyController]:
|
||||
#var new_cache: Array[EnemyController] = []
|
||||
#for enemy: EnemyController in multiple_targets_cache:
|
||||
#if is_instance_valid(enemy) and enemy.alive and enemy.global_position.distance_to(tower.global_position) <= tower.target_range:
|
||||
#new_cache.append(enemy)
|
||||
#if max_targets == 0 or new_cache.size() < max_targets:
|
||||
#multiple_targets_cache = find_multiple_targets(new_cache)
|
||||
#return multiple_targets_cache
|
||||
|
||||
var targets: Array[EnemyController] :
|
||||
get:
|
||||
return find_multiple_targets()
|
||||
set(_value):
|
||||
return
|
||||
|
||||
|
||||
func get_multiple_targets() -> Array[EnemyController]:
|
||||
var new_cache: Array[EnemyController] = []
|
||||
for enemy: EnemyController in multiple_targets_cache:
|
||||
if is_instance_valid(enemy) and enemy.alive and enemy.global_position.distance_to(tower.global_position) <= tower.target_range:
|
||||
new_cache.append(enemy)
|
||||
if new_cache.size() < max_targets:
|
||||
multiple_targets_cache = find_multiple_targets(new_cache)
|
||||
return multiple_targets_cache
|
||||
|
||||
|
||||
func get_target() -> EnemyController:
|
||||
if !is_instance_valid(target_cache) or !target_cache.alive or tower.global_position.distance_to(target_cache.global_position) > tower.target_range:
|
||||
target_cache = find_enemy()
|
||||
return target_cache
|
||||
|
||||
|
||||
func find_enemy() -> EnemyController:
|
||||
var most_progressed_enemy: EnemyController = null
|
||||
for enemy: EnemyController in get_tree().get_nodes_in_group("Enemies"):
|
||||
if tower.global_position.distance_to(enemy.global_position) > tower.target_range:
|
||||
continue
|
||||
var em_1: EnemyMovement = enemy.movement_controller as EnemyMovement
|
||||
var em_2: EnemyMovement
|
||||
if most_progressed_enemy != null:
|
||||
em_2 = most_progressed_enemy.movement_controller as EnemyMovement
|
||||
if (most_progressed_enemy == null or em_1.distance_remaining < em_2.distance_remaining) and enemy.stats.target_type & tower.stats.target_type:
|
||||
most_progressed_enemy = enemy
|
||||
return most_progressed_enemy
|
||||
#TODO: Figure out how to multiplayer-ize this
|
||||
#networked_acquire_target.rpc(get_tree().root.get_path_to(most_progressed_enemy))
|
||||
|
||||
|
||||
func find_multiple_targets(existing_cache: Array[EnemyController]) -> Array[EnemyController]:
|
||||
#func find_multiple_targets(existing_cache: Array[EnemyController]) -> Array[EnemyController]:
|
||||
func find_multiple_targets() -> Array[EnemyController]:
|
||||
var possible_enemies: Array[EnemyController] = []
|
||||
for enemy: EnemyController in get_tree().get_nodes_in_group("Enemies"):
|
||||
if !is_instance_valid(enemy):
|
||||
@ -48,15 +50,43 @@ func find_multiple_targets(existing_cache: Array[EnemyController]) -> Array[Enem
|
||||
continue
|
||||
if !(enemy.stats.target_type & tower.stats.target_type):
|
||||
continue
|
||||
if multiple_targets_cache.has(enemy):
|
||||
continue
|
||||
#if multiple_targets_cache.has(enemy):
|
||||
# continue
|
||||
possible_enemies.append(enemy)
|
||||
|
||||
for x: int in max_targets - existing_cache.size():
|
||||
#var enemies_to_select: int = max_targets - existing_cache.size()
|
||||
var enemies: Array[EnemyController] = [] # temp cache, see above todo
|
||||
var enemies_to_select: int = max_targets
|
||||
if max_targets == 0:
|
||||
enemies_to_select = possible_enemies.size()
|
||||
for x: int in enemies_to_select:
|
||||
if possible_enemies.size() == 0:
|
||||
break
|
||||
var chosen: EnemyController = possible_enemies.pick_random()
|
||||
var chosen: EnemyController = null
|
||||
match targeting_strategy:
|
||||
TARGETING_STRATEGY.RANDOM:
|
||||
chosen = select_random(possible_enemies)
|
||||
TARGETING_STRATEGY.MOST_PROGRESSED:
|
||||
chosen = select_most_progressed(possible_enemies)
|
||||
possible_enemies.erase(chosen)
|
||||
existing_cache.append(chosen)
|
||||
#existing_cache.append(chosen)
|
||||
enemies.append(chosen)
|
||||
|
||||
return existing_cache
|
||||
#return existing_cache
|
||||
return enemies
|
||||
|
||||
|
||||
func select_random(choices: Array[EnemyController]) -> EnemyController:
|
||||
return choices.pick_random()
|
||||
|
||||
|
||||
func select_most_progressed(choices: Array[EnemyController]) -> EnemyController:
|
||||
var most_progressed_enemy: EnemyController = null
|
||||
for enemy: EnemyController in choices:
|
||||
var em_1: EnemyMovement = enemy.movement_controller as EnemyMovement
|
||||
var em_2: EnemyMovement = null
|
||||
if most_progressed_enemy != null:
|
||||
em_2 = most_progressed_enemy.movement_controller as EnemyMovement
|
||||
if (most_progressed_enemy == null or em_1.distance_remaining < em_2.distance_remaining):
|
||||
most_progressed_enemy = enemy
|
||||
return most_progressed_enemy
|
||||
|
Reference in New Issue
Block a user