Initial commit

This commit is contained in:
ItsDrike 2025-02-27 23:50:12 +01:00
commit a0b34dd454
Signed by: ItsDrike
GPG key ID: FA2745890B7048C0
54 changed files with 1826 additions and 0 deletions

2
.gitattributes vendored Normal file
View file

@ -0,0 +1,2 @@
# Normalize EOL for all files that Git considers text files.
* text=auto eol=lf

3
.gitignore vendored Normal file
View file

@ -0,0 +1,3 @@
# Godot 4+ specific ignores
.godot/
/android/

Binary file not shown.

View file

@ -0,0 +1,34 @@
[remap]
importer="font_data_dynamic"
type="FontFile"
uid="uid://c53kogtyjwsss"
path="res://.godot/imported/PixelOperator8-Bold.ttf-74faf550739674ad3170f08e646e0614.fontdata"
[deps]
source_file="res://assets/fonts/PixelOperator8-Bold.ttf"
dest_files=["res://.godot/imported/PixelOperator8-Bold.ttf-74faf550739674ad3170f08e646e0614.fontdata"]
[params]
Rendering=null
antialiasing=1
generate_mipmaps=false
disable_embedded_bitmaps=true
multichannel_signed_distance_field=false
msdf_pixel_range=8
msdf_size=48
allow_system_fallback=true
force_autohinter=false
hinting=1
subpixel_positioning=1
oversampling=0.0
Fallbacks=null
fallbacks=[]
Compress=null
compress=true
preload=[]
language_support={}
script_support={}
opentype_features={}

Binary file not shown.

View file

@ -0,0 +1,34 @@
[remap]
importer="font_data_dynamic"
type="FontFile"
uid="uid://dbjl1e6kdxpl6"
path="res://.godot/imported/PixelOperator8.ttf-6f9f01766aff16f52046b880ffb8d367.fontdata"
[deps]
source_file="res://assets/fonts/PixelOperator8.ttf"
dest_files=["res://.godot/imported/PixelOperator8.ttf-6f9f01766aff16f52046b880ffb8d367.fontdata"]
[params]
Rendering=null
antialiasing=1
generate_mipmaps=false
disable_embedded_bitmaps=true
multichannel_signed_distance_field=false
msdf_pixel_range=8
msdf_size=48
allow_system_fallback=true
force_autohinter=false
hinting=1
subpixel_positioning=1
oversampling=0.0
Fallbacks=null
fallbacks=[]
Compress=null
compress=true
preload=[]
language_support={}
script_support={}
opentype_features={}

Binary file not shown.

View file

@ -0,0 +1,19 @@
[remap]
importer="mp3"
type="AudioStreamMP3"
uid="uid://bhdq1ysyu4dli"
path="res://.godot/imported/Faolan_Gaias_Chant.mp3-38155fe53051c36a5a858e8866156054.mp3str"
[deps]
source_file="res://assets/music/Faolan_Gaias_Chant.mp3"
dest_files=["res://.godot/imported/Faolan_Gaias_Chant.mp3-38155fe53051c36a5a858e8866156054.mp3str"]
[params]
loop=true
loop_offset=0.0
bpm=0.0
beat_count=0
bar_beats=4

BIN
assets/sounds/coin.wav Normal file

Binary file not shown.

View file

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://hxv3svfwkg67"
path="res://.godot/imported/coin.wav-9081ee1c6d81d9c34d08bc916297b892.sample"
[deps]
source_file="res://assets/sounds/coin.wav"
dest_files=["res://.godot/imported/coin.wav-9081ee1c6d81d9c34d08bc916297b892.sample"]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
edit/loop_mode=0
edit/loop_begin=0
edit/loop_end=-1
compress/mode=0

BIN
assets/sounds/explosion.wav Normal file

Binary file not shown.

