game: cache some calculations for enemies

This commit is contained in:
2025-08-22 14:12:42 +02:00
parent d57a59e9fe
commit f53d91a9eb
4 changed files with 43 additions and 12 deletions

View File

@@ -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,6 +178,7 @@ func _on_animation_player_animation_finished(anim_name: StringName) -> void:
func get_calculated(key: String) -> Variant:
# set max move speed to players move speed
var compute_func = func():
if key == "move_speed":
return clampf(
EnemyMod.get_calculated(self, key),
@@ -185,9 +187,10 @@ func get_calculated(key: String) -> Variant:
)
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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -0,0 +1 @@
uid://bbshyok4m8nq3