From 5dcc0e729ba60caf16bffeddced99bfaaaaed8eb Mon Sep 17 00:00:00 2001
From: AliJaffar <ali.esam@gmail.com>
Date: Mon, 3 Mar 2025 20:40:24 -0500
Subject: [PATCH] bullet factory, push attack

---
 febfabgame/Scenes/bullet.tscn       |  15 +++
 febfabgame/Scenes/feb_fab_game.tscn | 157 ++++++++++++++--------------
 febfabgame/Scenes/player.tscn       |  25 +++++
 febfabgame/Scripts/Player.gd        |  62 ++++++++++-
 febfabgame/Scripts/bullet.gd        |  17 +++
 febfabgame/Scripts/scene_manager.gd |  36 +++++++
 febfabgame/project.godot            |  23 ++++
 7 files changed, 256 insertions(+), 79 deletions(-)
 create mode 100644 febfabgame/Scenes/bullet.tscn
 create mode 100644 febfabgame/Scenes/player.tscn
 create mode 100644 febfabgame/Scripts/bullet.gd
 create mode 100644 febfabgame/Scripts/scene_manager.gd

diff --git a/febfabgame/Scenes/bullet.tscn b/febfabgame/Scenes/bullet.tscn
new file mode 100644
index 0000000..b29f2ba
--- /dev/null
+++ b/febfabgame/Scenes/bullet.tscn
@@ -0,0 +1,15 @@
+[gd_scene load_steps=3 format=3 uid="uid://cy7x36mdb5oxu"]
+
+[ext_resource type="Script" path="res://Scripts/bullet.gd" id="1_74gno"]
+
+[sub_resource type="RectangleShape2D" id="RectangleShape2D_vnal2"]
+size = Vector2(20, 4)
+
+[node name="Area2D" type="Area2D"]
+script = ExtResource("1_74gno")
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
+shape = SubResource("RectangleShape2D_vnal2")
+debug_color = Color(0.857955, 0.291109, 0.565473, 0.42)
+
+[connection signal="body_shape_entered" from="." to="." method="_on_body_shape_entered"]
diff --git a/febfabgame/Scenes/feb_fab_game.tscn b/febfabgame/Scenes/feb_fab_game.tscn
index fdb374c..8ec03ae 100644
--- a/febfabgame/Scenes/feb_fab_game.tscn
+++ b/febfabgame/Scenes/feb_fab_game.tscn
@@ -1,8 +1,15 @@
-[gd_scene load_steps=9 format=3 uid="uid://cpuc12n61qg6b"]
+[gd_scene load_steps=10 format=3 uid="uid://cpuc12n61qg6b"]
 
 [ext_resource type="Script" path="res://Scripts/trigger.gd" id="1_a0h8u"]
 [ext_resource type="Script" path="res://Scripts/gamecontroller.gd" id="1_amnm6"]
-[ext_resource type="Script" path="res://Scripts/Player.gd" id="2_e5caj"]
+[ext_resource type="PackedScene" uid="uid://b0snboj7mbad5" path="res://Scenes/player.tscn" id="3_3yq6m"]
+[ext_resource type="PackedScene" uid="uid://cy7x36mdb5oxu" path="res://Scenes/bullet.tscn" id="4_bk63h"]
+[ext_resource type="Script" path="res://Scripts/scene_manager.gd" id="5_4nsas"]
+
+[sub_resource type="WorldBoundaryShape2D" id="WorldBoundaryShape2D_qkap3"]
+
+[sub_resource type="CircleShape2D" id="CircleShape2D_skxer"]
+radius = 48.0
 
 [sub_resource type="RectangleShape2D" id="RectangleShape2D_yfjal"]
 size = Vector2(65, 20)
@@ -10,77 +17,9 @@ size = Vector2(65, 20)
 [sub_resource type="RectangleShape2D" id="RectangleShape2D_57esh"]
 size = Vector2(52, 56)
 
-[sub_resource type="WorldBoundaryShape2D" id="WorldBoundaryShape2D_qkap3"]
-
-[sub_resource type="CircleShape2D" id="CircleShape2D_skxer"]
-radius = 48.0
-
-[sub_resource type="CircleShape2D" id="CircleShape2D_xiumq"]
-
 [node name="FebFabGame" type="Node2D"]
 script = ExtResource("1_amnm6")
 