View file

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://bv5pmdha600lx"
path="res://.godot/imported/explosion.wav-52e05e8d4b6600106c8dde082c90f915.sample"
[deps]
source_file="res://assets/sounds/explosion.wav"
dest_files=["res://.godot/imported/explosion.wav-52e05e8d4b6600106c8dde082c90f915.sample"]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
edit/loop_mode=0
edit/loop_begin=0
edit/loop_end=-1
compress/mode=0

BIN
assets/sounds/hurt.wav Normal file

Binary file not shown.

View file

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://d3ga5iqgco704"
path="res://.godot/imported/hurt.wav-792baeb99505afd6a1496d4e4330b023.sample"
[deps]
source_file="res://assets/sounds/hurt.wav"
dest_files=["res://.godot/imported/hurt.wav-792baeb99505afd6a1496d4e4330b023.sample"]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
edit/loop_mode=0
edit/loop_begin=0
edit/loop_end=-1
compress/mode=0

BIN
assets/sounds/jump.wav Normal file

Binary file not shown.

View file

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://b55xtmvwkoslc"
path="res://.godot/imported/jump.wav-395b727cde98999423d5c020c9c3492f.sample"
[deps]
source_file="res://assets/sounds/jump.wav"
dest_files=["res://.godot/imported/jump.wav-395b727cde98999423d5c020c9c3492f.sample"]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
edit/loop_mode=0
edit/loop_begin=0
edit/loop_end=-1
compress/mode=0

BIN
assets/sounds/power_up.wav Normal file

Binary file not shown.

View file

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://chhyiookx3ilk"
path="res://.godot/imported/power_up.wav-8349ffe570559470036ebff4b80f7fc0.sample"
[deps]
source_file="res://assets/sounds/power_up.wav"
dest_files=["res://.godot/imported/power_up.wav-8349ffe570559470036ebff4b80f7fc0.sample"]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
edit/loop_mode=0
edit/loop_begin=0
edit/loop_end=-1
compress/mode=0

BIN
assets/sounds/tap.wav Normal file

Binary file not shown.

