1
Fork 0
mirror of https://github.com/Steffo99/hella-farm.git synced 2024-11-22 16:14:22 +00:00

Add eat_target and imp behaviour

This commit is contained in:
Lorenzo Rossi 2024-04-15 02:45:18 +02:00
parent 5dd3c62410
commit c12ff464e2
12 changed files with 218 additions and 72 deletions

39
behaviours/eat_target.gd Normal file
View file

@ -0,0 +1,39 @@
extends Node2D
class_name EatTarget
signal eaten(target: Node2D)
signal move(movement: Vector2)
@export var tag: StringName:
get:
return tag
set(value):
tag = value
if hunt_target != null:
hunt_target.tag = value
if eater != null:
eater.tag = value
@onready var hunt_target: HuntTarget = $"HuntTarget"
@onready var eater: Eater = $"Eater"
@onready var move_towards: MoveTowardsTarget = $"MoveTowardsTarget"
func _ready():
hunt_target.tag = tag
eater.tag = tag
func _on_target_selected(body: Node2D) -> void:
move_towards.target = body
func _on_target_abandoned(_body: Node2D) -> void:
move_towards.target = null
func _on_eater_eaten(edible):
eaten.emit(edible)
func _on_move_towards_target_move(movement):
move.emit(movement)

View file

@ -0,0 +1,22 @@
[gd_scene load_steps=5 format=3 uid="uid://dfitiajuuvdko"]
[ext_resource type="Script" path="res://behaviours/eat_target.gd" id="1_tlnlt"]
[ext_resource type="PackedScene" uid="uid://dxmodn8mbvw0i" path="res://behaviours/hunt_target.tscn" id="2_c8wdv"]
[ext_resource type="PackedScene" uid="uid://jg7qkbswgqjc" path="res://behaviours/eater.tscn" id="3_ir2yh"]
[ext_resource type="PackedScene" uid="uid://kceb2v2dm0qn" path="res://behaviours/move_towards_target.tscn" id="4_1qc2q"]
[node name="EatTarget" type="Node2D"]
script = ExtResource("1_tlnlt")
[node name="HuntTarget" parent="." instance=ExtResource("2_c8wdv")]
tag = &""
give_up_secs = 5.0
[node name="Eater" parent="." instance=ExtResource("3_ir2yh")]
[node name="MoveTowardsTarget" parent="." instance=ExtResource("4_1qc2q")]
[connection signal="target_abandoned" from="HuntTarget" to="." method="_on_target_abandoned"]
[connection signal="target_selected" from="HuntTarget" to="." method="_on_target_selected"]
[connection signal="eaten" from="Eater" to="." method="_on_eater_eaten"]
[connection signal="move" from="MoveTowardsTarget" to="." method="_on_move_towards_target_move"]

View file

@ -11,6 +11,7 @@ signal target_abandoned(target: Node2D)
return tag return tag
set(value): set(value):
tag = value tag = value
if hunter != null:
hunter.tag = value hunter.tag = value
@export var give_up_secs: float = 5.0 @export var give_up_secs: float = 5.0
@ -22,6 +23,9 @@ var target: Node2D = null
func pick_new_target(): func pick_new_target():
if hunter.possible_targets.is_empty():
return
var idx = Random.rng.randi_range(0, len(hunter.possible_targets) - 1) var idx = Random.rng.randi_range(0, len(hunter.possible_targets) - 1)
target = hunter.possible_targets[idx] target = hunter.possible_targets[idx]
target_selected.emit(target) target_selected.emit(target)
@ -37,6 +41,7 @@ func _on_hunter_tracked(_body: Node2D):
func _on_hunter_untracked(body: Node2D): func _on_hunter_untracked(body: Node2D):
if body == target: if body == target:
target = null target = null
target_abandoned.emit(body)
pick_new_target() pick_new_target()
func _on_give_up_timer_timeout() -> void: func _on_give_up_timer_timeout() -> void:

View file

