From f53d91a9eb748419fa73e01f80382620af5007f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torjus=20H=C3=A5kestad?= Date: Fri, 22 Aug 2025 14:12:42 +0200 Subject: [PATCH] game: cache some calculations for enemies --- scenes/enemies/enemy_base.gd | 25 ++++++++++++++----------- scenes/managers/enemy_manager.gd | 12 +++++++++++- scenes/utils/keyed_cache.gd | 17 +++++++++++++++++ scenes/utils/keyed_cache.gd.uid | 1 + 4 files changed, 43 insertions(+), 12 deletions(-) create mode 100644 scenes/utils/keyed_cache.gd create mode 100644 scenes/utils/keyed_cache.gd.uid diff --git a/scenes/enemies/enemy_base.gd b/scenes/enemies/enemy_base.gd index 2387a46..8ea0fe4 100644 --- a/scenes/enemies/enemy_base.gd +++ b/scenes/enemies/enemy_base.gd @@ -27,6 +27,7 @@ var is_dead: bool = false var health: float var _path_update_timer: float = 0.0 +var _compute_cache: KeyedCache = KeyedCache.new() func _ready() -> void: @@ -177,17 +178,19 @@ func _on_animation_player_animation_finished(anim_name: StringName) -> void: func get_calculated(key: String) -> Variant: # set max move speed to players move speed - if key == "move_speed": - return clampf( - EnemyMod.get_calculated(self, key), - 0, - player.player_stats.get_final("move_speed", player.modifiers) - ) - return EnemyMod.get_calculated(self, key) + var compute_func = func(): + if key == "move_speed": + return clampf( + EnemyMod.get_calculated(self, key), + 0, + player.player_stats.get_final("move_speed", player.modifiers) + ) + return EnemyMod.get_calculated(self, key) + + return _compute_cache.get_or_compute(key, compute_func) func has_property(key: String) -> bool: - for prop in get_property_list(): - if prop.name == key: - return true - return false + var cache_key = "prop_%s" % key + var compute_func = func(): return get(key) != null + return _compute_cache.get_or_compute(key, compute_func) diff --git a/scenes/managers/enemy_manager.gd b/scenes/managers/enemy_manager.gd index dc60930..3c38092 100644 --- a/scenes/managers/enemy_manager.gd +++ b/scenes/managers/enemy_manager.gd @@ -13,6 +13,8 @@ const ENEMY_BAT = preload("res://scenes/enemies/enemy_bat.tscn") const ENEMY_SLIME_SMALL = preload("res://scenes/enemies/enemy_slime_small.tscn") const SLIME_COLOR_VARIATIONS: Array[Color] = [Color.CHARTREUSE, Color.FUCHSIA, Color.DARK_ORANGE] +var _elapsed_time: float = 0.0 + func _ready() -> void: timer.wait_time = 1 / spawn_rate @@ -21,7 +23,12 @@ func _ready() -> void: GlobalConst.sig_set_spawn_rate.connect(_on_set_spawn_rate) +func _physics_process(delta: float) -> void: + _elapsed_time += delta + + func _on_timer_timeout() -> void: + _on_set_spawn_rate(1.0 + (_elapsed_time / 60.0) ** 2) var enemies = get_tree().get_nodes_in_group(GlobalConst.GROUP_ENEMY) GlobalConst.sig_debug_stats_set.emit("enemy_count", "%s" % len(enemies)) var next_enemy: PackedScene @@ -105,4 +112,7 @@ func _on_stop_spawning(val: bool): func _on_set_spawn_rate(val: float): - timer.wait_time = 1 / val + timer.stop() + timer.wait_time = 1.0 / val + timer.start() + print_debug("spawn_rate: %s" % timer.wait_time) diff --git a/scenes/utils/keyed_cache.gd b/scenes/utils/keyed_cache.gd new file mode 100644 index 0000000..07b0ea3 --- /dev/null +++ b/scenes/utils/keyed_cache.gd @@ -0,0 +1,17 @@ +class_name KeyedCache +extends Resource + +var cache = {} + + +func get_or_compute(key: String, compute_func: Callable): + if key in cache: + return cache["key"] + + var value = compute_func.call() + cache["key"] = value + return value + + +func invalidate_key(key: String): + cache.erase(key) diff --git a/scenes/utils/keyed_cache.gd.uid b/scenes/utils/keyed_cache.gd.uid new file mode 100644 index 0000000..a12c443 --- /dev/null +++ b/scenes/utils/keyed_cache.gd.uid @@ -0,0 +1 @@ +uid://bbshyok4m8nq3