View file

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://duhe7my8ilfph"
path="res://.godot/imported/tap.wav-78d4c5a48b21a853d89bec74f20510e7.sample"
[deps]
source_file="res://assets/sounds/tap.wav"
dest_files=["res://.godot/imported/tap.wav-78d4c5a48b21a853d89bec74f20510e7.sample"]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
edit/loop_mode=0
edit/loop_begin=0
edit/loop_end=-1
compress/mode=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View file

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dlly1tyauqodl"
path="res://.godot/imported/boost_arrow.png-8399aed23e4a01cb4b12c9de4e6c7f0f.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/sprites/boost_arrow.png"
dest_files=["res://.godot/imported/boost_arrow.png-8399aed23e4a01cb4b12c9de4e6c7f0f.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

BIN
assets/sprites/coin.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 500 B

View file

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bped01tsjeycn"
path="res://.godot/imported/coin.png-c8309bf0f8fb5f3a7d1e96a4eb3f02ce.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/sprites/coin.png"
dest_files=["res://.godot/imported/coin.png-c8309bf0f8fb5f3a7d1e96a4eb3f02ce.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

BIN
assets/sprites/fruit.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

View file

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://gx1xihdbejvu"
path="res://.godot/imported/fruit.png-3735163b668af10c2b35b52cba81b68a.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/sprites/fruit.png"
dest_files=["res://.godot/imported/fruit.png-3735163b668af10c2b35b52cba81b68a.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

BIN
assets/sprites/knight.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

View file

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b8cmjj8vq3r8d"
path="res://.godot/imported/knight.png-7c67c83d34932624952797d9e971a644.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/sprites/knight.png"
dest_files=["res://.godot/imported/knight.png-7c67c83d34932624952797d9e971a644.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View file

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cxuqjimd7csiq"
path="res://.godot/imported/platforms.png-3869606db457611ed4193d705dc364e4.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/sprites/platforms.png"
dest_files=["res://.godot/imported/platforms.png-3869606db457611ed4193d705dc364e4.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

Binary file not shown.

After

Width:  |  Height:  |  Size: 908 B

View file

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bl53gpvg5mh1y"
path="res://.godot/imported/slime_green.png-f6349164bf3a0f5189bb927b97af9c58.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/sprites/slime_green.png"
dest_files=["res://.godot/imported/slime_green.png-f6349164bf3a0f5189bb927b97af9c58.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

Binary file not shown.

After

Width:  |  Height:  |  Size: 1 KiB

View file

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bwoec51f6mei0"
path="res://.godot/imported/slime_purple.png-26dc5ddef235ce6a400e78e0d532b050.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/sprites/slime_purple.png"
dest_files=["res://.godot/imported/slime_purple.png-26dc5ddef235ce6a400e78e0d532b050.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View file

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://d0q2g65ahgok"
path="res://.godot/imported/world_tileset.png-61a32465f33c3d9d3bfecb75b6485009.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/sprites/world_tileset.png"
dest_files=["res://.godot/imported/world_tileset.png-61a32465f33c3d9d3bfecb75b6485009.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

15
default_bus_layout.tres Normal file
View file

@ -0,0 +1,15 @@
[gd_resource type="AudioBusLayout" format=3 uid="uid://dercp67dkjwja"]
[resource]
bus/1/name = &"Music"
bus/1/solo = false
bus/1/mute = false
bus/1/bypass_fx = false
bus/1/volume_db = -11.9576
bus/1/send = &"Master"
bus/2/name = &"SFX"
bus/2/solo = false
bus/2/mute = false
bus/2/bypass_fx = false
bus/2/volume_db = 0.0
bus/2/send = &"Master"

1
icon.svg Normal file
View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128"><rect width="124" height="124" x="2" y="2" fill="#363d52" stroke="#212532" stroke-width="4" rx="14"/><g fill="#fff" transform="translate(12.322 12.322)scale(.101)"><path d="M105 673v33q407 354 814 0v-33z"/><path fill="#478cbf" d="m105 673 152 14q12 1 15 14l4 67 132 10 8-61q2-11 15-15h162q13 4 15 15l8 61 132-10 4-67q3-13 15-14l152-14V427q30-39 56-81-35-59-83-108-43 20-82 47-40-37-88-64 7-51 8-102-59-28-123-42-26 43-46 89-49-7-98 0-20-46-46-89-64 14-123 42 1 51 8 102-48 27-88 64-39-27-82-47-48 49-83 108 26 42 56 81zm0 33v39c0 276 813 276 814 0v-39l-134 12-5 69q-2 10-14 13l-162 11q-12 0-16-11l-10-65H446l-10 65q-4 11-16 11l-162-11q-12-3-14-13l-5-69z"/><path d="M483 600c0 34 58 34 58 0v-86c0-34-58-34-58 0z"/><circle cx="725" cy="526" r="90"/><circle cx="299" cy="526" r="90"/></g><g fill="#414042" transform="translate(12.322 12.322)scale(.101)"><circle cx="307" cy="532" r="60"/><circle cx="717" cy="532" r="60"/></g></svg>

After

Width:  |  Height:  |  Size: 994 B

37
icon.svg.import Normal file
View file

@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c01ytq2qktieb"
path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://icon.svg"
dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

45
project.godot Normal file
View file

@ -0,0 +1,45 @@
; 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="First Game"
run/main_scene="res://scenes/game.tscn"
config/features=PackedStringArray("4.3", "Forward Plus")
config/icon="res://icon.svg"
[autoload]
Music="*res://scenes/music.tscn"
[input]
jump={
"deadzone": 0.5,
"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":4194320,"key_label":0,"unicode":0,"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":32,"key_label":0,"unicode":32,"location":0,"echo":false,"script":null)
]
}
move_left={
"deadzone": 0.5,
"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":4194319,"key_label":0,"unicode":0,"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":65,"key_label":0,"unicode":97,"location":0,"echo":false,"script":null)
]
}
move_right={
"deadzone": 0.5,
"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":4194321,"key_label":0,"unicode":0,"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":68,"key_label":0,"unicode":100,"location":0,"echo":false,"script":null)
]
}
[rendering]
textures/canvas_textures/default_texture_filter=3

25
scenes/boost.tscn Normal file
View file

@ -0,0 +1,25 @@
[gd_scene load_steps=5 format=3 uid="uid://c4tcbum3gjuwf"]
[ext_resource type="Script" path="res://scripts/boost.gd" id="1_dsr6r"]
[ext_resource type="Texture2D" uid="uid://dlly1tyauqodl" path="res://assets/sprites/boost_arrow.png" id="1_ogva3"]
[ext_resource type="AudioStream" uid="uid://chhyiookx3ilk" path="res://assets/sounds/power_up.wav" id="3_h4h5a"]
[sub_resource type="CircleShape2D" id="CircleShape2D_qh1nf"]
radius = 13.0
[node name="Boost" type="Area2D"]
collision_mask = 2
script = ExtResource("1_dsr6r")
[node name="Sprite2D" type="Sprite2D" parent="."]
scale = Vector2(0.139634, 0.139634)
texture = ExtResource("1_ogva3")
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
scale = Vector2(0.98759, 0.987433)
shape = SubResource("CircleShape2D_qh1nf")
[node name="AudioStreamPlayer2D" type="AudioStreamPlayer2D" parent="."]
stream = ExtResource("3_h4h5a")
[connection signal="body_entered" from="." to="." method="_on_body_entered"]

221
scenes/coin.tscn Normal file
View file

@ -0,0 +1,221 @@
[gd_scene load_steps=21 format=3 uid="uid://c0f4soyktwplm"]
[ext_resource type="Script" path="res://scripts/coin.gd" id="1_qvwa1"]
[ext_resource type="Texture2D" uid="uid://bped01tsjeycn" path="res://assets/sprites/coin.png" id="1_smegh"]
[ext_resource type="AudioStream" uid="uid://hxv3svfwkg67" path="res://assets/sounds/coin.wav" id="3_khddo"]
[sub_resource type="AtlasTexture" id="AtlasTexture_g2ywy"]
atlas = ExtResource("1_smegh")
region = Rect2(0, 0, 16, 16)
[sub_resource type="AtlasTexture" id="AtlasTexture_ik3tw"]
atlas = ExtResource("1_smegh")
region = Rect2(16, 0, 16, 16)
[sub_resource type="AtlasTexture" id="AtlasTexture_bjy3d"]
atlas = ExtResource("1_smegh")
region = Rect2(32, 0, 16, 16)
[sub_resource type="AtlasTexture" id="AtlasTexture_kpo2v"]
atlas = ExtResource("1_smegh")
region = Rect2(48, 0, 16, 16)
[sub_resource type="AtlasTexture" id="AtlasTexture_u2kfk"]
atlas = ExtResource("1_smegh")
region = Rect2(64, 0, 16, 16)
[sub_resource type="AtlasTexture" id="AtlasTexture_ci3xo"]
atlas = ExtResource("1_smegh")
region = Rect2(80, 0, 16, 16)
[sub_resource type="AtlasTexture" id="AtlasTexture_26bph"]
atlas = ExtResource("1_smegh")
region = Rect2(96, 0, 16, 16)
[sub_resource type="AtlasTexture" id="AtlasTexture_5mlwc"]
atlas = ExtResource("1_smegh")
region = Rect2(112, 0, 16, 16)
[sub_resource type="AtlasTexture" id="AtlasTexture_qbma7"]
atlas = ExtResource("1_smegh")
region = Rect2(128, 0, 16, 16)
[sub_resource type="AtlasTexture" id="AtlasTexture_it8gd"]
atlas = ExtResource("1_smegh")
region = Rect2(144, 0, 16, 16)
[sub_resource type="AtlasTexture" id="AtlasTexture_5eyw5"]
atlas = ExtResource("1_smegh")
region = Rect2(160, 0, 16, 16)
[sub_resource type="AtlasTexture" id="AtlasTexture_cybqp"]
atlas = ExtResource("1_smegh")
region = Rect2(176, 0, 16, 16)
[sub_resource type="SpriteFrames" id="SpriteFrames_l64mr"]
animations = [{
"frames": [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_g2ywy")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_ik3tw")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_bjy3d")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_kpo2v")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_u2kfk")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_ci3xo")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_26bph")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_5mlwc")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_qbma7")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_it8gd")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_5eyw5")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_cybqp")
}],
"loop": true,
"name": &"spinnycoin",
"speed": 10.0
}]
[sub_resource type="CircleShape2D" id="CircleShape2D_hwfwr"]
radius = 5.0
[sub_resource type="Animation" id="Animation_udfc6"]
length = 0.001
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("AnimatedSprite2D:visible")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [true]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("CollisionShape2D:disabled")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("PickupSound:playing")
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_gfhk0"]
resource_name = "pickup"
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("AnimatedSprite2D:visible")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("CollisionShape2D:disabled")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [true]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("PickupSound:playing")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [true]
}
tracks/3/type = "method"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath(".")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(1),
"transitions": PackedFloat32Array(1),
"values": [{
"args": [],
"method": &"queue_free"
}]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_a7gs7"]
_data = {
"RESET": SubResource("Animation_udfc6"),
"pickup": SubResource("Animation_gfhk0")
}
[node name="Coin" type="Area2D"]
collision_mask = 2
script = ExtResource("1_qvwa1")
[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="."]
sprite_frames = SubResource("SpriteFrames_l64mr")
animation = &"spinnycoin"
autoplay = "spinnycoin"
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
shape = SubResource("CircleShape2D_hwfwr")
[node name="PickupSound" type="AudioStreamPlayer2D" parent="."]
stream = ExtResource("3_khddo")
bus = &"SFX"
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
libraries = {
"": SubResource("AnimationLibrary_a7gs7")
}
[connection signal="body_entered" from="." to="." method="_on_body_entered"]