@ -5,6 +5,8 @@
[node name="HuntTarget" type="Node2D"] [node name="HuntTarget" type="Node2D"]
script = ExtResource("1_1ex7u") script = ExtResource("1_1ex7u")
tag = null
give_up_secs = null
[node name="Hunter" parent="." instance=ExtResource("2_vjdtc")] [node name="Hunter" parent="." instance=ExtResource("2_vjdtc")]

View file

@ -1,8 +1,46 @@
extends MoveTowards extends Node2D
class_name MoveTowardsMouse class_name MoveTowardsMouse
signal move(movement: Vector2)
signal detached
signal captured
@onready var game := MainGame.get_ancestor(self) @onready var game := MainGame.get_ancestor(self)
@export var speed: float = 100.0
@export var can_detach: bool = false
enum State { DETACHED, CAPTURED }
var state: State = State.DETACHED
func get_followed_global_position(): func get_followed_global_position():
return game.camera.get_global_mouse_position() return game.camera.get_global_mouse_position()
func get_followed_mouse_position():
var global_followed_position: Vector2 = get_followed_global_position()
var relative_followed_position: Vector2 = global_followed_position - global_position
return relative_followed_position
func _physics_process(delta: float) -> void:
match state:
State.CAPTURED:
var relative_followed_position: Vector2 = get_followed_mouse_position()
var direction: Vector2 = position.direction_to(relative_followed_position)
var actual_speed: float = min(delta * speed, relative_followed_position.length()) # Don't overshoot.
var movement: Vector2 = direction * actual_speed
move.emit(movement)
func _on_capture_area_mouse_entered() -> void:
state = State.CAPTURED
captured.emit()
func _on_capture_area_mouse_exited() -> void:
if can_detach:
state = State.DETACHED
detached.emit()

View file

@ -1,8 +1,29 @@
extends MoveTowards extends Node2D
class_name MoveTowardsTarget class_name MoveTowardsTarget
signal move(movement: Vector2)
@export var speed: float = 100.0
@export var target: Node2D @export var target: Node2D
func get_followed_global_position(): func get_followed_global_position():
return target.global_position return target.global_position
func get_followed_mouse_position():
var global_followed_position: Vector2 = get_followed_global_position()
var relative_followed_position: Vector2 = global_followed_position - global_position
return relative_followed_position
func _physics_process(delta: float) -> void:
if target == null:
return
var relative_followed_position: Vector2 = get_followed_mouse_position()
var direction: Vector2 = position.direction_to(relative_followed_position)
var actual_speed: float = min(delta * speed, relative_followed_position.length()) # Don't overshoot.
var movement: Vector2 = direction * actual_speed
move.emit(movement)

View file

@ -1,13 +1,6 @@
[gd_scene load_steps=3 format=3 uid="uid://kceb2v2dm0qn"] [gd_scene load_steps=2 format=3 uid="uid://kceb2v2dm0qn"]
[ext_resource type="Script" path="res://behaviours/move_towards_target.gd" id="1_703gy"] [ext_resource type="Script" path="res://behaviours/move_towards_target.gd" id="1_703gy"]
[ext_resource type="PackedScene" uid="uid://cbg5kgwxusvxf" path="res://behaviours/hover_detector.tscn" id="2_nq6qb"]
[node name="MoveTowardsTarget" type="Node2D"] [node name="MoveTowardsTarget" type="Node2D"]
script = ExtResource("1_703gy") script = ExtResource("1_703gy")
[node name="CaptureArea" parent="." instance=ExtResource("2_nq6qb")]
collision_mask = 24
[connection signal="mouse_entered" from="CaptureArea" to="." method="_on_capture_area_mouse_entered"]
[connection signal="mouse_exited" from="CaptureArea" to="." method="_on_capture_area_mouse_exited"]

View file

