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 0000000..69fc9b7 Binary files /dev/null and b/assets/sprites/arrow.png differ diff --git a/assets/sprites/arrow.png.import b/assets/sprites/arrow.png.import new file mode 100644 index 0000000..31be6ad --- /dev/null +++ b/assets/sprites/arrow.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bsb7o621apewm" +path="res://.godot/imported/arrow.png-18e607c3398c94c410f88abf48695716.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/arrow.png" +dest_files=["res://.godot/imported/arrow.png-18e607c3398c94c410f88abf48695716.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/arrow_green.png b/assets/sprites/arrow_green.png new file mode 100644 index 0000000..25219a9 Binary files /dev/null and b/assets/sprites/arrow_green.png differ diff --git a/assets/sprites/arrow_green.png.import b/assets/sprites/arrow_green.png.import new file mode 100644 index 0000000..a308ce9 --- /dev/null +++ b/assets/sprites/arrow_green.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d0rnuy6rf3yl3" +path="res://.godot/imported/arrow_green.png-c70e1a7962f7edc32f9554e6d6597fb8.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/arrow_green.png" +dest_files=["res://.godot/imported/arrow_green.png-c70e1a7962f7edc32f9554e6d6597fb8.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.png b/assets/sprites/biscuit.png new file mode 100644 index 0000000..677d8b7 Binary files /dev/null and b/assets/sprites/biscuit.png differ 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 0000000..ee6f9c7 Binary files /dev/null and b/assets/sprites/biscuit_o_tron.png differ 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 0000000..39dca7c Binary files /dev/null and b/assets/sprites/farmer.png differ 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 0000000..44df612 Binary files /dev/null and b/assets/sprites/fence.png differ 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 0000000..6c9a57c Binary files /dev/null and b/assets/sprites/grass.png differ 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 0000000..652ef92 Binary files /dev/null and b/assets/sprites/pig.png differ 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 0000000..f4f8550 Binary files /dev/null and b/assets/sprites/seagull_attack_0.png differ diff --git a/assets/sprites/seagull_attack_0.png.import b/assets/sprites/seagull_attack_0.png.import new file mode 100644 index 0000000..a7adec9 --- /dev/null +++ b/assets/sprites/seagull_attack_0.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c273scpqwtvb6" +path="res://.godot/imported/seagull_attack_0.png-d6b6e03c893f420caf384a4624154864.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/seagull_attack_0.png" +dest_files=["res://.godot/imported/seagull_attack_0.png-d6b6e03c893f420caf384a4624154864.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_1.png b/assets/sprites/seagull_attack_1.png new file mode 100644 index 0000000..fd81c5b Binary files /dev/null and b/assets/sprites/seagull_attack_1.png differ diff --git a/assets/sprites/seagull_attack_1.png.import b/assets/sprites/seagull_attack_1.png.import new file mode 100644 index 0000000..c5980b4 --- /dev/null +++ b/assets/sprites/seagull_attack_1.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cad650jvyjm2b" +path="res://.godot/imported/seagull_attack_1.png-e98b65e75e685fc474d1e729e5b54398.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/seagull_attack_1.png" +dest_files=["res://.godot/imported/seagull_attack_1.png-e98b65e75e685fc474d1e729e5b54398.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_0.png b/assets/sprites/seagull_fly_0.png new file mode 100644 index 0000000..8d989ee Binary files /dev/null and b/assets/sprites/seagull_fly_0.png differ 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 0000000..abbf2a1 Binary files /dev/null and b/assets/sprites/seagull_fly_1.png differ diff --git a/assets/sprites/seagull_fly_1.png.import b/assets/sprites/seagull_fly_1.png.import new file mode 100644 index 0000000..5e4b1d9 --- /dev/null +++ b/assets/sprites/seagull_fly_1.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dgvgknc7pbhwp" +path="res://.godot/imported/seagull_fly_1.png-002cb2f5eadb89cf248f0044212aafe6.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/seagull_fly_1.png" +dest_files=["res://.godot/imported/seagull_fly_1.png-002cb2f5eadb89cf248f0044212aafe6.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/icon.svg b/icon.svg new file mode 100644 index 0000000..c6bbb7d --- /dev/null +++ b/icon.svg @@ -0,0 +1 @@ + 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")