564
scenes/game.tscn Normal file

File diff suppressed because one or more lines are too long

18
scenes/kill_zone.tscn Normal file
View file

@ -0,0 +1,18 @@
[gd_scene load_steps=3 format=3 uid="uid://c1mg68v18w4v"]
[ext_resource type="Script" path="res://scripts/kill_zone.gd" id="1_thrq8"]
[ext_resource type="AudioStream" uid="uid://d3ga5iqgco704" path="res://assets/sounds/hurt.wav" id="2_besme"]
[node name="KillZone" type="Area2D"]
collision_mask = 2
script = ExtResource("1_thrq8")
[node name="Timer" type="Timer" parent="."]
wait_time = 0.6
one_shot = true
[node name="HurtAudioPlayer" type="AudioStreamPlayer2D" parent="."]
stream = ExtResource("2_besme")
[connection signal="body_entered" from="." to="." method="_on_body_entered"]
[connection signal="timeout" from="Timer" to="." method="_on_timer_timeout"]

8
scenes/music.tscn Normal file
View file

@ -0,0 +1,8 @@
[gd_scene load_steps=2 format=3 uid="uid://clo72nrcc6d2j"]
[ext_resource type="AudioStream" uid="uid://bhdq1ysyu4dli" path="res://assets/music/Faolan_Gaias_Chant.mp3" id="1_g83cg"]
[node name="Music" type="AudioStreamPlayer2D"]
stream = ExtResource("1_g83cg")
autoplay = true
bus = &"Music"