-[node name="Brick" type="StaticBody2D" parent="."]
-position = Vector2(606, 379)
-metadata/_edit_group_ = true
-
-[node name="CollisionShape2D" type="CollisionShape2D" parent="Brick"]
-position = Vector2(-0.5, 0)
-shape = SubResource("RectangleShape2D_yfjal")
-
-[node name="Brick3" type="StaticBody2D" parent="."]
-position = Vector2(353, 385)
-metadata/_edit_group_ = true
-
-[node name="CollisionShape2D" type="CollisionShape2D" parent="Brick3"]
-position = Vector2(-0.5, 0)
-shape = SubResource("RectangleShape2D_yfjal")
-
-[node name="Brick2" type="StaticBody2D" parent="."]
-position = Vector2(478, 490)
-rotation = 0.699225
-metadata/_edit_group_ = true
-
-[node name="CollisionShape2D" type="CollisionShape2D" parent="Brick2"]
-position = Vector2(-0.5, 0)
-shape = SubResource("RectangleShape2D_yfjal")
-
-[node name="Crate1" type="RigidBody2D" parent="."]
-position = Vector2(642, 251)
-rotation = -0.585206
-metadata/_edit_group_ = true
-
-[node name="CollisionShape2D" type="CollisionShape2D" parent="Crate1"]
-shape = SubResource("RectangleShape2D_57esh")
-debug_color = Color(0.812962, 0.406946, 0.115236, 0.42)
-
-[node name="Crate4" type="RigidBody2D" parent="."]
-position = Vector2(353, 97)
-rotation = 1.62165
-metadata/_edit_group_ = true
-
-[node name="CollisionShape2D" type="CollisionShape2D" parent="Crate4"]
-shape = SubResource("RectangleShape2D_57esh")
-debug_color = Color(0.812962, 0.406946, 0.115236, 0.42)
-
-[node name="Crate2" type="RigidBody2D" parent="."]
-position = Vector2(664, 155)
-rotation = 0.531432
-metadata/_edit_group_ = true
-
-[node name="CollisionShape2D" type="CollisionShape2D" parent="Crate2"]
-shape = SubResource("RectangleShape2D_57esh")
-debug_color = Color(0.812962, 0.406946, 0.115236, 0.42)
-
-[node name="Crate3" type="RigidBody2D" parent="."]
-position = Vector2(843, 88)
-rotation = 0.531432
-metadata/_edit_group_ = true
-
-[node name="CollisionShape2D" type="CollisionShape2D" parent="Crate3"]
-shape = SubResource("RectangleShape2D_57esh")
-debug_color = Color(0.812962, 0.406946, 0.115236, 0.42)
-
 [node name="Floor" type="StaticBody2D" parent="."]
 position = Vector2(613, 579)
 metadata/_edit_group_ = true
@@ -97,14 +36,80 @@ metadata/_edit_group_ = true
 shape = SubResource("CircleShape2D_skxer")
 debug_color = Color(0.50428, 0.445656, 0.95237, 0.42)
 
-[node name="CharacterBody2D" type="CharacterBody2D" parent="."]
-position = Vector2(590, 356)
-script = ExtResource("2_e5caj")
+[node name="Level" type="Node2D" parent="."]
+
+[node name="Brick" type="StaticBody2D" parent="Level"]
+position = Vector2(606, 379)
 metadata/_edit_group_ = true
 
