diff --git a/addons/godot_projectile_engine/core/projectile_template/base/projectile_behaviors/destroy/behaviors/projectile_destroy_collision.gd b/addons/godot_projectile_engine/core/projectile_template/base/projectile_behaviors/destroy/behaviors/projectile_destroy_collision.gd index 50466493..bd3062a5 100644 --- a/addons/godot_projectile_engine/core/projectile_template/base/projectile_behaviors/destroy/behaviors/projectile_destroy_collision.gd +++ b/addons/godot_projectile_engine/core/projectile_template/base/projectile_behaviors/destroy/behaviors/projectile_destroy_collision.gd @@ -48,8 +48,9 @@ func process_behavior(_value, _context: Dictionary) -> bool: var _behavior_owner = _context.get(ProjectileEngine.BehaviorContext.BEHAVIOR_OWNER) if !_behavior_owner: return false - if !_projectile_updater: - _projectile_updater = _behavior_owner.projectile_updater + + # if !_projectile_updater: + # _projectile_updater = _behavior_owner.projectile_updater if _behavior_owner is Projectile2D: if !_behavior_owner.monitorable or !_behavior_owner.monitoring: @@ -134,6 +135,7 @@ func process_behavior(_value, _context: Dictionary) -> bool: if _behavior_owner is ProjectileInstance2D: if destroy_on_area_collide: + _projectile_updater = _behavior_owner.projectile_updater if _projectile_updater.has_overlapping_areas(_behavior_owner.area_index): for _overlap_area in _projectile_updater.get_overlapping_areas(_behavior_owner.area_index): if !_overlap_area: diff --git a/addons/godot_projectile_engine/core/projectile_template/base/projectile_behaviors/direction/behaviors/projectile_direction_homing.gd b/addons/godot_projectile_engine/core/projectile_template/base/projectile_behaviors/direction/behaviors/projectile_direction_homing.gd new file mode 100644 index 00000000..271c94f3 --- /dev/null +++ b/addons/godot_projectile_engine/core/projectile_template/base/projectile_behaviors/direction/behaviors/projectile_direction_homing.gd @@ -0,0 +1,158 @@ +extends ProjectileBehaviorDirection +class_name ProjectileDirectionHoming + +# @deprecated + +## Target-based homing behavior that steers projectiles toward specific targets + +enum TargetType { + GROUP, + NODE, + POSITION +} + + +## Type of target to home towards +@export var target_type: TargetType = TargetType.GROUP + +## Group name to target (when target_type is GROUP) +@export var target_group: String = "" + +## Specific node path to target (when target_type is NODE) +@export var target_node_path: NodePath + +## Fixed position to target (when target_type is POSITION) +@export var target_position: Vector2 + +## How to select target from group +@export var group_selection: ProjectileEngine.TargetGroupSelection = ProjectileEngine.TargetGroupSelection.NEAREST + +## Speed at which the projectile steers toward target (radians per second) +@export var steer_speed: float = 5.0 + +## How the homing modifies the direction +@export var direction_modify_method: DirectionModifyMethod = DirectionModifyMethod.OVERRIDE + +## Maximum distance at which homing is active (0 = unlimited) +@export var max_homing_distance: float = 0.0 + +## Minimum distance at which homing stops (prevents orbiting) +@export var min_homing_distance: float = 10.0 + +## Strength of homing effect (0.0 to 1.0) +@export var homing_strength: float = 1.0 + +var current_target: Node2D +var current_target_position: Vector2 + + +## Returns required context values for this behavior +func _request_behavior_context() -> Array[ProjectileEngine.BehaviorContext]: + return [ + ProjectileEngine.BehaviorContext.PHYSICS_DELTA, + ProjectileEngine.BehaviorContext.GLOBAL_POSITION, + ProjectileEngine.BehaviorContext.BEHAVIOR_OWNER, + + ] + +func _request_persist_behavior_context() -> Array[ProjectileEngine.BehaviorContext]: + return [ + ProjectileEngine.BehaviorContext.ARRAY_VARIABLE + ] + + +## Processes homing behavior by steering toward target +func process_behavior(_value: Vector2, _context: Dictionary) -> Dictionary: + if not _context.has(ProjectileEngine.BehaviorContext.PHYSICS_DELTA): + return {ProjectileEngine.DirectionModify.DIRECTION_OVERWRITE: _value} + + + var delta: float = _context[ProjectileEngine.BehaviorContext.PHYSICS_DELTA] + if not _context.has(ProjectileEngine.BehaviorContext.GLOBAL_POSITION): + return {ProjectileEngine.DirectionModify.DIRECTION_OVERWRITE: _value} + + + var projectile_position: Vector2 = _context.get(ProjectileEngine.BehaviorContext.GLOBAL_POSITION) + + # Find target + var target_pos: Variant = _find_target(projectile_position, _context) + if target_pos == null: + return {ProjectileEngine.DirectionModify.DIRECTION_OVERWRITE: _value} + + var distance_to_target: float = projectile_position.distance_to(target_pos) + + if max_homing_distance > 0.0 and distance_to_target > max_homing_distance: + return {ProjectileEngine.DirectionModify.DIRECTION_OVERWRITE: _value} + + if distance_to_target < min_homing_distance: + return {ProjectileEngine.DirectionModify.DIRECTION_OVERWRITE: _value} + + var desired_direction: Vector2 = projectile_position.direction_to(target_pos) + + match direction_modify_method: + DirectionModifyMethod.OVERRIDE: + var new_direction: Vector2 = _value.move_toward(desired_direction, steer_speed * delta) + new_direction = new_direction.normalized() * homing_strength + _value * (1.0 - homing_strength) + return {ProjectileEngine.DirectionModify.DIRECTION_OVERWRITE: new_direction} + + DirectionModifyMethod.ADDITION: + var homing_force: Vector2 = desired_direction * homing_strength * steer_speed * delta + return {ProjectileEngine.DirectionModify.DIRECTION_ADDITION: homing_force} + null: + return {ProjectileEngine.DirectionModify.DIRECTION_OVERWRITE: _value} + _: + return {ProjectileEngine.DirectionModify.DIRECTION_OVERWRITE: _value} + + return {ProjectileEngine.DirectionModify.DIRECTION_OVERWRITE: _value} + +## Finds the target position based on target type +func _find_target(projectile_position: Vector2, _context: Dictionary) -> Variant: + match target_type: + TargetType.POSITION: + return target_position + + TargetType.NODE: + if target_node_path.is_empty(): + return null + if !_context.has(ProjectileEngine.BehaviorContext.BEHAVIOR_OWNER): + return null + var behavior_owner: Node = _context.get(ProjectileEngine.BehaviorContext.BEHAVIOR_OWNER) + if !behavior_owner: + return null + var target_node = behavior_owner.get_node_or_null(target_node_path) + if target_node and target_node is Node2D and is_instance_valid(target_node): + return target_node.global_position + return null + + TargetType.GROUP: + if target_group.is_empty(): + return null + + # Filter to Node2D objects + var _valid_nodes: Array[Node2D] = ProjectileEngine.get_valid_target_group_nodes(target_group) + + if _valid_nodes.is_empty(): + return null + + # Select target based on group selection method + match group_selection: + ProjectileEngine.TargetGroupSelection.FIRST: + return _valid_nodes[0].global_position + + ProjectileEngine.TargetGroupSelection.NEAREST: + var nearest_target: Node2D = _valid_nodes[0] + var nearest_distance: float = projectile_position.distance_to(nearest_target.global_position) + + for target in _valid_nodes: + var distance: float = projectile_position.distance_to(target.global_position) + if distance < nearest_distance: + nearest_distance = distance + nearest_target = target + + return nearest_target.global_position + + ProjectileEngine.TargetGroupSelection.RANDOM: + var random_target: Node2D = _valid_nodes[randi() % _valid_nodes.size()] + return random_target.global_position + + return null diff --git a/addons/godot_projectile_engine/core/projectile_template/base/projectile_behaviors/direction/behaviors/projectile_direction_homing_advanced.gd.uid b/addons/godot_projectile_engine/core/projectile_template/base/projectile_behaviors/direction/behaviors/projectile_direction_homing.gd.uid similarity index 100% rename from addons/godot_projectile_engine/core/projectile_template/base/projectile_behaviors/direction/behaviors/projectile_direction_homing_advanced.gd.uid rename to addons/godot_projectile_engine/core/projectile_template/base/projectile_behaviors/direction/behaviors/projectile_direction_homing.gd.uid diff --git a/addons/godot_projectile_engine/core/projectile_template/base/projectile_behaviors/direction/behaviors/projectile_direction_homing_advanced.gd b/addons/godot_projectile_engine/core/projectile_template/base/projectile_behaviors/direction/behaviors/projectile_direction_homing_advanced.gd deleted file mode 100644 index bab206af..00000000 --- a/addons/godot_projectile_engine/core/projectile_template/base/projectile_behaviors/direction/behaviors/projectile_direction_homing_advanced.gd +++ /dev/null @@ -1,163 +0,0 @@ -# extends ProjectileBehaviorDirection -# class_name ProjectileDirectionHomingAdvanced - -## @deprecated - -# ## Target-based homing behavior that steers projectiles toward specific targets - -# enum TargetType { -# GROUP, -# NODE, -# POSITION -# } - - -# ## Type of target to home towards -# @export var target_type: TargetType = TargetType.GROUP - -# ## Group name to target (when target_type is GROUP) -# @export var target_group: String = "" - -# ## Specific node path to target (when target_type is NODE) -# @export var target_node_path: NodePath - -# ## Fixed position to target (when target_type is POSITION) -# @export var target_position: Vector2 - -# ## How to select target from group -# @export var group_selection: ProjectileEngine.TargetGroupSelection = ProjectileEngine.TargetGroupSelection.NEAREST - -# ## Speed at which the projectile steers toward target (radians per second) -# @export var steer_speed: float = 5.0 - -# ## How the homing modifies the direction -# @export var direction_modify_method: DirectionModifyMethod = DirectionModifyMethod.OVERRIDE - -# ## Maximum distance at which homing is active (0 = unlimited) -# @export var max_homing_distance: float = 0.0 - -# ## Minimum distance at which homing stops (prevents orbiting) -# @export var min_homing_distance: float = 10.0 - -# ## Strength of homing effect (0.0 to 1.0) -# @export var homing_strength: float = 1.0 - -# var current_target: Node2D -# var current_target_position: Vector2 - - -# ## Returns required context values for this behavior -# func _request_behavior_context() -> Array[ProjectileEngine.BehaviorContext]: -# return [ -# ProjectileEngine.BehaviorContext.PHYSICS_DELTA, -# ProjectileEngine.BehaviorContext.GLOBAL_POSITION, -# ProjectileEngine.BehaviorContext.BEHAVIOR_OWNER, - -# ] - -# func _request_persist_behavior_context() -> Array[ProjectileEngine.BehaviorContext]: -# return [ -# ProjectileEngine.BehaviorContext.ARRAY_VARIABLE -# ] - - -# ## Processes homing behavior by steering toward target -# func process_behavior(_value: Vector2, _context: Dictionary) -> Dictionary: -# if not _context.has(ProjectileEngine.BehaviorContext.PHYSICS_DELTA): -# return {ProjectileEngine.DirectionModify.DIRECTION_OVERWRITE: _value} - - -# var delta: float = _context[ProjectileEngine.BehaviorContext.PHYSICS_DELTA] -# if not _context.has(ProjectileEngine.BehaviorContext.GLOBAL_POSITION): -# return {ProjectileEngine.DirectionModify.DIRECTION_OVERWRITE: _value} - - -# var projectile_position: Vector2 = _context.get(ProjectileEngine.BehaviorContext.GLOBAL_POSITION) - -# # Find target -# var target_pos: Variant = _find_target(projectile_position, _context) -# if target_pos == null: -# return {ProjectileEngine.DirectionModify.DIRECTION_OVERWRITE: _value} - -# # Calculate distance to target -# var distance_to_target: float = projectile_position.distance_to(target_pos) - -# # Check distance constraints -# if max_homing_distance > 0.0 and distance_to_target > max_homing_distance: -# return {ProjectileEngine.DirectionModify.DIRECTION_OVERWRITE: _value} - -# if distance_to_target < min_homing_distance: -# return {ProjectileEngine.DirectionModify.DIRECTION_OVERWRITE: _value} - -# # Calculate desired direction toward target -# var desired_direction: Vector2 = projectile_position.direction_to(target_pos) - -# # Apply homing based on modify method -# match direction_modify_method: -# DirectionModifyMethod.OVERRIDE: -# # Gradually steer toward target -# var new_direction: Vector2 = _value.move_toward(desired_direction, steer_speed * delta) -# return {ProjectileEngine.DirectionModify.DIRECTION_OVERWRITE: new_direction.normalized() * homing_strength + _value * (1.0 - homing_strength)} - -# DirectionModifyMethod.ADDITION: -# # Add homing force as direction addition -# var homing_force: Vector2 = desired_direction * homing_strength * steer_speed * delta -# return {ProjectileEngine.DirectionModify.DIRECTION_ADDITION : homing_force} -# null: -# return {ProjectileEngine.DirectionModify.DIRECTION_OVERWRITE: _value} -# _: -# return {ProjectileEngine.DirectionModify.DIRECTION_OVERWRITE: _value} - -# return {ProjectileEngine.DirectionModify.DIRECTION_OVERWRITE: _value} - -# ## Finds the target position based on target type -# func _find_target(projectile_position: Vector2, _context: Dictionary) -> Variant: -# match target_type: -# TargetType.POSITION: -# return target_position - -# TargetType.NODE: -# if target_node_path.is_empty(): -# return null -# if !_context.has(ProjectileEngine.BehaviorContext.BEHAVIOR_OWNER): -# return null -# var behavior_owner : Node = _context.get(ProjectileEngine.BehaviorContext.BEHAVIOR_OWNER) -# if !behavior_owner: -# return null -# var target_node = behavior_owner.get_node_or_null(target_node_path) -# if target_node and target_node is Node2D and is_instance_valid(target_node): -# return target_node.global_position -# return null - -# TargetType.GROUP: -# if target_group.is_empty(): -# return null - -# # Filter to Node2D objects -# var _valid_nodes: Array[Node2D] = ProjectileEngine.get_valid_target_group_nodes(target_group) - -# if _valid_nodes.is_empty(): -# return null - -# # Select target based on group selection method -# match group_selection: -# ProjectileEngine.TargetGroupSelection.FIRST: -# return _valid_nodes[0].global_position - -# ProjectileEngine.TargetGroupSelection.NEAREST: -# var nearest_target: Node2D = _valid_nodes[0] -# var nearest_distance: float = projectile_position.distance_to(nearest_target.global_position) - -# for target in _valid_nodes: -# var distance: float = projectile_position.distance_to(target.global_position) -# if distance < nearest_distance: -# nearest_distance = distance -# nearest_target = target - -# return nearest_target.global_position - -# ProjectileEngine.TargetGroupSelection.RANDOM: -# var random_target: Node2D = _valid_nodes[randi() % _valid_nodes.size()] -# return random_target.global_position - -# return null diff --git a/addons/godot_projectile_engine/core/projectile_template/base/projectile_behaviors/direction/behaviors/projectile_direction_homing_simple.gd b/addons/godot_projectile_engine/core/projectile_template/base/projectile_behaviors/direction/behaviors/projectile_direction_homing_simple.gd deleted file mode 100644 index 696f8c15..00000000 --- a/addons/godot_projectile_engine/core/projectile_template/base/projectile_behaviors/direction/behaviors/projectile_direction_homing_simple.gd +++ /dev/null @@ -1,89 +0,0 @@ -# extends ProjectileBehaviorDirection -# class_name ProjectileDirectionHomingSimple - -##@deprecated - -# ## Simple homing behavior that steers projectiles toward a target group - -# ## Group name to target -# @export var target_group: String = "" - -# ## Speed at which the projectile steers toward target (radians per second) -# @export var steer_speed: float = 5.0 - -# ## Strength of homing effect (0.0 to 1.0) -# @export var homing_strength: float = 1.0 - -# ## Maximum distance at which homing is active (0 = unlimited) -# @export var max_homing_distance: float = 0.0 - - -# ## Returns required context values for this behavior -# func _request_behavior_context() -> Array[ProjectileEngine.BehaviorContext]: -# return [ -# ProjectileEngine.BehaviorContext.PHYSICS_DELTA, -# ProjectileEngine.BehaviorContext.GLOBAL_POSITION, -# ] - - -# func process_behavior(_value: Vector2, _context: Dictionary) -> Dictionary: -# if not _context.has(ProjectileEngine.BehaviorContext.PHYSICS_DELTA): -# return {ProjectileEngine.DirectionModify.DIRECTION_OVERWRITE: _value} - -# if target_group.is_empty(): -# return {ProjectileEngine.DirectionModify.DIRECTION_OVERWRITE: _value} - -# var delta: float = _context[ProjectileEngine.BehaviorContext.PHYSICS_DELTA] -# var projectile_position: Vector2 = _context[ProjectileEngine.BehaviorContext.GLOBAL_POSITION] - -# # Find nearest target in group -# var target_position: Vector2 = _find_nearest_target(projectile_position) -# # if target_position == Vector2.ZERO: -# # return {ProjectileEngine.DirectionModify.DIRECTION_OVERWRITE: _value} - -# # var new_direction := vector_rotate_toward_slerp(_value, target_position, 0.1, 0) -# # print(new_direction) -# # Calculate distance to target -# var distance_to_target: float = projectile_position.distance_to(target_position) -# # Check distance constraint -# if max_homing_distance > 0.0 and distance_to_target > max_homing_distance: -# return {ProjectileEngine.DirectionModify.DIRECTION_OVERWRITE: _value} - -# # Calculate desired direction toward target -# var desired_direction: Vector2 = projectile_position.direction_to(target_position) -# var current_angle = _value.angle() -# var target_angle = desired_direction.angle() -# print(rad_to_deg(target_angle)) -# # var new_direction: Vector2 = _value.move_toward(desired_direction, abs(steer_speed) * delta) -# # var _rotation_direction := rotate_toward(current_angle, target_angle, deg_to_rad(20)) -# # var _rotation_direction := lerp_angle(current_angle, abs(target_angle), 0.5) -# # print(_rotation_direction) -# # print(new_directionw) -# # var final_direction: Vector2 = new_direction.normalized() * homing_strength + _value * (1.0 - homing_strength) - -# # return {ProjectileEngine.DirectionModify.DIRECTION_OVERWRITE: new_direction} -# return {ProjectileEngine.DirectionModify.DIRECTION_ROTATION: _rotation_direction} - - - - -# ## Finds the nearest target in the specified group -# func _find_nearest_target(projectile_position: Vector2) -> Vector2: -# var group_nodes: Array[Node] = ProjectileEngine.get_tree().get_nodes_in_group(target_group) -# if group_nodes.is_empty(): -# return projectile_position - -# var nearest_target: Node2D = null -# var nearest_distance: float = INF - -# for node in group_nodes: -# if node is Node2D and is_instance_valid(node): -# var distance: float = projectile_position.distance_to(node.global_position) -# if distance < nearest_distance: -# nearest_distance = distance -# nearest_target = node - -# if nearest_target: -# return nearest_target.global_position - -# return projectile_position diff --git a/addons/godot_projectile_engine/core/projectile_template/base/projectile_behaviors/direction/behaviors/projectile_direction_homing_simple.gd.uid b/addons/godot_projectile_engine/core/projectile_template/base/projectile_behaviors/direction/behaviors/projectile_direction_homing_simple.gd.uid deleted file mode 100644 index c6ae3e0f..00000000 --- a/addons/godot_projectile_engine/core/projectile_template/base/projectile_behaviors/direction/behaviors/projectile_direction_homing_simple.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bbmmn1md4lx3 diff --git a/experiments/experiment_collision/experiment_collision_2.tscn b/experiments/experiment_collision/experiment_collision_2.tscn new file mode 100644 index 00000000..4b458c3e --- /dev/null +++ b/experiments/experiment_collision/experiment_collision_2.tscn @@ -0,0 +1,133 @@ +[gd_scene load_steps=28 format=3 uid="uid://b67fw54otbq"] + +[ext_resource type="Script" uid="uid://dn7rm61wq3t3s" path="res://addons/godot_projectile_engine/core/projectile_environment/projectile_environment.gd" id="1_t3psu"] +[ext_resource type="Script" uid="uid://cgi5wxrd3qs15" path="res://addons/godot_projectile_engine/core/projectile_wrapper/projectile_wrapper_2d.gd" id="2_07wtp"] +[ext_resource type="Script" uid="uid://cnqgcej10tinn" path="res://addons/godot_projectile_engine/core/projectile_spawner/projectile_spawner.gd" id="3_2njl2"] +[ext_resource type="Script" uid="uid://dg832mp2dyxuh" path="res://addons/godot_projectile_engine/core/projectile_template/base/projectile_behaviors/base/projectile_behavior_bouncing.gd" id="4_uy6lt"] +[ext_resource type="Script" uid="uid://b8xk7m2n5qr3w" path="res://addons/godot_projectile_engine/core/projectile_template/base/projectile_behaviors/base/projectile_behavior_destroy.gd" id="5_s8nxj"] +[ext_resource type="Script" uid="uid://bkjnay24vltjg" path="res://addons/godot_projectile_engine/core/projectile_template/base/projectile_behaviors/destroy/behaviors/projectile_destroy_collision.gd" id="6_cyppi"] +[ext_resource type="Script" uid="uid://chtssqssdvls7" path="res://addons/godot_projectile_engine/core/projectile_template/base/projectile_behaviors/base/projectile_behavior_direction.gd" id="7_jb0lv"] +[ext_resource type="Script" uid="uid://cx5wpxyqcksq0" path="res://addons/godot_projectile_engine/core/projectile_template/base/projectile_behaviors/direction/behaviors/projectile_direction_homing.gd" id="8_qwgt7"] +[ext_resource type="Script" uid="uid://f77iu3txs7r5" path="res://addons/godot_projectile_engine/core/projectile_template/base/projectile_behaviors/base/projectile_behavior_piercing.gd" id="8_u6rld"] +[ext_resource type="Script" uid="uid://lr7r36tmtarr" path="res://addons/godot_projectile_engine/core/projectile_template/base/projectile_behaviors/base/projectile_behavior_rotation.gd" id="9_wr452"] +[ext_resource type="Script" uid="uid://dqtdroky03dsm" path="res://addons/godot_projectile_engine/core/projectile_template/base/projectile_behaviors/base/projectile_behavior_scale.gd" id="10_xvktd"] +[ext_resource type="Script" uid="uid://d3yyxyx6shhya" path="res://addons/godot_projectile_engine/core/projectile_template/projectile_template_custom_2d/projectile_template_custom_2d.gd" id="11_ut3r3"] +[ext_resource type="Script" uid="uid://1xodvevoujyr" path="res://addons/godot_projectile_engine/core/projectile_template/base/projectile_behaviors/base/projectile_behavior_speed.gd" id="12_kr6uy"] +[ext_resource type="Texture2D" uid="uid://xej5ti53m73n" path="res://addons/godot_projectile_engine/examples/assets/projectile/projectile_circle_1.png" id="13_dgbgp"] +[ext_resource type="Script" uid="uid://cmlvc7d6q6iec" path="res://addons/godot_projectile_engine/core/projectile_template/base/projectile_behaviors/base/projectile_behavior_trigger.gd" id="14_62v8t"] +[ext_resource type="Script" uid="uid://cs3yq53jlx0po" path="res://addons/godot_projectile_engine/core/projectile_spawner/spawn_marker/projectile_spawn_maker_2d.gd" id="15_vkrb8"] +[ext_resource type="Script" uid="uid://bc73oiea731jc" path="res://addons/godot_projectile_engine/core/pattern_composer/pattern_composer.gd" id="16_ulpl7"] +[ext_resource type="Script" uid="uid://co24jiat0y46s" path="res://addons/godot_projectile_engine/core/pattern_composer/component/PCCSingle2D.gd" id="17_003pf"] +[ext_resource type="Script" uid="uid://b8nclaklcf4uu" path="res://addons/godot_projectile_engine/core/timing_scheduler/timing_scheduler.gd" id="18_bg6iq"] +[ext_resource type="Script" uid="uid://sjpvs4m6jk71" path="res://addons/godot_projectile_engine/core/timing_scheduler/repeater/tsc_repeater.gd" id="19_njdcj"] + +[sub_resource type="Gradient" id="Gradient_td4cq"] +offsets = PackedFloat32Array(0) +colors = PackedColorArray(0.0705882, 0.0705882, 0.121569, 1) + +[sub_resource type="GradientTexture2D" id="GradientTexture2D_0ehko"] +gradient = SubResource("Gradient_td4cq") + +[sub_resource type="CircleShape2D" id="CircleShape2D_t4xol"] + +[sub_resource type="Resource" id="Resource_cujoe"] +script = ExtResource("6_cyppi") +wait_projectile_piercing = true +metadata/_custom_type_script = "uid://bkjnay24vltjg" + +[sub_resource type="Resource" id="Resource_wi002"] +script = ExtResource("8_qwgt7") +target_group = "TestHoming" +steer_speed = 10.0 +homing_strength = 2.0 +metadata/_custom_type_script = "uid://cx5wpxyqcksq0" + +[sub_resource type="Resource" id="Resource_xua5m"] +script = ExtResource("8_u6rld") +piercing_count = 2 +pierce_area = true +pierce_area_layer = 256 +pierce_body = true +pierce_body_layer = 512 +metadata/_custom_type_script = "uid://f77iu3txs7r5" + +[sub_resource type="Resource" id="Resource_tit6q"] +script = ExtResource("11_ut3r3") +texture = ExtResource("13_dgbgp") +collision_shape = SubResource("CircleShape2D_t4xol") +collision_layer = 1 +collision_mask = 768 +direction_projectile_behaviors = Array[ExtResource("7_jb0lv")]([SubResource("Resource_wi002")]) +destroy_projectile_behaviors = Array[ExtResource("5_s8nxj")]([SubResource("Resource_cujoe")]) +piercing_projectile_behaviors = Array[ExtResource("8_u6rld")]([SubResource("Resource_xua5m")]) +custom_data = [{ +"damage": 5 +}, null] +metadata/_custom_type_script = "uid://d3yyxyx6shhya" + +[node name="ExperimentCollision1" type="Node2D"] + +[node name="Sprite2D" type="Sprite2D" parent="."] +position = Vector2(0, 1.9073486e-06) +scale = Vector2(59.75, 39.625) +texture = SubResource("GradientTexture2D_0ehko") + +[node name="ProjectileEnvironment2D" type="Node2D" parent="."] +script = ExtResource("1_t3psu") +metadata/_custom_type_script = "uid://dn7rm61wq3t3s" + +[node name="Camera2D" type="Camera2D" parent="."] + +[node name="ProjectileWrapper2D" type="Node2D" parent="." node_paths=PackedStringArray("projectile_spawner_2d")] +script = ExtResource("2_07wtp") +projectile_spawner_2d = NodePath("ProjectileSpawner2D4") +metadata/_custom_type_script = "uid://cgi5wxrd3qs15" + +[node name="ProjectileSpawner2D4" type="Node2D" parent="ProjectileWrapper2D" node_paths=PackedStringArray("timing_scheduler")] +position = Vector2(-192, 0) +script = ExtResource("3_2njl2") +projectile_composer_name = "pattern_collision" +projectile_template_2d = SubResource("Resource_tit6q") +timing_scheduler = NodePath("../TimingScheduler") +use_spawn_markers = true +metadata/_custom_type_script = "uid://cnqgcej10tinn" + +[node name="ProjectileSpawnMarker2D" type="Marker2D" parent="ProjectileWrapper2D/ProjectileSpawner2D4"] +script = ExtResource("15_vkrb8") +metadata/_custom_type_script = "uid://cs3yq53jlx0po" + +[node name="ProjectileSpawnMarker2D2" type="Marker2D" parent="ProjectileWrapper2D/ProjectileSpawner2D4"] +position = Vector2(0, 64) +script = ExtResource("15_vkrb8") +metadata/_custom_type_script = "uid://cs3yq53jlx0po" + +[node name="ProjectileSpawnMarker2D3" type="Marker2D" parent="ProjectileWrapper2D/ProjectileSpawner2D4"] +position = Vector2(0, 128) +script = ExtResource("15_vkrb8") +metadata/_custom_type_script = "uid://cs3yq53jlx0po" + +[node name="ProjectileSpawnMarker2D4" type="Marker2D" parent="ProjectileWrapper2D/ProjectileSpawner2D4"] +position = Vector2(0, -64) +script = ExtResource("15_vkrb8") +metadata/_custom_type_script = "uid://cs3yq53jlx0po" + +[node name="PatternComposer2D" type="Node" parent="ProjectileWrapper2D"] +script = ExtResource("16_ulpl7") +composer_name = "pattern_collision" +metadata/_custom_type_script = "uid://bc73oiea731jc" + +[node name="PCCSingle2D" type="Node" parent="ProjectileWrapper2D/PatternComposer2D"] +script = ExtResource("17_003pf") +metadata/_custom_type_script = "uid://co24jiat0y46s" + +[node name="TimingScheduler" type="Node" parent="ProjectileWrapper2D"] +script = ExtResource("18_bg6iq") +metadata/_custom_type_script = "uid://b8nclaklcf4uu" + +[node name="TSCRepeater" type="Node" parent="ProjectileWrapper2D/TimingScheduler"] +script = ExtResource("19_njdcj") +duration = 5.0 +metadata/_custom_type_script = "uid://sjpvs4m6jk71" + +[node name="Node2D" type="Node2D" parent="." groups=["TestHoming"]] +position = Vector2(128, 0) diff --git a/tests/projectile_template/test_gdunit_projectile_template.gd b/tests/projectile_template/test_gdunit_projectile_template.gd index deaae65b..218845b5 100644 --- a/tests/projectile_template/test_gdunit_projectile_template.gd +++ b/tests/projectile_template/test_gdunit_projectile_template.gd @@ -3,25 +3,25 @@ extends GdUnitTestSuite func test_projectile_template_simple() -> void: var runner := scene_runner("uid://l1bpiwyep1wq") - await runner.simulate_frames(5) + runner.simulate_frames(5) assert_object(runner).is_not_null() pass func test_projectile_template_advanced() -> void: var runner := scene_runner("uid://bgo83y47tcri0") - await runner.simulate_frames(5) + runner.simulate_frames(5) assert_object(runner).is_not_null() pass func test_projectile_template_custom() -> void: var runner := scene_runner("uid://cj68gunmdf1d2") - await runner.simulate_frames(5) + runner.simulate_frames(5) assert_object(runner).is_not_null() pass func test_projectile_template_node_2d() -> void: var runner := scene_runner("uid://cm72pafj44d6b") - await runner.simulate_frames(5) + runner.simulate_frames(5) assert_object(runner).is_not_null() pass \ No newline at end of file diff --git a/tests/test_example_scenes/test_example_scenes.gd b/tests/test_example_scenes/test_example_scenes.gd index 9ccfd6e9..57a81550 100644 --- a/tests/test_example_scenes/test_example_scenes.gd +++ b/tests/test_example_scenes/test_example_scenes.gd @@ -2,37 +2,37 @@ extends GdUnitTestSuite func test_example_scene_1() -> void: var runner := scene_runner("uid://cwlrovd240rt2") - await runner.simulate_frames(5) + runner.simulate_frames(5) assert_object(runner).is_not_null() pass func test_example_scene_2() -> void: var runner := scene_runner("uid://b34nudu7t8gwd") - await runner.simulate_frames(5) + runner.simulate_frames(5) assert_object(runner).is_not_null() pass func test_example_scene_3() -> void: var runner := scene_runner("uid://rxicnemi55bq") - await runner.simulate_frames(5) + runner.simulate_frames(5) assert_object(runner).is_not_null() pass func test_example_scene_4() -> void: var runner := scene_runner("uid://4jgbpsiaa8uu") - await runner.simulate_frames(5) + runner.simulate_frames(5) assert_object(runner).is_not_null() pass func test_example_scene_5() -> void: var runner := scene_runner("uid://bccgqsjl1b74f") - await runner.simulate_frames(5) + runner.simulate_frames(5) assert_object(runner).is_not_null() pass func test_example_scene_6() -> void: var runner := scene_runner("uid://dactafr7x6iw3") - await runner.simulate_frames(5) + runner.simulate_frames(5) assert_object(runner).is_not_null() pass \ No newline at end of file diff --git a/tests/test_projectile_wrapper/test_projectile_wrappers.gd b/tests/test_projectile_wrapper/test_projectile_wrappers.gd index 8acee93a..53c9a5a9 100644 --- a/tests/test_projectile_wrapper/test_projectile_wrappers.gd +++ b/tests/test_projectile_wrapper/test_projectile_wrappers.gd @@ -3,7 +3,7 @@ extends GdUnitTestSuite func test_projectile_template_simple() -> void: var runner := scene_runner("uid://uf11mp6p4ldp") - await runner.simulate_frames(5) + runner.simulate_frames(5) assert_object(runner).is_not_null() ProjectileEngine.activate_all_projectile_wrappers("") ProjectileEngine.activate_all_projectile_wrappers("wrong_wrapper") diff --git a/tests/timing_scheduler/test_gdunit_timing_scheduler.gd b/tests/timing_scheduler/test_gdunit_timing_scheduler.gd index c5588307..fc59ebe2 100644 --- a/tests/timing_scheduler/test_gdunit_timing_scheduler.gd +++ b/tests/timing_scheduler/test_gdunit_timing_scheduler.gd @@ -3,18 +3,18 @@ extends GdUnitTestSuite func test_timing_scheduler_cooldown() -> void: var runner := scene_runner("uid://c3h721cnivuwh") - await runner.simulate_frames(5) + runner.simulate_frames(5) assert_object(runner).is_not_null() pass func test_timing_scheduler_repeater() -> void: var runner := scene_runner("uid://iutp25ib6h50") - await runner.simulate_frames(5) + runner.simulate_frames(5) assert_object(runner).is_not_null() pass func test_timing_scheduler_timing_set() -> void: var runner := scene_runner("uid://uibs8p43qvxc") - await runner.simulate_frames(5) + runner.simulate_frames(5) assert_object(runner).is_not_null() pass \ No newline at end of file