17
scenes/platform.tscn Normal file
View file

@ -0,0 +1,17 @@
[gd_scene load_steps=3 format=3 uid="uid://dy2cgj5ibb8tx"]
[ext_resource type="Texture2D" uid="uid://cxuqjimd7csiq" path="res://assets/sprites/platforms.png" id="1_woepu"]
[sub_resource type="RectangleShape2D" id="RectangleShape2D_qrusg"]
size = Vector2(32, 8)
[node name="Platform" type="AnimatableBody2D"]
[node name="Sprite2D" type="Sprite2D" parent="."]
texture = ExtResource("1_woepu")
region_enabled = true
region_rect = Rect2(16, 0, 32, 9)
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
shape = SubResource("RectangleShape2D_qrusg")
one_way_collision = true

185
scenes/player.tscn Normal file
View file

@ -0,0 +1,185 @@
[gd_scene load_steps=25 format=3 uid="uid://bctm7arnf6byt"]
[ext_resource type="Texture2D" uid="uid://b8cmjj8vq3r8d" path="res://assets/sprites/knight.png" id="1_3eogy"]
[sub_resource type="AtlasTexture" id="AtlasTexture_plx60"]
atlas = ExtResource("1_3eogy")
region = Rect2(0, 0, 32, 32)
[sub_resource type="AtlasTexture" id="AtlasTexture_ftith"]
atlas = ExtResource("1_3eogy")
region = Rect2(32, 0, 32, 32)
[sub_resource type="AtlasTexture" id="AtlasTexture_bfuwa"]
atlas = ExtResource("1_3eogy")
region = Rect2(64, 0, 32, 32)
[sub_resource type="AtlasTexture" id="AtlasTexture_j7avn"]
atlas = ExtResource("1_3eogy")
region = Rect2(96, 0, 32, 32)
[sub_resource type="AtlasTexture" id="AtlasTexture_vuom1"]
atlas = ExtResource("1_3eogy")
region = Rect2(64, 160, 32, 32)
[sub_resource type="AtlasTexture" id="AtlasTexture_kylfx"]
atlas = ExtResource("1_3eogy")
region = Rect2(0, 64, 32, 32)
[sub_resource type="AtlasTexture" id="AtlasTexture_u71vq"]
atlas = ExtResource("1_3eogy")
region = Rect2(32, 64, 32, 32)
[sub_resource type="AtlasTexture" id="AtlasTexture_qp5jh"]
atlas = ExtResource("1_3eogy")
region = Rect2(64, 64, 32, 32)
[sub_resource type="AtlasTexture" id="AtlasTexture_iajmj"]
atlas = ExtResource("1_3eogy")
region = Rect2(96, 64, 32, 32)
[sub_resource type="AtlasTexture" id="AtlasTexture_3cb2l"]
atlas = ExtResource("1_3eogy")
region = Rect2(128, 64, 32, 32)
[sub_resource type="AtlasTexture" id="AtlasTexture_uojbm"]
atlas = ExtResource("1_3eogy")
region = Rect2(160, 64, 32, 32)
[sub_resource type="AtlasTexture" id="AtlasTexture_lhkn6"]
atlas = ExtResource("1_3eogy")
region = Rect2(192, 64, 32, 32)
[sub_resource type="AtlasTexture" id="AtlasTexture_hopry"]
atlas = ExtResource("1_3eogy")
region = Rect2(224, 64, 32, 32)
[sub_resource type="AtlasTexture" id="AtlasTexture_ls3wm"]
atlas = ExtResource("1_3eogy")
region = Rect2(0, 96, 32, 32)
[sub_resource type="AtlasTexture" id="AtlasTexture_x0kw7"]
atlas = ExtResource("1_3eogy")
region = Rect2(32, 96, 32, 32)
[sub_resource type="AtlasTexture" id="AtlasTexture_synuv"]
atlas = ExtResource("1_3eogy")
region = Rect2(64, 96, 32, 32)
[sub_resource type="AtlasTexture" id="AtlasTexture_b3k30"]
atlas = ExtResource("1_3eogy")
region = Rect2(96, 96, 32, 32)
[sub_resource type="AtlasTexture" id="AtlasTexture_xqdv2"]
atlas = ExtResource("1_3eogy")
region = Rect2(128, 96, 32, 32)
[sub_resource type="AtlasTexture" id="AtlasTexture_jm60i"]
atlas = ExtResource("1_3eogy")
region = Rect2(160, 96, 32, 32)
[sub_resource type="AtlasTexture" id="AtlasTexture_wgonx"]
atlas = ExtResource("1_3eogy")
region = Rect2(192, 96, 32, 32)
[sub_resource type="AtlasTexture" id="AtlasTexture_66rf8"]
atlas = ExtResource("1_3eogy")
region = Rect2(224, 96, 32, 32)
[sub_resource type="SpriteFrames" id="SpriteFrames_i0ef4"]
animations = [{
"frames": [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_plx60")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_ftith")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_bfuwa")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_j7avn")
}],
"loop": true,
"name": &"idle",
"speed": 10.0
}, {
"frames": [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_vuom1")
}],
"loop": true,
"name": &"jump",
"speed": 5.0
}, {
"frames": [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_kylfx")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_u71vq")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_qp5jh")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_iajmj")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_3cb2l")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_uojbm")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_lhkn6")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_hopry")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_ls3wm")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_x0kw7")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_synuv")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_b3k30")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_xqdv2")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_jm60i")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_wgonx")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_66rf8")
}],
"loop": true,
"name": &"run",
"speed": 10.0
}]
[sub_resource type="RectangleShape2D" id="RectangleShape2D_lj4mw"]
size = Vector2(10, 15)
[node name="Player" type="CharacterBody2D"]
z_index = 5
collision_layer = 2
[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="."]
position = Vector2(0, -12)
sprite_frames = SubResource("SpriteFrames_i0ef4")
animation = &"run"
autoplay = "idle"
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
position = Vector2(0, -7.5)
shape = SubResource("RectangleShape2D_lj4mw")