-[node name="CollisionShape2D" type="CollisionShape2D" parent="CharacterBody2D"]
-shape = SubResource("CircleShape2D_xiumq")
-debug_color = Color(0.234989, 0.626043, 0.349119, 0.42)
+[node name="CollisionShape2D" type="CollisionShape2D" parent="Level/Brick"]
+position = Vector2(-0.5, 0)
+shape = SubResource("RectangleShape2D_yfjal")
+
+[node name="Brick3" type="StaticBody2D" parent="Level"]
+position = Vector2(353, 385)
+metadata/_edit_group_ = true
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="Level/Brick3"]
+position = Vector2(-0.5, 0)
+shape = SubResource("RectangleShape2D_yfjal")
+
+[node name="Brick2" type="StaticBody2D" parent="Level"]
+position = Vector2(478, 490)
+rotation = 0.699225
+metadata/_edit_group_ = true
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="Level/Brick2"]
+position = Vector2(-0.5, 0)
+shape = SubResource("RectangleShape2D_yfjal")
+
+[node name="Crates" type="Node2D" parent="."]
+
+[node name="Crate1" type="RigidBody2D" parent="Crates"]
+position = Vector2(642, 251)
+rotation = -0.585206
+metadata/_edit_group_ = true
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="Crates/Crate1"]
+shape = SubResource("RectangleShape2D_57esh")
+debug_color = Color(0.812962, 0.406946, 0.115236, 0.42)
+
+[node name="Crate4" type="RigidBody2D" parent="Crates"]
+position = Vector2(353, 97)
+rotation = 1.62165
+metadata/_edit_group_ = true
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="Crates/Crate4"]
+shape = SubResource("RectangleShape2D_57esh")
+debug_color = Color(0.812962, 0.406946, 0.115236, 0.42)
+
+[node name="Crate2" type="RigidBody2D" parent="Crates"]
+position = Vector2(664, 155)
+rotation = 0.531432
+metadata/_edit_group_ = true
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="Crates/Crate2"]
+shape = SubResource("RectangleShape2D_57esh")
+debug_color = Color(0.812962, 0.406946, 0.115236, 0.42)
+
+[node name="Crate3" type="RigidBody2D" parent="Crates"]
+position = Vector2(843, 88)
+rotation = 0.531432
+metadata/_edit_group_ = true
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="Crates/Crate3"]
+shape = SubResource("RectangleShape2D_57esh")
+debug_color = Color(0.812962, 0.406946, 0.115236, 0.42)
+
+[node name="CharacterBody2D" parent="." instance=ExtResource("3_3yq6m")]
+position = Vector2(440, 243)
+
+[node name="Area2D" parent="." instance=ExtResource("4_bk63h")]
+position = Vector2(236, 307)
+
+[node name="SceneManager" type="Node" parent="."]
+unique_name_in_owner = true
+script = ExtResource("5_4nsas")
 
 [connection signal="areaTrigger" from="Trigger" to="." method="_on_trigger_area_trigger"]
 [connection signal="body_entered" from="Trigger" to="Trigger" method="_on_body_entered"]
diff --git a/febfabgame/Scenes/player.tscn b/febfabgame/Scenes/player.tscn
new file mode 100644
index 0000000..0c30ef3
--- /dev/null
+++ b/febfabgame/Scenes/player.tscn
@@ -0,0 +1,25 @@
+[gd_scene load_steps=3 format=3 uid="uid://b0snboj7mbad5"]
+
+[ext_resource type="Script" path="res://Scripts/Player.gd" id="1_mjl5w"]
+
+[sub_resource type="CircleShape2D" id="CircleShape2D_xiumq"]
+
+[node name="CharacterBody2D" type="CharacterBody2D"]
+script = ExtResource("1_mjl5w")
+metadata/_edit_group_ = true
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
+shape = SubResource("CircleShape2D_xiumq")
+debug_color = Color(0.234989, 0.626043, 0.349119, 0.42)
+
+[node name="rightCast" type="RayCast2D" parent="."]
+target_position = Vector2(16, 0)
+
+[node name="leftCast" type="RayCast2D" parent="."]
+target_position = Vector2(-16, 0)
+
+[node name="rightTarget" type="Node2D" parent="."]
+position = Vector2(24, -26)
+
+[node name="leftTarget" type="Node2D" parent="."]
+position = Vector2(-25, -26)
diff --git a/febfabgame/Scripts/Player.gd b/febfabgame/Scripts/Player.gd
index 115be51..2fb12e5 100644
--- a/febfabgame/Scripts/Player.gd
+++ b/febfabgame/Scripts/Player.gd
@@ -1,8 +1,20 @@
 extends CharacterBody2D
 
 
-const SPEED = 300.0
-const JUMP_VELOCITY = -420.0
+const SPEED = 200.0
+const JUMP_VELOCITY = -450.0
+const PUSH_FORCE = 500
+
+var faceLeft = false
+var pushRightEnabled = false
+var pushLeftEnabled = false
+var pushTarget
+
+@onready var right_cast: RayCast2D = $rightCast
+@onready var left_cast: RayCast2D = $leftCast
+@onready var right_target: Node2D = $rightTarget
+@onready var left_target: Node2D = $leftTarget
+
 
 
 func _physics_process(delta: float) -> void:
@@ -16,13 +28,57 @@ func _physics_process(delta: float) -> void:
 
 	# Get the input direction and handle the movement/deceleration.
 	# As good practice, you should replace UI actions with custom gameplay actions.
