commit b35e6f4f602185880ce582f0a856cfc04de7930f
Author: AliJaffar <ali.esam@gmail.com>
Date:   Mon Feb 24 21:10:45 2025 -0500

    big four game objects, custom signals

diff --git a/febfabgame/.gitattributes b/febfabgame/.gitattributes
new file mode 100644
index 0000000..8ad74f7
--- /dev/null
+++ b/febfabgame/.gitattributes
@@ -0,0 +1,2 @@
+# Normalize EOL for all files that Git considers text files.
+* text=auto eol=lf
diff --git a/febfabgame/.gitignore b/febfabgame/.gitignore
new file mode 100644
index 0000000..0af181c
--- /dev/null
+++ b/febfabgame/.gitignore
@@ -0,0 +1,3 @@
+# Godot 4+ specific ignores
+.godot/
+/android/
diff --git a/febfabgame/Scenes/feb_fab_game.tscn b/febfabgame/Scenes/feb_fab_game.tscn
new file mode 100644
index 0000000..fdb374c
--- /dev/null
+++ b/febfabgame/Scenes/feb_fab_game.tscn
@@ -0,0 +1,110 @@
+[gd_scene load_steps=9 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"]
+
+[sub_resource type="RectangleShape2D" id="RectangleShape2D_yfjal"]
+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
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="Floor"]
+shape = SubResource("WorldBoundaryShape2D_qkap3")
+
+[node name="Trigger" type="Area2D" parent="."]
+position = Vector2(727, 529)
+script = ExtResource("1_a0h8u")
+metadata/_edit_group_ = true
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="Trigger"]
+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")
+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)
+
+[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/Scripts/Player.gd b/febfabgame/Scripts/Player.gd
new file mode 100644
index 0000000..115be51
--- /dev/null
+++ b/febfabgame/Scripts/Player.gd
@@ -0,0 +1,29 @@
+extends CharacterBody2D
+
+
+const SPEED = 300.0
+const JUMP_VELOCITY = -420.0
+
+
+func _physics_process(delta: float) -> void:
+	# Add the gravity.
+	if not is_on_floor():
+		velocity += get_gravity() * delta
+
+	# Handle jump.
+	if Input.is_action_just_pressed("ui_accept") and is_on_floor():
+		velocity.y = JUMP_VELOCITY
+
+	# 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")
+	if direction:
+		velocity.x = direction * SPEED
+	else:
+		velocity.x = move_toward(velocity.x, 0, SPEED)
+
+	move_and_slide()
+	for i in get_slide_collision_count():
+		var c = get_slide_collision(i)
+		if c.get_collider() is RigidBody2D:
+			c.get_collider().apply_central_impulse(-c.get_normal() * 50)
diff --git a/febfabgame/Scripts/gamecontroller.gd b/febfabgame/Scripts/gamecontroller.gd
new file mode 100644
index 0000000..3676b48
--- /dev/null
+++ b/febfabgame/Scripts/gamecontroller.gd
@@ -0,0 +1,25 @@
+extends Node2D
+
+# Game Data 
+var totalCrates = 4
+var cratesDestroyed = 0
+
+
+# Called when the node enters the scene tree for the first time.
+func _ready() -> void:
+	pass # Replace with function body.
+
+
+# Called every frame. 'delta' is the elapsed time since the previous frame.
+func _process(delta: float) -> void:
+	pass
+
+
+func _on_trigger_area_trigger(body) -> void:
+	print("game controller knows about crate destruction")
+	cratesDestroyed +=1
+	totalCrates -=1
+	#kill em
+	body.queue_free()
+	if totalCrates <=0:
+		print("win")
diff --git a/febfabgame/Scripts/trigger.gd b/febfabgame/Scripts/trigger.gd
new file mode 100644
index 0000000..e357803
--- /dev/null
+++ b/febfabgame/Scripts/trigger.gd
@@ -0,0 +1,16 @@
+extends Area2D
+
+signal areaTrigger(Object)
+# Called when the node enters the scene tree for the first time.
+func _ready() -> void:
+	print("Trigger is Active")
+
+
+# Called every frame. 'delta' is the elapsed time since the previous frame.
+func _process(delta: float) -> void:
+	pass
+
+
+func _on_body_entered(body: Node2D) -> void:
+	print("body collision in trigger")
+	areaTrigger.emit(body)
diff --git a/febfabgame/icon.svg b/febfabgame/icon.svg
new file mode 100644
index 0000000..9d8b7fa
--- /dev/null
+++ b/febfabgame/icon.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128"><rect width="124" height="124" x="2" y="2" fill="#363d52" stroke="#212532" stroke-width="4" rx="14"/><g fill="#fff" transform="translate(12.322 12.322)scale(.101)"><path d="M105 673v33q407 354 814 0v-33z"/><path fill="#478cbf" d="m105 673 152 14q12 1 15 14l4 67 132 10 8-61q2-11 15-15h162q13 4 15 15l8 61 132-10 4-67q3-13 15-14l152-14V427q30-39 56-81-35-59-83-108-43 20-82 47-40-37-88-64 7-51 8-102-59-28-123-42-26 43-46 89-49-7-98 0-20-46-46-89-64 14-123 42 1 51 8 102-48 27-88 64-39-27-82-47-48 49-83 108 26 42 56 81zm0 33v39c0 276 813 276 814 0v-39l-134 12-5 69q-2 10-14 13l-162 11q-12 0-16-11l-10-65H446l-10 65q-4 11-16 11l-162-11q-12-3-14-13l-5-69z"/><path d="M483 600c0 34 58 34 58 0v-86c0-34-58-34-58 0z"/><circle cx="725" cy="526" r="90"/><circle cx="299" cy="526" r="90"/></g><g fill="#414042" transform="translate(12.322 12.322)scale(.101)"><circle cx="307" cy="532" r="60"/><circle cx="717" cy="532" r="60"/></g></svg>
\ No newline at end of file
diff --git a/febfabgame/icon.svg.import b/febfabgame/icon.svg.import
new file mode 100644
index 0000000..1ac01ad
--- /dev/null
+++ b/febfabgame/icon.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://vepncep1nhco"
+path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://icon.svg"
+dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/febfabgame/project.godot b/febfabgame/project.godot
new file mode 100644
index 0000000..ea62cd2
--- /dev/null
+++ b/febfabgame/project.godot
@@ -0,0 +1,22 @@
+; Engine configuration file.
+; It's best edited using the editor UI and not directly,
+; since the parameters that go here are not all obvious.
+;
+; Format:
+;   [section] ; section goes between []
+;   param=value ; assign values to parameters
+
+config_version=5
+
+[application]
+
+config/name="FebFabGame"
+run/main_scene="res://Scenes/feb_fab_game.tscn"
+config/features=PackedStringArray("4.3", "Forward Plus")
+config/icon="res://icon.svg"
+
+[file_customization]
+
+folder_colors={
+"res://Scenes/": "red"
+}