From f922fe4669080d1633e0a345a3f8981867c9e841 Mon Sep 17 00:00:00 2001
From: David Luevano Alvarado <david@luevano.xyz>
Date: Fri, 3 Jun 2022 21:13:19 -0600
Subject: add working world gen, fixed food placing, minor refactoring

---
 src/entities/actors/snake/scenes/Body.tscn         |   4 ++--
 src/entities/actors/snake/scenes/Head.tscn         |   5 +++--
 src/entities/actors/snake/scenes/Snake.tscn        |   9 +++++++--
 src/entities/actors/snake/scenes/Tail.tscn         |   3 ++-
 src/entities/actors/snake/scripts/camera.gd        |   9 +++++++++
 .../actors/snake/scripts/generic_segment.gd        |   7 +++++++
 src/entities/actors/snake/scripts/head.gd          |   2 ++
 src/entities/actors/snake/scripts/snake.gd         |  22 ++++++++++++++-------
 src/entities/actors/snake/sprites/body.png         | Bin 168 -> 136 bytes
 src/entities/actors/snake/sprites/head.png         | Bin 188 -> 174 bytes
 src/entities/actors/snake/sprites/tail.png         | Bin 174 -> 133 bytes
 11 files changed, 47 insertions(+), 14 deletions(-)
 create mode 100644 src/entities/actors/snake/scripts/camera.gd

(limited to 'src/entities/actors/snake')

diff --git a/src/entities/actors/snake/scenes/Body.tscn b/src/entities/actors/snake/scenes/Body.tscn
index 49694c0..7b5de58 100644
--- a/src/entities/actors/snake/scenes/Body.tscn
+++ b/src/entities/actors/snake/scenes/Body.tscn
@@ -4,8 +4,8 @@
 [ext_resource path="res://entities/actors/snake/scripts/generic_segment.gd" type="Script" id=2]
 
 [sub_resource type="CapsuleShape2D" id=1]
-radius = 4.99999
-height = 4.00002
+radius = 1.99999
+height = 2.00001
 
 [node name="BodyPathFollow" type="PathFollow2D"]
 loop = false
diff --git a/src/entities/actors/snake/scenes/Head.tscn b/src/entities/actors/snake/scenes/Head.tscn
index d118fbf..336265b 100644
--- a/src/entities/actors/snake/scenes/Head.tscn
+++ b/src/entities/actors/snake/scenes/Head.tscn
@@ -3,8 +3,8 @@
 [ext_resource path="res://entities/actors/snake/sprites/head.png" type="Texture" id=1]
 [ext_resource path="res://entities/actors/snake/scripts/head.gd" type="Script" id=2]
 
-[sub_resource type="ConvexPolygonShape2D" id=1]
-points = PoolVector2Array( -5, 0, 5, 0, 5, -3, 3, -4, 1, -5, -1, -5, -3, -4, -5, -3 )
+[sub_resource type="CircleShape2D" id=1]
+radius = 2.0
 
 [node name="Head" type="KinematicBody2D"]
 collision_mask = 262
@@ -14,4 +14,5 @@ script = ExtResource( 2 )
 texture = ExtResource( 1 )
 
 [node name="Collision" type="CollisionShape2D" parent="."]
+position = Vector2( 0, -2 )
 shape = SubResource( 1 )
diff --git a/src/entities/actors/snake/scenes/Snake.tscn b/src/entities/actors/snake/scenes/Snake.tscn
index cb1eb2a..ea234c4 100644
--- a/src/entities/actors/snake/scenes/Snake.tscn
+++ b/src/entities/actors/snake/scenes/Snake.tscn
@@ -1,9 +1,10 @@
-[gd_scene load_steps=6 format=2]
+[gd_scene load_steps=7 format=2]
 
 [ext_resource path="res://entities/actors/snake/scenes/Head.tscn" type="PackedScene" id=1]
 [ext_resource path="res://entities/actors/snake/scenes/Body.tscn" type="PackedScene" id=2]
 [ext_resource path="res://entities/actors/snake/scripts/snake.gd" type="Script" id=3]
 [ext_resource path="res://entities/actors/snake/scenes/Tail.tscn" type="PackedScene" id=4]