-	var direction := Input.get_axis("ui_left", "ui_right")
+	var direction := Input.get_axis("left", "right")
+	if Input.is_action_just_pressed("shove") && pushRightEnabled && faceLeft == false:
+		pushTarget.apply_central_impulse(Vector2(1,0)*PUSH_FORCE)
+		pushRightEnabled = false 
+	if Input.is_action_just_pressed("shove") && pushLeftEnabled && faceLeft == true:
+		print("can actually push")
+		pushTarget.apply_central_impulse(Vector2(-1,0)*PUSH_FORCE)
+		pushLeftEnabled = false
+	# Shoot Attach
+	if Input.is_action_just_pressed("shoot"):
+		if faceLeft == false:
+			%SceneManager.makeBullet(right_target.global_transform, 700)
+		if faceLeft == true:
+			%SceneManager.makeBullet(left_target.global_transform, -700)
+	
 	if direction:
 		velocity.x = direction * SPEED
 	else:
 		velocity.x = move_toward(velocity.x, 0, SPEED)
+		
+	if direction <0:
+		faceLeft = true
+	if direction >0:
+		faceLeft = false
+			
 
 	move_and_slide()
+	if right_cast.is_colliding():
+		print("something on my right")
+		var collider = right_cast.get_collider()
+		if collider is Node:
+			if collider is RigidBody2D:
+				print("shove this crate")
+				#record that we can shove right
+				pushRightEnabled = true
+				#record what object to shove 
+				pushTarget = collider
+				
+	if left_cast.is_colliding():
+		print("something on my left")
+		var collider =  left_cast.get_collider()
+		if collider is Node:
+			if collider is RigidBody2D:
+				print("shove this crate")
+				#record that we can shove left
+				pushLeftEnabled = true
+				#record what object to shove 
+				pushTarget = collider
+		
+		
+		
 	for i in get_slide_collision_count():
 		var c = get_slide_collision(i)
 		if c.get_collider() is RigidBody2D:
diff --git a/febfabgame/Scripts/bullet.gd b/febfabgame/Scripts/bullet.gd
new file mode 100644
index 0000000..f1962ee
--- /dev/null
+++ b/febfabgame/Scripts/bullet.gd
@@ -0,0 +1,17 @@
+class_name Bullet extends Area2D
+
+var speed = 750
+
+signal hit(bullet, body)
+
+func setSpeed(value):
+	speed = value
+	
+#animation
+func _physics_process(delta: float) -> void:
+	position += transform.x * speed * delta
+
+
+func _on_body_shape_entered(body_rid: RID, body: Node2D, body_shape_index: int, local_shape_index: int) -> void:
+	print("bullet collision")
+	hit.emit(self, body)
diff --git a/febfabgame/Scripts/scene_manager.gd b/febfabgame/Scripts/scene_manager.gd
new file mode 100644
index 0000000..60931ca
--- /dev/null
+++ b/febfabgame/Scripts/scene_manager.gd
@@ -0,0 +1,36 @@
+extends Node
+
+var bulletsFiredTotal = 0
+var bulletsMadeTotal = 0
+var bulletArray= []
+
+var bullet = preload("res://Scenes/bullet.tscn")
+
+# bullet factory - makes bullets
+func bulletFactory():
+	var mybullet
+	if bulletArray.size() < 8:
+		print("new bullet at factory")
+		mybullet = bullet.instantiate()
+		mybullet.connect("hit", bulletHit)
+	else:
+		print("recycled bullet at factory")
+		mybullet = bulletArray.pop_back()
+		
+	bulletArray.push_front(mybullet)
+	return mybullet
+# order desk for bullets 
+func makeBullet(position, speed):
+	print("make a bullet")
+	var newBullet = bulletFactory()
+	owner.add_child(newBullet)
+	newBullet.setSpeed(speed)
+	newBullet.transform = position
+func bulletHit(bullet, body):
+	print("tell the game controller a bullet hit smthn")
+	
+	
+	
+	
+	
+	
diff --git a/febfabgame/project.godot b/febfabgame/project.godot
index ea62cd2..832079a 100644
--- a/febfabgame/project.godot
+++ b/febfabgame/project.godot
@@ -20,3 +20,26 @@ config/icon="res://icon.svg"
 folder_colors={
 "res://Scenes/": "red"
 }
+
+[input]
+
+left={
+"deadzone": 0.5,
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":97,"location":0,"echo":false,"script":null)
+]
+}
+right={
+"deadzone": 0.5,
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":100,"location":0,"echo":false,"script":null)
+]
+}
+shove={
+"deadzone": 0.5,
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":76,"key_label":0,"unicode":108,"location":0,"echo":false,"script":null)
+]
+}
+shoot={
+"deadzone": 0.5,
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":77,"key_label":0,"unicode":109,"location":0,"echo":false,"script":null)
+]
+}