68
scenes/slime.tscn Normal file
View file

@ -0,0 +1,68 @@
[gd_scene load_steps=10 format=3 uid="uid://couldn2p7ji40"]
[ext_resource type="Texture2D" uid="uid://bl53gpvg5mh1y" path="res://assets/sprites/slime_green.png" id="1_0d7ny"]
[ext_resource type="Script" path="res://scripts/slime.gd" id="1_yja1u"]
[ext_resource type="PackedScene" uid="uid://c1mg68v18w4v" path="res://scenes/kill_zone.tscn" id="2_4sy8s"]
[sub_resource type="AtlasTexture" id="AtlasTexture_fkx3u"]
atlas = ExtResource("1_0d7ny")
region = Rect2(0, 24, 24, 24)
[sub_resource type="AtlasTexture" id="AtlasTexture_81u4a"]
atlas = ExtResource("1_0d7ny")
region = Rect2(24, 24, 24, 24)
[sub_resource type="AtlasTexture" id="AtlasTexture_vnwch"]
atlas = ExtResource("1_0d7ny")
region = Rect2(48, 24, 24, 24)
[sub_resource type="AtlasTexture" id="AtlasTexture_tnh43"]
atlas = ExtResource("1_0d7ny")
region = Rect2(72, 24, 24, 24)
[sub_resource type="SpriteFrames" id="SpriteFrames_ck5td"]
animations = [{
"frames": [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_fkx3u")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_81u4a")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_vnwch")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_tnh43")
}],
"loop": true,
"name": &"idle",
"speed": 10.0
}]
[sub_resource type="RectangleShape2D" id="RectangleShape2D_e6ink"]
size = Vector2(10, 12)
[node name="Slime" type="Node2D"]
script = ExtResource("1_yja1u")
[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="."]
sprite_frames = SubResource("SpriteFrames_ck5td")
animation = &"idle"
autoplay = "idle"
frame_progress = 0.99564
[node name="KillZone" parent="." instance=ExtResource("2_4sy8s")]
[node name="CollisionShape2D" type="CollisionShape2D" parent="KillZone"]
position = Vector2(0, 6)
shape = SubResource("RectangleShape2D_e6ink")
[node name="RayCastRight" type="RayCast2D" parent="."]
position = Vector2(0, 6)
target_position = Vector2(12, 0)
[node name="RayCastLeft" type="RayCast2D" parent="."]
position = Vector2(0, 6)
rotation = -0.00269656
target_position = Vector2(-12, 0)

