From 171ff78876c08786375ed09bf44764dcaae023ec Mon Sep 17 00:00:00 2001 From: Byte Dice Date: Sat, 18 Oct 2025 19:43:41 +0200 Subject: [PATCH] added entire game (cuz it didnt use git before) --- .editorconfig | 4 + actors/biscuit_o_tron.tscn | 38 +++ actors/pig.tscn | 230 +++++++++++++++++ actors/player_character.tscn | 95 +++++++ actors/seagull_particle.tscn | 25 ++ assets/sprites/arrow.png | Bin 0 -> 691 bytes assets/sprites/arrow.png.import | 40 +++ assets/sprites/arrow_green.png | Bin 0 -> 747 bytes assets/sprites/arrow_green.png.import | 40 +++ assets/sprites/biscuit.png | Bin 0 -> 374 bytes assets/sprites/biscuit.png.import | 40 +++ assets/sprites/biscuit_o_tron.png | Bin 0 -> 10952 bytes assets/sprites/biscuit_o_tron.png.import | 40 +++ assets/sprites/farmer.png | Bin 0 -> 5050 bytes assets/sprites/farmer.png.import | 40 +++ assets/sprites/fence.png | Bin 0 -> 1190 bytes assets/sprites/fence.png.import | 40 +++ assets/sprites/grass.png | Bin 0 -> 29908 bytes assets/sprites/grass.png.import | 40 +++ assets/sprites/pig.png | Bin 0 -> 4332 bytes assets/sprites/pig.png.import | 40 +++ assets/sprites/seagull_attack_0.png | Bin 0 -> 2227 bytes assets/sprites/seagull_attack_0.png.import | 40 +++ assets/sprites/seagull_attack_1.png | Bin 0 -> 2418 bytes assets/sprites/seagull_attack_1.png.import | 40 +++ assets/sprites/seagull_fly_0.png | Bin 0 -> 1950 bytes assets/sprites/seagull_fly_0.png.import | 40 +++ assets/sprites/seagull_fly_1.png | Bin 0 -> 2051 bytes assets/sprites/seagull_fly_1.png.import | 40 +++ icon.svg | 1 + icon.svg.import | 43 ++++ libs/character.gd | 58 +++++ libs/character.gd.uid | 1 + libs/character_camera.gd | 59 +++++ libs/character_camera.gd.uid | 1 + libs/character_movement.gd | 228 ++++++++++++++++ libs/character_movement.gd.uid | 1 + project.godot | 71 +++++ scenes/main.tscn | 138 ++++++++++ scripts/biscuit_o_tron.gd | 47 ++++ scripts/biscuit_o_tron.gd.uid | 1 + scripts/game_over.gd | 23 ++ scripts/game_over.gd.uid | 1 + scripts/info_hud.gd | 32 +++ scripts/info_hud.gd.uid | 1 + scripts/key_sequence.gd | 105 ++++++++ scripts/key_sequence.gd.uid | 1 + scripts/main_menu.gd | 47 ++++ scripts/main_menu.gd.uid | 1 + scripts/main_scene.gd | 35 +++ scripts/main_scene.gd.uid | 1 + scripts/pig.gd | 174 +++++++++++++ scripts/pig.gd.uid | 1 + scripts/player_character.gd | 160 ++++++++++++ scripts/player_character.gd.uid | 1 + scripts/seagull_particle.gd | 27 ++ scripts/seagull_particle.gd.uid | 1 + ui/game_over.tscn | 286 +++++++++++++++++++++ ui/info_hud.tscn | 47 ++++ ui/key_sequence.tscn | 10 + ui/main_menu.tscn | 120 +++++++++ ui/styles/font_gost_commo.tres | 10 + ui/styles/theme_menu_buttons.tres | 79 ++++++ 63 files changed, 2684 insertions(+) create mode 100644 .editorconfig create mode 100644 actors/biscuit_o_tron.tscn create mode 100644 actors/pig.tscn create mode 100644 actors/player_character.tscn create mode 100644 actors/seagull_particle.tscn create mode 100644 assets/sprites/arrow.png create mode 100644 assets/sprites/arrow.png.import create mode 100644 assets/sprites/arrow_green.png create mode 100644 assets/sprites/arrow_green.png.import create mode 100644 assets/sprites/biscuit.png create mode 100644 assets/sprites/biscuit.png.import create mode 100644 assets/sprites/biscuit_o_tron.png create mode 100644 assets/sprites/biscuit_o_tron.png.import create mode 100644 assets/sprites/farmer.png create mode 100644 assets/sprites/farmer.png.import create mode 100644 assets/sprites/fence.png create mode 100644 assets/sprites/fence.png.import create mode 100644 assets/sprites/grass.png create mode 100644 assets/sprites/grass.png.import create mode 100644 assets/sprites/pig.png create mode 100644 assets/sprites/pig.png.import create mode 100644 assets/sprites/seagull_attack_0.png create mode 100644 assets/sprites/seagull_attack_0.png.import create mode 100644 assets/sprites/seagull_attack_1.png create mode 100644 assets/sprites/seagull_attack_1.png.import create mode 100644 assets/sprites/seagull_fly_0.png create mode 100644 assets/sprites/seagull_fly_0.png.import create mode 100644 assets/sprites/seagull_fly_1.png create mode 100644 assets/sprites/seagull_fly_1.png.import create mode 100644 icon.svg create mode 100644 icon.svg.import create mode 100644 libs/character.gd create mode 100644 libs/character.gd.uid create mode 100644 libs/character_camera.gd create mode 100644 libs/character_camera.gd.uid create mode 100644 libs/character_movement.gd create mode 100644 libs/character_movement.gd.uid create mode 100644 project.godot create mode 100644 scenes/main.tscn create mode 100644 scripts/biscuit_o_tron.gd create mode 100644 scripts/biscuit_o_tron.gd.uid create mode 100644 scripts/game_over.gd create mode 100644 scripts/game_over.gd.uid create mode 100644 scripts/info_hud.gd create mode 100644 scripts/info_hud.gd.uid create mode 100644 scripts/key_sequence.gd create mode 100644 scripts/key_sequence.gd.uid create mode 100644 scripts/main_menu.gd create mode 100644 scripts/main_menu.gd.uid create mode 100644 scripts/main_scene.gd create mode 100644 scripts/main_scene.gd.uid create mode 100644 scripts/pig.gd create mode 100644 scripts/pig.gd.uid create mode 100644 scripts/player_character.gd create mode 100644 scripts/player_character.gd.uid create mode 100644 scripts/seagull_particle.gd create mode 100644 scripts/seagull_particle.gd.uid create mode 100644 ui/game_over.tscn create mode 100644 ui/info_hud.tscn create mode 100644 ui/key_sequence.tscn create mode 100644 ui/main_menu.tscn create mode 100644 ui/styles/font_gost_commo.tres create mode 100644 ui/styles/theme_menu_buttons.tres diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..f28239b --- /dev/null +++ b/.editorconfig @@ -0,0 +1,4 @@ +root = true + +[*] +charset = utf-8 diff --git a/actors/biscuit_o_tron.tscn b/actors/biscuit_o_tron.tscn new file mode 100644 index 0000000..3a583e5 --- /dev/null +++ b/actors/biscuit_o_tron.tscn @@ -0,0 +1,38 @@ +[gd_scene load_steps=5 format=3 uid="uid://bv6wpdjivdlf4"] + +[ext_resource type="Texture2D" uid="uid://bwicnrb8alscg" path="res://assets/sprites/biscuit_o_tron.png" id="1_71t4g"] +[ext_resource type="Script" uid="uid://d2t5nkrsib24d" path="res://scripts/biscuit_o_tron.gd" id="1_a0ycn"] + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_a0ycn"] +size = Vector2(83, 150) + +[sub_resource type="CircleShape2D" id="CircleShape2D_71t4g"] +radius = 26.172504 + +[node name="BiscuitOTron" type="StaticBody2D"] +script = ExtResource("1_a0ycn") +biscuit_increment = 0.15 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +position = Vector2(-39.5, 10) +shape = SubResource("RectangleShape2D_a0ycn") + +[node name="Sprite2D" type="Sprite2D" parent="."] +scale = Vector2(0.359375, 0.359375) +texture = ExtResource("1_71t4g") + +[node name="ProgressBar" type="ProgressBar" parent="."] +offset_left = -76.0 +offset_top = -90.0 +offset_right = 77.0 +offset_bottom = -72.0 +theme_override_font_sizes/font_size = 10 + +[node name="Trigger" type="Area2D" parent="."] + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Trigger"] +position = Vector2(42, 51) +shape = SubResource("CircleShape2D_71t4g") + +[connection signal="body_entered" from="Trigger" to="." method="_on_trigger_body_entered"] +[connection signal="body_exited" from="Trigger" to="." method="_on_trigger_body_exited"] diff --git a/actors/pig.tscn b/actors/pig.tscn new file mode 100644 index 0000000..249b9c8 --- /dev/null +++ b/actors/pig.tscn @@ -0,0 +1,230 @@ +[gd_scene load_steps=17 format=3 uid="uid://conq3w82acr56"] + +[ext_resource type="Script" uid="uid://qtb3s2euymob" path="res://scripts/pig.gd" id="1_1u2wy"] +[ext_resource type="Texture2D" uid="uid://dkx5rhq6cd7fq" path="res://assets/sprites/pig.png" id="1_cdv7h"] +[ext_resource type="Texture2D" uid="uid://c273scpqwtvb6" path="res://assets/sprites/seagull_attack_0.png" id="3_vjcar"] +[ext_resource type="Texture2D" uid="uid://cad650jvyjm2b" path="res://assets/sprites/seagull_attack_1.png" id="4_3ly8g"] +[ext_resource type="Texture2D" uid="uid://cgrqjhigxfby" path="res://assets/sprites/seagull_fly_0.png" id="5_xx63w"] +[ext_resource type="Texture2D" uid="uid://dgvgknc7pbhwp" path="res://assets/sprites/seagull_fly_1.png" id="6_dq5nc"] + +[sub_resource type="SpriteFrames" id="SpriteFrames_r0vjv"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": ExtResource("3_vjcar") +}, { +"duration": 1.0, +"texture": ExtResource("4_3ly8g") +}], +"loop": true, +"name": &"attack", +"speed": 6.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": ExtResource("5_xx63w") +}, { +"duration": 1.0, +"texture": ExtResource("6_dq5nc") +}], +"loop": true, +"name": &"fly", +"speed": 6.0 +}] + +[sub_resource type="CircleShape2D" id="CircleShape2D_1u2wy"] +radius = 22.0 + +[sub_resource type="CircleShape2D" id="CircleShape2D_gbhn7"] +radius = 32.0 + +[sub_resource type="Animation" id="Animation_1u2wy"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("PigSprite:rotation") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("PigSprite:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-5, -8)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("PigSprite:scale:x") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [0.313] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Seagull:scale:x") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [0.31299996] +} + +[sub_resource type="Animation" id="Animation_gbhn7"] +resource_name = "flip" +length = 0.2 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("PigSprite:scale:x") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.2), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [0.313, -0.313] +} + +[sub_resource type="Animation" id="Animation_cdv7h"] +resource_name = "walk" +length = 0.4 +loop_mode = 1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("PigSprite:rotation") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.1, 0.3), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [0.0, -0.108210415, 0.108210415] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("PigSprite:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0.1, 0.3), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(-2, -3), Vector2(2, -3)] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_gbhn7"] +_data = { +&"RESET": SubResource("Animation_1u2wy"), +&"flip": SubResource("Animation_gbhn7"), +&"walk": SubResource("Animation_cdv7h") +} + +[sub_resource type="Animation" id="Animation_3ly8g"] +resource_name = "flip" +length = 0.2 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Seagull:scale:x") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.2), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [0.31299996, -0.313] +} + +[sub_resource type="Animation" id="Animation_vjcar"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Seagull:scale:x") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [0.31299996] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_xx63w"] +_data = { +&"RESET": SubResource("Animation_vjcar"), +&"flip": SubResource("Animation_3ly8g") +} + +[node name="Pig" type="CharacterBody2D"] +collision_layer = 3 +collision_mask = 3 +script = ExtResource("1_1u2wy") +min_state_dur = 3.0 +max_state_dur = 10.0 +min_time_till_attack = 10.0 +max_time_till_attack = 90.0 +min_attack_duration = 20.0 +max_attack_duration = 50.0 +walk_speed = 150.0 +panic_speed = 250.0 +seagull_speed = 400.0 + +[node name="PigSprite" type="Sprite2D" parent="."] +position = Vector2(-5, -8) +scale = Vector2(0.313, 0.313) +texture = ExtResource("1_cdv7h") + +[node name="SeagullAttackPos" type="Marker2D" parent="PigSprite"] +position = Vector2(3, -85) + +[node name="Seagull" type="AnimatedSprite2D" parent="."] +visible = false +position = Vector2(-4.061, -34.605) +scale = Vector2(0.31299996, 0.313) +sprite_frames = SubResource("SpriteFrames_r0vjv") +animation = &"fly" + +[node name="Collision" type="CollisionShape2D" parent="."] +position = Vector2(-7, -6) +shape = SubResource("CircleShape2D_1u2wy") + +[node name="FeedZone" type="Area2D" parent="."] + +[node name="FeedCollision" type="CollisionShape2D" parent="FeedZone"] +position = Vector2(-7, -6) +shape = SubResource("CircleShape2D_gbhn7") + +[node name="PigAnimations" type="AnimationPlayer" parent="."] +libraries = { +&"": SubResource("AnimationLibrary_gbhn7") +} + +[node name="SeagullAnimations" type="AnimationPlayer" parent="."] +libraries = { +&"": SubResource("AnimationLibrary_xx63w") +} + +[connection signal="body_entered" from="FeedZone" to="." method="_on_feed_zone_body_entered"] diff --git a/actors/player_character.tscn b/actors/player_character.tscn new file mode 100644 index 0000000..90de9d3 --- /dev/null +++ b/actors/player_character.tscn @@ -0,0 +1,95 @@ +[gd_scene load_steps=7 format=3 uid="uid://dvaagwge5g1g"] + +[ext_resource type="Script" uid="uid://cknbo3ltp5mc3" path="res://scripts/player_character.gd" id="1_r4hof"] +[ext_resource type="Texture2D" uid="uid://lfoeatk81tam" path="res://assets/sprites/farmer.png" id="2_r4hof"] + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_r4hof"] +size = Vector2(40, 80) + +[sub_resource type="Animation" id="Animation_r4hof"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:scale") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0.31249997, 0.3125)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath(".:scale:x") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [0.313] +} + +[sub_resource type="Animation" id="Animation_irlf7"] +resource_name = "flip" +length = 0.2 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:scale:x") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.2), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [0.313, -0.313] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_qgghw"] +_data = { +&"RESET": SubResource("Animation_r4hof"), +&"flip": SubResource("Animation_irlf7") +} + +[node name="PlayerCharacter" type="CharacterBody2D"] +script = ExtResource("1_r4hof") +speed = 300.0 +sprint_speed = 600.0 +jump_power = 7.0 +coyote_time = 0.2 +jump_buffer_timer = 0.2 +aerial_dash_count = 1 +vel_multiplier_after_dash = 0.5 +dash_speed = 1200.0 +dash_dur = 0.2 +dash_cd = 0.5 +gravity = 14.0 +terminal_vel = 1000.0 +max_health = 100.0 +starting_health = 50.0 +iframe_dur = 0.5 +camera_type = 2 + +[node name="Collision" type="CollisionShape2D" parent="."] +shape = SubResource("RectangleShape2D_r4hof") + +[node name="Sprite" type="Sprite2D" parent="."] +scale = Vector2(0.31249997, 0.3125) +texture = ExtResource("2_r4hof") + +[node name="BiscuitPos" type="Marker2D" parent="Sprite"] +position = Vector2(99.20001, -83.2) +scale = Vector2(3.2000003, 3.1999998) + +[node name="Camera" type="Camera2D" parent="."] +position_smoothing_enabled = true + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +root_node = NodePath("../Sprite") +libraries = { +&"": SubResource("AnimationLibrary_qgghw") +} diff --git a/actors/seagull_particle.tscn b/actors/seagull_particle.tscn new file mode 100644 index 0000000..d87c40f --- /dev/null +++ b/actors/seagull_particle.tscn @@ -0,0 +1,25 @@ +[gd_scene load_steps=5 format=3 uid="uid://coowerg56exy7"] + +[ext_resource type="Texture2D" uid="uid://cgrqjhigxfby" path="res://assets/sprites/seagull_fly_0.png" id="1_dr8jw"] +[ext_resource type="Texture2D" uid="uid://dgvgknc7pbhwp" path="res://assets/sprites/seagull_fly_1.png" id="2_cef41"] +[ext_resource type="Script" uid="uid://dms2mkhl6pbyo" path="res://scripts/seagull_particle.gd" id="3_cef41"] + +[sub_resource type="SpriteFrames" id="SpriteFrames_1sxsl"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": ExtResource("1_dr8jw") +}, { +"duration": 1.0, +"texture": ExtResource("2_cef41") +}], +"loop": true, +"name": &"default", +"speed": 6.0 +}] + +[node name="SeagullParticle" type="AnimatedSprite2D"] +scale = Vector2(0.313, 0.313) +sprite_frames = SubResource("SpriteFrames_1sxsl") +script = ExtResource("3_cef41") +speed = 400.0 diff --git a/assets/sprites/arrow.png b/assets/sprites/arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..69fc9b773af7e21c74b3bafe843acff93cb5a454 GIT binary patch literal 691 zcmV;k0!;mhP)I^}_i8 zQL_oh_jy=+&ab08QTRE6g&pM_K^s6RJcMwZXPbpJ2o(S|Z%5&+PYs9_h!1qwjf#)+ zM>st|XdCnKpa5pX=f>n9s5Jux1qPs&>$6@>{VX6r0Mx`wJ!A#pQ)=i_S?MfxqjNnV z+*e7Bg;87ua_`TEJO@l(DUcvUDPSc&Rf+@(xi(BifJV-9qTm7GzL7#i!VmyynHv#F zwM{7@g}`0}U+wkQV*3Z;lt5qs@Fu?8JVgk%bz~vm=RBX; zJaqwBmN||&Z0kBfUYyc~HOT*S3 z0UA_S8goa0S8rKe%ejvL?LCEi0NN3{0caEUKEB%su=;h%EdZ;?Q30TRi-Uxt0sv{C zHca;bkT7dwZ2;PYy^p^mz`KXE?Sn@^zG_>Y=p>Nf03^n|qAwf(>iEie$q@kz4xlt@ zCJn5_M_W|@lu=NFP`>?JNRCr$Po8fiCAPj`!a6x% zlb;C&-KP^69FN2Ib=c!`{T#9bjX%SKP2S-JrVV2gNPoDbqUeJq9JO5p46)G%OeMqOE0 zPmT}=pvAkgn87luht?&p+780&wV4k~;tt_5m%}nK`i+#6q}l;~_L1VFAZRe~+@Jy= zS>I6(^Wh>PY$}1UF0C@3DleKK2|~0a3W*mvAa=L5m-tjk6zW~yaItqP7QdlUdi ztwo`!m`~$?)WJ#=Kz1%o`Q^2Md%ktB-K!fuD9l&KwUL(vd&0yuG!*x}1y$zEI%pmiHK0PBF! z{Z|h_Qs){d)dSFolU&;YNGKh-jfn$VS_w=5wB(o$prveC#M&KTLA9kmy8~*?7V0d3 z(^tI%5L@0Hgz5os8PxvX0cZ)fetoqL&>pBt6H_e!sQ_&|69DLgQLV_PSAl*cW|{t} zZ<7)*jv3m02LQ#{U}vXyfd1KF@WzHeYtxQyuN#`J<~zLu-~dqDSIM6ow`SeH4h|p; zYRkdKBHq0{icp&9!{pUj8jJhOZ3xEA75?}00~Y05VH`WN0W`O;s50Wj)9+>gVlLnU d+EciT{6t9@#twueHUTdxyh`lJd*3`yfGaQZ@z0{kp`0Dx8LgoI>?4Vb0K~Xr zNSi6RJpd>)W|S?!s$0D8K`zpE7BzKBX$0^Z+J-bPf(5yaum4BL#pqFRK(Fp3;>309gdS z8JZbsTJpz`m4J_*6H+InT2e(mV UE}Jsy82|tP07*qoM6N<$f{H$z2mk;8 literal 0 HcmV?d00001 diff --git a/assets/sprites/biscuit.png.import b/assets/sprites/biscuit.png.import new file mode 100644 index 0000000..6a2c4e4 --- /dev/null +++ b/assets/sprites/biscuit.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cgg0ujqkbhge8" +path="res://.godot/imported/biscuit.png-a3e9dd3ca0525507908c6f69c9d88e3e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/biscuit.png" +dest_files=["res://.godot/imported/biscuit.png-a3e9dd3ca0525507908c6f69c9d88e3e.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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/sprites/biscuit_o_tron.png b/assets/sprites/biscuit_o_tron.png new file mode 100644 index 0000000000000000000000000000000000000000..ee6f9c7142df8ac808212c813f8cc8efd7e683c0 GIT binary patch literal 10952 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 literal 0 HcmV?d00001 diff --git a/assets/sprites/biscuit_o_tron.png.import b/assets/sprites/biscuit_o_tron.png.import new file mode 100644 index 0000000..07f57f3 --- /dev/null +++ b/assets/sprites/biscuit_o_tron.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bwicnrb8alscg" +path="res://.godot/imported/biscuit_o_tron.png-16bfe0f90b8951657ae064d452187d32.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/biscuit_o_tron.png" +dest_files=["res://.godot/imported/biscuit_o_tron.png-16bfe0f90b8951657ae064d452187d32.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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/sprites/farmer.png b/assets/sprites/farmer.png new file mode 100644 index 0000000000000000000000000000000000000000..39dca7c0e96f279de99dcbea87f01259729285d7 GIT binary patch literal 5050 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 literal 0 HcmV?d00001 diff --git a/assets/sprites/farmer.png.import b/assets/sprites/farmer.png.import new file mode 100644 index 0000000..e9905f8 --- /dev/null +++ b/assets/sprites/farmer.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://lfoeatk81tam" +path="res://.godot/imported/farmer.png-221030e14fc8fbbae1811b2296103e93.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/farmer.png" +dest_files=["res://.godot/imported/farmer.png-221030e14fc8fbbae1811b2296103e93.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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/sprites/fence.png b/assets/sprites/fence.png new file mode 100644 index 0000000000000000000000000000000000000000..44df6127fc3ef2af5097f602e90b5650402f18d3 GIT binary patch literal 1190 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5ygAr_AwW<1&>6W(V;x=tM^5cf(4@QrrmzHY$oyj)gOK2hQ zmfbVe{wX#vFmWhgB^>-3z0al2O%L5)|M!Q<&HdWi6|1kGUvK|BQpcEA{e$hDo@4Va z-0J)v5c$vkVeAF%?+tg0=k|ZOXk2~3jQzlA^$5-{!ewO-n&jr1YnDdKz1w*HgX4xG z(a_gcOVW!O?pSZy*4Ta|j56+_I2g3QEcQ5D(^UIo zN!G^dy;2g#Ha=K&>hM?H2<~IHchy1}6ZYJ>?;`m__{?HY&c^TWK9%^&Gu>};nU;RB zNhh;dYVq3eP~jNurK{I5h#h~&IM*&$J3IMiP0C?8Tg$z13)8CiCGBK-!L;|yx8CKu zrcGA5Wq0@QBHbB3kBDwyaX5dqplHkMq#JoZs#>-zyU284e+jdk;ZM;k%e$7@I#zFg z|Fo|EaL_ znUA_N+w>F|crxBJIfymBV4Prjb@Mvy)0Kv2tj;hR)JtmIe($EeO7D-5sN!Oc7blM! zupc;i{p=S(hX+~@1R3_)Wmd_Wdp+E|Ucbxu^9_Ly91U^@=E&r(`myyV@8<2-@3YL2 zKKFXM|0VPHk1P+ke%=12?d6Mo+`iXm&kJXevyeOf;x^Mi_wR9=zkmD_e&>CM^7^|= zUP&^1W_iXG(VcMj{FV<1)|G4TzP316;pC&fbnSKB1KF)|5xcju{?YhoAA34C^+Xvo>(n5=L)D8@^tlcS?83{1OUgR@$Uct literal 0 HcmV?d00001 diff --git a/assets/sprites/fence.png.import b/assets/sprites/fence.png.import new file mode 100644 index 0000000..f477a15 --- /dev/null +++ b/assets/sprites/fence.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dtvbg6shi4amx" +path="res://.godot/imported/fence.png-e139570dc79dce3978d1f9063bed8c49.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/fence.png" +dest_files=["res://.godot/imported/fence.png-e139570dc79dce3978d1f9063bed8c49.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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/sprites/grass.png b/assets/sprites/grass.png new file mode 100644 index 0000000000000000000000000000000000000000..6c9a57c2d05a6f326c65b5719827e5515369bb13 GIT binary patch literal 29908 zcmdpeWmuG5)UJ#(N*Evvs5BVBkRl~D(kdz{4nvQF(vs3S7D%IlASoqEOZNy8Dj`Zs zN=i4-YUQ*LD7#AMf?zGtaa4+H0>~_ukLct|=d;JW084-@e0_R1|LR+XqGL z+qeG&`2p~RyQjXa{ZL&4;tp~eyU$1cb`M&Zx*qZyRXe{JldjW zLwfEbgFwl5{&-04N_p<+kAEMNuOnj7>@>Ttk^aD`L44qED(;-y`=0oNC-w=`zaz*| zaG@SkdVSuRXlE!NxXphlAg3lj9gC*nVLBuK&ktOv+P_I9jKKEN6RVhP6?W*K9{{lj zcV^fo4iFn7UtfKf@E8+@@AcUD;W{C^x&Gbt(EeSb>I7oZLLP_GJon)gq0V$vO1GHJ z)N_tAQw-2#RoASr%l7QZtGMeTl0O&#HjhcVUU zj@ekh;u{pyTy!&n+T+_txpmVo$lMsS}tDD7gZiN~x&qW>w6<6+70z z@?4ii%Vk-Y)~Ok8ljVu_8V?t-VK?)hwEooY5RpGAmuVWQZ8?y!>U{%kmilF{SSA1= zf=kloweF-S%NpFCY0@ih_kadl;==&{VgPOkRQ%brMMvbKS5{g+;M%_b&Y@)zMidg3uSwJIMCv5!Vu z(Jqy#vuSn9Sr=BXY@kMsdQGLpm!9s3#x}FrVRGvtL0uK{DxWJZISmz3H{AJ2KH=)t zex`OyH+j6@f+oKw9IE4M}HD z2N%dbjl{TAAirC}3RUo;KUJr8#1WEFP$PV3B`)7}w60UW!> z;ZO2T88aunz{s;uI<8+;pZs?8u?hOLRFmc~#}`*Rn>d9EDROGZ(?MG11(ptLTQwe^ zkL_9xaoXc^hE*L2>ycoTWk|l4&XbZDj%AjbEf2$mv0l@=8kauCRTr$XA!Exu&8$3Z zISJq5y^ePK!db)I-IU=!wG>3S~n$`2H%$d>W+?^l6L zJ^?aG)#B?`^h^i(;14~d#_9Q-w0OfizMB;s6x5?^v6v>Z4r;=fGZ~(;x;()4hH3Rp zG~VG+S7p|FL68}o4`k{YT*yw*6KRW^vP314)G9Q4^E!5QD z50O*XGW_|o`195DikGe=$B^)Fn^M@avDk~HtccTFgK}#+f)Ij?HPeI*^=KL8+Ad;c zg)~a)LigcfAo4w_DjW5=NSb7B!JkTFVHsDI>UqBrY!i77bwRmCy?y!pewsJe*SyGY z2p)t$)5#BUqq@$dVrE_1yVTPY=GF|1dc?bj`NcYio<;+eMaHIkx}bEgm(s9(yVlok z^i~S-N5!F7ykyL&wgx$M_Qmt#8=9+uqt!hPt|3e>I45ls8h3YkoT_d{2h+GEeAKH{ z(^~Z-BfV_Tx!D*|h_Fu3O^vC;zUthQI}%z>H8?>v+1U0uHnKn&Z8znr(a_Rg<)bY( zp_Pf2$TE~_;;idn+Ibr~MmZ?6-mP?9qFS%aB2sH1^jHo3z|w@Uoxkv~nK!oTMy5)s z;KCty-z-Dbm-I(g>lkM270bdoNdw^AU^iI@FF(Gynl~*FoMx+f*>%kCyt2TwRNSyh z7`BS$7gKWhF+n3;+XR;h&4!nZS*Pm*wtcqXTjb-7z78fS&YaI_!poxZ4L`@@HC~n+ z(nzhPu%`PIDPeY{@4aU}BAxQWre0r1{kw(U=+7*y^Dc{rJL4`Aw_J<7ZZ7k}fMv1v zrz1&i^5Yb7u75lE+-DH z`($0$cG^J2+ggl?A;!Gq0|Cp?8koe0<$&beUYErtd4}O&9D64Sd(pau-fujm5R#2Qr zI9UbF>dJGD&I*M1I(5Ab`*99IFjECQeNWwPXZFrwTN;a&RZ^<#a~BsH4i3X45OX=YuT%OoaQQ3 zg`ra4j4&p^Z*bvgB5-Q^s8p2>F_6cdCinup6M$ho4fY{hI0r#Zw;fUoln(L!#u(Ro{KV1K z>_%Bry)c3nn^HM4Cgmk>f}Lp>D;4|Mf8q4OxyFcOWiFJ0zn{}>c!6$?VTo0}_{e+Q zj}yD&;Z(_7MpZLo>*0up2dZ;A$?I; zr$_zqOc2g%c@lT)p6|$hIsSe|ex)+YaG?56cjX@l?+7)qPcue0v{v-?fZV=&hoQ5w@(LuHnN zYmIPY*8SlKJ;N)&cAg^3kUk^y#Nw_z{DRb(WmYl?p2LR6#OGR+P zI7^jFe99m!`4Ju=D~1-UG9>`g!1rch*O*Q8?54CMK{1? zwpgH|kOQZ!FUN}=eDrn7fuap8UWocaG`2Do5`V-kbmp!I0 zWyK|?mjSI2L}OkZeEYHPwpZYXi^)aF^%t}^N?ycAoL+ePmGASc*3oBa1y@>|P5D>v zpA9-TqEYzT#=JOOc3Lwljt~NXcu5mK@<8&D{&D_aO8pf!c`^@L9zJ2}zL3VZ>5uOy z6#5WmEh>iVzJf_|RZDG0h@}DJ?hiw`Id+OCgkFnH!K*TMr3)V53}O=;D?S&QPw}zo zR4Q<8?cc(VgH0c!io72h4L^T#YqG;U&;Wk9r{=ri2lsU4QR|SBS1~jnJ~N?c9Ub&q zoT(}ci?v!O@}mRw%iUJWdOxIv5w_Z%HaT}CWztYsQ~SK32jBd38P{AoGVBL`Qk*6Y zTaXQ(wSMr~6ml+9>ak1Xq&CF4y)PicxrK4ard>~ z`LRYf-LDaLOOn#H)4Hj3FBT_l;U~CSsy8E}Fz4S2MGzV;l=%sJ-!uPxYz-9cS9NvW zj^dCs2pOPye$GOSCHdC4c5ND3&kPe@PYFiX=jf2CayE^UL`ZoG+bm47W!q2uTBs{MkK<)RE+V z$JCOO5slgDZ+rHnb%MvrC9lAv4CuKCZE6JaG#SkIa!?WbE~S}o@CL!Z*k*)+4!^k5 zcG@MmM`W(`>YhyFjd5KgLY64MfUsE#UbY~Yeof5h(B030Eq;hk5j)#(K#Tf`6f70&#W6Oy>XDh>tMSjbpb!h#h-1aBpD*kyoHkz8zbj zKk%G&|H?q4K=6RE1vC_HY#ppc|FvRoiK_foi}5Veq0{v~pI=li5L7a@6kjaYm4Ni$x^g)LQ+hk==K1lo#G23Q zmU*_zgG`ZUEoF6P4I!p0=4F^^~MoC?j*wLXF;Gsn?a4 z^ZGhSSQ5qnN3)i2uMG3!fYE^P**m}IILR*2LKvz13dk($Hf({LC748(td za8kj=+J5`MedrJ|NA97IX)T5yw~s1?7NSdH6q=O zmC+yWeVShl2x7fOhd6a#4{Nfahx{04@l;%P+<7c52KhL`s=VdoGlCG<(}xX3zf~!< z4c#nTvZ|syDswEy%k!Zk^Su!>X5~_lL22QuZ`%{LS_c!#QMEy-yZm)Pcf6L%i8c=1 zk9&*K`h8ZpueO-$tU*H;XO3NulJ`Ri@H$bj-5J8%JW??1DVC7iK5!PTQ$Ok;fh%i{ z*5w{l1An#}d+KU8@|*J|Z>~+k_m8*;m<;TEIR`ToP-jA*GHU}jOqE^N%eR*MU8drs zQU`rZuCpcKt!c$AOfx7sg^Vmw&~%E_58=g0f{jf}Ec2hfs8UcLKbzTETA%Bo%CGo2 zeozc?>Pwh{5DzXCq>64H?vicVKI0MFI`B=2?aO|{`WC0+xTIlMwwtm0!{LY@fCDXMLryyrh+ND^eZ01LIEib1}8%;*%%KFgy z&>i~|g|ErzEpt^?*mDg)PR1z)-DeFaAN? zMLoh4aFDU?=f>KCg4G^9!?bG2VFHH54d^UvTdnrCZQF4$K%L7Xn9W%qv{ zvn7K7_!~Zq{%_hrh3PgZ-u`c7&q$1x6kQ#kF5i@39uJf)cXc#hp6Cq-nDPkioNCE> z`{Kuc7zrikJu@>qo-feLp#9^w%}q+Ww^6*``cNvftbg$e&_{h0Q!Iv{<8e>w=u`t}>CV_i6J;+Zw#ATKs7uZMf5ytZezCu$Pj-=X%6}-VX%b-zKo6_L=b2Fjz^<7b!os>^Dy8{)kv$4{%XC1q7xvqm-L-Cw25 zmak1|vNm>>6RKDa1LYCZ9Vc(r$gW;u9`Dv-ZOc_YptY+7NC6x%rRXusq#58s`Ke9I zCSesl=2s7E$-dEfL0cT0^_xQU{V#K7;2rMeSh**oS` zfezH2Y2vZhprZ6@$!N|$o2HE?t#c^1nUCip10m3JF$+5~OAYn2lRa+4>uR(?%+gPCYup*%ng)ju_ZGT{(}5Pv{Mq@#8cp` z{lvpy;1v{odlLE$Cd=leHY4E+>Ob6l7mKcoT1^d@(-8>a$-E78i0xn154(gZ#y$z8 zta};#+ZNvT0KrETLL?tpc=Pk-qlB@fC|!Gk2RA>qUbU||lxav9ohakckbLRo`$snm zmK!$2%45e)h#1fuM`Yg1`W3xi(8sOicl8q@zSu;!iP2>u`|y|c6DOib3Q)i^W2(O~ z(QCVv_Mp+C+)?Cxz}av5m^EzGMVU2N>Ow`g?9iCMxJ%vGrO{`gfYHz)@#}6V)CLyN z8#co7cEcGGyd2MMYa62_a5l}@0+^D*f#vd!<)VTlol%#dB`wRq+~dTZ2b2mHBVS7Y zg4dih%Tz8sMpkp|53nY3N_Q!8iuS$jVbb!Cc@k@Vn~W9q?#qch;Sr1N{F|RDVQPT? z==qBW8_Ql8JT!^G8sHp8YO@$*);2?5+Aq85bQmai4kOP(ns!zEQ=@v%<$~}uZll{8P@U`PqeHCYQjKETL*ye`&ZnZz{zhqNfBBm7 z&@Q0-^?b~js=NT$j{*>$KeTr{;GE3ImXxcwsLU4aIWMKB>ReyD|4#Jz45^IgtzrfZ zr)};BNc_5SlD5i6)Vc}CfScBX~b<-5OaNuXnEY*rZvCmX};Bp zTAUsM#j)D@&bacWn*21&!5&){agL12E-g4&HB-U$L z*i~wJ0ldU*)#YhiLzJ2Ovhvp|=g?A@3zA1mG@B$js<+eDBC0=*nr?I1R}D947F96J zWJlZWu%EL644U=m5OGS?CEJ2M1}W1{Jn~LXkr)LdF-Ev-?2nNs>(p)eZP(~)*}vQ| z{5zyQtz4sq#h}|=Z!T8PhvcJ8iq;Xy_;-rT+|COf;?{B9jOWI^cJn1NV6B zh0=}!7Q*OQhXZ0dK)8kxBh$|;)c%x4vPQ(WVPvpOO79|2cLueQCxg4bW&4l+*;x)# z#{Yx^^+gTad(c&mKW%aWRU8)f`Ms>48jY7X=<5qRiF*dz{h1@t@AfhsZ_s-QW`Uu8 zqqL?#Q!vY6JuRA~?*!7}WJmjNAGedkAaD+ChdqiOq=1_0jwvC7OhTtvr8YOmW9;`| zZO_JD+lcK}9ny4b(jrKrq*w^rFCBidHKo*_MsBB)UX3RFy$RAfIzz8Uj;1W8{`-H z?=2AJ&&Qv9wQl!-(ebukfmQh|VoepdIZu#zbviZIWbckl1kCqoK}b=9#49=k&ztf8 zRye9DnT}SL%1+G}j756QWnrh4Gk%Ae#i3~=gzNlwnM3&F1I&iiFZ*EopeJ381I+*B zfc_00l=<_!p*xkg?Oija(&1JqiTL`qleUGGK*t_uz()IkA{bn{X0I1W`l;KL~?adX7 zZW7`-t?1qSo7oMamGCUrPqFjRlKE-bWxwLvd!kzlBHdc}SM%PrH-AK<4^}K+9Akb_ z_foUSDWFtJ?*g26r*Q;4zcyeFCB^gkeW*JHKln@T%|>!*MPA!q==7*_wg@g8fQ`1j zJ3sirb!UCJ8Ni2d_V*k6LL^*Kww9XfgRi+QG%vP_YxdRR)^r@}s4Q(y*_wjXWSdU} zI71ahhF4e8N?W3>&_qSaC$^pfG>0EOsq+MQp6Ll*k*C&h$?V>k^lAB3h!-*PIX&Ut zqe^q?#qPeLwUAlAWcwG9#fAaCTR=xSGarD^;n%0^=8nlXS0>hUkoL##<=Yy0g*B8_YqaGf+NAaQ zC0$Tqvcv_TuVccoRUub9o$usw5V(N88aw2cZrEEBL*YKWH3kSxxtFp?lv~_5m!L+lp}`b9uRFU``tD3Y$V!#evxSH@Vbv7F#3%hfJvo z1X}6Se#GdfHd~YYC$$O<02^eoU!iy*S_q*$Ux@9bWusQay9w=tu;kRoxdn63cjQ}T z7FareGBVzABO7U270Q!?NI;eZB(yq-I*&VtyHiCew)(+Sf=3s>->@hol(49vvl!MF zBZ;I0v=)ARt_|7MXIrV>+Eck2C_o=#d2eNan7BI%SQVESw0(K52PvL5iZm-dcYn&- zUivypTJ|YuhRMKwHM+Ol zkJMxa;yztnbTYCpb}aUk4P<@gH19lEH&m~(;Z_ssuvXpkg`$h<&$w{oJkEE1@HV?| zotH;1m;O7eAEoH5V|tHie{rd`cSS493ypNC_{KmQxI2jXQ9N|wRpZc!D8|Weax5kM zV`AajWqm-yf#_o8bjAu7uNUa2px%>&P9BG?FlCZN9D_Vx|OGJpyT1vyK0*e{N`b!n+pI5Rx-m=N>o* zi!iZnun=*<-W6ykgIMu_er7qM z5pkzgd-;M6Y`i#w+Ngw>R^k)%h_a1gHo!X6{fXd+s9JwfK|_!WHDyfonqgGP_!E-t zY1fQ($->f`!+bP3?nQ$)(E5D^XY1F02E*g;W@KX3Yf?WKN>_I$gH{Q>TI!$cuI8fH zv+n??3mC?uWQxAx;h1Uav-E~UI?N~mFu~6?v1J%ruaL(BOu@vdAQypo?Vm**!Q=W4 z4*(#6uzYDKkgb5;Be^|N9jX(-pHM`XHw{bgIjY^8QMFUBp5X$$h^F@#YdiTfirbvi zhbeVybJAZ@(yYBiG`N`&_-|N6|A$YmR$6eIl@b=2>5CkbE>ph2X~$pusrte=rQf>u zgYJ+~f_Vez9R|c@Dtghwi_ejyR2E~1b8vZ>^5oE(f4FdE7X>h1$UBy~-evmNy|IcG zA1kWwWSq*?BF?79GgDxs!l&16_R>c(0O>(CVg}GO4V;4WD>O-HYdYSkO84?NVJDoT z)kSZS=*#om_|!QYAZ5Ey7qt(dv)=f?1F3S}7}MCe?RjprJbu37q;;LYrSDfGGS6? zuU0J&PP?rQY{e`Ff1lDUUuJj9o4P7z5e|b$tUP}nlh2)yBl&f}VWcVhUUZc9@c^H>x-{$JnTJXyDmZF-S`L9#V$M<{1fV zxao7uz%Z{m`CV^bX|-wEe~LTk@mKZyNVk_3}MssM3S z4+f5?Cmc7(Fcu;z7jXsx>nG0kQHh@QEtISJHI$<6F9q+Dz+$RW)7FK@Vrr$gT{5`~gzRDr6H0~9BXjKZ1Y zw~=Jrrg!UncOnv?q#YoHGz^Sg*%2*DXh7WBq{sA@%lPGsW&4`hiT30+K88Q-OGlD0 z<5SUeXHu&!h5Y3dJet`-|C8eap~aLEq|_^AkVM62S`YJQ;k>3M zV*~^oveRL5%<9*L=baD4LHst|Me}SDBj{vqEVM z7=_b4#s2DH<0zo^9++kACW`0Hbg!t}`?Us~KPbFMX+Op)id<%%Jk#g@s++@tV4wcz zV!XT#TAxK?{5;3M9(RbZrU89I@hnG4+N0GkpkK}t0~toLqsNFM{D2nyJDxewI6W=V zW}NvgI!jMAE%}k>uNw#N$^)?hkzxHp#>ajdam}muDam>}1Qo+nKLAvRqR|YZ(g|4> zH}Y531t5lN?tv699Gxy;m3-iw%>sV!FxF%l-``->C~k@Y>cZ6VXPm#|!$onPko2=; zkFb~TKwUo?hN&f7A9O_9TVD}NX}TF4_cTssN1mY;kfpgfPrM5#=BY-qvqZ1K0_|kY zICl~=6ay&zNmsOL$O9b~p*y(L&*z)>$A|8|+af831NGjk08Eqbt!+ub^}f@|9FS5! zNag*Tq<8+%33*YAuEDSnY1^1+?>CDNSC#j|}@ND?9qQ!3HzKiMo?QT?7z zummk+dyzxrc)m!HT7s#GvL{{`*VJ~oP0)$t1kd`@PD7SSWjOJvuz7457$`kOx}LE4}?0vRjPEE^3! z02Vrzhy-A}8k>XZFAEt?X<3KFIP-n1UVD4qS5MQ331UlGptRusvp&K}-!`5UD&e&I z*>nE{{RkDn!J$QEnpu!A5g<&liJo4=p+(bcOJaRB9gGA!RZNvY&uj1SVY3ukRHAuj zzEtC;Ch*GlAn76ZEOG;nd3DCE?pV-4st4St!Rud%vE7bQCxm9{ka}OZyZoY5Zo!1} z7fms;w#O%I@FLDnxxzUKrWgcCACU8)#pT#aDz5Ly6o9A_(sd&G9YljjP#>a#HXS4V zj57f~;cw~Mek=kWw{G_=kT60mAK6T(Q4@ZSMFP*XFRhw=Gt`Cz;@VAnJ@G!k6(W>c zUhmCLP%!)_@R;^sV>3xgw+AA;9iuHUwq$)UW@Y1chcZ&jC~A|U?rfiygnnHe!Np2a zMox~$Oxjx3NEJ6SZ`p4NuMIM1e|b$I#bB(Lx-UcRud@!raB+lMSH{HcpGI5m>pwRd zZ`L^9UJujgsH32Eq#KE^gP zymUW(d23So>;Mgb$;V#Fiko`5_!mEsX1L@hKFxNGGF#1drplPxI1ASO9UJrQ?vnXq z+;?>WAa=q%Ej8tx7=c$@aP-i{Ewopuqsf^%hpv#Wkh598y3;@#U@0KNih>oa1W<8oTnGJC<+ znE~fFO#rG6!UOaKDLlZVaVL+O8)(e9K7jdp-*_kdRz<=^l%dLRAo{jaN&fp#hPKR=q-Kv4p)z3gK{2$T^`#DC`F2XS4db&50nViILK@8Q=h>kKhY{(| z#HOZY6!P81nyTjem!K&-!8|S1nw^if#C4Zzt(gu4ts3gQm-n?d%HykU zK1&jiAc0u5*&h=<*u+xRWHH3tt!9!|#7-DI@%njL%&rh92rdOuEVZv_Nx%MOR?YPD zw;CZvjq_@jD4oMki69KjbzFyKwTn{y`)vyu3d#0(H}N)9eDy!UAQ>bVT5>!1tVA~G zmg}YF{`2Dx@;a?dP;)#}rAqW3d-6RccDo_ijVlT?XKZk4~I(#?ShLTLLc(~D?3Kxou^&LI?cTS2-P|ZBd4=gM6~3EN+RGsZ zF5)~%3u>YVb_U%C>OwW8&I?Aq>+n!kp#fVztfEs1^NIpykxH&%)v$z3#dJHI1=_yTY~P9^tgo&bRWj_Fc z{gkXK`qumG-SZU@O{omej6;WsFbE=B*xn+_`x@>~>pBF+a>#M`-ddi(5b;g^){Kcb&b|4vtwM zV(~xPej4xX0SZ_vJ|Cl5kX?$HNv3|4cOb>1yTXQ%2SL~2M;4#K842fV;u(qU;E9~t z8yu3O5fe51%T@yJK=VL9w*A}${XZ)33v_co`TK|S@%P2E`5tVa+fyfME>M-=O0s3! z;TvHX@bfo0Am2~k%lx$-!sIwCpowr^X_pexAAA6~t(9!?eT3D+z2k1;{m{=D{waEY zeH^9_012DNwf@e=z&z;7ee*X{vcjey`T6_TZ~IP79N4YJg5xO2DZQ?rrN@lu!K{S( z$`y)&OT6%FzB_XEfVP(Jn$)$4**_X<-?fVejFz{`f65)sDFwCOC2lL`zD*AMQZZ>_ z(1|mH)F`cY{Pd_PPb@ouj*o&Y<~m*gM^{)O8oqQHOudUPTiJ+#^5Uf;r7trY5MnCL zd=#ez(cs7C4pW!1G7OSnLva)nHkQ^N-l0yz@@xTk{F)@@(t5=A<}(KUbZr<#gm zma!G81@j6zI+BkV1NPziA)@WS*$X^4Pi=64b}?EPZ@17!E<2xDqc_hx(}ryI8~=8@ z5PfJ!OdPQPDOH!~^BNDY>xLB+nGu4;%@2^71&ABkb-Tb4Xy_4pPs%%A`W@he>b%f{ZIavFtL^+jf zx+suLBKRJ3o-b7p#bj*oNTa{R7F$crf3_t_7L5}@9IfC7DZ1x!LUi$jG?mDISdW5W!HiC$i> zS!E=49aljrypSz=j3m(8&fo!^+Tf(Ot`k?4&zIPuoiLCnAmF`p3V<+aTW2EaPae(8 z&v(b)EWNsj{lq@TYtwMcqlMR$uHJVaE&{X%rS^0{@D1|XonIYu0RwQpGl$B!Y1={2 zhJD1Qy?eL;UjkWHe3An5(NLs<`Jz{>eU*LDHCl-sb*HROvtG#%h`Du;j~SD+FN_56 z0(ohXr?ln*c~s-H^;Xm>=5>*!Y|O`LKG%|Dg?b@qD?_q%H}@pxNIW=qTyRn842bj}zWQF6UDlGFdgwxsZmPIo9B-_m)xvfiZJi(UgBJnL^VOATL_1CWrg{A~ z(QG;wJ^OXu_rWFu1H$4;Ku%BzwegM#3cHR^atR3Q;B2IM8*cc!D~4NZSnEpP&8)cA zQww|c7xW#T_`u_i+a9K*U$MRuYD7P|YFCJ+xqs2A|J!SlQL3fMoc-GL{%5G0ZXBd#~I`ME5r``CsQ3CT*oOXk4zEypnpk5D^u81n14@*2Hcl@a>n@F`;Sg z)LUo#X_9ZI9v8NY-!^}ousAwi!_Kf_^9duZwpyw4qGXT(sHy&2oAlsDl&*`+z+Hb= zTD8=mgCw&LKy@h(tKKs<80cn*4yL3Ri+=?8Iy?%Jk&ZJ`Jk-`8@ILQY# zxb_M5x5pgYc-ALPY_^uuyXy?l>EKKZAt<>58n$2&4Xeo#61kED$U6!KBwhkGYf~=tjQ)(b3^$~|8e52;>^%1#6ReYJMP?p- z@W2i$AHW^EJd-RgPg4D;RF60QDA}zI&JK)GN$EXuh6_Z~BXp?8526FN2L-hNBgVSy z7}ojg_Z`eE^;hKmD@P~9WC($?O}df9vTx0bTf>Ru)?a&C^zC}z7sJ^x-i(0z8O|b* z00Qhv9EWI|84SevX-5a|`s2&s#3{Xt^=nZofy5tf;Z5c ztPAp2i>%JQGrQf)1+^#G-U}d{eo*i0$h(6DI3UKfz00v)$gxV7z(R$S10lW~N(o%y z1gwh;IL#9T+gVl>l#XX^zq4hMRq*r(IoP~r`akN$@;is5z-wWeeW(JpnQ)1R!`D3V zl!Oddq3PrfOD3GD+P?=k#VS=H~(udY(M_#FX6=i_5KrITp z$EDtjnlO`^KL^RGD7lG!?dvdxe7B~?cNRa}CkFdTbM%_Dk2 z3eLw9H)fg)4u5sd6f5Oew-CHcG@({Z1-3x_m>Mz}Dv=qXeMs8x&>_z^DU@7j^`U0s zQMw2807Vq_@h~VSIYaUf>OAqW`^6JF{^|Q=8LqNR5Q6%JffIe$&Tru$c%gwxwf~K2 zCr<_0M3$C9n%6#@1wb8kCl?<*mDm0GaJyRHk~KA}WzmtknW8r=V3UGCg)lfikCk8B;@BON0sa2h~VZFW$3NDPAP$+Lp~sT;}Ss0>Wg*`qcF zW9t*NuTCi4NDX7ZJiHqLATidsF0am$OqBE@bTP{}PBwlY2+-uR&+#>xj)o(geHnME zq`++A1R<34i}KdFeOC9BG^$af1swWY=qjJpBxiyifY{C)O;0=~D(H_7Iap^xU-((U zDB#{$*CfsAscftwt5N(;_(ae&j0vvUYomk4^^#=_IS*>VT9guO=#CCvhjK{ut#Wxc zm+)AH*7Q`@GN4jx#cZL3S9tj`@>!0ad_>~jQ$;IMV1kA?f@PTcN??{D7g+pcX`wD)-dlb`+5SidRAoT`^p!1j9g3F##T<1RubN8+v4lBmC=| z4ge4quRukQ_eIUVUt<8t)v=$)D5#Uq_D%XYhXy-qEuLZh+^$2S6(hS8Lr^+KDhl~q>FX-3E6}ZvB8^5pxCmcY>r{-!y zhnOg<7|v+YJnZCw%WZ^#sc*8$edIXhcZufsDe5T!WSJt>(3hRD8f{M*}Ti;$QTdX;)rKQEBjLU^Z{PVId1yLSSRc`DU4!>W`D zg)u~nvLr**%8Pc&-Pc;FM>njg8zFXcNe*3Oby@;Oka$_jbGlh^gOkr3Y9bd$AoigZ zq%)DkwZ}#yGY;yntvd_-pam`7TW~}JB^941OU;8DW^YojZ!-wkHCdPzJ@3TG&%0V* z!*av3^x~;h=cC}9l<>xf4EI=?Xuq!S5<#v*Qy{(G%FEk4HT|U%C7owjf)e?V{s6}f zpo1v388?RC6iK`AZ2|&|#WQ1cQMQ$lexqK4S!g{1-b4vsen#zNk#Z*0Zl@zd;HWlU zn>TAf`0Iom1A=b9;U&)hoFKzzKz!)W{qn)nvFWrg)18DQB^x$Uc?fm6d!V zr>DeF;%v`nN&VKZR}kRZ55N*|l!YFBhqbFS*?ud2dGbzgY8dy4Qr#PCIp2EY@v0-0 znhUNMC&PnccD=g ze%=0VIVI!+Cjf0mxiVK3Z+(n2ICsK_I608qzC`4g{i|ax^NiPgKw8>MM)q2?2QCbzJQG5sc|n4u4pdLaGQ<$r=y#+yBq;v`%El`oqKoVP}Jfsqk*V8 z@rdc#FhF3*+7BPjkA7D{h>_!q4isVBHH)73F`%iq=teRl+Y`*bnN>bbg4Jh{u^GVG z?Lo3YJ{65GhRCJKDJ^hR(ZH*G99K+~BB+{+$nQ58uaK0Fu$Itc;)rtzQp%BwG!(oK zvMQ7>awPf`{%zqrk?J@W%XS`VI9Delx=E)(~TZASd2({-XOA$X7k5csm8ywQzix1RPGbmdO(zJ~tfE`!{{m9toM52{ z)XS$8k8Zw;9MB?nEdHl%6sCyzGMyR*Ym=e?y=66CRom}->%sFA!ZC%;3vX%LhsfMt z*_RHe5LLzxCIHcHym%_;6C&|bP;DV?(H$H78J~Cp+6$=#$-p=<2f%(tt3R>9>;?~=Q6k|aW@g#)|YPpXc(89 zxw#vXlO!L<3qnv{e*b?Tw*oGuJz3nVM3a>ME{NdnTAS?gYsVJ+>2lsjxSfFXZ-RP) zTJH+1ADs9>f*=!r1%x@Dcf%a;KpR&hCx4i~%J-ztDqChc;CfM3?zugidkMnlLvv|= zuSik-$Dj0trk%8Ca84ZC-LCc5eG5lvC~4l^5g&eU9L$r%jI$$jwfxgUcC98azu+x) zjQyWdh9pN?gl?e7iD_#>{8 za_ENu?hp8U*5K~bUEQUk;8NhFQ@z5Dj132EaA7UxJr4Yted@XOk^%^4UHuIxidrod z&F<5>%OC1%$Y2f~6;;rKeFl}edS2t!-l1v1C*ZOvx;y6pTnYlR0O*l`ce_*p=~5#| zSJ*zBBY_+&b_Z$>d^aVRy6Q>sA7_wkk${|nAi|AEBx3P?AQTo>st4!%ya^}CM9vNW zbCOJyaFXo&Oz2J-1>|OUZTKSZA~@*wZ}o|^ivI~tCvE?KuRX&BK?n!i2TN3a2q-!q z_@ux8E*C)fk>n|-cqVKZN)O5wXx`Y+y$TIclne~rlEAKg9O~q98_jVq;0zhwx`qIK-LwPmeKRCtxyGA zP!+8I_i-NB?7t8rJLB91m7Kc|O?H4JJCAdK{27m@IP6&fqU5sO0_i2Ks_j3IW7F^> zi0-Y8Hd%qA%lQczwHF8(?XF^ixI(Av0~f=>eBF-KUj~cIe27dDI|`rHs6Aq~O?5iR0CJ1q z2s+;Mr{8A@)2rR;n>e6po4QsOU=8QfqR9W9e@g#T!Bt+;%_+822|c%p>A?rX*Lbpl zp$FxLcVe}zW{cH#%=#~E=zo5NsNs3g{47R~Ak%D5k)NfrT(UqYt@I&GkqP&lR;*#7 zxABvqOQ_1EP^0(A>xYV6U5rrzMgzrV)%DE81OPM`jFvwLzh$rT$-cBAfn$cIN0$g6 zcj|U~$~7reQ#%szP_cx`FH*oORF;)hz_QL8uml{#FVHxG0LbjgmtR^}xxNhy1|&?m z2GaR&44180dhKWKk?60Nx!KfU&+Ns zLMiUeKdB8F{`5+wIQ3hTj11xC1Uv$FV_Bt&QsPqV3w-j6k{@%=y=H$75WAYd$&^EK zr{4Im+$8vSCrEC3xl{b6aT@wY-0*RNG>{7j&JCYrsew|M^H>cP#eT~&`HmI^cf6$Q z2%BZPy>EI3y5o)lf~yLF^sFpR99Wqf&`3rC@lbb$f~c6~t$PIX7Xss$xI~9QH3*t< zQlr@_V1j~y?{w*c^cl#+Bz4Nn>1Qr~yn28+Lc`xohr<9~C(>K^txq9vm>3zHrq7e9 zzyaHF?~fhwRe!=?e>?<{q5Lj(IUC?k=N)23BW@}AvVTiM_d|VYtg;EPdlB|M*u6J@ z-@xf6&b#h>&>}j7)XN<5C>f(;VMF=FrK-BL&X*WR&QNcx+sb_U@?&)6*p;v51f;&z zlG4+)ueGDci=QI1u}@yaD>*I@;}a2RoQ!9YMyt2QhD_Y>m5mV4-dcwk9i5oZ$aICh z6P;2Vs!m}!F(ebFn;KM?l9XVVOYd#-JzsA`b1R+QNY1_IGTV2FQ7L2ikn@Jpmsidy z-wAa?cLufQAovZ~HD9=>`VDy_Jz>g;vK2e&a3Qm{*S7uwH(c#m%Gbo4WG#=h)V^}k zupHKaMlOTHIgGdaQj^)I(edvW#^OF+r9%r~@&Xh=Ha#;>e_==U)e9V&C>b$nwtI2*Hw znO-8A2L8DOT*D$bH#j}?`)LaSXi2UBcjPtYvQY3>FLf$hZpoG!H}NWM4!`&*M)Dws zQljg%(#C8~4?4sbgJBiORVa&xfx{sia|>3FfweKQigywHCnwkGi!Sku5)cJjpk93n zTYjdGee$*bR8vEsPFC4u)KRxm?SR%f9hZ=^K5#zH_mAJNQT+7KW2E<7>sg`cG{ zVle~ea2VW?79vc#*aT?6agLy3Yu$GR!Np7LWaofBL(hPiC5#u7wBua(w;oInQ~{InRAx=f1D|Iwr??XX(_u0gasp`Ce>jUxft~X!XVb zbStN(wGIwtIWi1(WLQjONT=VmeJQm2G+yiY+dH;cMiI0gtI$SqkT62uT=+>WS<%(F zo*gM87%Dm;Qk+DMG_64>faZh|5SmNW1I`(On(J7I0nT2A5aSRJq$gYl`AcCm$6KWh zYQYvv6bKkd_gkakZg60fpxn&HrFsHa=boZQB`xE(eK^Ue2Y{CJ@ld^0oeaqN0m)VD z-q}+Lvo}dZdrr-02*yA>z11Ox+^7Zof{Lw=Knio!ae08^+Lh_V62RB1cflyrp@Nhp zvl$~m$y!8)(x!bN9c&kDTy-pOxO0yxtWQ=1AOld!vKI5FdT2KK#seM3Vs>%aN@1r9 zPXXL7&r-2zo5j0Z3$LZy_x`P(HE90*{oAISH`Kifn8H$a{?}pG-=5tmv|2#$X%CgHjf?DP7Szc z&AEMlb23!GKGj=zQ=o+QpxT@Zam2IKwi!gATEKtf+WMa_FHF~QOv}10>NM?8zXvzWbtf%*m#T zTim*n{30j!QMYQCOJFRXGN#@EAPKA9wEeBH9TNaWlimkXrl(pLuzM!mt9MZQp#A`i z@q-u}Xy&!8X0~2Tx%AW14fD~<)W(JBz~jRiKOwUL7-U$4?%md8Xtuy$ox@N90bf2d zhGq-^98NFk8m6)k&eA*lx~u4cyFcn_>Hj{8NGdWjcNtb$-Y+M#y65u*i=dsa_A701 zFu^^M=akt-UoQtnKC)8VKnV=<`8rm-)mleX zgor{uCG};}EK5Z*pa=Yw;;_1|5eCr!cT}B~sW{@y985QD`)|aWTN$`v1 z(-|dSW^eDlImoIkhU4y9Y%A&SL>wEP9I+v(X=Q^Zim7?smk+WLOC?#~uAOK@7x|AD zH#x`Rm!)MPIz?V7+3JC~HQD3rK+Dms@gDIB?O!ivt7@jjYQU?82V&85h&M-0>Ke`)ACmuKj(uoMw!cFcELHL+UY;~; zQt}pjOsg#}?hbCh*kgVU7itaOT|TLPl+y>Lw#K_%2kv^BxsKlY`7I$Cb;j8S#eUTv z%gH*;r*1Vn91f(`59ejzhq!W4?@GD~I7CT1%F7y7#YzAnTzrl!zQmn1<9?lh6%Lbv zicpA*xMisy3NzE`lwfJ|-xYCcNHE6$3eck^M2pTE<1Pzkf!rRJ-n`!bQ}%*XSzip6 z-8XEj3SN@!<0EY9FsdF4<}WV|PY%D-B`@<2|Mttgkf6#;jMbIHsPT~lbma_i~Eu(z!*Gm{;sy8Vx=9s z37}{+-$D8lEAxj6lG4v&(f8VJ;Ky z)lDP7&`6z6obTisGfNS0p@tmWEdV3Nnk4DlsWP#;i0n8s4D=Mczh*SI)ju64jg4ZB z1RO0OvGS|p;$L#6(sjEA>LzX|>G+MX{q!D=kf8>L@Q!r;Itt>)6n`%meqN?VZ+z)9 zIgl=fo~+~h6{%!;Xo-3=jhrvas~(NM^a1QmPFl4Nx1@$(lr@%2wEuC)_N~u6+}L4I zcoZ5=AZnI4KYuSM=#Fo_wl5HB%X_8XYE8f_jtG(5kNTt@T{>pBWebNjbVfi-ET#Qs z)2-Jv@%iO8*TK~TOchJR;!R^Hprx}ivfOjFdTg@oA~ED_N)j+ZA~2cpCd037$qh8Z zbMxdARUcwNPJL7UI6aYQWBW0P97cQ)cFYb;65##ojNcwZAy4+~1GJhRxwgoDfcbj@$^_l3nRChrQBDq}iZZys9{SkO1? zt@SIIGoJzL17w@BEXf+LO`G{cmk#BnsE^h<>%ME1ED;}_Sr5QTMdDk1mv;J)9sF5r zb6TX#U_L;#m^Jp&GauVWM(fVEh_kFTPFEe|;&xv)eSE-*Y*J2O|m#W8!>eVVeclKMajM)zj56DUXGO^by8D zwhep9u=_2;FHxzNR{0bHT6O)#pdvcYbvfy|Nm#ge2S_pU&KniBTzZw5rUNQLs8$JT zO&#bRps?ZcAi#HXHuGEm5da)ZFG4prJMdkDpd?^zZz^-;@>F9K&P4Z3UMq@a{c|HX90J3QGdy`>8bzBjnp1{U*+NPJuA!h*&qD5 zhLDbx1$QHgRSUhiN@GNP_jme3b%3-}9Byy0Z}JN9Hhk9h%#H^I5-)=sD=r|a=b=C{ z)6GKujq1!YvCyg53H#eEzeZ=ixjLyNn(v%W-N_*$F{xCRj2Gv!*wuaeS$wX&8re+x z;<4+44cMI@@2<|$5<{HxIZAzBhp_yYwqI_+7x*mQzGjVb!*b}Vs;|tH#~9+D3Dl9I z0PB|f+7ZC-0;*Yxex1`pr7a>=N`4~(vmgA$epygtxc67dBrW=@dJA-F=y#Xs|NchC zDt$rgjjPbdtqjL!S;zQq1Eoo{x&>Y4krGU)SCm@3aii(tHz76S#%OtKZyvthUn>)x zksZPJPmD?v{a5sd=QM(kxJA@8!0r5ZPSmISHjKD+2*Dzqx$f?iQmj zoeXs3WrkTl8|-*_u{EJQj1xqzIf2kbS=}Ssw5W5Zt9xE{3X-yUW-X1?FMOSC*^e=W zd#cRe_!c>`ucu}DOg_Jn&M`neQf(Q<7c32Xzj9)5b898>X*uedc^&)UJ7+N1Fv2S9 z4eJ0QIZ{05hHhJQ_Look_uTkzL}D(9B8oXFANVgQ|e{1rfJ6 z80ud?i1J;g=W}Pk{G^X7{c`UUjNuTYVw>8n_GYVUxrF%LSOkcnQBAcObG!2U9aUxT zgX+Wz!_`1|tIDgk;kUI5As1LtTWWzMHQNizBbD(Y-1M8)7?2<(8yZjQ8;)^qdRIIHZ|d)I^yOxR?tY4S#cku z1F{~FoK&leQ0eSKos|4PG6`R@$P*52aT(>Fimwi6KKit8+D$c*aBX(l@Ipl+GXY!R z{sD@+m}pwf-mCnq{!KZec2>=W@Cf&7I6wtQqkhWqmUEJs)&1E^4d@(@GRC0gw@IDczer{h8}Nd+w}D9sY<*YY4*uoI z3i}TMaX{MZ0z8!wT~#8u3l(z**Hfk7OdJr|;R8ApiU|Fy zih`dv`FU`@NP_5GDsrPiTFdxL;Ek#K_voter9C^i?S?$zdJmuvS3%sQ??}?>7_D~? zqzbVJIl0-j_~cq^=78H=rk4S!4sPHdut3v*J3n>GcT>-)Llg;Cxdi*rrfyU3kO73z z4Gaw}|7;}S|GNJFdDJJ$?d(C)mo^=sIub;(Mk;<;eq9E_RwmT>{Hs_=fSzNU=1@Y2 z?|ZH0J|eJ#V8#}J5|;*=YPHl`wjbHW`-a`VcP5!Mq8^@o4_$PhbvbVO^Q?+yeSP32 z;_z-Xuf2_uHLJ*U;ddU^Xla|Yfp<~Sd*!fraV>N9C9RYJ;w_J$h1rklz!R?K&w z$p*3|c`(7)y892yE$^LjdC$-q{Y7-~yw(XxkmnU!B594fPdoUJZT0Q9bT7)v&sB=N z;aih`;j`}t1Kf}PiZ0;`i$sY5PICjRr!2?E!d0FRU>lnKT5rXl=n-SA;Jkm+g;f7@ z?o;&V<;!Hg;;wI@Z1+4<$g^=r+b9)Y$|TdV%B9kZZ&%`xG&xuIU7!7&F%*pxLyQTc zeVXB-sa-j+;->P9;2e4bfyWBD7E^L(P{Y7V25_WK$u~B%d5&Xwr>2Y*ydrMwtW8kP zjra-zPCD$x(Syl-w$FrL=oQD}#mKIwcDDt_#Q0J=q%A2-xhgU4RTj76V?CU2G#GiE zd#3e@q*vZPEa1E2`JEwx>WwnRg{Y5&L)RAEz}X`6O@X8ozPi)`dRA?=t7C_yuW+ba zRjUl=_=KPTNm@edPQBYs08Gt)60))siEI{1(UA-(C=ecq242pNu9SEM9v3^RQC#=T zXlH9plEqYN@KXgOmOCDYa@xtS&TD8j@AzoHx82*zz@K3b!(R31dLOz&G1@ig@gY>Q z&8B=b79sJY?QuGK*Xe=t;Y;hV^0G+Y)a%x1gWvV0N|r;8zq|XV2uz19LS$d6-eq5e z*vs`|z5Arj%n*&q51s&50ahg@nqIX*dC}Ot%K3TlN=})o~sb1V-}xG)jUs-)E5Nr96}8Cd{E+d|iX z-Ga(cr9YU_%5L@hAie1510BbBxt|Una;+F62AuvD<74|U-&Q1QYZ;NCzO3kdWlnV$)f%<<{@`bzcoO?&imT<3YpE7yifKgV>kKjC3SMD5<6M%#M;Mbwda z1}2}Uzvh027;RT-D(u@AqIu$__x^m$3Vzdn-tAm$k?l8d${5X~=OLx~_D+t~4c}LK z*z7?!`_hGLu|A@KscOd$zvoUrD0erGc(^apYpP&pQIEy%#Y8k!SW^);F?*OS+;j>lJ|l7QpBa*h5ON*_bK4= z!6Vco;a0l{z5g<>pRowXch-y3^{&5LBNW-${}P$Rkl|^U(Kz#5miyTs?rbBtzi|`% z6N+3lvdXk0AOk<8_<5+LkQR_HRJNAed;%n)%;DIe*c!vIgEkC|6OofPep>PM^%tunPPi$Px1g literal 0 HcmV?d00001 diff --git a/assets/sprites/grass.png.import b/assets/sprites/grass.png.import new file mode 100644 index 0000000..01a587e --- /dev/null +++ b/assets/sprites/grass.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dske0kvup2tru" +path="res://.godot/imported/grass.png-bae2078152e96197bbaa819e9f6548a3.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/grass.png" +dest_files=["res://.godot/imported/grass.png-bae2078152e96197bbaa819e9f6548a3.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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/sprites/pig.png b/assets/sprites/pig.png new file mode 100644 index 0000000000000000000000000000000000000000..652ef9293e91263a62c7e8b37fcc1e2e5df958e2 GIT binary patch literal 4332 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 AM*si- literal 0 HcmV?d00001 diff --git a/assets/sprites/pig.png.import b/assets/sprites/pig.png.import new file mode 100644 index 0000000..a6392a6 --- /dev/null +++ b/assets/sprites/pig.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dkx5rhq6cd7fq" +path="res://.godot/imported/pig.png-285df2b68af2316ddc1e90ba9bff96e6.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/pig.png" +dest_files=["res://.godot/imported/pig.png-285df2b68af2316ddc1e90ba9bff96e6.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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/sprites/seagull_attack_0.png b/assets/sprites/seagull_attack_0.png new file mode 100644 index 0000000000000000000000000000000000000000..f4f85502e374fee7c25df06ebcef662852b4acb8 GIT binary patch literal 2227 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 v8ER%PX#>-@Uf53t3Ukrl{*RkweXD)=|Qw literal 0 HcmV?d00001 diff --git a/assets/sprites/seagull_fly_0.png.import b/assets/sprites/seagull_fly_0.png.import new file mode 100644 index 0000000..7385398 --- /dev/null +++ b/assets/sprites/seagull_fly_0.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cgrqjhigxfby" +path="res://.godot/imported/seagull_fly_0.png-6185867c982d14badfdc8a21e29360d1.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/seagull_fly_0.png" +dest_files=["res://.godot/imported/seagull_fly_0.png-6185867c982d14badfdc8a21e29360d1.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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/sprites/seagull_fly_1.png b/assets/sprites/seagull_fly_1.png new file mode 100644 index 0000000000000000000000000000000000000000..abbf2a174d8482246a15a534c079b8b8e71248f1 GIT binary patch literal 2051 zcmcJQ`#;l<9>+hMVUw~^V^@MgkzHB>;xU1Cal`>fK@W zK}*N75!AT2-`-8pQBf)+{cs);(OrxhXB+{E9L^p*MGJz zZ1InvEkKE(Vry4Z-VYar4HA=$-v!{Op==W?c)5pVw7dJ>1gdR6 ztsY3w07F+Vft48t6xz!~6Wic3JA zMw-JC1kq>xg~1XK_z4&&0R(|_0sf#fbMm_qiZ=TAv@}wHIe?G09>6hDLcI04K0bU* zjb-Ac?j+tH(lM+bBS~Y7CTW*iPu~OBDpp9ncz`Vr#HeQ#^^NB@fBeM|gusTBz#?F1 zKaj2if2tOLa3B?1^u6D(!cv#>^_3wE2%LmK97YZlvFetS0x-}qXf)Sc)Xevq(gX_> z<+cVEQ7dsY+-XzQ?5WgSO+qQ_4{c#OhX+cYGc2Fnsp=XxB6Srtio35>vt1Sx5{gQQ z6W+bkb$(GOS4mK$KfW;2i#GgRVg~ek{Ck z@%Xj-t?BXaCJ$Jtr}+l8o%yq4W`1QB>vY>C&EWesoSRI}pPc7#II{-FSIyb-N<#Ib zj^(#wVvcR*xA1}%^Ku?YI6CrXUpK>uJ7;RfXO^EYmey9qPai5}w1lA8t9s5mVs92N;);)N^{$nFdCztfu{SyyG)_k$ zKWj@rYWKNBSX4h8b^;irGLR1dxkO;H4=*GY!3 zeDKu89{QYz(B0Rgs`px(hPew>x&s<$Z-klbnI7-jeBN^Ksa{ys=k-er&+wkEqwG)z zvaK`^H%wl+)&8S0k+BqLr;`#%Od`hqMMgb)t#>t&SuCOzGXqc7Y~dYS-6#D1pkge^ zi-FaU2<+7xoj5hqOvz-emf1JeUvV0bLYsu$TEfGtE-scGS{q3;a{AqUnP{`5ZmJzm zSa!HWJ`vb4s!+8V|0(+C#?AUlb8nm?u|2fY$Im4DF%7>i{~%SXwE_002|7zapy{V8 z+D1I~U)f7-jYYneM%AA1zja*^#DDqmS%r@Lv@5~RMnTMXTT(H<=EV^FYy*FVZYflH zo@mp!v;DHZaFpt}H>B`s7Vqg(ODK~%ccHZ*_5B=0Emul%5LYYp0$tf0dv-VQ1^x); zX*xT0M;lhVMCoJ@m0Q9%a&4~a>E-ar7-82)nYaxZhhH<4Xab~GvsrlHOjO(RD~{*g zw3}O(v~ue2tCm>rKfWdDsU_?(M%`+XVn$W59Ru!GFO2q=9pjVcLNFTXJHHALGJA=b zi(L|EuX|nHHH9X$Nslk(4E5VD$Q|yVv|U3@q&z<)nYQi?$tIl2cHS(XC(#>rh4bho zSh8wBi`<@s~ZKFHcBk$f`xEG$XKdXB=D~Te;D_=aW zHDL{U+w(Ia2M?)$7uklFd$?%4&P!nFfHuuY3uj%woD&M#GJ@byrq#rP0KcOaU|#OS zKMeNngB)Wa)`$9)TTY#;e&VZt35WOF%F;%A5tH$E6LR1JHMl1gEl$vzg1o(`1a45Q z{i8BxGtO|T?%Q7(ZYVz$y(~e|Mrn;`!A)!N_M}F78YvhFH#%*ck#gN4B9ZKW diff --git a/icon.svg.import b/icon.svg.import new file mode 100644 index 0000000..09c170b --- /dev/null +++ b/icon.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cqbky705c0dgo" +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/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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/libs/character.gd b/libs/character.gd new file mode 100644 index 0000000..0bfabbb --- /dev/null +++ b/libs/character.gd @@ -0,0 +1,58 @@ +extends Node + + +class Char: + # Children + var movement: LibCharMove.CharMovement + var camera: LibCharCam.CharCamera + + # Health + var max_health: float + var iframe_dur: float + # Updating + var health: float = 1.0 + var is_dead: bool = false + var iframe_timer: float = 0.0 + var mouse_pos: Vector2 = Vector2.ZERO + var look_dir: Vector2 = Vector2.ZERO + var sprite_rotation: float = 0.0 + + func _init( + _movement: LibCharMove.CharMovement, + _camera: LibCharCam.CharCamera, + _max_health: float, + _starting_health: float, + _iframe_dur: float + ): + movement = _movement + camera = _camera + max_health = _max_health + health = _starting_health + iframe_dur = _iframe_dur + + func process(_look_dir: Vector2, _mouse_pos: Vector2, delta: float): + look_dir = _look_dir + mouse_pos = _mouse_pos + movement.process(look_dir, delta) + camera .process(delta) + if Input.is_key_pressed(KEY_H): heal(25); print(health) + if Input.is_key_pressed(KEY_K): damage(25); print(health) + + func phys_process(delta: float): + movement.phys_process(delta) + camera .phys_process(delta) + if iframe_timer > 0.0: iframe_timer -= delta + + func heal(a: float): + health += abs(a) + health = min(health, max_health) + is_dead = a > 0 + func damage(a: float, ignore_iframes: bool = false, custom_iframes: float = -1): + if (iframe_timer <= 0 || ignore_iframes): + health -= abs(a) + + if (custom_iframes > 0): iframe_timer = custom_iframes + else: iframe_timer = iframe_dur + + health = max(0, health) + is_dead = a > 0 diff --git a/libs/character.gd.uid b/libs/character.gd.uid new file mode 100644 index 0000000..7e2ffbb --- /dev/null +++ b/libs/character.gd.uid @@ -0,0 +1 @@ +uid://cbv4pjad8jjud diff --git a/libs/character_camera.gd b/libs/character_camera.gd new file mode 100644 index 0000000..d2e562d --- /dev/null +++ b/libs/character_camera.gd @@ -0,0 +1,59 @@ +extends Node + + +enum CameraType { + FIXED, + FIXED_NO_PAN, + FOLLOW, + CUSTOM +} + + +class CharCamera: + var camera_type: CameraType + var custom_cam_type: Callable = Callable() + + var pos: Vector2 = Vector2.ZERO + var offset: Vector2 = Vector2.ZERO + + var camera: Camera2D + + func _init( + _camera: Camera2D, + _camera_type: CameraType, + _offset: Vector2 = Vector2.ZERO, + _pos: Vector2 = Vector2.ZERO + ): + camera = _camera + camera_type = _camera_type + offset = _offset + pos = _pos + if camera_type == CameraType.FIXED_NO_PAN: + set_cam_smoothing(0.0) + + + func process(_delta: float): + pass + + func phys_process(_delta: float): + if camera_type == CameraType.FIXED \ + || camera_type == CameraType.FIXED_NO_PAN: + camera.global_position = pos + elif camera_type == CameraType.FOLLOW: + camera.offset = offset + else: + camera.global_position = custom_cam_type.call() + + + func set_cam_smoothing(a: float): + camera.position_smoothing_speed = a + + + func make_current(): camera.make_current() + + + func teleport_camera(new_pos: Vector2): + var first_state = camera.position_smoothing_enabled + camera.position_smoothing_enabled = false + camera.global_position = new_pos + camera.position_smoothing_enabled = first_state diff --git a/libs/character_camera.gd.uid b/libs/character_camera.gd.uid new file mode 100644 index 0000000..e755258 --- /dev/null +++ b/libs/character_camera.gd.uid @@ -0,0 +1 @@ +uid://p1r7cuviw46p diff --git a/libs/character_movement.gd b/libs/character_movement.gd new file mode 100644 index 0000000..b028742 --- /dev/null +++ b/libs/character_movement.gd @@ -0,0 +1,228 @@ +extends Node + + +enum MovementType { + PLATFORMER, + TOP_DOWN, + CUSTOM, + NONE +} +enum DashType { + KEYS, + HORIZONTAL_KEYS, + MOUSE, + CONTINOUS_MOUSE, + SPRINT, + NONE +} + + +class CharMovement: + var movement_type: MovementType + var custom_movement_func: Callable = Callable() + + # EXTRA (that may or may not be added) + # Coyote time + # Input buffer + + # Params + var speed: float + var sprint_speed: float + var jump_power: float + var extra_jumps: int + var coyote_time: float + var jump_buffer_time: float + var dash_type: DashType + var aerial_dash_count: int + var vel_multiplier_after_dash: float + var dash_speed: float + var dash_dur: float + var dash_cd: float + # Physics Params + var gravity: float + var terminal_vel: float + + # Updating + var velocity: Vector2 = Vector2.ZERO + + var is_grounded: bool = false + + var can_jump: bool = true + var can_move: bool = true + + var jumps: int = 0 + var coyote_timer: float = 0.0 + var jump_buffer_timer: float = 0.0 + + var is_dashing: bool = false + var is_dash_cd: bool = false + var dash_timer: float = 0.0 + var dash_cd_timer: float = 0.0 + var aerial_dashes: int = 0 + + var look_dir: Vector2 = Vector2.ZERO + var last_look_dir: Vector2 = Vector2.ZERO + var move_dir: Vector2 = Vector2.ZERO + var move_dir_x: float = 0.0 + var last_move_dir: Vector2 = Vector2.ZERO + var last_move_dir_x: float = 0.0 + var was_dash_pressed: bool = false + var was_jump_pressed: bool = false + var is_jump_held: bool = false + + func _init( + _movement_type: MovementType, + _speed: float, + _sprint_speed: float, + _jump_power: float, + _extra_jumps: int, + _coyote_time: float, + _jump_buffer_time: float, + _dash_type: DashType, + _aerial_dash_count: int, + _vel_multiplier_after_dash: float, + _dash_speed: float, + _dash_dur: float, + _dash_cd: float, + _gravity: float, + _terminal_vel: float + ): + movement_type = _movement_type + speed = _speed + sprint_speed = _sprint_speed + jump_power = _jump_power + extra_jumps = _extra_jumps + coyote_time = _coyote_time + dash_type = _dash_type + dash_speed = _dash_speed + dash_dur = _dash_dur + dash_cd = _dash_cd + gravity = _gravity + terminal_vel = _terminal_vel + + # Long names + jump_buffer_time = _jump_buffer_time + aerial_dash_count = _aerial_dash_count + vel_multiplier_after_dash = _vel_multiplier_after_dash + + func set_custom_movement_func(function: Callable): + custom_movement_func = function + + + func process(_look_dir: Vector2, _delta: float): + look_dir = _look_dir + + move_dir = Input.get_vector("left", "right", "up", "down") + move_dir_x = Input.get_axis("left", "right") + was_dash_pressed = Input.is_action_just_pressed("dash") + was_jump_pressed = Input.is_action_just_pressed("jump") + is_jump_held = Input.is_action_pressed("jump") + + if movement_type == MovementType.PLATFORMER: + was_jump_pressed = was_jump_pressed || Input.is_action_just_pressed("jump_alt") + is_jump_held = is_jump_held || Input.is_action_pressed("jump_alt") + + func phys_process(delta: float): + move_logic(delta) + jump_logic(delta) + # dash overrides other movement + dash_logic(delta) + + physics(delta) + + + func dash_logic(delta: float): + if is_grounded: aerial_dashes = 0 + + if was_dash_pressed && !is_dashing && !is_dash_cd: + if movement_type == MovementType.TOP_DOWN \ + || aerial_dashes < aerial_dash_count \ + || is_grounded: + is_dashing = true + last_look_dir = look_dir + last_move_dir = move_dir + last_move_dir_x = move_dir_x + aerial_dashes += 1 + + if is_dashing: + dash_timer += delta + dash_velocity(delta) + + if dash_timer >= dash_dur: + is_dashing = false + is_dash_cd = true + dash_timer = 0.0 + velocity *= vel_multiplier_after_dash + + if is_dash_cd: + dash_cd_timer += delta + + if dash_cd_timer >= dash_cd: + is_dash_cd = false + dash_cd_timer = 0.0 + + func dash_velocity(delta: float): + match dash_type: + DashType.KEYS: velocity = last_move_dir * dash_speed * delta + DashType.HORIZONTAL_KEYS: velocity.x = last_move_dir_x * dash_speed * delta + DashType.MOUSE: velocity = last_look_dir * dash_speed * delta + DashType.CONTINOUS_MOUSE: velocity = look_dir * dash_speed * delta + DashType.SPRINT: pass + DashType.NONE: pass + + + func move_logic(delta: float): + if can_move: movement_velocity(delta) + + func movement_velocity(delta: float): + var final_speed = speed + if dash_type == DashType.SPRINT && Input.is_action_pressed("dash"): + final_speed = sprint_speed + + match movement_type: + MovementType.TOP_DOWN: velocity = move_dir * final_speed * delta + MovementType.PLATFORMER: velocity.x = move_dir_x * final_speed * delta + MovementType.CUSTOM: custom_movement_func.call(delta) + MovementType.NONE: pass + + + func jump_logic(delta: float): + if is_grounded: jumps = 0 + + if !can_jump || movement_type != MovementType.PLATFORMER: return + + # Spaghetti restaurant: $0.0 for 1 spaghett + if is_grounded && was_jump_pressed: jump() + elif coyote_timer < coyote_time \ + && was_jump_pressed && jumps == 0: jump() + elif jumps <= extra_jumps \ + && !is_grounded && was_jump_pressed: jump() + elif is_jump_held && is_grounded \ + && jump_buffer_timer < jump_buffer_time: + jumps = 0; jump() + + if !is_grounded \ + && coyote_timer < coyote_time: + coyote_timer += delta + + if is_jump_held && !is_grounded \ + && jump_buffer_timer < jump_buffer_time: + jump_buffer_timer += delta + + if is_grounded: + coyote_timer = 0.0 + if !is_jump_held: jump_buffer_timer = 0.0 + + func jump(): + velocity.y = jump_power * -1.0 + jumps += 1 + + + func physics(delta: float): + if movement_type != MovementType.PLATFORMER: return + + if !is_grounded: + velocity.y += gravity * delta + velocity.y = min(velocity.y, terminal_vel * delta) + else: + velocity.y = min(0, velocity.y) diff --git a/libs/character_movement.gd.uid b/libs/character_movement.gd.uid new file mode 100644 index 0000000..bcef449 --- /dev/null +++ b/libs/character_movement.gd.uid @@ -0,0 +1 @@ +uid://f512nblhdks4 diff --git a/project.godot b/project.godot new file mode 100644 index 0000000..4449ecf --- /dev/null +++ b/project.godot @@ -0,0 +1,71 @@ +; 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="LBS Game Jam 2025 (theme: british pigs)" +run/main_scene="uid://8rpm2uklud0j" +config/features=PackedStringArray("4.5", "Forward Plus") +config/icon="res://icon.svg" + +[autoload] + +LibChar="*res://libs/character.gd" +LibCharMove="*res://libs/character_movement.gd" +LibCharCam="*res://libs/character_camera.gd" + +[display] + +window/size/mode=2 +window/size/resizable=false +window/size/borderless=true + +[input] + +up={ +"deadzone": 0.2, +"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":87,"key_label":0,"unicode":119,"location":0,"echo":false,"script":null) +, 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":4194320,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +] +} +down={ +"deadzone": 0.2, +"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":83,"key_label":0,"unicode":115,"location":0,"echo":false,"script":null) +, 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":4194322,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +] +} +left={ +"deadzone": 0.2, +"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) +, 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":4194319,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +] +} +right={ +"deadzone": 0.2, +"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) +, 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":4194321,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +] +} +jump={ +"deadzone": 0.2, +"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":32,"key_label":0,"unicode":32,"location":0,"echo":false,"script":null) +] +} +jump_alt={ +"deadzone": 0.2, +"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":87,"key_label":0,"unicode":119,"location":0,"echo":false,"script":null) +, 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":4194320,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +] +} +dash={ +"deadzone": 0.2, +"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":4194325,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +] +} diff --git a/scenes/main.tscn b/scenes/main.tscn new file mode 100644 index 0000000..a59fed1 --- /dev/null +++ b/scenes/main.tscn @@ -0,0 +1,138 @@ +[gd_scene load_steps=11 format=3 uid="uid://dhp0hi4qpiu4q"] + +[ext_resource type="Texture2D" uid="uid://dske0kvup2tru" path="res://assets/sprites/grass.png" id="1_0wfyh"] +[ext_resource type="PackedScene" uid="uid://dvaagwge5g1g" path="res://actors/player_character.tscn" id="1_o5qli"] +[ext_resource type="Script" uid="uid://c8udxism1aby4" path="res://scripts/main_scene.gd" id="1_o6xl0"] +[ext_resource type="Texture2D" uid="uid://dtvbg6shi4amx" path="res://assets/sprites/fence.png" id="3_sugp2"] +[ext_resource type="PackedScene" uid="uid://bv6wpdjivdlf4" path="res://actors/biscuit_o_tron.tscn" id="4_jyhfs"] +[ext_resource type="PackedScene" uid="uid://cdy44cambk6ji" path="res://ui/key_sequence.tscn" id="4_tbgi4"] + +[sub_resource type="CircleShape2D" id="CircleShape2D_tefeu"] +radius = 151.00331 + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_sugp2"] +size = Vector2(1215, 20) + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_tbgi4"] +size = Vector2(20, 648) + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_jyhfs"] +size = Vector2(20, 380) + +[node name="Node2D" type="Node2D"] +script = ExtResource("1_o6xl0") +pig_amount = 5 + +[node name="GrassBackground" type="Sprite2D" parent="."] +texture_repeat = 2 +scale = Vector2(0.187, 0.187) +texture = ExtResource("1_0wfyh") +region_enabled = true +region_rect = Rect2(0, 0, 6500, 4000) + +[node name="PigBoundary" type="StaticBody2D" parent="."] +collision_layer = 2 +collision_mask = 2 + +[node name="Collision" type="CollisionShape2D" parent="PigBoundary"] +position = Vector2(-188, 52) +shape = SubResource("CircleShape2D_tefeu") + +[node name="SceneBounds" type="StaticBody2D" parent="."] + +[node name="Top" type="CollisionShape2D" parent="SceneBounds"] +position = Vector2(0, -290) +shape = SubResource("RectangleShape2D_sugp2") + +[node name="Bottom" type="CollisionShape2D" parent="SceneBounds"] +position = Vector2(0, 315) +shape = SubResource("RectangleShape2D_sugp2") + +[node name="Left" type="CollisionShape2D" parent="SceneBounds"] +position = Vector2(-586, 0) +shape = SubResource("RectangleShape2D_tbgi4") + +[node name="Right" type="CollisionShape2D" parent="SceneBounds"] +position = Vector2(565, 0) +shape = SubResource("RectangleShape2D_tbgi4") + +[node name="Fences" type="StaticBody2D" parent="SceneBounds"] + +[node name="FenceTop" type="Sprite2D" parent="SceneBounds/Fences"] +texture_repeat = 2 +position = Vector2(235.99997, -314) +scale = Vector2(0.475, 0.252) +texture = ExtResource("3_sugp2") +region_enabled = true +region_rect = Rect2(12.217192, 0, 1667.438, 74.37027) + +[node name="FenceBottom" type="Sprite2D" parent="SceneBounds/Fences"] +texture_repeat = 2 +position = Vector2(236.00002, 313.99997) +scale = Vector2(0.475, 0.252) +texture = ExtResource("3_sugp2") +region_enabled = true +region_rect = Rect2(12.217192, 0, 1667.438, 74.37027) + +[node name="FenceRight" type="Sprite2D" parent="SceneBounds/Fences"] +texture_repeat = 2 +position = Vector2(566, 25) +rotation = -4.712389 +scale = Vector2(0.475, 0.252) +texture = ExtResource("3_sugp2") +region_enabled = true +region_rect = Rect2(12.217192, 0, 1667.438, 74.37027) + +[node name="FenceLeftTop" type="Sprite2D" parent="SceneBounds/Fences"] +texture_repeat = 2 +position = Vector2(-152, -175.00002) +rotation = -1.5707964 +scale = Vector2(0.475, 0.252) +texture = ExtResource("3_sugp2") +region_enabled = true +region_rect = Rect2(12.217192, 0, 763.44775, 74.37027) + +[node name="FenceLeftBottom" type="Sprite2D" parent="SceneBounds/Fences"] +texture_repeat = 2 +position = Vector2(-152, 286) +rotation = -1.5707964 +scale = Vector2(0.475, 0.252) +texture = ExtResource("3_sugp2") +region_enabled = true +region_rect = Rect2(1.8075199, 0, 714.7975, 74.37027) + +[node name="LeftTop" type="CollisionShape2D" parent="SceneBounds/Fences"] +position = Vector2(-151, -205) +shape = SubResource("RectangleShape2D_jyhfs") + +[node name="LeftBottom" type="CollisionShape2D" parent="SceneBounds/Fences"] +position = Vector2(-151, 306) +shape = SubResource("RectangleShape2D_jyhfs") + +[node name="BiscuitOTrons" type="StaticBody2D" parent="."] + +[node name="BiscuitOTron" parent="BiscuitOTrons" instance=ExtResource("4_jyhfs")] +position = Vector2(-472, 195) + +[node name="BiscuitOTron2" parent="BiscuitOTrons" instance=ExtResource("4_jyhfs")] +position = Vector2(-472, -13) + +[node name="BiscuitOTron3" parent="BiscuitOTrons" instance=ExtResource("4_jyhfs")] +position = Vector2(-472, -216) + +[node name="PlayerCharacter" parent="." instance=ExtResource("1_o5qli")] +movement_type = 2 +speed = 2.0 +dash_type = 5 +camera_type = 0 +max_biscuits = 3 + +[node name="KeySequence" parent="PlayerCharacter" instance=ExtResource("4_tbgi4")] +offset_top = -100.0 +offset_bottom = -100.0 + +[node name="FarmTopLeft" type="Marker2D" parent="."] +position = Vector2(65, -258) + +[node name="FarmBottomRight" type="Marker2D" parent="."] +position = Vector2(497, 252) diff --git a/scripts/biscuit_o_tron.gd b/scripts/biscuit_o_tron.gd new file mode 100644 index 0000000..bb3e907 --- /dev/null +++ b/scripts/biscuit_o_tron.gd @@ -0,0 +1,47 @@ +extends StaticBody2D + + +@export var biscuit_increment: float + + +@onready var sequence: Array[int] = [] +@onready var is_active: bool = false +@onready var biscuit_fraction: float = 0.0 +var hud: Panel +var player: CharacterBody2D + + +func _process(delta: float): + $ProgressBar.value = biscuit_fraction * 100 + if biscuit_fraction < 1.0: + biscuit_fraction += biscuit_increment * delta + biscuit_fraction = min(biscuit_fraction, 1.0) + + if not hud: return + + if hud.is_fully_completed() && is_active: + sequence = hud.generate_sequence(5) + hud.set_sequence(sequence) + biscuit_fraction = 0.0 + hud.hide() + player.try_add_biscuit() + + if is_active && biscuit_fraction >= 1.0: hud.show() + + if sequence.is_empty(): + sequence = hud.generate_sequence(5) + hud.set_sequence(sequence) + + +func _on_trigger_body_entered(body: Node2D): + if body is not CharacterBody2D: return + is_active = true + + if not hud: hud = body.get_node("KeySequence") + if not player: player = body + + +func _on_trigger_body_exited(body: Node2D): + if body is not CharacterBody2D: return + is_active = false + hud.hide() diff --git a/scripts/biscuit_o_tron.gd.uid b/scripts/biscuit_o_tron.gd.uid new file mode 100644 index 0000000..494478f --- /dev/null +++ b/scripts/biscuit_o_tron.gd.uid @@ -0,0 +1 @@ +uid://d2t5nkrsib24d diff --git a/scripts/game_over.gd b/scripts/game_over.gd new file mode 100644 index 0000000..76ffb85 --- /dev/null +++ b/scripts/game_over.gd @@ -0,0 +1,23 @@ +extends Control + + +var saved_pigs: int +@onready var has_reddend = false + + +func _ready(): + if not saved_pigs: saved_pigs = 0 + $Saved.text = "At least you saved them %s times" % saved_pigs + if saved_pigs == 0: $Saved.text = "You couldn't even save one abduction?" + $AnimationPlayer.play("fade_in") + + +func _process(_delta: float): + if !$AnimationPlayer.current_animation == "fade_in" \ + && saved_pigs == 0 && !has_reddend: + $AnimationPlayer.play("redden") + has_reddend = true + + +func _on_menu_button_pressed() -> void: + get_tree().change_scene_to_file("res://ui/main_menu.tscn") diff --git a/scripts/game_over.gd.uid b/scripts/game_over.gd.uid new file mode 100644 index 0000000..9c67181 --- /dev/null +++ b/scripts/game_over.gd.uid @@ -0,0 +1 @@ +uid://f6863j28l3ua diff --git a/scripts/info_hud.gd b/scripts/info_hud.gd new file mode 100644 index 0000000..8a2dbf1 --- /dev/null +++ b/scripts/info_hud.gd @@ -0,0 +1,32 @@ +extends Control + +@export var hp_animation_dur: float + +var healthbar_full_size: Vector2 +var hp_value: Panel + +var hp_tween: Tween + +func _ready(): + healthbar_full_size = $HealthbarBase/HealthbarValue.size + hp_value = $HealthbarBase/HealthbarValue + + +## The amount is a value between 0..1 +func set_health(a: float): + var f_pos: float = healthbar_full_size.y - (a * hp_value.size.y) + var user_favor: float = sin(a * PI) * 10 + f_pos -= user_favor + f_pos = clamp(f_pos, 0, healthbar_full_size.y) + if hp_value.position.y == f_pos: return; + + if hp_tween && hp_tween.is_running(): hp_tween.kill() + hp_tween = create_tween() + hp_tween.set_trans(Tween.TRANS_LINEAR) + + hp_tween.tween_property( + hp_value, + "position:y", + f_pos, + hp_animation_dur + ) diff --git a/scripts/info_hud.gd.uid b/scripts/info_hud.gd.uid new file mode 100644 index 0000000..76a07cb --- /dev/null +++ b/scripts/info_hud.gd.uid @@ -0,0 +1 @@ +uid://de476q6oxds3o diff --git a/scripts/key_sequence.gd b/scripts/key_sequence.gd new file mode 100644 index 0000000..425a784 --- /dev/null +++ b/scripts/key_sequence.gd @@ -0,0 +1,105 @@ +extends Panel + + +enum Directions { + UP, + DOWN, + LEFT, + RIGHT +} + + +var arrow = preload("res://assets/sprites/arrow.png") +var arrow_completed = preload("res://assets/sprites/arrow_green.png") +@onready var sequence: Array[Directions] = [] +@onready var completed: Array[bool] = [] + +var arrow_el: TextureRect + + +func _ready(): + arrow_el = TextureRect.new() + + arrow_el.size = Vector2(40.0, 40.0) + arrow_el.pivot_offset = arrow_el.size / 2 + arrow_el.texture = arrow + arrow_el.expand_mode = TextureRect.EXPAND_FIT_WIDTH_PROPORTIONAL + + +func set_sequence(new_sequence: Array[Directions]): + sequence = new_sequence + reset_completed() + render_sequence() + + +func add_to_sequence(direction: Directions): + sequence.append(direction) + render_sequence() + + +func reset_sequence(): + sequence = [] + reset_sequence_render() + + +func reset_sequence_render(): + for el in self.get_children(): + self.remove_child(el) + + +func render_sequence(): + reset_sequence_render() + + for i in range(sequence.size()): + var dir = sequence[i] + var n_el = arrow_el.duplicate() + n_el.position.x = (i - sequence.size() / 2.0) * n_el.size.x + + var rot_deg = 0.0 + + match dir: + Directions.UP: rot_deg = 0.0 + Directions.RIGHT: rot_deg = 90.0 + Directions.DOWN: rot_deg = 180.0 + Directions.LEFT: rot_deg = 270.0 + + n_el.rotation = deg_to_rad(rot_deg) + + if completed[i]: n_el.texture = arrow_completed + + self.add_child(n_el) + + +func random_direction() -> Directions: + var dir = randi_range(0, Directions.keys().size() - 1) + + return Directions.values()[dir] + + +func generate_sequence(length: int) -> Array[Directions]: + var new_sequence: Array[Directions] = [] + + for i in range(length): + new_sequence.append(random_direction()) + + return new_sequence + + +func try_complete_next(direction: Directions): + if !self.visible: return + + var next = completed.find(false) + + if direction != sequence[next]: reset_completed() + else: completed[next] = true + render_sequence() + + +func is_fully_completed() -> bool: + return false not in completed && !completed.is_empty() + + +func reset_completed(): + completed = [] + completed.resize(sequence.size()) + completed.fill(false) diff --git a/scripts/key_sequence.gd.uid b/scripts/key_sequence.gd.uid new file mode 100644 index 0000000..0e3ee84 --- /dev/null +++ b/scripts/key_sequence.gd.uid @@ -0,0 +1 @@ +uid://dh4tox6b5ewbq diff --git a/scripts/main_menu.gd b/scripts/main_menu.gd new file mode 100644 index 0000000..c4304d2 --- /dev/null +++ b/scripts/main_menu.gd @@ -0,0 +1,47 @@ +extends Control + +var seagull = preload("res://actors/seagull_particle.tscn") + +@export var square_rot: float + +var play_button: Button +var quit_button: Button +var credit_button: Button + +@onready var times_quit: int = 0 +@onready var times_credited: int = 0 + +func _ready(): + play_button = $InteractiblesContainer/ButtonsContainer/PlayButton + quit_button = $InteractiblesContainer/ButtonsContainer/QuitButton + credit_button = $InteractiblesContainer/ButtonsContainer/CreditsButton + + +func _on_play_button_pressed() -> void: + get_tree().change_scene_to_file("res://scenes/main.tscn") + + +func _on_quit_button_pressed() -> void: + quit_button.text = "No." + times_quit += 1 + if times_quit == 10: + quit_button.disabled = true + quit_button.text = "This game is too\nSuper Epic Cool Awesome Stuff\nfor you to leave." + + +func _process(delta: float): + $BgSquare.rotation += square_rot * delta + var AVG_TIME_FOR_SEAGULL: float = 0.5 + var should_seagull: bool = randf() < delta / AVG_TIME_FOR_SEAGULL + + if should_seagull: + var s = seagull.instantiate() + $Seagulls.add_child(s) + + +func _on_credits_button_pressed() -> void: + credit_button.text = "Are you stupid?" + times_quit += 1 + if times_quit == 3: + credit_button.disabled = true + credit_button.text = "Byte Dice" diff --git a/scripts/main_menu.gd.uid b/scripts/main_menu.gd.uid new file mode 100644 index 0000000..182a825 --- /dev/null +++ b/scripts/main_menu.gd.uid @@ -0,0 +1 @@ +uid://dpv5jt28axlpa diff --git a/scripts/main_scene.gd b/scripts/main_scene.gd new file mode 100644 index 0000000..a60a0a8 --- /dev/null +++ b/scripts/main_scene.gd @@ -0,0 +1,35 @@ +extends Node2D + + +var pig = preload("res://actors/pig.tscn") +var game_over = preload("res://ui/game_over.tscn") + + +@export var pig_amount: int + +@onready var pigs_abducted: int = 0 +@onready var pigs_saved: int = 0 + + +func _ready(): + get_tree().root.content_scale_mode = Window.CONTENT_SCALE_MODE_VIEWPORT + + for _i in range(pig_amount): + var p = pig.instantiate() + + p.global_position = Vector2( + randf_range($FarmTopLeft.global_position.x, $FarmBottomRight.global_position.x), + randf_range($FarmTopLeft.global_position.y, $FarmBottomRight.global_position.y) + ) + self.add_child(p) + + +func _process(_delta: float): + if pigs_abducted > 0: + var g = game_over.instantiate() + g.saved_pigs = pigs_saved + var tree = get_tree() + tree.root.add_child(g) + var old_scene = tree.current_scene + tree.current_scene = g + old_scene.free() diff --git a/scripts/main_scene.gd.uid b/scripts/main_scene.gd.uid new file mode 100644 index 0000000..80d1bcd --- /dev/null +++ b/scripts/main_scene.gd.uid @@ -0,0 +1 @@ +uid://c8udxism1aby4 diff --git a/scripts/pig.gd b/scripts/pig.gd new file mode 100644 index 0000000..ff324af --- /dev/null +++ b/scripts/pig.gd @@ -0,0 +1,174 @@ +extends CharacterBody2D + + +enum States { + WALKING, + PANIC, + WAITING +} + +@export var min_state_dur: float +@export var max_state_dur: float +@export var min_time_till_attack: float +@export var max_time_till_attack: float +@export var min_attack_duration: float +@export var max_attack_duration: float +@export var walk_speed: float +@export var panic_speed: float +@export var seagull_speed: float + +@onready var is_attacked: bool = false # I shouldve made these an enum tbh +@onready var attack_approaching: bool = false +@onready var is_retreating: bool = false +@onready var walk_dir = Vector2.ZERO +@onready var is_flipped: bool = false +@onready var seagull_is_flipped: bool = false +@onready var seagull_dir = Vector2.ZERO +@onready var seagull_home_pos = Vector2.ZERO +@onready var received_biscuit: bool = false + +var time_till_attacked: float +var time_till_abducted: float +var current_state: States +var state_duration: float + + +func _ready(): + time_till_attacked = randf_range(min_time_till_attack, max_time_till_attack) + change_walk_dir() + new_state() + + +func _physics_process(delta: float): + if !is_attacked: + match current_state: + States.WALKING: act_walking(delta) + States.PANIC: act_walking(delta, true) + States.WAITING: + if !$PigAnimations.current_animation == "flip": + $PigAnimations.stop() + else: + if time_till_abducted > 0: act_walking(delta, true) + else: pass + + attack_logic(delta) + + if walk_dir.x < 0 && !is_flipped: + $PigAnimations.play("flip") + is_flipped = true + elif walk_dir.x > 0 && is_flipped: + $PigAnimations.play_backwards("flip") + is_flipped = false + + state_duration -= delta + if time_till_attacked > 0: time_till_attacked -= delta + if state_duration <= 0.0: new_state() + + +func new_state(): + state_duration = randf_range(min_state_dur, max_state_dur) + var next_state = randi_range(0, States.size() - 1) + + if next_state == States.PANIC && randf() < 0.95: + next_state = States.WALKING if randi_range(0, 1) == 0 else States.WAITING + + current_state = States.values()[next_state] + + +func act_walking(delta: float, panicked: bool = false): + var average_time_to_switch_dir: float = 2.0 if !panicked else 0.2 + var should_switch_dir = randf() < delta / average_time_to_switch_dir + if should_switch_dir: change_walk_dir() + self.velocity = walk_dir * (walk_speed if !panicked else panic_speed) + self.move_and_slide() + if !$PigAnimations.current_animation == "flip": + $PigAnimations.play("walk") + + +func change_walk_dir(): + walk_dir = Vector2( + randf_range(-1, 1), + randf_range(-1, 1) + ).normalized() + + +func attack_logic(delta: float): + if time_till_attacked <= 0.0 && !(is_attacked || attack_approaching || is_retreating): + attack_approaching = true + seagull_home_pos = Vector2( + randf_range(-3000.0, 3000.0), + randf_range(-1920.0, -2500.0) + ) + $Seagull.global_position = seagull_home_pos + $Seagull.visible = true + $Seagull.play("fly") + + attack_approaching_logic(delta) + is_attacked_logic(delta) + retreating_logic(delta) + + if seagull_dir.x < 0 && !seagull_is_flipped: + $SeagullAnimations.play("flip") + seagull_is_flipped = true + elif seagull_dir.x > 0 && seagull_is_flipped: + $SeagullAnimations.play_backwards("flip") + seagull_is_flipped = false + + +func attack_approaching_logic(delta: float): + if !attack_approaching: return + + seagull_dir = ($PigSprite/SeagullAttackPos.global_position - $Seagull.global_position).normalized() + + $Seagull.global_position += seagull_dir * seagull_speed * delta + + var dist = $Seagull.global_position.distance_to($PigSprite/SeagullAttackPos.global_position) + if dist < 15.0: + $Seagull.global_position = $PigSprite/SeagullAttackPos.global_position + attack_approaching = false + is_attacked = true + $Seagull.play("attack") + if !$PigAnimations.current_animation == "flip": $PigAnimations.stop() + time_till_abducted = randf_range(min_attack_duration, max_attack_duration) + + +func is_attacked_logic(delta: float): + if !is_attacked: return + + if time_till_abducted <= 0.0: + seagull_dir = (seagull_home_pos - $Seagull.global_position).normalized() + self.global_position += seagull_dir * seagull_speed * delta + $PigSprite.self_modulate.a = 0.5 + $Collision.disabled = true + + if self.global_position.y < -get_viewport_rect().size.y - 300.0: + get_tree().current_scene.pigs_abducted += 1 + get_parent().remove_child(self) + + if received_biscuit: + is_attacked = false + received_biscuit = false + is_retreating = true + get_tree().current_scene.pigs_saved += 1 + + time_till_abducted -= delta + + +func retreating_logic(delta: float): + if !is_retreating: return + + seagull_dir = (seagull_home_pos - $Seagull.global_position).normalized() + $Seagull.global_position += seagull_dir * seagull_speed * delta + + if $Seagull.global_position.y < -get_viewport_rect().size.y - 300.0: + is_retreating = false + $Seagull.global_position = seagull_home_pos + + +func _on_feed_zone_body_entered(body: Node2D): + if body is not CharacterBody2D: return + if body.name != "PlayerCharacter": return + + if is_attacked && body.biscuit_count > 0 && time_till_abducted > 0.0: + received_biscuit = true + body.remove_biscuit() diff --git a/scripts/pig.gd.uid b/scripts/pig.gd.uid new file mode 100644 index 0000000..d91870f --- /dev/null +++ b/scripts/pig.gd.uid @@ -0,0 +1 @@ +uid://qtb3s2euymob diff --git a/scripts/player_character.gd b/scripts/player_character.gd new file mode 100644 index 0000000..c5288e7 --- /dev/null +++ b/scripts/player_character.gd @@ -0,0 +1,160 @@ +extends CharacterBody2D + + +var biscuit = preload("res://assets/sprites/biscuit.png") + + +@export_group("Movement") +@export var movement_type: LibCharMove.MovementType +@export_subgroup("Moving") +@export var speed: float +@export var sprint_speed: float +@export_subgroup("Jumping") +@export var jump_power: float +@export var extra_jumps: int +@export var coyote_time: float +@export var jump_buffer_timer: float +@export_subgroup("Dashing") +@export var dash_type: LibCharMove.DashType +@export var aerial_dash_count: int +@export var vel_multiplier_after_dash: float +@export var dash_speed: float +@export var dash_dur: float +@export var dash_cd: float +@export_subgroup("Physics") +@export var gravity: float +@export var terminal_vel: float + +@export_group("Generic") +@export_subgroup("Health") +@export var max_health: float +@export var starting_health: float +@export var iframe_dur: float +@export_subgroup("Camera") +@export var camera_type: LibCharCam.CameraType +@export var camera_offset: Vector2 + +@export_group("Biscuit") +@export var max_biscuits: int + + +var character: LibChar.Char +var hud: Control +@onready var is_flipped: bool = false +@onready var biscuit_count: int = 0 + +func _ready(): + floor_max_angle = deg_to_rad(40.0) + match movement_type: + LibCharMove.MovementType.PLATFORMER: + motion_mode = CharacterBody2D.MOTION_MODE_GROUNDED + LibCharMove.MovementType.TOP_DOWN: + motion_mode = CharacterBody2D.MOTION_MODE_FLOATING + + # custom movement so we do this + motion_mode = CharacterBody2D.MOTION_MODE_GROUNDED + + var char_movement = LibCharMove.CharMovement.new( + movement_type, + speed, sprint_speed, + jump_power, extra_jumps, coyote_time, jump_buffer_timer, + dash_type, aerial_dash_count, vel_multiplier_after_dash, + dash_speed, dash_dur, dash_cd, + gravity, terminal_vel + ) + + var char_camera = LibCharCam.CharCamera.new( + $Camera, + camera_type, + camera_offset, + Vector2.ZERO + ) + + character = LibChar.Char.new( + char_movement, char_camera, + max_health, starting_health, iframe_dur + ) + + character.movement.custom_movement_func = move_logic + + character.camera.make_current() + character.camera.pos = $Camera.global_position + + +var mouse_pos: Vector2 = Vector2.ZERO +var look_dir: Vector2 = Vector2.ZERO + + +func _process(delta: float): + mouse_pos = get_viewport().get_mouse_position() + look_dir = (mouse_pos - self.global_position).normalized() + character.process(look_dir, mouse_pos, delta) + sequence_logic() + + +func _physics_process(delta: float): + character.phys_process(delta) + # move_and_slide() automatically computes delta :( + velocity = character.movement.velocity / delta + move_and_slide() + character.movement.is_grounded = is_on_floor() + + +func move_logic(delta: float): + var dir_vector = (mouse_pos - (get_viewport_rect().size / 2)) - self.global_position + character.movement.velocity = dir_vector * character.movement.speed * delta + + if dir_vector.x < 0 && !is_flipped: + $AnimationPlayer.play("flip") + is_flipped = true + if dir_vector.x > 0 && is_flipped: + $AnimationPlayer.play_backwards("flip") + is_flipped = false + + +func sequence_logic(): + var dir: int = -1 + + if Input.is_action_just_pressed("up"): + dir = $KeySequence.Directions.UP + elif Input.is_action_just_pressed("down"): + dir = $KeySequence.Directions.DOWN + elif Input.is_action_just_pressed("left"): + dir = $KeySequence.Directions.LEFT + elif Input.is_action_just_pressed("right"): + dir = $KeySequence.Directions.RIGHT + + if dir != -1: $KeySequence.try_complete_next(dir) + + +func reset_biscuits(): + for el in $Sprite/BiscuitPos.get_children(): + $Sprite/BiscuitPos.remove_child(el) + + +func render_biscuits(): + const BISCUIT_OFFSET = 5.0 + + reset_biscuits() + + for i in range(biscuit_count): + var offset = BISCUIT_OFFSET + if i == 0: offset = 0 + var b = Sprite2D.new() + b.texture = biscuit + b.position.y = -i * (biscuit.get_height() - offset) + + $Sprite/BiscuitPos.add_child(b) + + +func try_add_biscuit() -> bool: + if biscuit_count >= max_biscuits: return false + biscuit_count += 1 + render_biscuits() + return true + + +func remove_biscuit(): + if biscuit_count <= 0: return + biscuit_count -= 1 + render_biscuits() diff --git a/scripts/player_character.gd.uid b/scripts/player_character.gd.uid new file mode 100644 index 0000000..f453b0c --- /dev/null +++ b/scripts/player_character.gd.uid @@ -0,0 +1 @@ +uid://cknbo3ltp5mc3 diff --git a/scripts/seagull_particle.gd b/scripts/seagull_particle.gd new file mode 100644 index 0000000..491c620 --- /dev/null +++ b/scripts/seagull_particle.gd @@ -0,0 +1,27 @@ +extends AnimatedSprite2D + + +@export var speed: float + +var dir: Vector2 + +@onready var pos = Vector2( + -100.0 if randi_range(0, 1) else get_viewport_rect().size.x, + randf_range(0, 1) +) + + +func _ready(): + dir = Vector2( + randf_range(0, 1) * (-1 if pos.x > 0 else 1), + randf_range(-0.2, 0.2) + ).normalized() + + pos.y *= get_viewport_rect().size.y + self.global_position = pos + if dir.x < 0: self.flip_h = true + + +func _process(delta: float): + self.global_position += dir * speed * delta + self.play("default") diff --git a/scripts/seagull_particle.gd.uid b/scripts/seagull_particle.gd.uid new file mode 100644 index 0000000..b7933e0 --- /dev/null +++ b/scripts/seagull_particle.gd.uid @@ -0,0 +1 @@ +uid://dms2mkhl6pbyo diff --git a/ui/game_over.tscn b/ui/game_over.tscn new file mode 100644 index 0000000..5f7e74a --- /dev/null +++ b/ui/game_over.tscn @@ -0,0 +1,286 @@ +[gd_scene load_steps=7 format=3 uid="uid://bnm66u54kj3xf"] + +[ext_resource type="Script" uid="uid://f6863j28l3ua" path="res://scripts/game_over.gd" id="1_oo8kp"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_u0541"] +bg_color = Color(0, 0, 0, 1) + +[sub_resource type="Animation" id="Animation_5eixk"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Panel:theme_override_styles/panel:bg_color") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Color(0, 0, 0, 1)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("YouDied:modulate:a") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [0.0] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Pathetic:visible") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} + +[sub_resource type="Animation" id="Animation_oo8kp"] +resource_name = "fade_in" +length = 14.0 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Panel:theme_override_styles/panel:bg_color") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(3.0333333, 6.0333333), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Color(0, 0, 0, 1), Color(1, 1, 1, 1)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("YouDied:modulate:a") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(7.0333333, 8.033333), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [0.0, 1.0] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Cause:modulate:a") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(9.033333, 10.033333), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [0.0, 1.0] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Reason:modulate:a") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(11.033333, 12.033333), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [0.0, 1.0] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("MenuButton:modulate:a") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(13, 14), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [0.0, 1.0] +} +tracks/5/type = "value" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("Saved:modulate:a") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"times": PackedFloat32Array(13, 14), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [0.0, 1.0] +} + +[sub_resource type="Animation" id="Animation_j1fe5"] +resource_name = "redden" +length = 2.0 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Pathetic:visible") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 2), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [false, true] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Panel:theme_override_styles/panel:bg_color") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 2), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [Color(1, 1, 1, 1), Color(0.4117647, 0, 0, 1)] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_j1fe5"] +_data = { +&"RESET": SubResource("Animation_5eixk"), +&"fade_in": SubResource("Animation_oo8kp"), +&"redden": SubResource("Animation_j1fe5") +} + +[node name="Control" 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_oo8kp") + +[node name="Panel" type="Panel" parent="."] +layout_mode = 0 +offset_right = 1152.0 +offset_bottom = 648.0 +theme_override_styles/panel = SubResource("StyleBoxFlat_u0541") + +[node name="YouDied" type="Label" parent="."] +modulate = Color(1, 1, 1, 0) +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -180.0 +offset_top = -260.0 +offset_right = 181.0 +offset_bottom = -185.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_colors/font_color = Color(0, 0, 0, 1) +theme_override_font_sizes/font_size = 41 +text = "You died" +horizontal_alignment = 1 + +[node name="Cause" type="Label" parent="."] +modulate = Color(1, 1, 1, 0) +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -201.0 +offset_top = -191.0 +offset_right = 203.0 +offset_bottom = -74.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_colors/font_color = Color(0, 0, 0, 1) +theme_override_font_sizes/font_size = 41 +text = "Cause: depressesion" +horizontal_alignment = 1 + +[node name="Reason" type="Label" parent="."] +modulate = Color(1, 1, 1, 0) +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -460.0 +offset_top = -116.0 +offset_right = 462.0 +offset_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_colors/font_color = Color(0, 0, 0, 1) +theme_override_font_sizes/font_size = 41 +text = "Reason: one of your beloved pigs got abducted" +horizontal_alignment = 1 + +[node name="MenuButton" type="Button" parent="."] +layout_mode = 1 +anchors_preset = 7 +anchor_left = 0.5 +anchor_top = 1.0 +anchor_right = 0.5 +anchor_bottom = 1.0 +offset_left = -74.0 +offset_top = -150.0 +offset_right = 76.0 +offset_bottom = -107.0 +grow_horizontal = 2 +grow_vertical = 0 +theme_override_font_sizes/font_size = 25 +text = "Go to menu" + +[node name="Saved" type="Label" parent="."] +modulate = Color(1, 1, 1, 0) +layout_mode = 1 +anchors_preset = 7 +anchor_left = 0.5 +anchor_top = 1.0 +anchor_right = 0.5 +anchor_bottom = 1.0 +offset_left = -102.0 +offset_top = -71.0 +offset_right = 103.0 +offset_bottom = -48.0 +grow_horizontal = 2 +grow_vertical = 0 +theme_override_colors/font_color = Color(0, 0, 0, 1) +text = "Skibidi toilet template text" + +[node name="Pathetic" type="Label" parent="."] +visible = false +layout_mode = 1 +anchors_preset = 7 +anchor_left = 0.5 +anchor_top = 1.0 +anchor_right = 0.5 +anchor_bottom = 1.0 +offset_left = -101.0 +offset_top = -49.0 +offset_right = 104.0 +offset_bottom = -26.0 +grow_horizontal = 2 +grow_vertical = 0 +theme_override_colors/font_color = Color(0, 0, 0, 1) +text = "Pathetic." +horizontal_alignment = 1 + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +libraries = { +&"": SubResource("AnimationLibrary_j1fe5") +} + +[connection signal="pressed" from="MenuButton" to="." method="_on_menu_button_pressed"] diff --git a/ui/info_hud.tscn b/ui/info_hud.tscn new file mode 100644 index 0000000..bf6d936 --- /dev/null +++ b/ui/info_hud.tscn @@ -0,0 +1,47 @@ +[gd_scene load_steps=4 format=3 uid="uid://dbgelckky2v52"] + +[ext_resource type="Script" uid="uid://de476q6oxds3o" path="res://scripts/info_hud.gd" id="1_muwf5"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_hiti4"] +bg_color = Color(1, 1, 1, 1) +corner_radius_top_left = 50 +corner_radius_top_right = 50 +corner_radius_bottom_right = 50 +corner_radius_bottom_left = 50 + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_muwf5"] +bg_color = Color(0.94009703, 0.3102313, 0.7501747, 1) +corner_radius_top_left = 50 +corner_radius_top_right = 50 +corner_radius_bottom_right = 50 +corner_radius_bottom_left = 50 + +[node name="InfoHud" 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_muwf5") +hp_animation_dur = 0.1 + +[node name="HealthbarBase" type="Panel" parent="."] +clip_children = 2 +clip_contents = true +layout_mode = 1 +anchors_preset = 2 +anchor_top = 1.0 +anchor_bottom = 1.0 +offset_left = 25.0 +offset_top = -265.0 +offset_right = 47.0 +offset_bottom = -25.0 +grow_vertical = 0 +theme_override_styles/panel = SubResource("StyleBoxFlat_hiti4") + +[node name="HealthbarValue" type="Panel" parent="HealthbarBase"] +layout_mode = 0 +offset_right = 22.0 +offset_bottom = 240.0 +theme_override_styles/panel = SubResource("StyleBoxFlat_muwf5") diff --git a/ui/key_sequence.tscn b/ui/key_sequence.tscn new file mode 100644 index 0000000..f93cb96 --- /dev/null +++ b/ui/key_sequence.tscn @@ -0,0 +1,10 @@ +[gd_scene load_steps=3 format=3 uid="uid://cdy44cambk6ji"] + +[ext_resource type="Script" uid="uid://dh4tox6b5ewbq" path="res://scripts/key_sequence.gd" id="1_alcnd"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_wkagm"] + +[node name="KeySequence" type="Panel"] +visible = false +theme_override_styles/panel = SubResource("StyleBoxEmpty_wkagm") +script = ExtResource("1_alcnd") diff --git a/ui/main_menu.tscn b/ui/main_menu.tscn new file mode 100644 index 0000000..adf65af --- /dev/null +++ b/ui/main_menu.tscn @@ -0,0 +1,120 @@ +[gd_scene load_steps=8 format=3 uid="uid://8rpm2uklud0j"] + +[ext_resource type="LabelSettings" uid="uid://ch4qnno2euv16" path="res://ui/styles/font_gost_commo.tres" id="1_0dkrt"] +[ext_resource type="Script" uid="uid://dpv5jt28axlpa" path="res://scripts/main_menu.gd" id="1_wk0pr"] +[ext_resource type="Texture2D" uid="uid://dkx5rhq6cd7fq" path="res://assets/sprites/pig.png" id="2_rmr83"] +[ext_resource type="Theme" uid="uid://78ymohvmckry" path="res://ui/styles/theme_menu_buttons.tres" id="2_wk0pr"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_0dkrt"] +bg_color = Color(7.670838e-08, 0.11997212, 0.012806023, 1) + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_rmr83"] + +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_8uxxo"] +texture = ExtResource("2_rmr83") + +[node name="Control" 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_wk0pr") +square_rot = 0.15 + +[node name="Background" type="Panel" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_styles/panel = SubResource("StyleBoxFlat_0dkrt") + +[node name="Seagulls" type="Panel" parent="."] +layout_mode = 0 +offset_right = 40.0 +offset_bottom = 40.0 +theme_override_styles/panel = SubResource("StyleBoxEmpty_rmr83") + +[node name="BgSquare" type="Panel" parent="."] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -246.0 +offset_top = -246.0 +offset_right = 246.0 +offset_bottom = 246.0 +grow_horizontal = 2 +grow_vertical = 2 +pivot_offset = Vector2(246, 246) +theme_override_styles/panel = SubResource("StyleBoxTexture_8uxxo") + +[node name="InteractiblesContainer" type="VBoxContainer" parent="."] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -310.0 +offset_top = -36.5 +offset_right = 310.0 +offset_bottom = 36.5 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_constants/separation = 80 + +[node name="Label" type="Label" parent="InteractiblesContainer"] +layout_mode = 2 +text = "Super Epic Cool Awesome Stuff: +The Game" +label_settings = ExtResource("1_0dkrt") +horizontal_alignment = 1 + +[node name="ButtonsContainer" type="VBoxContainer" parent="InteractiblesContainer"] +layout_mode = 2 +theme_override_constants/separation = 20 + +[node name="PlayButton" type="Button" parent="InteractiblesContainer/ButtonsContainer"] +custom_minimum_size = Vector2(175, 60) +layout_mode = 2 +size_flags_horizontal = 4 +focus_mode = 0 +theme = ExtResource("2_wk0pr") +text = "Play" + +[node name="CreditsButton" type="Button" parent="InteractiblesContainer/ButtonsContainer"] +custom_minimum_size = Vector2(175, 60) +layout_mode = 2 +size_flags_horizontal = 4 +focus_mode = 0 +theme = ExtResource("2_wk0pr") +text = "Credits" + +[node name="QuitButton" type="Button" parent="InteractiblesContainer/ButtonsContainer"] +custom_minimum_size = Vector2(175, 60) +layout_mode = 2 +size_flags_horizontal = 4 +focus_mode = 0 +theme = ExtResource("2_wk0pr") +text = "Quit" + +[node name="Label" type="Label" parent="."] +layout_mode = 1 +anchors_preset = 2 +anchor_top = 1.0 +anchor_bottom = 1.0 +offset_top = -49.0 +offset_right = 261.0 +grow_vertical = 0 +text = "Made for the LBS 2025 Game Jam. +Theme: \"British Pigs\"" + +[connection signal="pressed" from="InteractiblesContainer/ButtonsContainer/PlayButton" to="." method="_on_play_button_pressed"] +[connection signal="pressed" from="InteractiblesContainer/ButtonsContainer/CreditsButton" to="." method="_on_credits_button_pressed"] +[connection signal="pressed" from="InteractiblesContainer/ButtonsContainer/QuitButton" to="." method="_on_quit_button_pressed"] diff --git a/ui/styles/font_gost_commo.tres b/ui/styles/font_gost_commo.tres new file mode 100644 index 0000000..ca6b18d --- /dev/null +++ b/ui/styles/font_gost_commo.tres @@ -0,0 +1,10 @@ +[gd_resource type="LabelSettings" load_steps=2 format=3 uid="uid://ch4qnno2euv16"] + +[sub_resource type="SystemFont" id="SystemFont_suxjm"] +font_names = PackedStringArray("GOST Common") + +[resource] +font = SubResource("SystemFont_suxjm") +font_size = 50 +font_color = Color(0.4156184, 0.57489175, 1, 1) +outline_size = 10 diff --git a/ui/styles/theme_menu_buttons.tres b/ui/styles/theme_menu_buttons.tres new file mode 100644 index 0000000..01e51a1 --- /dev/null +++ b/ui/styles/theme_menu_buttons.tres @@ -0,0 +1,79 @@ +[gd_resource type="Theme" load_steps=7 format=3 uid="uid://78ymohvmckry"] + +[sub_resource type="SystemFont" id="SystemFont_kefkl"] +font_names = PackedStringArray("GOST Common") + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_sdpor"] +bg_color = Color(0.13558733, 1.0203719e-05, 0.5757747, 1) +border_width_left = 3 +border_width_top = 3 +border_width_right = 3 +border_width_bottom = 3 +border_color = Color(0.7372549, 0.7372549, 0.7372549, 1) +corner_radius_top_left = 10 +corner_radius_top_right = 10 +corner_radius_bottom_right = 10 +corner_radius_bottom_left = 10 + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_nlon4"] +bg_color = Color(0.43050313, 0.5708193, 1, 1) +border_width_left = 3 +border_width_top = 3 +border_width_right = 3 +border_width_bottom = 3 +border_color = Color(1, 1, 1, 1) +corner_radius_top_left = 10 +corner_radius_top_right = 10 +corner_radius_bottom_right = 10 +corner_radius_bottom_left = 10 + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ghxax"] +bg_color = Color(0.5598542, 0.6732296, 1, 1) +border_width_left = 3 +border_width_top = 3 +border_width_right = 3 +border_width_bottom = 3 +border_color = Color(1, 1, 1, 1) +corner_radius_top_left = 10 +corner_radius_top_right = 10 +corner_radius_bottom_right = 10 +corner_radius_bottom_left = 10 + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_2m0qt"] +bg_color = Color(0.45369804, 0.56404567, 1, 1) +border_width_left = 3 +border_width_top = 3 +border_width_right = 3 +border_width_bottom = 3 +border_color = Color(1, 1, 1, 1) +corner_radius_top_left = 10 +corner_radius_top_right = 10 +corner_radius_bottom_right = 10 +corner_radius_bottom_left = 10 + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_kr5ue"] +bg_color = Color(0.38866094, 0.44743973, 0.99797183, 1) +border_width_left = 3 +border_width_top = 3 +border_width_right = 3 +border_width_bottom = 3 +border_color = Color(1, 1, 1, 1) +corner_radius_top_left = 10 +corner_radius_top_right = 10 +corner_radius_bottom_right = 10 +corner_radius_bottom_left = 10 + +[resource] +Button/colors/font_color = Color(1, 1, 1, 1) +Button/colors/font_disabled_color = Color(0.737193, 0.7371929, 0.7371929, 1) +Button/colors/font_focus_color = Color(1, 1, 1, 1) +Button/colors/font_hover_color = Color(1, 1, 1, 1) +Button/colors/font_hover_pressed_color = Color(1, 1, 1, 1) +Button/colors/font_pressed_color = Color(1, 1, 1, 1) +Button/font_sizes/font_size = 30 +Button/fonts/font = SubResource("SystemFont_kefkl") +Button/styles/disabled = SubResource("StyleBoxFlat_sdpor") +Button/styles/focus = SubResource("StyleBoxFlat_nlon4") +Button/styles/hover = SubResource("StyleBoxFlat_ghxax") +Button/styles/normal = SubResource("StyleBoxFlat_2m0qt") +Button/styles/pressed = SubResource("StyleBoxFlat_kr5ue")