diff --git a/Assets/Characters/Female1.png b/Assets/Characters/Female1.png new file mode 100644 index 0000000..cb758cf Binary files /dev/null and b/Assets/Characters/Female1.png differ diff --git a/Assets/Characters/Female1.png.import b/Assets/Characters/Female1.png.import new file mode 100644 index 0000000..f4950b6 --- /dev/null +++ b/Assets/Characters/Female1.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://315k07rsgf6t" +path.s3tc="res://.godot/imported/Female1.png-32c7b3afa8b348d789d25434c42d0b3a.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://Assets/Characters/Female1.png" +dest_files=["res://.godot/imported/Female1.png-32c7b3afa8b348d789d25434c42d0b3a.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +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=0 diff --git a/Assets/Characters/Male1.png b/Assets/Characters/Male1.png new file mode 100644 index 0000000..f5d3525 Binary files /dev/null and b/Assets/Characters/Male1.png differ diff --git a/Assets/Characters/Male1.png.import b/Assets/Characters/Male1.png.import new file mode 100644 index 0000000..c6ed1b6 --- /dev/null +++ b/Assets/Characters/Male1.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bn6ikwol6x8r0" +path.s3tc="res://.godot/imported/Male1.png-771345d3aff75b5160c1a6dbc860364e.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://Assets/Characters/Male1.png" +dest_files=["res://.godot/imported/Male1.png-771345d3aff75b5160c1a6dbc860364e.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +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=0 diff --git a/Assets/Emotes/emote_faceAngry.png b/Assets/Emotes/emote_faceAngry.png new file mode 100644 index 0000000..43d6c86 Binary files /dev/null and b/Assets/Emotes/emote_faceAngry.png differ diff --git a/Assets/Emotes/emote_faceAngry.png.import b/Assets/Emotes/emote_faceAngry.png.import new file mode 100644 index 0000000..6e9300b --- /dev/null +++ b/Assets/Emotes/emote_faceAngry.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://y24ssl61l6uv" +path="res://.godot/imported/emote_faceAngry.png-aa3a262420ef633dc34c39681d1c910c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Emotes/emote_faceAngry.png" +dest_files=["res://.godot/imported/emote_faceAngry.png-aa3a262420ef633dc34c39681d1c910c.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 diff --git a/Assets/Emotes/emote_faceHappy.png b/Assets/Emotes/emote_faceHappy.png new file mode 100644 index 0000000..19f7c0d Binary files /dev/null and b/Assets/Emotes/emote_faceHappy.png differ diff --git a/Assets/Emotes/emote_faceHappy.png.import b/Assets/Emotes/emote_faceHappy.png.import new file mode 100644 index 0000000..f6643c2 --- /dev/null +++ b/Assets/Emotes/emote_faceHappy.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d362b57essjt6" +path="res://.godot/imported/emote_faceHappy.png-6dd77ea09ad4351e746d9b3848f84e6e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Emotes/emote_faceHappy.png" +dest_files=["res://.godot/imported/emote_faceHappy.png-6dd77ea09ad4351e746d9b3848f84e6e.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 diff --git a/Assets/Emotes/emote_faceSad.png b/Assets/Emotes/emote_faceSad.png new file mode 100644 index 0000000..0d007ac Binary files /dev/null and b/Assets/Emotes/emote_faceSad.png differ diff --git a/Assets/Emotes/emote_faceSad.png.import b/Assets/Emotes/emote_faceSad.png.import new file mode 100644 index 0000000..cbaa13b --- /dev/null +++ b/Assets/Emotes/emote_faceSad.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cuphn1ph86gv8" +path.s3tc="res://.godot/imported/emote_faceSad.png-3f79bde2b0a21130630738dd11746564.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://Assets/Emotes/emote_faceSad.png" +dest_files=["res://.godot/imported/emote_faceSad.png-3f79bde2b0a21130630738dd11746564.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +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=0 diff --git a/Assets/Emotes/emote_hearts.png b/Assets/Emotes/emote_hearts.png new file mode 100644 index 0000000..6c808d3 Binary files /dev/null and b/Assets/Emotes/emote_hearts.png differ diff --git a/Assets/Emotes/emote_hearts.png.import b/Assets/Emotes/emote_hearts.png.import new file mode 100644 index 0000000..437b80f --- /dev/null +++ b/Assets/Emotes/emote_hearts.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c37o831e05ljr" +path.s3tc="res://.godot/imported/emote_hearts.png-1ece24d239c76081343c286ae865cb90.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://Assets/Emotes/emote_hearts.png" +dest_files=["res://.godot/imported/emote_hearts.png-1ece24d239c76081343c286ae865cb90.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +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=0 diff --git a/Assets/Emotes/emote_star.png b/Assets/Emotes/emote_star.png new file mode 100644 index 0000000..872b258 Binary files /dev/null and b/Assets/Emotes/emote_star.png differ diff --git a/Assets/Emotes/emote_star.png.import b/Assets/Emotes/emote_star.png.import new file mode 100644 index 0000000..a3854ec --- /dev/null +++ b/Assets/Emotes/emote_star.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dqyhhvxpwtpsy" +path.s3tc="res://.godot/imported/emote_star.png-d1f7308a1e87c81fd0d857808bfea092.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://Assets/Emotes/emote_star.png" +dest_files=["res://.godot/imported/emote_star.png-d1f7308a1e87c81fd0d857808bfea092.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +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=0 diff --git a/Bullets/arrow.gd b/Bullets/arrow.gd index e735fd7..d02413c 100644 --- a/Bullets/arrow.gd +++ b/Bullets/arrow.gd @@ -2,7 +2,7 @@ extends CharacterBody3D class_name Bullet var target : CharacterBody3D -var speed : int = 20 +@export var speed : int = 20 var bullet_damage : int = 1 func _physics_process(delta: float) -> void: diff --git a/Bullets/arrow.tscn b/Bullets/arrow.tscn index d576897..2c2b89c 100644 --- a/Bullets/arrow.tscn +++ b/Bullets/arrow.tscn @@ -1,27 +1,31 @@ [gd_scene load_steps=5 format=3 uid="uid://oykrff3g74eo"] -[ext_resource type="PackedScene" uid="uid://3nq3g7ddnphr" path="res://Assets/GLB format/weapon-ammo-arrow.glb" id="1_dsts2"] [ext_resource type="Script" uid="uid://b788twwo1o6l2" path="res://Bullets/arrow.gd" id="1_r5o86"] +[ext_resource type="Texture2D" uid="uid://dqyhhvxpwtpsy" path="res://Assets/Emotes/emote_star.png" id="2_r5o86"] [sub_resource type="SphereShape3D" id="SphereShape3D_r5o86"] -radius = 0.2 +radius = 0.1 [sub_resource type="SphereShape3D" id="SphereShape3D_dsts2"] -radius = 0.3 +radius = 0.12 [node name="Arrow" type="CharacterBody3D"] script = ExtResource("1_r5o86") - -[node name="weapon-ammo-arrow2" parent="." instance=ExtResource("1_dsts2")] +speed = 10 [node name="CollisionShape3D" type="CollisionShape3D" parent="."] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -0.123779) +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.0715332, 0) shape = SubResource("SphereShape3D_r5o86") +[node name="Sprite3D" type="Sprite3D" parent="."] +transform = Transform3D(2.5, 0, 0, 0, 2.5, 0, 0, 0, 2.5, 0, 0, 0) +billboard = 2 +texture = ExtResource("2_r5o86") + [node name="Impact" type="Area3D" parent="."] [node name="CollisionShape3D2" type="CollisionShape3D" parent="Impact"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -0.137329) +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.0714111, 0) shape = SubResource("SphereShape3D_dsts2") debug_color = Color(0.926858, 0.237749, 0.335021, 0.42) diff --git a/Globals/EventBus.gd b/Globals/EventBus.gd new file mode 100644 index 0000000..117e181 --- /dev/null +++ b/Globals/EventBus.gd @@ -0,0 +1,6 @@ +extends Node + + +#Emitter : TowerButton.gd +#Subscriber : World.gd +signal tower_selected(tower : PackedScene) diff --git a/Globals/EventBus.gd.uid b/Globals/EventBus.gd.uid new file mode 100644 index 0000000..6447eec --- /dev/null +++ b/Globals/EventBus.gd.uid @@ -0,0 +1 @@ +uid://cqrfsolhtr1k3 diff --git a/Towers/tower-b.tscn b/Towers/tower-b.tscn new file mode 100644 index 0000000..7e892ef --- /dev/null +++ b/Towers/tower-b.tscn @@ -0,0 +1,46 @@ +[gd_scene load_steps=5 format=3 uid="uid://dp846r4jscm5p"] + +[ext_resource type="Script" uid="uid://8kpvuurr5h5n" path="res://Towers/tower.gd" id="1_pb6ru"] +[ext_resource type="Texture2D" uid="uid://315k07rsgf6t" path="res://Assets/Characters/Female1.png" id="2_pb6ru"] + +[sub_resource type="BoxShape3D" id="BoxShape3D_egfuc"] +size = Vector3(1, 0.1, 1) + +[sub_resource type="SphereShape3D" id="SphereShape3D_pajr1"] +radius = 3.0 + +[node name="Tower" type="StaticBody3D"] +collision_layer = 4 +collision_mask = 4 +script = ExtResource("1_pb6ru") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.00914001, 0) +shape = SubResource("BoxShape3D_egfuc") + +[node name="Range" type="Area3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.923584, 0) + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Range"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.475708, 0) +shape = SubResource("SphereShape3D_pajr1") + +[node name="Aim" type="Marker3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.02026, 0) + +[node name="BulletContainer" type="Node" parent="."] + +[node name="Cooldown" type="Timer" parent="."] +wait_time = 1.5 + +[node name="Sprite3D" type="Sprite3D" parent="."] +transform = Transform3D(3.5, 0, 0, 0, 3.5, 0, 0, 0, 3.5, 0, 0.515442, 0) +billboard = 2 +texture = ExtResource("2_pb6ru") +hframes = 8 +vframes = 12 +frame = 75 + +[connection signal="body_entered" from="Range" to="." method="_on_range_body_entered"] +[connection signal="body_exited" from="Range" to="." method="_on_range_body_exited"] +[connection signal="timeout" from="Cooldown" to="." method="_on_cooldown_timeout"] diff --git a/Towers/tower.tscn b/Towers/tower.tscn index c84a292..774c851 100644 --- a/Towers/tower.tscn +++ b/Towers/tower.tscn @@ -1,7 +1,7 @@ [gd_scene load_steps=5 format=3 uid="uid://trg7ag3dqr2l"] [ext_resource type="Script" uid="uid://8kpvuurr5h5n" path="res://Towers/tower.gd" id="1_egfuc"] -[ext_resource type="PackedScene" uid="uid://bkrwjcxb47n0d" path="res://Assets/GLB format/tower-round-build-d.glb" id="1_ovc7u"] +[ext_resource type="Texture2D" uid="uid://bn6ikwol6x8r0" path="res://Assets/Characters/Male1.png" id="2_egfuc"] [sub_resource type="BoxShape3D" id="BoxShape3D_egfuc"] size = Vector3(1, 0.1, 1) @@ -10,10 +10,10 @@ size = Vector3(1, 0.1, 1) radius = 3.0 [node name="Tower" type="StaticBody3D"] +collision_layer = 4 +collision_mask = 4 script = ExtResource("1_egfuc") -[node name="tower-round-build-d2" parent="." instance=ExtResource("1_ovc7u")] - [node name="CollisionShape3D" type="CollisionShape3D" parent="."] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.00914001, 0) shape = SubResource("BoxShape3D_egfuc") @@ -33,6 +33,14 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.02026, 0) [node name="Cooldown" type="Timer" parent="."] wait_time = 1.5 +[node name="Sprite3D" type="Sprite3D" parent="."] +transform = Transform3D(3.5, 0, 0, 0, 3.5, 0, 0, 0, 3.5, 0, 0.515442, 0) +billboard = 2 +texture = ExtResource("2_egfuc") +hframes = 8 +vframes = 12 +frame = 75 + [connection signal="body_entered" from="Range" to="." method="_on_range_body_entered"] [connection signal="body_exited" from="Range" to="." method="_on_range_body_exited"] [connection signal="timeout" from="Cooldown" to="." method="_on_cooldown_timeout"] diff --git a/UI/health_bar_2d.gd b/UI/health_bar_2d.gd new file mode 100644 index 0000000..ce55c2e --- /dev/null +++ b/UI/health_bar_2d.gd @@ -0,0 +1,9 @@ +extends ProgressBar + +func setup_bar(amount : int, max_amount : int) -> void: + max_value = max_amount + value = amount + + +func update_bar(amount : int) -> void: + value = amount diff --git a/UI/health_bar_2d.gd.uid b/UI/health_bar_2d.gd.uid new file mode 100644 index 0000000..77189f9 --- /dev/null +++ b/UI/health_bar_2d.gd.uid @@ -0,0 +1 @@ +uid://c4037f8r3bomr diff --git a/UI/health_bar_2d.tscn b/UI/health_bar_2d.tscn new file mode 100644 index 0000000..b8a7a6d --- /dev/null +++ b/UI/health_bar_2d.tscn @@ -0,0 +1,29 @@ +[gd_scene load_steps=4 format=3 uid="uid://cwl31nkib7ixp"] + +[ext_resource type="Script" uid="uid://c4037f8r3bomr" path="res://UI/health_bar_2d.gd" id="1_qpj2g"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_qpj2g"] +bg_color = Color(0.341176, 0.0823529, 0.0941176, 0) +border_width_left = 2 +border_width_top = 2 +border_width_right = 2 +border_width_bottom = 2 +expand_margin_left = 4.0 +expand_margin_top = 4.0 +expand_margin_right = 4.0 +expand_margin_bottom = 4.0 + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_xcn5x"] +bg_color = Color(0.921569, 0.419608, 0.415686, 1) + +[node name="HealthBar2D" type="ProgressBar"] +custom_minimum_size = Vector2(100, 10) +offset_left = 4.0 +offset_top = 4.0 +offset_right = 104.0 +offset_bottom = 14.0 +theme_override_styles/background = SubResource("StyleBoxFlat_qpj2g") +theme_override_styles/fill = SubResource("StyleBoxFlat_xcn5x") +value = 50.0 +show_percentage = false +script = ExtResource("1_qpj2g") diff --git a/UI/health_bar_3d.gd b/UI/health_bar_3d.gd new file mode 100644 index 0000000..ec82ef6 --- /dev/null +++ b/UI/health_bar_3d.gd @@ -0,0 +1,14 @@ +extends Sprite3D + +@onready var bar : ProgressBar = $SubViewport/HealthBar2D + +func _ready() -> void: + texture = $SubViewport.get_texture() + + +func set_up(value : int, max_amount : int) -> void: + bar.setup_bar(value, max_amount) + + +func update(value : int) -> void: + bar.update_bar(value) diff --git a/UI/health_bar_3d.gd.uid b/UI/health_bar_3d.gd.uid new file mode 100644 index 0000000..f5a0007 --- /dev/null +++ b/UI/health_bar_3d.gd.uid @@ -0,0 +1 @@ +uid://be8jd1w1bsfyt diff --git a/UI/health_bar_3d.tscn b/UI/health_bar_3d.tscn new file mode 100644 index 0000000..f4dd6c2 --- /dev/null +++ b/UI/health_bar_3d.tscn @@ -0,0 +1,16 @@ +[gd_scene load_steps=4 format=3 uid="uid://daiqb0q373002"] + +[ext_resource type="Texture2D" uid="uid://bd7ed8dvc7m0v" path="res://icon.svg" id="1_dna40"] +[ext_resource type="Script" uid="uid://be8jd1w1bsfyt" path="res://UI/health_bar_3d.gd" id="1_l5e25"] +[ext_resource type="PackedScene" uid="uid://cwl31nkib7ixp" path="res://UI/health_bar_2d.tscn" id="2_l5e25"] + +[node name="HealthBar3D" type="Sprite3D"] +billboard = 2 +texture = ExtResource("1_dna40") +script = ExtResource("1_l5e25") + +[node name="SubViewport" type="SubViewport" parent="."] +size = Vector2i(108, 18) +size_2d_override_stretch = true + +[node name="HealthBar2D" parent="SubViewport" instance=ExtResource("2_l5e25")] diff --git a/UI/shop_panel.tscn b/UI/shop_panel.tscn new file mode 100644 index 0000000..e67a5f3 --- /dev/null +++ b/UI/shop_panel.tscn @@ -0,0 +1,42 @@ +[gd_scene load_steps=3 format=3 uid="uid://he31g7f3ru1c"] + +[ext_resource type="PackedScene" uid="uid://bqpeu50pgsdfk" path="res://UI/tower_button.tscn" id="1_txsyf"] +[ext_resource type="PackedScene" uid="uid://dp846r4jscm5p" path="res://Towers/tower-b.tscn" id="2_oxe32"] + +[node name="ShopPanel" type="Panel"] +custom_minimum_size = Vector2(300, 0) +anchors_preset = 11 +anchor_left = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 0 +grow_vertical = 2 + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="PierreButton" parent="VBoxContainer" instance=ExtResource("1_txsyf")] +layout_mode = 2 + +[node name="AlineButton" parent="VBoxContainer" instance=ExtResource("1_txsyf")] +layout_mode = 2 +text = "Aline +350 Trucs" +tower = ExtResource("2_oxe32") + +[node name="MarginContainer" type="MarginContainer" parent="VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 + +[node name="CancelButton" type="Button" parent="VBoxContainer"] +custom_minimum_size = Vector2(0, 50) +layout_mode = 2 +text = "Cancel +" + +[editable path="VBoxContainer/AlineButton"] diff --git a/UI/tower_button.gd b/UI/tower_button.gd new file mode 100644 index 0000000..da17eb9 --- /dev/null +++ b/UI/tower_button.gd @@ -0,0 +1,7 @@ +extends Button + +@export var tower : PackedScene + + +func _on_pressed() -> void: + EventBus.tower_selected.emit(tower) diff --git a/UI/tower_button.gd.uid b/UI/tower_button.gd.uid new file mode 100644 index 0000000..7b0ad9c --- /dev/null +++ b/UI/tower_button.gd.uid @@ -0,0 +1 @@ +uid://dyhtr6g7kd1g2 diff --git a/UI/tower_button.tscn b/UI/tower_button.tscn new file mode 100644 index 0000000..543ff2f --- /dev/null +++ b/UI/tower_button.tscn @@ -0,0 +1,25 @@ +[gd_scene load_steps=4 format=3 uid="uid://bqpeu50pgsdfk"] + +[ext_resource type="Texture2D" uid="uid://dqyhhvxpwtpsy" path="res://Assets/Emotes/emote_star.png" id="1_88p3s"] +[ext_resource type="Script" uid="uid://dyhtr6g7kd1g2" path="res://UI/tower_button.gd" id="1_i47ne"] +[ext_resource type="PackedScene" uid="uid://trg7ag3dqr2l" path="res://Towers/tower.tscn" id="2_4qiv5"] + +[node name="TowerButton" type="Button"] +custom_minimum_size = Vector2(300, 50) +text = "Pierre +250 Trucs" +script = ExtResource("1_i47ne") +tower = ExtResource("2_4qiv5") + +[node name="TextureRect" type="TextureRect" parent="."] +layout_mode = 1 +anchors_preset = 4 +anchor_top = 0.5 +anchor_bottom = 0.5 +offset_top = -20.0 +offset_right = 40.0 +offset_bottom = 20.0 +grow_vertical = 2 +texture = ExtResource("1_88p3s") + +[connection signal="pressed" from="." to="." method="_on_pressed"] diff --git a/UI/ui.tscn b/UI/ui.tscn new file mode 100644 index 0000000..85a7885 --- /dev/null +++ b/UI/ui.tscn @@ -0,0 +1,14 @@ +[gd_scene load_steps=2 format=3 uid="uid://dbx8ow3v45k4k"] + +[ext_resource type="PackedScene" uid="uid://he31g7f3ru1c" path="res://UI/shop_panel.tscn" id="1_2fwl4"] + +[node name="UI" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="ShopPanel" parent="." instance=ExtResource("1_2fwl4")] +layout_mode = 1 diff --git a/VFX/death_particles.gd b/VFX/death_particles.gd new file mode 100644 index 0000000..1e221b8 --- /dev/null +++ b/VFX/death_particles.gd @@ -0,0 +1,10 @@ +extends CPUParticles3D + +func _ready() -> void: + call_deferred("play") + +func play(): + emitting = true + +func _on_finished() -> void: + queue_free() diff --git a/VFX/death_particles.gd.uid b/VFX/death_particles.gd.uid new file mode 100644 index 0000000..1c1bb86 --- /dev/null +++ b/VFX/death_particles.gd.uid @@ -0,0 +1 @@ +uid://c3cmwfdofbw0x diff --git a/VFX/death_particles.tscn b/VFX/death_particles.tscn new file mode 100644 index 0000000..9c5b4d1 --- /dev/null +++ b/VFX/death_particles.tscn @@ -0,0 +1,37 @@ +[gd_scene load_steps=6 format=3 uid="uid://ddm57pv5ox171"] + +[ext_resource type="Texture2D" uid="uid://c37o831e05ljr" path="res://Assets/Emotes/emote_hearts.png" id="1_sjjhj"] +[ext_resource type="Script" uid="uid://c3cmwfdofbw0x" path="res://VFX/death_particles.gd" id="2_d4t8v"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_u5ixm"] +transparency = 2 +alpha_scissor_threshold = 0.252 +alpha_antialiasing_mode = 0 +blend_mode = 1 +shading_mode = 0 +albedo_texture = ExtResource("1_sjjhj") +billboard_mode = 2 +billboard_keep_scale = true + +[sub_resource type="QuadMesh" id="QuadMesh_8oxv1"] +material = SubResource("StandardMaterial3D_u5ixm") + +[sub_resource type="Curve" id="Curve_wov25"] +_data = [Vector2(0, 1), 0.0, 0.0, 0, 0, Vector2(1, 0.464378), 0.0, 0.0, 0, 0] +point_count = 2 + +[node name="DeathParticles" type="CPUParticles3D"] +emitting = false +amount = 6 +one_shot = true +explosiveness = 1.0 +mesh = SubResource("QuadMesh_8oxv1") +direction = Vector3(1, 1, 0) +spread = 180.0 +gravity = Vector3(0, 0, 0) +initial_velocity_min = 0.5 +initial_velocity_max = 1.0 +scale_amount_curve = SubResource("Curve_wov25") +script = ExtResource("2_d4t8v") + +[connection signal="finished" from="." to="." method="_on_finished"] diff --git a/VFX/sad_particles.tscn b/VFX/sad_particles.tscn new file mode 100644 index 0000000..74e821a --- /dev/null +++ b/VFX/sad_particles.tscn @@ -0,0 +1,37 @@ +[gd_scene load_steps=6 format=3 uid="uid://m0vj2ac5oesx"] + +[ext_resource type="Texture2D" uid="uid://cuphn1ph86gv8" path="res://Assets/Emotes/emote_faceSad.png" id="1_kukuk"] +[ext_resource type="Script" uid="uid://c3cmwfdofbw0x" path="res://VFX/death_particles.gd" id="2_n3nax"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_u5ixm"] +transparency = 2 +alpha_scissor_threshold = 0.252 +alpha_antialiasing_mode = 0 +blend_mode = 1 +shading_mode = 0 +albedo_texture = ExtResource("1_kukuk") +billboard_mode = 2 +billboard_keep_scale = true + +[sub_resource type="QuadMesh" id="QuadMesh_8oxv1"] +material = SubResource("StandardMaterial3D_u5ixm") + +[sub_resource type="Curve" id="Curve_wov25"] +_data = [Vector2(0, 1), 0.0, 0.0, 0, 0, Vector2(1, 0.464378), 0.0, 0.0, 0, 0] +point_count = 2 + +[node name="SadParticles" type="CPUParticles3D"] +emitting = false +amount = 6 +one_shot = true +explosiveness = 1.0 +mesh = SubResource("QuadMesh_8oxv1") +direction = Vector3(1, 1, 0) +spread = 180.0 +gravity = Vector3(0, 0, 0) +initial_velocity_min = 0.5 +initial_velocity_max = 1.0 +scale_amount_curve = SubResource("Curve_wov25") +script = ExtResource("2_n3nax") + +[connection signal="finished" from="." to="." method="_on_finished"] diff --git a/enemies/enemy-a.tscn b/enemies/enemy-a.tscn index ce3d9b3..dd8a215 100644 --- a/enemies/enemy-a.tscn +++ b/enemies/enemy-a.tscn @@ -1,7 +1,8 @@ -[gd_scene load_steps=4 format=3 uid="uid://dknt1oiyei5e5"] +[gd_scene load_steps=5 format=3 uid="uid://dknt1oiyei5e5"] [ext_resource type="Script" uid="uid://dg6f6na1nn2c6" path="res://enemies/enemy.gd" id="1_l7e03"] -[ext_resource type="PackedScene" uid="uid://52kknuv6xd3x" path="res://Assets/GLB format/enemy-ufo-a.glb" id="2_cmo2f"] +[ext_resource type="Texture2D" uid="uid://bn6ikwol6x8r0" path="res://Assets/Characters/Male1.png" id="2_l7e03"] +[ext_resource type="PackedScene" uid="uid://daiqb0q373002" path="res://UI/health_bar_3d.tscn" id="3_cmo2f"] [sub_resource type="SphereShape3D" id="SphereShape3D_7frlh"] @@ -9,12 +10,18 @@ [node name="EnemyA" type="CharacterBody3D" parent="."] script = ExtResource("1_l7e03") -health = 1 - -[node name="enemy-ufo-a2" parent="EnemyA" instance=ExtResource("2_cmo2f")] +speed = 1 [node name="CollisionShape3D" type="CollisionShape3D" parent="EnemyA"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.289246, 0) shape = SubResource("SphereShape3D_7frlh") -[editable path="EnemyA/enemy-ufo-a2"] +[node name="Sprite3D" type="Sprite3D" parent="EnemyA"] +transform = Transform3D(3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0) +billboard = 2 +texture = ExtResource("2_l7e03") +hframes = 8 +vframes = 12 + +[node name="HealthBar3D" parent="EnemyA" instance=ExtResource("3_cmo2f")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.6, 0) diff --git a/enemies/enemy-b.tscn b/enemies/enemy-b.tscn index 6f6bbb9..ce5c382 100644 --- a/enemies/enemy-b.tscn +++ b/enemies/enemy-b.tscn @@ -1,7 +1,8 @@ -[gd_scene load_steps=4 format=3 uid="uid://bfngnvgbcbakd"] +[gd_scene load_steps=5 format=3 uid="uid://bfngnvgbcbakd"] [ext_resource type="Script" uid="uid://dg6f6na1nn2c6" path="res://enemies/enemy.gd" id="1_uehkb"] -[ext_resource type="PackedScene" uid="uid://dk8gnkd85ik25" path="res://Assets/GLB format/enemy-ufo-b.glb" id="2_uehkb"] +[ext_resource type="Texture2D" uid="uid://315k07rsgf6t" path="res://Assets/Characters/Female1.png" id="2_uehkb"] +[ext_resource type="PackedScene" uid="uid://daiqb0q373002" path="res://UI/health_bar_3d.tscn" id="3_s3rvm"] [sub_resource type="SphereShape3D" id="SphereShape3D_7frlh"] @@ -9,10 +10,17 @@ [node name="EnemyB" type="CharacterBody3D" parent="."] script = ExtResource("1_uehkb") -health = 2 [node name="CollisionShape3D" type="CollisionShape3D" parent="EnemyB"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.289246, 0) shape = SubResource("SphereShape3D_7frlh") -[node name="enemy-ufo-b2" parent="EnemyB" instance=ExtResource("2_uehkb")] +[node name="Sprite3D" type="Sprite3D" parent="EnemyB"] +transform = Transform3D(3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0) +billboard = 2 +texture = ExtResource("2_uehkb") +hframes = 8 +vframes = 12 + +[node name="HealthBar3D" parent="EnemyB" instance=ExtResource("3_s3rvm")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.6, 0) diff --git a/enemies/enemy.gd b/enemies/enemy.gd index e72df74..cd31399 100644 --- a/enemies/enemy.gd +++ b/enemies/enemy.gd @@ -1,21 +1,29 @@ extends CharacterBody3D class_name Enemy +@onready var death_vfx_packed : PackedScene = preload("res://VFX/death_particles.tscn") +@onready var sad_vfx_packed : PackedScene = preload("res://VFX/sad_particles.tscn") + @export var speed : int = 2 -@export var health : int = 15 : +@export var max_life : int = 10 +var health : int = 0 : set(value): health = value - if health <= 0 and is_alive: + if health >= max_life and is_alive: death() @onready var Path : PathFollow3D = get_parent() + var is_alive : bool = true -#func _ready() -> void: - #$HealthBar3D.set_up(health) +func _ready() -> void: + $HealthBar3D.set_up(health, max_life) func _physics_process(delta: float) -> void: + if !is_alive: + return + Path.set_progress(Path.get_progress() + speed * delta) if Path.get_progress_ratio() >= 0.99: @@ -24,12 +32,17 @@ func _physics_process(delta: float) -> void: func take_damage(damage : int) -> void: - health -= damage - #$HealthBar3D.update(health) + health += damage + $HealthBar3D.update(health) func death() -> void: is_alive = false #Global.enemies_alive -= 1 #Global.money += 50 + $Sprite3D.visible = false + var death_vfx : CPUParticles3D = death_vfx_packed.instantiate() + get_tree().current_scene.add_child(death_vfx) + death_vfx.global_position = global_position + Path.queue_free() diff --git a/icon.svg.import b/icon.svg.import index 4a7e320..eab1575 100644 --- a/icon.svg.import +++ b/icon.svg.import @@ -3,25 +3,26 @@ importer="texture" type="CompressedTexture2D" uid="uid://bd7ed8dvc7m0v" -path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex" +path.s3tc="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.s3tc.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc"], +"vram_texture": true } [deps] source_file="res://icon.svg" -dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"] +dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.s3tc.ctex"] [params] -compress/mode=0 +compress/mode=2 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/generate=true mipmaps/limit=-1 roughness/mode=0 roughness/src_normal="" @@ -31,7 +32,7 @@ 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 +detect_3d/compress_to=0 svg/scale=1.0 editor/scale_with_editor_scale=false editor/convert_colors_with_editor_theme=false diff --git a/project.godot b/project.godot index b25c186..bb19bee 100644 --- a/project.godot +++ b/project.godot @@ -18,6 +18,7 @@ config/icon="res://icon.svg" [autoload] GameManager="*res://Globals/GameManager.gd" +EventBus="*res://Globals/EventBus.gd" [file_customization] @@ -39,3 +40,9 @@ build={ "events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":1,"position":Vector2(344, 20),"global_position":Vector2(353, 68),"factor":1.0,"button_index":1,"canceled":false,"pressed":true,"double_click":false,"script":null) ] } + +[layer_names] + +3d_physics/layer_1="floor" +3d_physics/layer_2="tower" +3d_physics/layer_3="baddy" diff --git a/spawner.gd b/spawner.gd index b1c1cc8..5da3af6 100644 --- a/spawner.gd +++ b/spawner.gd @@ -15,7 +15,6 @@ func spawn_next_wave() -> void: $SpawnTimer.start(current_wave.wait_time_before_next_wave) - func _process(delta: float) -> void: spawn_manager() diff --git a/world.gd b/world.gd index bd42ec0..3fdf67a 100644 --- a/world.gd +++ b/world.gd @@ -5,9 +5,12 @@ extends Node3D @onready var cam : Camera3D = $Camera3D @onready var selector : Node3D = $Selector +var in_build_menu : bool = false -#func _ready() -> void: - #$Spawner.spawn_next_wave() +func _ready() -> void: + $Spawner.spawn_next_wave() + $CanvasLayer/UI/ShopPanel.visible = in_build_menu + EventBus.tower_selected.connect(_on_EventBus_tower_selected) func _process(delta: float) -> void: handle_player_controls() @@ -43,3 +46,12 @@ func build_tower(scene : PackedScene) -> void: var temp_cannon : Tower = scene.instantiate() add_child(temp_cannon) temp_cannon.global_position = selector.global_position + + +func _on_EventBus_tower_selected(tower : PackedScene): + tower_blueprint = tower + + +func _on_recrutement_button_pressed() -> void: + in_build_menu = !in_build_menu + $CanvasLayer/UI/ShopPanel.visible = in_build_menu diff --git a/world.tscn b/world.tscn index 928af9c..27c55c7 100644 --- a/world.tscn +++ b/world.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=11 format=3 uid="uid://ky0uewndeuwv"] +[gd_scene load_steps=12 format=3 uid="uid://ky0uewndeuwv"] [ext_resource type="Script" uid="uid://qqid42jkpkmv" path="res://world.gd" id="1_fj7yv"] [ext_resource type="PackedScene" uid="uid://d1f6m15niwgt" path="res://Tiles/tile.tscn" id="3_aqk2v"] @@ -8,6 +8,7 @@ [ext_resource type="Script" uid="uid://chu8s12rtdeqx" path="res://Scripts/Wave.gd" id="6_gbfbk"] [ext_resource type="Resource" uid="uid://dkbuy7fetnihs" path="res://Waves/wave_1.tres" id="7_ioo17"] [ext_resource type="Resource" uid="uid://dvw6vm3vbpmdl" path="res://Waves/wave_2.tres" id="8_wse8f"] +[ext_resource type="PackedScene" uid="uid://dbx8ow3v45k4k" path="res://UI/ui.tscn" id="9_ioo17"] [sub_resource type="Curve3D" id="Curve3D_aqk2v"] _data = { @@ -152,4 +153,24 @@ environment = SubResource("Environment_036b0") transform = Transform3D(1, 0, 0, 0, 0.258819, 0.965926, 0, -0.965926, 0.258819, 0, 4, 6) light_color = Color(0.823308, 0.863845, 0.742102, 1) +[node name="CanvasLayer" type="CanvasLayer" parent="."] + +[node name="UI" parent="CanvasLayer" instance=ExtResource("9_ioo17")] + +[node name="RecrutementButton" type="Button" parent="CanvasLayer/UI"] +custom_minimum_size = Vector2(200, 50) +layout_mode = 1 +anchors_preset = 2 +anchor_top = 1.0 +anchor_bottom = 1.0 +offset_left = 29.0 +offset_top = -77.0 +offset_right = 229.0 +offset_bottom = -27.0 +grow_vertical = 0 +text = "Recrutement" + [connection signal="timeout" from="Spawner/SpawnTimer" to="Spawner" method="_on_spawn_timer_timeout"] +[connection signal="pressed" from="CanvasLayer/UI/RecrutementButton" to="." method="_on_recrutement_button_pressed"] + +[editable path="CanvasLayer/UI"]