11
scripts/boost.gd Normal file
View file

@ -0,0 +1,11 @@
extends Area2D
@export var boost_strength: float = 450.0 # Acceleration applied over time
@onready var audio_stream_player: AudioStreamPlayer2D = $AudioStreamPlayer2D
func _on_body_entered(body: Node2D) -> void:
if body is CharacterBody2D:
var direction = Vector2.RIGHT.rotated(rotation)
body.velocity += direction * boost_strength
audio_stream_player.play()

9
scripts/coin.gd Normal file
View file

@ -0,0 +1,9 @@
extends Area2D
@onready var game_manager: Node = %GameManager
@onready var animation_player: AnimationPlayer = $AnimationPlayer
func _on_body_entered(body: Node2D) -> void:
game_manager.add_score_point()
animation_player.play("pickup")

9
scripts/game_manager.gd Normal file
View file

@ -0,0 +1,9 @@
extends Node
@onready var score_label: Label = $ScoreLabel
var score: int = 0
func add_score_point():
score += 1
score_label.text = "You collected " + str(score) + " coins."

16
scripts/kill_zone.gd Normal file
View file

@ -0,0 +1,16 @@
extends Area2D
@onready var timer: Timer = $Timer
@onready var hurt_audio_player: AudioStreamPlayer2D = $HurtAudioPlayer
func _on_body_entered(body: Node2D) -> void:
# Slow down everything
Engine.time_scale = 0.5
# Remove the player's collider, making them fall through the map
body.get_node("CollisionShape2D").queue_free()
hurt_audio_player.play()
timer.start()
func _on_timer_timeout() -> void:
Engine.time_scale = 1
get_tree().reload_current_scene()