+[ext_resource path="res://entities/actors/snake/scripts/camera.gd" type="Script" id=5]
 
 [sub_resource type="Curve2D" id=1]
 _data = {
@@ -15,7 +16,11 @@ script = ExtResource( 3 )
 BODY_SEGMENT_NP = ExtResource( 2 )
 TAIL_SEGMENT_NP = ExtResource( 4 )
 
+[node name="Head" parent="." instance=ExtResource( 1 )]
+
 [node name="Path" type="Path2D" parent="."]
 curve = SubResource( 1 )
 
-[node name="Head" parent="." instance=ExtResource( 1 )]
+[node name="Camera" type="Camera2D" parent="."]
+current = true
+script = ExtResource( 5 )
diff --git a/src/entities/actors/snake/scenes/Tail.tscn b/src/entities/actors/snake/scenes/Tail.tscn
index 17e8ec5..adfe422 100644
--- a/src/entities/actors/snake/scenes/Tail.tscn
+++ b/src/entities/actors/snake/scenes/Tail.tscn
@@ -4,7 +4,7 @@
 [ext_resource path="res://entities/actors/snake/scripts/generic_segment.gd" type="Script" id=2]
 
 [sub_resource type="CircleShape2D" id=1]
-radius = 4.12311
+radius = 2.0
 
 [node name="TailPathFollow" type="PathFollow2D"]
 loop = false
@@ -20,4 +20,5 @@ collision_mask = 0
 texture = ExtResource( 1 )
 
 [node name="Collision" type="CollisionShape2D" parent="Tail"]
+position = Vector2( 7.23998e-06, 2 )
 shape = SubResource( 1 )
diff --git a/src/entities/actors/snake/scripts/camera.gd b/src/entities/actors/snake/scripts/camera.gd
new file mode 100644
index 0000000..c230dad
--- /dev/null
+++ b/src/entities/actors/snake/scripts/camera.gd
@@ -0,0 +1,9 @@
+extends Camera2D
+
+onready var _snake_head: KinematicBody2D = get_parent().get_node("Head")
+var _snake_position: Vector2
+
+
+func _physics_process(delta: float) -> void:
+	_snake_position = _snake_head.global_position
+	global_position = global_position.linear_interpolate(_snake_position, delta)
diff --git a/src/entities/actors/snake/scripts/generic_segment.gd b/src/entities/actors/snake/scripts/generic_segment.gd
index e2db91d..d0bb944 100644
--- a/src/entities/actors/snake/scripts/generic_segment.gd
+++ b/src/entities/actors/snake/scripts/generic_segment.gd
@@ -6,6 +6,7 @@ onready var _segment: Area2D = get_child(0)
 
 
 func _ready() -> void:
+	Event.connect("snake_rotated", self, "_on_snake_rotated")
 	_segment.connect("body_entered", self, "_on_body_entered")
 
 
@@ -15,3 +16,9 @@ func _physics_process(delta: float) -> void:
 
 func _on_body_entered(body: Node) -> void:
 	Event.emit_signal("snake_segment_body_entered", body)
+
+
+func _on_snake_rotated() -> void:
+	# this is just random, i need to offset a tiny bit whenever the snake rotates
+	#	so that the first body segmetn doesn't catch up with the head
+	offset -= Global.SNAKE_SPEED * pow(get_physics_process_delta_time(), 2)
\ No newline at end of file
diff --git a/src/entities/actors/snake/scripts/head.gd b/src/entities/actors/snake/scripts/head.gd
index 448802e..117f461 100644
--- a/src/entities/actors/snake/scripts/head.gd
+++ b/src/entities/actors/snake/scripts/head.gd
@@ -5,6 +5,7 @@ enum {
 	RIGHT=1
 }
 
+var _initial_speed: float = Global.SNAKE_SPEED
 var velocity: Vector2 = Vector2.ZERO
 var _direction: Vector2 = Vector2.UP
 var _time_elapsed: float = 0.0
@@ -26,6 +27,7 @@ func _physics_process(delta: float) -> void:
 func _rotate_to(direction: int) -> void:
 	rotate(deg2rad(direction * Global.SNAKE_ROT_SPEED * get_physics_process_delta_time()))
 	_direction = _direction.rotated(deg2rad(direction * Global.SNAKE_ROT_SPEED * get_physics_process_delta_time()))
+	Event.emit_signal("snake_rotated")
 
 
 # using a timer is not recommended for < 0.01
diff --git a/src/entities/actors/snake/scripts/snake.gd b/src/entities/actors/snake/scripts/snake.gd
index ead6254..01e09da 100644
--- a/src/entities/actors/snake/scripts/snake.gd
+++ b/src/entities/actors/snake/scripts/snake.gd
@@ -13,6 +13,7 @@ var tail_segment: PathFollow2D
 # didn't konw how to name this, basically holds the current path lenght
 # 	whenever the add body segment, and we use this stack to add body parts
 var body_segment_queue: Array
+# var distance_to_first_segment: float
 
 
 func _ready():
@@ -23,21 +24,28 @@ func _ready():
 	Event.connect("snake_added_initial_segments", self, "_on_snake_added_initial_segments")
 
 	Event.connect("food_eaten", self, "_on_food_eaten")
+	# need to always set a new curve when ready, so when restarting it's af resh curve
+	path.curve = Curve2D.new()
 
 
 func _physics_process(delta: float) -> void:
-	if body_segment_queue.size() != 0:
+	if body_segment_queue.size() != 0 and current_body_segments > max_body_initial_segments:
 		_add_new_segment()
 
+	# if body_segment_stack.size() > 0:
+	# 	distance_to_first_segment = path.curve.get_baked_length() - body_segment_stack.front().offset
+	# 	if distance_to_first_segment >= Global.SNAKE_SEGMENT_SIZE:
+	# 		print(distance_to_first_segment)
+
 
 func _input(event: InputEvent) -> void:
 	if event.is_action_pressed("add_body_part"):
 		_add_segment_to_queue()
 
 
-func _draw() -> void:
-	if path.curve.get_baked_points().size() >= 2:
-		draw_polyline(path.curve.get_baked_points(), Color.aquamarine, 1, true)
+# func _draw() -> void:
+# 	if path.curve.get_baked_points().size() >= 2:
+# 		draw_polyline(path.curve.get_baked_points(), Color.aquamarine, 1, true)
 
 
 func _add_new_segment() -> void:
@@ -83,7 +91,7 @@ func _add_segment_to_queue() -> void:
 func _on_snake_path_new_point(coordinates: Vector2) -> void:
 	path.curve.add_point(coordinates)
 	# update call is to draw curve as there are new points to the path's curve
-	update()
+	# update()
 
 	if current_body_segments < max_body_initial_segments:
 		_add_initial_segment(BODY_SEGMENT_NP)
@@ -101,5 +109,5 @@ func _on_snake_added_initial_segments() -> void:
 	set_process_input(true)
 
 
-func _on_food_eaten(type: int) -> void:
-	_add_segment_to_queue()
\ No newline at end of file
+func _on_food_eaten(type: int, location: Vector2) -> void:
+	_add_segment_to_queue()
diff --git a/src/entities/actors/snake/sprites/body.png b/src/entities/actors/snake/sprites/body.png
index ebef3b4..d94ff94 100644
Binary files a/src/entities/actors/snake/sprites/body.png and b/src/entities/actors/snake/sprites/body.png differ
diff --git a/src/entities/actors/snake/sprites/head.png b/src/entities/actors/snake/sprites/head.png
index 525de45..0bca146 100644
Binary files a/src/entities/actors/snake/sprites/head.png and b/src/entities/actors/snake/sprites/head.png differ
diff --git a/src/entities/actors/snake/sprites/tail.png b/src/entities/actors/snake/sprites/tail.png
index ff78e1b..05abc6e 100644
Binary files a/src/entities/actors/snake/sprites/tail.png and b/src/entities/actors/snake/sprites/tail.png differ
-- 
cgit v1.2.3-70-g09d2