@ -6,53 +6,6 @@
[sub_resource type="PlaceholderTexture2D" id="PlaceholderTexture2D_08frh"] [sub_resource type="PlaceholderTexture2D" id="PlaceholderTexture2D_08frh"]
[sub_resource type="Animation" id="Animation_mqmwg"]
resource_name = "fade_out"
tracks/0/type = "bezier"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("Sprite:modulate:r")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"handle_modes": PackedInt32Array(0, 0),
"points": PackedFloat32Array(1, -0.25, 0, 0.25, 0, 1, -0.25, 0, 0.25, 0),
"times": PackedFloat32Array(0, 1)
}
tracks/1/type = "bezier"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("Sprite:modulate:g")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"handle_modes": PackedInt32Array(0, 0),
"points": PackedFloat32Array(1, -0.25, 0, 0.25, 0, 1, -0.25, 0, 0.25, 0),
"times": PackedFloat32Array(0, 1)
}
tracks/2/type = "bezier"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("Sprite:modulate:b")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"handle_modes": PackedInt32Array(0, 0),
"points": PackedFloat32Array(1, -0.25, 0, 0.25, 0, 1, -0.25, 0, 0.25, 0),
"times": PackedFloat32Array(0, 1)
}
tracks/3/type = "bezier"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("Sprite:modulate:a")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"handle_modes": PackedInt32Array(0, 0),
"points": PackedFloat32Array(1, -0.25, 0, 0.25, 0, 0, -0.25, 0, 0.25, 0),
"times": PackedFloat32Array(0, 1)
}
[sub_resource type="Animation" id="Animation_rrrnd"] [sub_resource type="Animation" id="Animation_rrrnd"]
length = 0.001 length = 0.001
tracks/0/type = "bezier" tracks/0/type = "bezier"
@ -100,6 +53,53 @@ tracks/3/keys = {
"times": PackedFloat32Array(0) "times": PackedFloat32Array(0)
} }
[sub_resource type="Animation" id="Animation_mqmwg"]
resource_name = "fade_out"
tracks/0/type = "bezier"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("Sprite:modulate:r")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"handle_modes": PackedInt32Array(0, 0),
"points": PackedFloat32Array(1, -0.25, 0, 0.25, 0, 1, -0.25, 0, 0.25, 0),
"times": PackedFloat32Array(0, 1)
}
tracks/1/type = "bezier"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("Sprite:modulate:g")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"handle_modes": PackedInt32Array(0, 0),
"points": PackedFloat32Array(1, -0.25, 0, 0.25, 0, 1, -0.25, 0, 0.25, 0),
"times": PackedFloat32Array(0, 1)
}
tracks/2/type = "bezier"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("Sprite:modulate:b")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"handle_modes": PackedInt32Array(0, 0),
"points": PackedFloat32Array(1, -0.25, 0, 0.25, 0, 1, -0.25, 0, 0.25, 0),
"times": PackedFloat32Array(0, 1)
}
tracks/3/type = "bezier"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("Sprite:modulate:a")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"handle_modes": PackedInt32Array(0, 0),
"points": PackedFloat32Array(1, -0.25, 0, 0.25, 0, 0, -0.25, 0, 0.25, 0),
"times": PackedFloat32Array(0, 1)
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_fs8h8"] [sub_resource type="AnimationLibrary" id="AnimationLibrary_fs8h8"]
_data = { _data = {
"RESET": SubResource("Animation_rrrnd"), "RESET": SubResource("Animation_rrrnd"),

View file

@ -1,6 +1,10 @@
extends CharacterBody2D extends CharacterBody2D
class_name Imp class_name Imp
@export var skull_chance: float = 0.2
@onready var skull_spawner: Spawner = $"SkullSpawner"
@onready var draggable: Draggable = $"Draggable"
# Called when the node enters the scene tree for the first time. # Called when the node enters the scene tree for the first time.
func _ready() -> void: func _ready() -> void:
@ -8,5 +12,21 @@ func _ready() -> void:
# Called every frame. 'delta' is the elapsed time since the previous frame. # Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void: func _process(_delta: float) -> void:
pass pass
func _on_eat_target_eaten(_target: Edible):
if Random.rng.randf() < skull_chance:
skull_spawner.spawn()
func _on_draggable_move(movement:Vector2):
if draggable.being_dragged:
print("move", movement)
move_and_collide(movement)
func _on_move(movement:Vector2):
if not draggable.being_dragged:
print("move", movement)
move_and_collide(movement)

View file

@ -1,9 +1,10 @@
[gd_scene load_steps=7 format=3 uid="uid://4d3ksr3171x4"] [gd_scene load_steps=8 format=3 uid="uid://4d3ksr3171x4"]
[ext_resource type="Script" path="res://entities/imp.gd" id="1_dixpc"] [ext_resource type="Script" path="res://entities/imp.gd" id="1_dixpc"]
[ext_resource type="PackedScene" uid="uid://dxmodn8mbvw0i" path="res://behaviours/hunt_target.tscn" id="3_6bq0i"]
[ext_resource type="PackedScene" uid="uid://dijcjahkddudv" path="res://behaviours/draggable.tscn" id="3_4528r"] [ext_resource type="PackedScene" uid="uid://dijcjahkddudv" path="res://behaviours/draggable.tscn" id="3_4528r"]
[ext_resource type="PackedScene" uid="uid://kceb2v2dm0qn" path="res://behaviours/move_towards_target.tscn" id="4_ofu70"] [ext_resource type="PackedScene" uid="uid://dfitiajuuvdko" path="res://behaviours/eat_target.tscn" id="3_iybf3"]
[ext_resource type="PackedScene" uid="uid://cyrg770fsetyu" path="res://behaviours/spawner.tscn" id="4_d8lgm"]
[ext_resource type="PackedScene" uid="uid://uoxwjpmgg27a" path="res://entities/gold.tscn" id="5_yrfoq"]
[sub_resource type="CircleShape2D" id="CircleShape2D_c5tcn"] [sub_resource type="CircleShape2D" id="CircleShape2D_c5tcn"]
radius = 16.0 radius = 16.0
@ -31,11 +32,12 @@ scale = Vector2(0.5, 0.5)
[node name="DropSound" type="AudioStreamPlayer2D" parent="Draggable"] [node name="DropSound" type="AudioStreamPlayer2D" parent="Draggable"]
scale = Vector2(0.5, 0.5) scale = Vector2(0.5, 0.5)
[node name="HuntTarget" parent="." instance=ExtResource("3_6bq0i")] [node name="EatTarget" parent="." instance=ExtResource("3_iybf3")]
tag = &"Sheep" tag = &"Sheep"
[node name="MoveTowardsTarget" parent="." instance=ExtResource("4_ofu70")] [node name="SkullSpawner" parent="." instance=ExtResource("4_d8lgm")]
scene = ExtResource("5_yrfoq")
[connection signal="dragged" from="Draggable" to="." method="_on_draggable_dragged"] [connection signal="move" from="Draggable" to="." method="_on_draggable_move"]
[connection signal="dropped" from="Draggable" to="." method="_on_draggable_dropped"] [connection signal="eaten" from="EatTarget" to="." method="_on_eat_target_eaten"]
[connection signal="move" from="Draggable" to="." method="_on_drag_move"] [connection signal="move" from="EatTarget" to="." method="_on_move"]

View file

@ -1,7 +1,7 @@
[gd_scene load_steps=4 format=3 uid="uid://b38wkla8e7rmo"] [gd_scene load_steps=4 format=3 uid="uid://b38wkla8e7rmo"]
[ext_resource type="Script" path="res://main.gd" id="1_jyg3q"] [ext_resource type="Script" path="res://main.gd" id="1_jyg3q"]
[ext_resource type="Material" uid="uid://dpumcyplql08q" path="res://postprocess.material" id="2_3o1ux"] [ext_resource type="Material" path="res://postprocess.material" id="2_3o1ux"]
[ext_resource type="PackedScene" uid="uid://bkm7id1wdwywg" path="res://scenes/menu/safe_margin_container.tscn" id="2_ah6n8"] [ext_resource type="PackedScene" uid="uid://bkm7id1wdwywg" path="res://scenes/menu/safe_margin_container.tscn" id="2_ah6n8"]
[node name="Main" type="Node"] [node name="Main" type="Node"]

View file

@ -1,7 +1,7 @@
[gd_scene load_steps=13 format=3 uid="uid://cxj5aud02f40j"] [gd_scene load_steps=14 format=3 uid="uid://cxj5aud02f40j"]
[ext_resource type="Script" path="res://scenes/game/main_game.gd" id="1_wiglu"] [ext_resource type="Script" path="res://scenes/game/main_game.gd" id="1_wiglu"]
[ext_resource type="PackedScene" path="res://behaviours/spawner.tscn" id="2_bx37o"] [ext_resource type="PackedScene" uid="uid://cyrg770fsetyu" path="res://behaviours/spawner.tscn" id="2_bx37o"]
[ext_resource type="PackedScene" uid="uid://dm068vaseh45n" path="res://scenes/game/game_camera.tscn" id="2_db5xs"] [ext_resource type="PackedScene" uid="uid://dm068vaseh45n" path="res://scenes/game/game_camera.tscn" id="2_db5xs"]
[ext_resource type="PackedScene" uid="uid://brvbtvt4em32" path="res://behaviours/counter.tscn" id="3_p6jw3"] [ext_resource type="PackedScene" uid="uid://brvbtvt4em32" path="res://behaviours/counter.tscn" id="3_p6jw3"]
[ext_resource type="PackedScene" uid="uid://eqb3vfbvjefp" path="res://entities/cloud.tscn" id="3_whlmm"] [ext_resource type="PackedScene" uid="uid://eqb3vfbvjefp" path="res://entities/cloud.tscn" id="3_whlmm"]
@ -9,6 +9,7 @@
[ext_resource type="PackedScene" uid="uid://uoxwjpmgg27a" path="res://entities/gold.tscn" id="4_eu7q4"] [ext_resource type="PackedScene" uid="uid://uoxwjpmgg27a" path="res://entities/gold.tscn" id="4_eu7q4"]
[ext_resource type="PackedScene" uid="uid://bc2bm8lbol18w" path="res://entities/sheep.tscn" id="5_63bwb"] [ext_resource type="PackedScene" uid="uid://bc2bm8lbol18w" path="res://entities/sheep.tscn" id="5_63bwb"]
[ext_resource type="Texture2D" uid="uid://dyvkvmw7wxwe5" path="res://icon.svg" id="9_8kxq4"] [ext_resource type="Texture2D" uid="uid://dyvkvmw7wxwe5" path="res://icon.svg" id="9_8kxq4"]
[ext_resource type="PackedScene" uid="uid://4d3ksr3171x4" path="res://entities/imp.tscn" id="10_26rf6"]
[sub_resource type="TileSet" id="TileSet_g2dkm"] [sub_resource type="TileSet" id="TileSet_g2dkm"]
@ -72,12 +73,12 @@ position = Vector2(379, -58)
position = Vector2(456, -7) position = Vector2(456, -7)
[node name="Sheep" parent="." instance=ExtResource("5_63bwb")] [node name="Sheep" parent="." instance=ExtResource("5_63bwb")]
position = Vector2(-135, -134) position = Vector2(-273, -86)
[node name="SpawnedEntities" type="Node2D" parent="."] [node name="SpawnedEntities" type="Node2D" parent="."]
[node name="Cloud" parent="." instance=ExtResource("3_whlmm")] [node name="Cloud" parent="." instance=ExtResource("3_whlmm")]
position = Vector2(-3, -112) position = Vector2(-62, -239)
[node name="Node2D" type="Node2D" parent="."] [node name="Node2D" type="Node2D" parent="."]
position = Vector2(590, 317) position = Vector2(590, 317)
@ -93,4 +94,7 @@ texture = ExtResource("9_8kxq4")
scale = Vector2(0.0886132, 0.0886132) scale = Vector2(0.0886132, 0.0886132)
shape = SubResource("CircleShape2D_3du4x") shape = SubResource("CircleShape2D_3du4x")
[node name="Imp" parent="." instance=ExtResource("10_26rf6")]
position = Vector2(-275, 10)
[connection signal="mouse_entered" from="Node2D/Area2D" to="CloudSpawner" method="spawn"] [connection signal="mouse_entered" from="Node2D/Area2D" to="CloudSpawner" method="spawn"]