48
scripts/player.gd Normal file
View file

@ -0,0 +1,48 @@
extends CharacterBody2D
@onready var animated_sprite: AnimatedSprite2D = $AnimatedSprite2D
const JUMP_VELOCITY = -300.0
const MAX_WALK_SPEED = 130.0
const ACCELERATION = 800.0 # Acceleration for smoother movement
const FRICTION = 600.0 # Deceleration when no input is given
var direction: float = 0
func _process(delta: float) -> void:
# Flip the sprite based on current direction
if direction != 0:
animated_sprite.flip_h = direction == -1
# Play animatinos
if not is_on_floor():
animated_sprite.play("jump")
elif direction != 0:
animated_sprite.play("run")
else:
animated_sprite.play("idle")
func _physics_process(delta: float) -> void:
# Add the gravity
if not is_on_floor():
velocity += get_gravity() * delta
# Handle jump30
if Input.is_action_just_pressed("jump") and is_on_floor():
velocity.y += JUMP_VELOCITY
# Get the input direction and handle the movement.
direction = Input.get_axis("move_left", "move_right")
if direction:
# Only apply more move acceleration if we're at/past max walk speed
# (only if accelerating towards opposite direction, or not yet at max speed)
#
# This implementation makes sure we don't accientaly decelerate by moving if we
# got velocity from something else (e.g. a boost), which the move_towards func
# would otherwise do.
if sign(velocity.x) != sign(direction) or abs(velocity.x) < MAX_WALK_SPEED:
velocity.x = move_toward(velocity.x, direction * MAX_WALK_SPEED, ACCELERATION * delta)
else:
velocity.x = move_toward(velocity.x, 0, FRICTION * delta)
move_and_slide()

21
scripts/slime.gd Normal file
View file

@ -0,0 +1,21 @@
extends Node2D
@export var speed = 50
@onready var ray_cast_right: RayCast2D = $RayCastRight
@onready var ray_cast_left: RayCast2D = $RayCastLeft
@onready var animated_sprite: AnimatedSprite2D = $AnimatedSprite2D
var direction = 1
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
if direction == 1 and ray_cast_right.is_colliding():
direction = -1
animated_sprite.flip_h = true
if direction == -1 and ray_cast_left.is_colliding():
direction = 1
animated_sprite.flip_h = false
position.x += direction * speed * delta