summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitattributes2
-rw-r--r--.gitignore3
-rw-r--r--Game.tscn6
-rw-r--r--Player/Assets/arrow.krabin0 -> 32160 bytes
-rw-r--r--Player/Assets/arrow.kra~bin0 -> 31971 bytes
-rw-r--r--Player/Assets/arrow.pngbin0 -> 170 bytes
-rw-r--r--Player/Assets/arrow.png.import34
-rw-r--r--Player/Assets/arrow.png~bin0 -> 165 bytes
-rw-r--r--Player/Assets/bow.krabin0 -> 32879 bytes
-rw-r--r--Player/Assets/bow.kra~bin0 -> 32897 bytes
-rw-r--r--Player/Assets/bow.pngbin0 -> 202 bytes
-rw-r--r--Player/Assets/bow.png.import34
-rw-r--r--Player/Assets/bow.png~bin0 -> 226 bytes
-rw-r--r--Player/arrow.gd27
-rw-r--r--Player/arrow.tscn35
-rw-r--r--Player/arrow_head_shape.tres4
-rw-r--r--Player/bow.gd86
-rw-r--r--Player/bow.tscn20
-rw-r--r--Player/target_line.gd26
-rw-r--r--SoundManager.tscn23
-rw-r--r--Stage/balloons.gd12
-rw-r--r--Stage/balloons.tscn32
-rw-r--r--Target/Assets/balloon-pop-01.wavbin0 -> 7134 bytes
-rw-r--r--Target/Assets/balloon-pop-01.wav.import24
-rw-r--r--Target/Assets/balloon-pop-02.wavbin0 -> 11598 bytes
-rw-r--r--Target/Assets/balloon-pop-02.wav.import24
-rw-r--r--Target/Assets/balloon-pop-03.wavbin0 -> 19278 bytes
-rw-r--r--Target/Assets/balloon-pop-03.wav.import24
-rw-r--r--Target/Assets/balloon.krabin0 -> 41069 bytes
-rw-r--r--Target/Assets/balloon.kra~bin0 -> 41089 bytes
-rw-r--r--Target/Assets/balloon.pngbin0 -> 155 bytes
-rw-r--r--Target/Assets/balloon.png.import34
-rw-r--r--Target/Assets/balloon.png~bin0 -> 152 bytes
-rw-r--r--Target/balloon.gd40
-rw-r--r--Target/balloon.tscn37
-rw-r--r--Target/balloon_shape.tres5
-rw-r--r--UI/Assets/background.jpgbin0 -> 722373 bytes
-rw-r--r--UI/Assets/background.jpg.import34
-rw-r--r--UI/hud.gd7
-rw-r--r--UI/hud.tscn21
-rw-r--r--UI/start.gd5
-rw-r--r--UI/start.tscn35
-rw-r--r--export_presets.cfg207
-rw-r--r--game.gd8
-rw-r--r--icon.svg1
-rw-r--r--icon.svg.import37
-rw-r--r--project.godot50
-rw-r--r--sound_manager.gd7
48 files changed, 944 insertions, 0 deletions
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..8ad74f7
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,2 @@
+# Normalize EOL for all files that Git considers text files.
+* text=auto eol=lf
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..0af181c
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,3 @@
+# Godot 4+ specific ignores
+.godot/
+/android/
diff --git a/Game.tscn b/Game.tscn
new file mode 100644
index 0000000..ae0456b
--- /dev/null
+++ b/Game.tscn
@@ -0,0 +1,6 @@
+[gd_scene load_steps=2 format=3 uid="uid://dn3yr1q2kbl7c"]
+
+[ext_resource type="Script" path="res://game.gd" id="1_rydg3"]
+
+[node name="Game" type="Node"]
+script = ExtResource("1_rydg3")
diff --git a/Player/Assets/arrow.kra b/Player/Assets/arrow.kra
new file mode 100644
index 0000000..57ca2a8
--- /dev/null
+++ b/Player/Assets/arrow.kra
Binary files differ
diff --git a/Player/Assets/arrow.kra~ b/Player/Assets/arrow.kra~
new file mode 100644
index 0000000..376471d
--- /dev/null
+++ b/Player/Assets/arrow.kra~
Binary files differ
diff --git a/Player/Assets/arrow.png b/Player/Assets/arrow.png
new file mode 100644
index 0000000..4e71ad9
--- /dev/null
+++ b/Player/Assets/arrow.png
Binary files differ
diff --git a/Player/Assets/arrow.png.import b/Player/Assets/arrow.png.import
new file mode 100644
index 0000000..0c475ca
--- /dev/null
+++ b/Player/Assets/arrow.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://b6mkb436giuns"
+path="res://.godot/imported/arrow.png-a9f919cad48f96a83e2a88829bb8141c.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://Player/Assets/arrow.png"
+dest_files=["res://.godot/imported/arrow.png-a9f919cad48f96a83e2a88829bb8141c.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/Player/Assets/arrow.png~ b/Player/Assets/arrow.png~
new file mode 100644
index 0000000..bc6209b
--- /dev/null
+++ b/Player/Assets/arrow.png~
Binary files differ
diff --git a/Player/Assets/bow.kra b/Player/Assets/bow.kra
new file mode 100644
index 0000000..c08370d
--- /dev/null
+++ b/Player/Assets/bow.kra
Binary files differ
diff --git a/Player/Assets/bow.kra~ b/Player/Assets/bow.kra~
new file mode 100644
index 0000000..ce0934a
--- /dev/null
+++ b/Player/Assets/bow.kra~
Binary files differ
diff --git a/Player/Assets/bow.png b/Player/Assets/bow.png
new file mode 100644
index 0000000..c315267
--- /dev/null
+++ b/Player/Assets/bow.png
Binary files differ
diff --git a/Player/Assets/bow.png.import b/Player/Assets/bow.png.import
new file mode 100644
index 0000000..bd33d5d
--- /dev/null
+++ b/Player/Assets/bow.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://e0214m2jyp81"
+path="res://.godot/imported/bow.png-8d7cdf3a1d17167a06b6f444c5720069.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://Player/Assets/bow.png"
+dest_files=["res://.godot/imported/bow.png-8d7cdf3a1d17167a06b6f444c5720069.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/Player/Assets/bow.png~ b/Player/Assets/bow.png~
new file mode 100644
index 0000000..00ee2d9
--- /dev/null
+++ b/Player/Assets/bow.png~
Binary files differ
diff --git a/Player/arrow.gd b/Player/arrow.gd
new file mode 100644
index 0000000..f6cce57
--- /dev/null
+++ b/Player/arrow.gd
@@ -0,0 +1,27 @@
+extends CharacterBody2D
+
+
+var deacceleration := 10.0
+var flying := false
+
+
+func _ready():
+ if OS.has_feature("mobile"):
+ scale = Vector2(2, 2)
+
+
+func _physics_process(delta: float) -> void:
+ velocity = velocity.move_toward(Vector2.ZERO, deacceleration * delta)
+
+ if abs(velocity) > Vector2.ZERO:
+ flying = true
+ $ArrowHead/CollisionShape2D.disabled = false
+
+ if flying and velocity == Vector2.ZERO:
+ queue_free()
+
+ move_and_slide()
+
+
+func _on_visible_on_screen_notifier_2d_screen_exited() -> void:
+ queue_free()
diff --git a/Player/arrow.tscn b/Player/arrow.tscn
new file mode 100644
index 0000000..a9f7c98
--- /dev/null
+++ b/Player/arrow.tscn
@@ -0,0 +1,35 @@
+[gd_scene load_steps=4 format=3 uid="uid://ctkfjrwg171fr"]
+
+[ext_resource type="Texture2D" uid="uid://b6mkb436giuns" path="res://Player/Assets/arrow.png" id="1_1lalc"]
+[ext_resource type="Script" path="res://Player/arrow.gd" id="1_q6ess"]
+[ext_resource type="Shape2D" uid="uid://vny1lmq7xr3s" path="res://Player/arrow_head_shape.tres" id="3_b2q2f"]
+
+[node name="Arrow" type="CharacterBody2D"]
+z_index = 1
+collision_layer = 0
+collision_mask = 8
+script = ExtResource("1_q6ess")
+
+[node name="Sprite2D" type="Sprite2D" parent="."]
+texture_filter = 1
+rotation = -3.14159
+texture = ExtResource("1_1lalc")
+
+[node name="VisibleOnScreenNotifier2D" type="VisibleOnScreenNotifier2D" parent="."]
+position = Vector2(-7.15256e-07, -3.27826e-07)
+scale = Vector2(0.8, 0.5)
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
+position = Vector2(-4.5, 0)
+shape = ExtResource("3_b2q2f")
+
+[node name="ArrowHead" type="Area2D" parent="." groups=["arrow"]]
+collision_layer = 2
+collision_mask = 4
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="ArrowHead"]
+position = Vector2(-4.5, 0)
+shape = ExtResource("3_b2q2f")
+disabled = true
+
+[connection signal="screen_exited" from="VisibleOnScreenNotifier2D" to="." method="_on_visible_on_screen_notifier_2d_screen_exited"]
diff --git a/Player/arrow_head_shape.tres b/Player/arrow_head_shape.tres
new file mode 100644
index 0000000..0c29169
--- /dev/null
+++ b/Player/arrow_head_shape.tres
@@ -0,0 +1,4 @@
+[gd_resource type="RectangleShape2D" format=3 uid="uid://vny1lmq7xr3s"]
+
+[resource]
+size = Vector2(3, 4)
diff --git a/Player/bow.gd b/Player/bow.gd
new file mode 100644
index 0000000..aa3fafc
--- /dev/null
+++ b/Player/bow.gd
@@ -0,0 +1,86 @@
+extends Node2D
+
+
+var anchor := Vector2.ZERO
+var anchor_mode := false
+var drag_distance := Vector2.ZERO
+var max_length := 75.0
+
+var arrow_scene = preload("res://Player/arrow.tscn")
+var arrow: Node2D
+
+var process_touch := false
+
+
+func _ready() -> void:
+ if OS.has_feature("mobile"):
+ scale = Vector2(2, 2)
+
+ $DrawLine.visible = false
+ $TargetLine.visible = false
+
+
+func _input(event: InputEvent) -> void:
+ if event is InputEventScreenTouch:
+ if event.is_pressed():
+ process_touch = true
+ elif event.is_released():
+ process_touch = false
+
+
+func _process(_delta: float) -> void:
+ if Input.is_action_just_pressed("click"):
+ global_position = get_global_mouse_position()
+ anchor = get_global_mouse_position()
+ anchor_mode = true
+
+ arrow = arrow_scene.instantiate()
+ arrow.global_position = global_position
+
+ get_tree().current_scene.add_child(arrow)
+ $DrawLine.visible = true
+
+ $TargetLine.visible = true
+ $TargetLine.origin = anchor
+ $TargetLine.queue_redraw()
+
+ elif Input.is_action_just_released("click"):
+ anchor_mode = false
+
+ arrow.velocity = -drag_distance * 1.5
+ arrow.flying = true
+ arrow = null
+
+ $DrawLine.visible = false
+ $DrawLine.clear_points()
+
+ $TargetLine.visible = false
+ $TargetLine.queue_redraw()
+
+ elif Input.is_action_pressed("click"):
+ drag_distance = get_global_mouse_position() - anchor
+ rotation = atan2(drag_distance.y, drag_distance.x)
+
+ var max_distance = get_global_mouse_position()
+ if drag_distance.length() > max_length:
+ drag_distance = (max_length / drag_distance.length()) * drag_distance
+ max_distance = anchor + drag_distance
+
+ $DrawLine.clear_points()
+ $DrawLine.add_point(Vector2.ZERO)
+ $DrawLine.add_point((max_distance - global_position) / scale)
+ $DrawLine.rotation = -rotation
+
+ $TargetLine.direction = (max_distance - global_position).normalized() * -1
+ $TargetLine.rotation = -rotation
+ $TargetLine.queue_redraw()
+
+ if not anchor_mode:
+ if OS.has_feature("mobile"):
+ if process_touch:
+ global_position = get_global_mouse_position()
+ else:
+ global_position = get_global_mouse_position()
+
+ if is_instance_valid(arrow):
+ arrow.rotation = rotation
diff --git a/Player/bow.tscn b/Player/bow.tscn
new file mode 100644
index 0000000..e1ec9da
--- /dev/null
+++ b/Player/bow.tscn
@@ -0,0 +1,20 @@
+[gd_scene load_steps=4 format=3 uid="uid://bn0h50n6fr6n1"]
+
+[ext_resource type="Texture2D" uid="uid://e0214m2jyp81" path="res://Player/Assets/bow.png" id="1_7j25w"]
+[ext_resource type="Script" path="res://Player/bow.gd" id="1_f5b6e"]
+[ext_resource type="Script" path="res://Player/target_line.gd" id="3_r056j"]
+
+[node name="Bow" type="Node2D"]
+z_index = 1
+script = ExtResource("1_f5b6e")
+
+[node name="Sprite2D" type="Sprite2D" parent="."]
+texture_filter = 1
+texture = ExtResource("1_7j25w")
+
+[node name="DrawLine" type="Line2D" parent="."]
+width = 1.0
+
+[node name="TargetLine" type="Node2D" parent="."]
+script = ExtResource("3_r056j")
+color = Color(0.464322, 0.282893, 0, 1)
diff --git a/Player/target_line.gd b/Player/target_line.gd
new file mode 100644
index 0000000..8a321af
--- /dev/null
+++ b/Player/target_line.gd
@@ -0,0 +1,26 @@
+extends Node2D
+
+
+@export var direction := Vector2.ZERO
+@export var origin := Vector2.ZERO
+@export var spacing_factor := 15
+@export var color := Color("#ffa500")
+
+
+func _draw() -> void:
+ var target_direction = direction * (get_viewport_rect().size).length()
+ var points = target_direction.length() / spacing_factor
+ var fraction = (target_direction / points)
+ for point in range(points):
+ color.a = 1.0 / clamp(log(point), 1.0, 10.0)
+ draw_circle(
+ (point + 1) * fraction,
+ 1.0,
+ color
+ )
+ draw_circle(
+ (point + 1) * fraction,
+ 1.0,
+ Color(1.0, 1.0, 1.0, color.a),
+ false
+ )
diff --git a/SoundManager.tscn b/SoundManager.tscn
new file mode 100644
index 0000000..c083e65
--- /dev/null
+++ b/SoundManager.tscn
@@ -0,0 +1,23 @@
+[gd_scene load_steps=5 format=3 uid="uid://phao3lwow0kh"]
+
+[ext_resource type="Script" path="res://sound_manager.gd" id="1_32vwc"]
+[ext_resource type="AudioStream" uid="uid://2ysaqcfxhuhc" path="res://Target/Assets/balloon-pop-01.wav" id="2_3a1yw"]
+[ext_resource type="AudioStream" uid="uid://13t4skh185gb" path="res://Target/Assets/balloon-pop-02.wav" id="3_qd2xq"]
+[ext_resource type="AudioStream" uid="uid://cyqg31tj3xxwv" path="res://Target/Assets/balloon-pop-03.wav" id="4_qv7n7"]
+
+[node name="SoundManager" type="Node"]
+script = ExtResource("1_32vwc")
+
+[node name="Balloon" type="Node" parent="."]
+
+[node name="Balloon-pop-01" type="AudioStreamPlayer" parent="Balloon"]
+stream = ExtResource("2_3a1yw")
+volume_db = -5.0
+
+[node name="Balloon-pop-02" type="AudioStreamPlayer" parent="Balloon"]
+stream = ExtResource("3_qd2xq")
+volume_db = -5.0
+
+[node name="Balloon-pop-03" type="AudioStreamPlayer" parent="Balloon"]
+stream = ExtResource("4_qv7n7")
+volume_db = -5.0
diff --git a/Stage/balloons.gd b/Stage/balloons.gd
new file mode 100644
index 0000000..a242bc0
--- /dev/null
+++ b/Stage/balloons.gd
@@ -0,0 +1,12 @@
+extends Node2D
+
+
+func _on_spawn_timer_timeout() -> void:
+ var balloon = preload("res://Target/balloon.tscn").instantiate()
+ balloon.global_position = Vector2(
+ randf_range(get_viewport_rect().position.x, get_viewport_rect().end.x),
+ randf_range(get_viewport_rect().position.y, get_viewport_rect().end.y)
+ )
+ balloon.velocity = Vector2(randf_range(-1.0, 1.0) * 20, randf_range(-1.0, 1.0) * 20)
+ balloon.modulate = Color(randf(), randf(), randf())
+ add_child(balloon)
diff --git a/Stage/balloons.tscn b/Stage/balloons.tscn
new file mode 100644
index 0000000..63cd919
--- /dev/null
+++ b/Stage/balloons.tscn
@@ -0,0 +1,32 @@
+[gd_scene load_steps=5 format=3 uid="uid://ddthntf36xojy"]
+
+[ext_resource type="Script" path="res://Stage/balloons.gd" id="1_fuioi"]
+[ext_resource type="PackedScene" uid="uid://cuemoig58el4f" path="res://UI/hud.tscn" id="2_tsbp8"]
+[ext_resource type="Texture2D" uid="uid://cyw52lkxbbnbb" path="res://UI/Assets/background.jpg" id="3_sh8m8"]
+[ext_resource type="PackedScene" uid="uid://bn0h50n6fr6n1" path="res://Player/bow.tscn" id="4_0t5n3"]
+
+[node name="Balloons" type="Node2D"]
+script = ExtResource("1_fuioi")
+
+[node name="HUD" parent="." instance=ExtResource("2_tsbp8")]
+
+[node name="Background" type="CanvasLayer" parent="."]
+layer = -1
+
+[node name="TextureRect" type="TextureRect" parent="Background"]
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+texture = ExtResource("3_sh8m8")
+expand_mode = 1
+
+[node name="Bow" parent="." instance=ExtResource("4_0t5n3")]
+position = Vector2(104, 152)
+
+[node name="SpawnTimer" type="Timer" parent="."]
+wait_time = 0.5
+autostart = true
+
+[connection signal="timeout" from="SpawnTimer" to="." method="_on_spawn_timer_timeout"]
diff --git a/Target/Assets/balloon-pop-01.wav b/Target/Assets/balloon-pop-01.wav
new file mode 100644
index 0000000..b0f3e58
--- /dev/null
+++ b/Target/Assets/balloon-pop-01.wav
Binary files differ
diff --git a/Target/Assets/balloon-pop-01.wav.import b/Target/Assets/balloon-pop-01.wav.import
new file mode 100644
index 0000000..50b0fc9
--- /dev/null
+++ b/Target/Assets/balloon-pop-01.wav.import
@@ -0,0 +1,24 @@
+[remap]
+
+importer="wav"
+type="AudioStreamWAV"
+uid="uid://2ysaqcfxhuhc"
+path="res://.godot/imported/balloon-pop-01.wav-54d644f5f16010f4ae805ba450d8b07a.sample"
+
+[deps]
+
+source_file="res://Target/Assets/balloon-pop-01.wav"
+dest_files=["res://.godot/imported/balloon-pop-01.wav-54d644f5f16010f4ae805ba450d8b07a.sample"]
+
+[params]
+
+force/8_bit=false
+force/mono=false
+force/max_rate=false
+force/max_rate_hz=44100
+edit/trim=false
+edit/normalize=false
+edit/loop_mode=0
+edit/loop_begin=0
+edit/loop_end=-1
+compress/mode=0
diff --git a/Target/Assets/balloon-pop-02.wav b/Target/Assets/balloon-pop-02.wav
new file mode 100644
index 0000000..4a3d7a6
--- /dev/null
+++ b/Target/Assets/balloon-pop-02.wav
Binary files differ
diff --git a/Target/Assets/balloon-pop-02.wav.import b/Target/Assets/balloon-pop-02.wav.import
new file mode 100644
index 0000000..142f6a0
--- /dev/null
+++ b/Target/Assets/balloon-pop-02.wav.import
@@ -0,0 +1,24 @@
+[remap]
+
+importer="wav"
+type="AudioStreamWAV"
+uid="uid://13t4skh185gb"
+path="res://.godot/imported/balloon-pop-02.wav-49b7c0363fe6daf1af7d80016db102d2.sample"
+
+[deps]
+
+source_file="res://Target/Assets/balloon-pop-02.wav"
+dest_files=["res://.godot/imported/balloon-pop-02.wav-49b7c0363fe6daf1af7d80016db102d2.sample"]
+
+[params]
+
+force/8_bit=false
+force/mono=false
+force/max_rate=false
+force/max_rate_hz=44100
+edit/trim=false
+edit/normalize=false
+edit/loop_mode=0
+edit/loop_begin=0
+edit/loop_end=-1
+compress/mode=0
diff --git a/Target/Assets/balloon-pop-03.wav b/Target/Assets/balloon-pop-03.wav
new file mode 100644
index 0000000..9ce6a80
--- /dev/null
+++ b/Target/Assets/balloon-pop-03.wav
Binary files differ
diff --git a/Target/Assets/balloon-pop-03.wav.import b/Target/Assets/balloon-pop-03.wav.import
new file mode 100644
index 0000000..20c9913
--- /dev/null
+++ b/Target/Assets/balloon-pop-03.wav.import
@@ -0,0 +1,24 @@
+[remap]
+
+importer="wav"
+type="AudioStreamWAV"
+uid="uid://cyqg31tj3xxwv"
+path="res://.godot/imported/balloon-pop-03.wav-93e3465c13f530ea62ebcb0479181009.sample"
+
+[deps]
+
+source_file="res://Target/Assets/balloon-pop-03.wav"
+dest_files=["res://.godot/imported/balloon-pop-03.wav-93e3465c13f530ea62ebcb0479181009.sample"]
+
+[params]
+
+force/8_bit=false
+force/mono=false
+force/max_rate=false
+force/max_rate_hz=44100
+edit/trim=false
+edit/normalize=false
+edit/loop_mode=0
+edit/loop_begin=0
+edit/loop_end=-1
+compress/mode=0
diff --git a/Target/Assets/balloon.kra b/Target/Assets/balloon.kra
new file mode 100644
index 0000000..a9e1a07
--- /dev/null
+++ b/Target/Assets/balloon.kra
Binary files differ
diff --git a/Target/Assets/balloon.kra~ b/Target/Assets/balloon.kra~
new file mode 100644
index 0000000..f2050de
--- /dev/null
+++ b/Target/Assets/balloon.kra~
Binary files differ
diff --git a/Target/Assets/balloon.png b/Target/Assets/balloon.png
new file mode 100644
index 0000000..3aee4b4
--- /dev/null
+++ b/Target/Assets/balloon.png
Binary files differ
diff --git a/Target/Assets/balloon.png.import b/Target/Assets/balloon.png.import
new file mode 100644
index 0000000..62aa172
--- /dev/null
+++ b/Target/Assets/balloon.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dv84uuaxgs8fc"
+path="res://.godot/imported/balloon.png-295af647cd51cb409a91fc4900f0ec1c.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://Target/Assets/balloon.png"
+dest_files=["res://.godot/imported/balloon.png-295af647cd51cb409a91fc4900f0ec1c.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/Target/Assets/balloon.png~ b/Target/Assets/balloon.png~
new file mode 100644
index 0000000..cf99359
--- /dev/null
+++ b/Target/Assets/balloon.png~
Binary files differ
diff --git a/Target/balloon.gd b/Target/balloon.gd
new file mode 100644
index 0000000..af7a8bd
--- /dev/null
+++ b/Target/balloon.gd
@@ -0,0 +1,40 @@
+extends CharacterBody2D
+
+
+func _ready():
+ if OS.has_feature("mobile"):
+ scale = Vector2(1.5, 1.5)
+
+ var tween = create_tween()
+ tween.set_loops()
+ tween.tween_method(func(value):
+ $Line2D.set_point_position(2, Vector2(value, $Line2D.points[2].y))
+ , -2, 2, randf_range(0.5, 1.5)).set_delay(0.01)
+ tween.tween_method(func(value):
+ $Line2D.set_point_position(2, Vector2(value, $Line2D.points[2].y))
+ , 2, -2, randf_range(0.5, 1.5)).set_delay(0.01)
+ tween.tween_method(func(value):
+ $Line2D.set_point_position(3, Vector2(value, $Line2D.points[3].y))
+ , -1, 1, randf_range(0.5, 1.5)).set_delay(0.01)
+ tween.tween_method(func(value):
+ $Line2D.set_point_position(3, Vector2(value, $Line2D.points[3].y))
+ , 1, -1, randf_range(0.5, 1.5)).set_delay(0.01)
+
+
+func _process(_delta: float) -> void:
+ move_and_slide()
+
+ var collision := get_last_slide_collision()
+ if collision:
+ velocity = velocity.bounce(collision.get_normal())
+
+
+func _on_area_2d_area_entered(area: Area2D) -> void:
+ if area.is_in_group("arrow"):
+ Game.score += 1
+ SoundManager.balloon.get_children().pick_random().play()
+ queue_free()
+
+
+func _on_visible_on_screen_notifier_2d_screen_exited() -> void:
+ queue_free()
diff --git a/Target/balloon.tscn b/Target/balloon.tscn
new file mode 100644
index 0000000..f967a96
--- /dev/null
+++ b/Target/balloon.tscn
@@ -0,0 +1,37 @@
+[gd_scene load_steps=4 format=3 uid="uid://blifc11rkfkkv"]
+
+[ext_resource type="Script" path="res://Target/balloon.gd" id="1_e3new"]
+[ext_resource type="Texture2D" uid="uid://dv84uuaxgs8fc" path="res://Target/Assets/balloon.png" id="2_3oqak"]
+[ext_resource type="Shape2D" uid="uid://da5k00qhu13tl" path="res://Target/balloon_shape.tres" id="3_d2kvr"]
+
+[node name="Balloon" type="CharacterBody2D"]
+collision_layer = 0
+collision_mask = 8
+script = ExtResource("1_e3new")
+
+[node name="Sprite2D" type="Sprite2D" parent="."]
+texture_filter = 1
+texture = ExtResource("2_3oqak")
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
+shape = ExtResource("3_d2kvr")
+
+[node name="Area2D" type="Area2D" parent="."]
+collision_layer = 4
+collision_mask = 2
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="Area2D"]
+shape = ExtResource("3_d2kvr")
+debug_color = Color(0.561074, 0.559604, 0, 0.42)
+
+[node name="VisibleOnScreenNotifier2D" type="VisibleOnScreenNotifier2D" parent="."]
+position = Vector2(4.76837e-07, 1.19209e-07)
+scale = Vector2(0.6, 0.7)
+
+[node name="Line2D" type="Line2D" parent="."]
+position = Vector2(0, -1)
+points = PackedVector2Array(0, 7, -1, 10, 2, 12, 0, 15)
+width = 1.0
+
+[connection signal="area_entered" from="Area2D" to="." method="_on_area_2d_area_entered"]
+[connection signal="screen_exited" from="VisibleOnScreenNotifier2D" to="." method="_on_visible_on_screen_notifier_2d_screen_exited"]
diff --git a/Target/balloon_shape.tres b/Target/balloon_shape.tres
new file mode 100644
index 0000000..05f5dbe
--- /dev/null
+++ b/Target/balloon_shape.tres
@@ -0,0 +1,5 @@
+[gd_resource type="CapsuleShape2D" format=3 uid="uid://da5k00qhu13tl"]
+
+[resource]
+radius = 6.0
+height = 14.0
diff --git a/UI/Assets/background.jpg b/UI/Assets/background.jpg
new file mode 100644
index 0000000..90789b6
--- /dev/null
+++ b/UI/Assets/background.jpg
Binary files differ
diff --git a/UI/Assets/background.jpg.import b/UI/Assets/background.jpg.import
new file mode 100644
index 0000000..61ab5dc
--- /dev/null
+++ b/UI/Assets/background.jpg.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cyw52lkxbbnbb"
+path="res://.godot/imported/background.jpg-7ab479536167978b65a746ec270a1959.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://UI/Assets/background.jpg"
+dest_files=["res://.godot/imported/background.jpg-7ab479536167978b65a746ec270a1959.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/UI/hud.gd b/UI/hud.gd
new file mode 100644
index 0000000..d5f7cc3
--- /dev/null
+++ b/UI/hud.gd
@@ -0,0 +1,7 @@
+extends CanvasLayer
+
+
+func _ready() -> void:
+ Game.score_changed.connect(func():
+ %Score.text = str(Game.score)
+ )
diff --git a/UI/hud.tscn b/UI/hud.tscn
new file mode 100644
index 0000000..e02d9dd
--- /dev/null
+++ b/UI/hud.tscn
@@ -0,0 +1,21 @@
+[gd_scene load_steps=2 format=3 uid="uid://cuemoig58el4f"]
+
+[ext_resource type="Script" path="res://UI/hud.gd" id="1_ip2w4"]
+
+[node name="HUD" type="CanvasLayer"]
+script = ExtResource("1_ip2w4")
+
+[node name="MarginContainer" type="MarginContainer" parent="."]
+offset_right = 40.0
+offset_bottom = 40.0
+theme_override_constants/margin_left = 8
+theme_override_constants/margin_top = 8
+theme_override_constants/margin_right = 8
+theme_override_constants/margin_bottom = 8
+
+[node name="Score" type="Label" parent="MarginContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_horizontal = 0
+size_flags_vertical = 0
+text = "0"
diff --git a/UI/start.gd b/UI/start.gd
new file mode 100644
index 0000000..5290112
--- /dev/null
+++ b/UI/start.gd
@@ -0,0 +1,5 @@
+extends Control
+
+
+func _on_balloons_button_pressed() -> void:
+ get_tree().change_scene_to_file("res://Stage/balloons.tscn")
diff --git a/UI/start.tscn b/UI/start.tscn
new file mode 100644
index 0000000..bd02fd2
--- /dev/null
+++ b/UI/start.tscn
@@ -0,0 +1,35 @@
+[gd_scene load_steps=2 format=3 uid="uid://b20e404dx8nk1"]
+
+[ext_resource type="Script" path="res://UI/start.gd" id="1_6l74h"]
+
+[node name="Start" type="Control"]
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+script = ExtResource("1_6l74h")
+
+[node name="CenterContainer" type="CenterContainer" parent="."]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+
+[node name="VBoxContainer" type="VBoxContainer" parent="CenterContainer"]
+layout_mode = 2
+
+[node name="BalloonsButton" type="Button" parent="CenterContainer/VBoxContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+text = "Balloons"
+
+[node name="ForestButton" type="Button" parent="CenterContainer/VBoxContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+text = "Forest"
+
+[connection signal="pressed" from="CenterContainer/VBoxContainer/BalloonsButton" to="." method="_on_balloons_button_pressed"]
diff --git a/export_presets.cfg b/export_presets.cfg
new file mode 100644
index 0000000..41d2d8f
--- /dev/null
+++ b/export_presets.cfg
@@ -0,0 +1,207 @@
+[preset.0]
+
+name="Android"
+platform="Android"
+runnable=true
+advanced_options=true
+dedicated_server=false
+custom_features=""
+export_filter="all_resources"
+include_filter=""
+exclude_filter=""
+export_path="../../../../Applications/Godot/bow-arrow.apk"
+encryption_include_filters=""
+encryption_exclude_filters=""
+encrypt_pck=false
+encrypt_directory=false
+script_export_mode=2
+
+[preset.0.options]
+
+custom_template/debug=""
+custom_template/release=""
+gradle_build/use_gradle_build=false
+gradle_build/gradle_build_directory=""
+gradle_build/android_source_template=""
+gradle_build/compress_native_libraries=false
+gradle_build/export_format=0
+gradle_build/min_sdk=""
+gradle_build/target_sdk=""
+architectures/armeabi-v7a=false
+architectures/arm64-v8a=true
+architectures/x86=false
+architectures/x86_64=false
+version/code=1
+version/name=""
+package/unique_name="com.example.$genname"
+package/name="Bow & Arrow"
+package/signed=true
+package/app_category=2
+package/retain_data_on_uninstall=false
+package/exclude_from_recents=false
+package/show_in_android_tv=false
+package/show_in_app_library=true
+package/show_as_launcher_app=false
+launcher_icons/main_192x192=""
+launcher_icons/adaptive_foreground_432x432=""
+launcher_icons/adaptive_background_432x432=""
+graphics/opengl_debug=false
+xr_features/xr_mode=0
+screen/immersive_mode=true
+screen/support_small=true
+screen/support_normal=true
+screen/support_large=true
+screen/support_xlarge=true
+user_data_backup/allow=false
+command_line/extra_args=""
+apk_expansion/enable=false
+apk_expansion/SALT=""
+apk_expansion/public_key=""
+permissions/custom_permissions=PackedStringArray()
+permissions/access_checkin_properties=false
+permissions/access_coarse_location=false
+permissions/access_fine_location=false
+permissions/access_location_extra_commands=false
+permissions/access_mock_location=false
+permissions/access_network_state=false
+permissions/access_surface_flinger=false
+permissions/access_wifi_state=false
+permissions/account_manager=false
+permissions/add_voicemail=false
+permissions/authenticate_accounts=false
+permissions/battery_stats=false
+permissions/bind_accessibility_service=false
+permissions/bind_appwidget=false
+permissions/bind_device_admin=false
+permissions/bind_input_method=false
+permissions/bind_nfc_service=false
+permissions/bind_notification_listener_service=false
+permissions/bind_print_service=false
+permissions/bind_remoteviews=false
+permissions/bind_text_service=false
+permissions/bind_vpn_service=false
+permissions/bind_wallpaper=false
+permissions/bluetooth=false
+permissions/bluetooth_admin=false
+permissions/bluetooth_privileged=false
+permissions/brick=false
+permissions/broadcast_package_removed=false
+permissions/broadcast_sms=false
+permissions/broadcast_sticky=false
+permissions/broadcast_wap_push=false
+permissions/call_phone=false
+permissions/call_privileged=false
+permissions/camera=false
+permissions/capture_audio_output=false
+permissions/capture_secure_video_output=false
+permissions/capture_video_output=false
+permissions/change_component_enabled_state=false
+permissions/change_configuration=false
+permissions/change_network_state=false
+permissions/change_wifi_multicast_state=false
+permissions/change_wifi_state=false
+permissions/clear_app_cache=false
+permissions/clear_app_user_data=false
+permissions/control_location_updates=false
+permissions/delete_cache_files=false
+permissions/delete_packages=false
+permissions/device_power=false
+permissions/diagnostic=false
+permissions/disable_keyguard=false
+permissions/dump=false
+permissions/expand_status_bar=false
+permissions/factory_test=false
+permissions/flashlight=false
+permissions/force_back=false
+permissions/get_accounts=false
+permissions/get_package_size=false
+permissions/get_tasks=false
+permissions/get_top_activity_info=false
+permissions/global_search=false
+permissions/hardware_test=false
+permissions/inject_events=false
+permissions/install_location_provider=false
+permissions/install_packages=false
+permissions/install_shortcut=false
+permissions/internal_system_window=false
+permissions/internet=false
+permissions/kill_background_processes=false
+permissions/location_hardware=false
+permissions/manage_accounts=false
+permissions/manage_app_tokens=false
+permissions/manage_documents=false
+permissions/manage_external_storage=false
+permissions/master_clear=false
+permissions/media_content_control=false
+permissions/modify_audio_settings=false
+permissions/modify_phone_state=false
+permissions/mount_format_filesystems=false
+permissions/mount_unmount_filesystems=false
+permissions/nfc=false
+permissions/persistent_activity=false
+permissions/post_notifications=false
+permissions/process_outgoing_calls=false
+permissions/read_calendar=false
+permissions/read_call_log=false
+permissions/read_contacts=false
+permissions/read_external_storage=false
+permissions/read_frame_buffer=false
+permissions/read_history_bookmarks=false
+permissions/read_input_state=false
+permissions/read_logs=false
+permissions/read_phone_state=false
+permissions/read_profile=false
+permissions/read_sms=false
+permissions/read_social_stream=false
+permissions/read_sync_settings=false
+permissions/read_sync_stats=false
+permissions/read_user_dictionary=false
+permissions/reboot=false
+permissions/receive_boot_completed=false
+permissions/receive_mms=false
+permissions/receive_sms=false
+permissions/receive_wap_push=false
+permissions/record_audio=false
+permissions/reorder_tasks=false
+permissions/restart_packages=false
+permissions/send_respond_via_message=false
+permissions/send_sms=false
+permissions/set_activity_watcher=false
+permissions/set_alarm=false
+permissions/set_always_finish=false
+permissions/set_animation_scale=false
+permissions/set_debug_app=false
+permissions/set_orientation=false
+permissions/set_pointer_speed=false
+permissions/set_preferred_applications=false
+permissions/set_process_limit=false
+permissions/set_time=false
+permissions/set_time_zone=false
+permissions/set_wallpaper=false
+permissions/set_wallpaper_hints=false
+permissions/signal_persistent_processes=false
+permissions/status_bar=false
+permissions/subscribed_feeds_read=false
+permissions/subscribed_feeds_write=false
+permissions/system_alert_window=false
+permissions/transmit_ir=false
+permissions/uninstall_shortcut=false
+permissions/update_device_stats=false
+permissions/use_credentials=false
+permissions/use_sip=false
+permissions/vibrate=false
+permissions/wake_lock=false
+permissions/write_apn_settings=false
+permissions/write_calendar=false
+permissions/write_call_log=false
+permissions/write_contacts=false
+permissions/write_external_storage=false
+permissions/write_gservices=false
+permissions/write_history_bookmarks=false
+permissions/write_profile=false
+permissions/write_secure_settings=false
+permissions/write_settings=false
+permissions/write_sms=false
+permissions/write_social_stream=false
+permissions/write_sync_settings=false
+permissions/write_user_dictionary=false
diff --git a/game.gd b/game.gd
new file mode 100644
index 0000000..42de6e9
--- /dev/null
+++ b/game.gd
@@ -0,0 +1,8 @@
+extends Node
+
+
+signal score_changed
+var score := 0 :
+ set(value):
+ score = value
+ score_changed.emit()
diff --git a/icon.svg b/icon.svg
new file mode 100644
index 0000000..9d8b7fa
--- /dev/null
+++ b/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/icon.svg.import b/icon.svg.import
new file mode 100644
index 0000000..c3b8dec
--- /dev/null
+++ b/icon.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://ytg33mbgtm5e"
+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/project.godot b/project.godot
new file mode 100644
index 0000000..801dbc1
--- /dev/null
+++ b/project.godot
@@ -0,0 +1,50 @@
+; 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="bow-arrow"
+run/main_scene="res://UI/start.tscn"
+config/features=PackedStringArray("4.3", "Mobile")
+config/icon="res://icon.svg"
+
+[autoload]
+
+Game="*res://Game.tscn"
+SoundManager="*res://SoundManager.tscn"
+
+[display]
+
+window/size/viewport_width=210
+window/size/viewport_height=300
+window/stretch/mode="viewport"
+window/stretch/aspect="expand"
+window/handheld/orientation=1
+
+[input]
+
+click={
+"deadzone": 0.5,
+"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(234, 6),"global_position":Vector2(243, 52),"factor":1.0,"button_index":1,"canceled":false,"pressed":true,"double_click":false,"script":null)
+]
+}
+
+[layer_names]
+
+2d_physics/layer_1="Player"
+2d_physics/layer_2="Arrow"
+2d_physics/layer_3="Target"
+2d_physics/layer_4="Wall"
+
+[rendering]
+
+renderer/rendering_method="gl_compatibility"
+renderer/rendering_method.mobile="gl_compatibility"
+textures/vram_compression/import_etc2_astc=true
diff --git a/sound_manager.gd b/sound_manager.gd
new file mode 100644
index 0000000..5978383
--- /dev/null
+++ b/sound_manager.gd
@@ -0,0 +1,7 @@
+extends Node
+
+
+@onready var balloon: Node = $Balloon
+@onready var balloon_pop_01: AudioStreamPlayer = $"Balloon/Balloon-pop-01"
+@onready var balloon_pop_02: AudioStreamPlayer = $"Balloon/Balloon-pop-02"
+@onready var balloon_pop_03: AudioStreamPlayer = $"Balloon/Balloon-pop-03"