## Creep.gd ## Enemy unit that follows the lane path and damages the Security System on exit. ## Call assign_path() immediately after adding to the scene tree. class_name Creep extends Node2D var _max_hp: int = 100 var _hp: int = 100 var _speed: float = 100.0 var _armor_type: int = DamageCalc.ArmorType.LIGHT var _bounty: int = 5 var _hp_damage: int = 1 # Baked path points in global space var _path: PackedVector2Array = [] var _path_index: int = 0 var _dead: bool = false func _ready() -> void: add_to_group("creeps") func setup(wave_data: Dictionary) -> void: _max_hp = wave_data.get("creep_hp", 100) _hp = _max_hp _speed = wave_data.get("creep_speed", 100.0) _bounty = wave_data.get("bounty", 5) _hp_damage = wave_data.get("hp_damage", 1) _armor_type = wave_data.get("creep_armor", DamageCalc.ArmorType.LIGHT) ## Assign the world-space baked path from the Lane's Path2D. func assign_path(world_points: PackedVector2Array) -> void: _path = world_points _path_index = 0 if _path.size() > 0: global_position = _path[0] func get_armor_type() -> int: return _armor_type func get_hp_fraction() -> float: return float(_hp) / float(_max_hp) func take_damage(amount: int) -> void: if _dead: return _hp -= amount _update_health_bar() if _hp <= 0: _die() func _process(delta: float) -> void: if _dead or _path.size() == 0: return if _path_index >= _path.size(): return var target: Vector2 = _path[_path_index] var dir: Vector2 = (target - global_position).normalized() global_position += dir * _speed * delta # Advance to next waypoint when close enough if global_position.distance_to(target) < 3.0: _path_index += 1 if _path_index >= _path.size(): _reach_exit() func _die() -> void: if _dead: return _dead = true remove_from_group("creeps") EventBus.creep_died.emit(self, _bounty) # Award bounty to all players for pid in Economy._minerals.keys(): Economy._minerals[pid] += _bounty EventBus.minerals_changed.emit(pid, Economy._minerals[pid]) queue_free() func _reach_exit() -> void: if _dead: return _dead = true remove_from_group("creeps") EventBus.creep_reached_exit.emit(self, _hp_damage) queue_free() func _update_health_bar() -> void: var bar := get_node_or_null("HealthBar") as ProgressBar if bar: bar.value = get_hp_fraction() * 100.0