Compare commits

...

10 Commits

91 changed files with 2171 additions and 162 deletions

View File

@@ -30,9 +30,9 @@ func load_game() -> bool:
print("Game state loaded from: ", save_path)
print("Player state: ", save_data["player_state"])
gm.player_state = save_data["player_state"]
var skills: Array[String] = []
for skill_name in gm.player_state["unlocked_skills"]:
skills.append(skill_name)
var skills: Array[SkillData] = []
for skill in gm.player_state["unlocked_skills"]:
skills.append(skill)
gm.unlock_skills(skills)
return true

View File

@@ -1,4 +1,4 @@
[gd_scene load_steps=9 format=3 uid="uid://bymro4t7angv5"]
[gd_scene load_steps=10 format=3 uid="uid://bymro4t7angv5"]
[ext_resource type="Texture2D" uid="uid://djifxc5x0dyrw" path="res://sprites/ppc_tileset.png" id="1_1c3jb"]
[ext_resource type="Script" uid="uid://cdnwrn8v05qhi" path="res://scripts/components/bullet_component.gd" id="2_i6t5k"]
@@ -7,6 +7,7 @@
[ext_resource type="Script" uid="uid://bgty7040ams6s" path="res://scripts/components/projectile_init_component.gd" id="5_2vqt8"]
[ext_resource type="Script" uid="uid://873un8agkyja" path="res://scripts/components/launch_component.gd" id="6_d0tcd"]
[ext_resource type="Script" uid="uid://cvcnfrr1udco5" path="res://scripts/components/straight_motion_component.gd" id="7_r41xl"]
[ext_resource type="PackedScene" uid="uid://c1iorglk708g0" path="res://objects/fxs/terrain_hit_fx.tscn" id="8_d0tcd"]
[sub_resource type="RectangleShape2D" id="RectangleShape2D_ar0xf"]
size = Vector2(16, 10)
@@ -24,10 +25,12 @@ hframes = 12
vframes = 12
frame = 80
[node name="BulletComponent" type="Node" parent="." node_paths=PackedStringArray("root", "area2d")]
[node name="BulletComponent" type="Node" parent="." node_paths=PackedStringArray("root", "area2d", "hit_terrain_fx", "bullet_sprite")]
script = ExtResource("2_i6t5k")
root = NodePath("..")
area2d = NodePath("..")
hit_terrain_fx = NodePath("../TerrainHitFX")
bullet_sprite = NodePath("../Sprite2D")
[node name="VisibleOnScreenNotifier2D" type="VisibleOnScreenNotifier2D" parent="."]
position = Vector2(0, 2.38419e-07)
@@ -60,3 +63,5 @@ script = ExtResource("7_r41xl")
root = NodePath("..")
launch_component = NodePath("../LaunchComponent")
metadata/_custom_type_script = "uid://cvcnfrr1udco5"
[node name="TerrainHitFX" parent="." instance=ExtResource("8_d0tcd")]

View File

@@ -1,12 +1,12 @@
[gd_scene load_steps=47 format=3 uid="uid://bqi5s710xb1ju"]
[gd_scene load_steps=48 format=3 uid="uid://bqi5s710xb1ju"]
[ext_resource type="Script" uid="uid://ccuddyoakg04u" path="res://scripts/player.gd" id="1_8j4h4"]
[ext_resource type="Texture2D" uid="uid://b7gp0gqvkv8j4" path="res://sprites/MrBrick_base.png" id="2_bc55y"]
[ext_resource type="Shader" uid="uid://bs4xvm4qkurpr" path="res://shaders/hit_flash.tres" id="2_lgb3u"]
[ext_resource type="Texture2D" uid="uid://jl1gwqchhpdc" path="res://sprites/left_eye.png" id="3_2srrh"]
[ext_resource type="Script" uid="uid://b3mrdvre1y567" path="res://scripts/components/ship_movement.gd" id="3_p4n66"]
[ext_resource type="Texture2D" uid="uid://iiawtnwmeny3" path="res://sprites/right_eye.png" id="4_ccn81"]
[ext_resource type="Script" uid="uid://oxeqvxkgj87j" path="res://scripts/components/flip_player.gd" id="5_geu10"]
[ext_resource type="Texture2D" uid="uid://0l454rfplmqg" path="res://sprites/MrBrick_base-sheet.png" id="5_yysbb"]
[ext_resource type="Script" uid="uid://qeu80jy4vmuf" path="res://scripts/components/score.gd" id="6_fowa2"]
[ext_resource type="Script" uid="uid://btfsq0bvtrx3t" path="res://scripts/components/health.gd" id="7_tqjk8"]
[ext_resource type="Script" uid="uid://dkpu3121y88oo" path="res://scripts/components/player_death.gd" id="8_1v23d"]
@@ -37,6 +37,7 @@
[ext_resource type="Script" uid="uid://d1ctdx52gskv1" path="res://scripts/components/ship_shooter.gd" id="34_gwc8i"]
[ext_resource type="PackedScene" uid="uid://dtem8jgcyoqar" path="res://objects/entities/green_laser.tscn" id="36_oxudy"]
[ext_resource type="Script" uid="uid://cfeoalic0mu2j" path="res://scripts/components/kill_player_out_of_screen.gd" id="37_oxudy"]
[ext_resource type="Script" uid="uid://d32kd83lf86iy" path="res://scripts/components/progressive_damage_component.gd" id="38_o1ihh"]
[sub_resource type="ShaderMaterial" id="ShaderMaterial_xoue7"]
shader = ExtResource("2_lgb3u")
@@ -116,7 +117,8 @@ metadata/_custom_type_script = "uid://b3mrdvre1y567"
[node name="Base" type="Sprite2D" parent="Graphics/Root"]
material = SubResource("ShaderMaterial_xoue7")
texture = ExtResource("2_bc55y")
texture = ExtResource("5_yysbb")
hframes = 5
[node name="Left Eye" type="Sprite2D" parent="Graphics/Root"]
position = Vector2(-7, -6)
@@ -277,5 +279,13 @@ script = ExtResource("37_oxudy")
screen_notifier = NodePath("../VisibleOnScreenNotifier2D")
health_component = NodePath("../HealthComponent")
[node name="ProgressiveDamageComponent" type="Node" parent="." node_paths=PackedStringArray("health_component", "sprite", "platform_movement")]
script = ExtResource("38_o1ihh")
health_component = NodePath("../HealthComponent")
sprite = NodePath("../Graphics/Root/Base")
platform_movement = NodePath("../Movements/PlatformMovement")
min_jump_height = 100.0
jump_reduction_percentage = 0.15
[connection signal="on_death" from="HealthComponent" to="PlayerDeathComponent" method="_on_health_component_on_death"]
[connection signal="on_health_change" from="HealthComponent" to="KnockbackComponent" method="_on_health_component_on_health_change"]

View File

@@ -1,4 +1,4 @@
[gd_scene load_steps=9 format=3 uid="uid://bhc7y4xugu4q7"]
[gd_scene load_steps=10 format=3 uid="uid://bhc7y4xugu4q7"]
[ext_resource type="Texture2D" uid="uid://djifxc5x0dyrw" path="res://sprites/ppc_tileset.png" id="1_w543f"]
[ext_resource type="Script" uid="uid://dkmxhjtmu5xlb" path="res://scripts/components/damage_component.gd" id="2_ll0xw"]
@@ -7,6 +7,7 @@
[ext_resource type="Script" uid="uid://bvsgg8lu0a8m6" path="res://scripts/components/lifetime_component.gd" id="5_qsc5m"]
[ext_resource type="Script" uid="uid://873un8agkyja" path="res://scripts/components/launch_component.gd" id="6_6th6w"]
[ext_resource type="Script" uid="uid://cvcnfrr1udco5" path="res://scripts/components/straight_motion_component.gd" id="7_e0mqp"]
[ext_resource type="PackedScene" uid="uid://c1iorglk708g0" path="res://objects/fxs/terrain_hit_fx.tscn" id="8_6th6w"]
[sub_resource type="CircleShape2D" id="CircleShape2D_txsw8"]
radius = 4.0
@@ -59,8 +60,13 @@ script = ExtResource("7_e0mqp")
root = NodePath("..")
launch_component = NodePath("../LaunchComponent")
[node name="BulletComponent" type="Node" parent="." node_paths=PackedStringArray("root", "area2d")]
[node name="BulletComponent" type="Node" parent="." node_paths=PackedStringArray("root", "area2d", "hit_terrain_fx", "bullet_sprite")]
script = ExtResource("3_keogl")
root = NodePath("..")
area2d = NodePath("..")
hit_terrain_fx = NodePath("../TerrainHitFX")
bullet_sprite = NodePath("../Sprite2D")
metadata/_custom_type_script = "uid://cdnwrn8v05qhi"
[node name="TerrainHitFX" parent="." instance=ExtResource("8_6th6w")]
z_index = 3

View File

@@ -126,9 +126,11 @@ area2d = NodePath("../Hitbox")
[node name="PeriodicShootingComponent" type="Node" parent="." node_paths=PackedStringArray("root", "bullet_spawn_right", "bullet_spawn_left")]
script = ExtResource("6_4ajjm")
bullet_scene = ExtResource("7_4ajjm")
shoot_interval = 2.0
root = NodePath("..")
bullet_spawn_right = NodePath("../laser spawn point right")
bullet_spawn_left = NodePath("../laser spawn point left")
shooting_interval_variation = 0.5
[node name="EnemyDeathComponent" type="Node" parent="." node_paths=PackedStringArray("root", "collision_shape_2d", "health_component")]
script = ExtResource("7_uyhuj")

View File

@@ -1,4 +1,4 @@
[gd_scene load_steps=9 format=3 uid="uid://dtem8jgcyoqar"]
[gd_scene load_steps=10 format=3 uid="uid://dtem8jgcyoqar"]
[ext_resource type="Script" uid="uid://dkmxhjtmu5xlb" path="res://scripts/components/damage_component.gd" id="1_nuljg"]
[ext_resource type="Script" uid="uid://cdnwrn8v05qhi" path="res://scripts/components/bullet_component.gd" id="2_1gu8o"]
@@ -7,16 +7,18 @@
[ext_resource type="Script" uid="uid://873un8agkyja" path="res://scripts/components/launch_component.gd" id="5_772bd"]
[ext_resource type="Script" uid="uid://bvsgg8lu0a8m6" path="res://scripts/components/lifetime_component.gd" id="6_vd16u"]
[ext_resource type="Script" uid="uid://bgty7040ams6s" path="res://scripts/components/projectile_init_component.gd" id="7_1gu8o"]
[ext_resource type="Script" uid="uid://bpy6xtfm8l3hy" path="res://scripts/components/trigger_lever_component.gd" id="8_2vcrp"]
[sub_resource type="RectangleShape2D" id="RectangleShape2D_n4uav"]
size = Vector2(16, 2)
[node name="Red Laser" type="Area2D"]
[node name="Green Laser" type="Area2D"]
collision_layer = 16
collision_mask = 9
[node name="DamageComponent" type="Node" parent="." node_paths=PackedStringArray("area2d")]
script = ExtResource("1_nuljg")
damage = 1.0
area2d = NodePath("..")
metadata/_custom_type_script = "uid://dkmxhjtmu5xlb"
@@ -72,3 +74,7 @@ autostart = true
script = ExtResource("7_1gu8o")
launch_component = NodePath("../LaunchComponent")
metadata/_custom_type_script = "uid://bgty7040ams6s"
[node name="TriggerLeverComponent" type="Node" parent="."]
script = ExtResource("8_2vcrp")
metadata/_custom_type_script = "uid://bpy6xtfm8l3hy"

View File

@@ -9,7 +9,7 @@ size = Vector2(12, 13)
[node name="Lever" type="Area2D" groups=["levers"]]
collision_layer = 0
collision_mask = 4
collision_mask = 20
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
position = Vector2(0, 1.5)

View File

@@ -0,0 +1,32 @@
[gd_scene load_steps=6 format=3 uid="uid://t6h2ra7kjyq"]
[ext_resource type="Texture2D" uid="uid://1x4iq56rhc18" path="res://sprites/health_potions.png" id="1_p0sdo"]
[ext_resource type="Script" uid="uid://cegdd1sravi5m" path="res://scripts/components/heal_component.gd" id="2_piwlp"]
[ext_resource type="Script" uid="uid://pa1bwc4no08q" path="res://scripts/components/collectable.gd" id="3_k2tv6"]
[ext_resource type="Resource" uid="uid://2tl3yoh202no" path="res://resources/collectables/small_health_potion.tres" id="4_p0sdo"]
[sub_resource type="CircleShape2D" id="CircleShape2D_uj2v5"]
radius = 7.0
[node name="SmallHealPotion" type="Area2D"]
collision_layer = 0
collision_mask = 4
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
shape = SubResource("CircleShape2D_uj2v5")
[node name="Sprite2D" type="Sprite2D" parent="."]
texture = ExtResource("1_p0sdo")
hframes = 4
frame = 1
[node name="HealComponent" type="Node" parent="." node_paths=PackedStringArray("collectable")]
script = ExtResource("2_piwlp")
collectable = NodePath("../CollectableComponent")
[node name="CollectableComponent" type="Node" parent="." node_paths=PackedStringArray("area2d", "collision_shape")]
script = ExtResource("3_k2tv6")
area2d = NodePath("..")
collision_shape = NodePath("../CollisionShape2D")
collectable_data = ExtResource("4_p0sdo")
metadata/_custom_type_script = "uid://pa1bwc4no08q"

View File

@@ -0,0 +1,14 @@
[gd_scene load_steps=3 format=3 uid="uid://dkqa3q6j2gof4"]
[ext_resource type="Script" uid="uid://ybmwls7hv8j3" path="res://scripts/components/spaceship_exit_component.gd" id="1_1cmfv"]
[sub_resource type="RectangleShape2D" id="RectangleShape2D_njt46"]
[node name="Spaceship exit" type="Area2D" node_paths=PackedStringArray("area2d")]
collision_layer = 0
collision_mask = 4
script = ExtResource("1_1cmfv")
area2d = NodePath(".")
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
shape = SubResource("RectangleShape2D_njt46")

View File

@@ -0,0 +1,49 @@
[gd_scene load_steps=5 format=3 uid="uid://blpk55m4e7y3a"]
[ext_resource type="Texture2D" uid="uid://055an6f4wluo" path="res://sprites/backgrounds/forest/PS_Forest_01.png" id="1_vpdhu"]
[ext_resource type="Texture2D" uid="uid://dk8846ai1ht6i" path="res://sprites/backgrounds/forest/PS_Forest_02.png" id="2_11jh3"]
[ext_resource type="Texture2D" uid="uid://bl3iv071i34ge" path="res://sprites/backgrounds/forest/PS_Forest_03.png" id="3_j8xur"]
[ext_resource type="Texture2D" uid="uid://bcrqiyfk6fpgq" path="res://sprites/backgrounds/forest/PS_Forest_04.png" id="4_qdo8p"]
[node name="ParallaxBackground" type="ParallaxBackground"]
[node name="Sky" type="ParallaxLayer" parent="."]
motion_scale = Vector2(0, 0)
motion_mirroring = Vector2(480, 0)
[node name="Sprite2D" type="Sprite2D" parent="Sky"]
texture_repeat = 2
scale = Vector2(1.5, 1.013)
texture = ExtResource("1_vpdhu")
centered = false
[node name="Clouds" type="ParallaxLayer" parent="."]
motion_scale = Vector2(0.1, 0.1)
motion_mirroring = Vector2(480, 0)
[node name="Sprite2D" type="Sprite2D" parent="Clouds"]
texture_repeat = 2
scale = Vector2(1.5, 1.5)
texture = ExtResource("2_11jh3")
centered = false
[node name="Hills" type="ParallaxLayer" parent="."]
motion_scale = Vector2(0.2, 0.2)
motion_mirroring = Vector2(480, 0)
[node name="Sprite2D" type="Sprite2D" parent="Hills"]
texture_repeat = 2
scale = Vector2(1.5, 1.5)
texture = ExtResource("3_j8xur")
centered = false
[node name="Ground" type="ParallaxLayer" parent="."]
motion_scale = Vector2(0.4, 0.4)
motion_offset = Vector2(0.1, 0)
motion_mirroring = Vector2(480, 0)
[node name="Sprite2D" type="Sprite2D" parent="Ground"]
texture_repeat = 2
scale = Vector2(1.5, 1.5)
texture = ExtResource("4_qdo8p")
centered = false

View File

@@ -0,0 +1,80 @@
[gd_scene load_steps=8 format=3 uid="uid://c1iorglk708g0"]
[ext_resource type="Script" uid="uid://djfejwp6e402k" path="res://scripts/components/terrain_hit_fx.gd" id="1_22p6x"]
[sub_resource type="GradientTexture1D" id="GradientTexture1D_6dbny"]
[sub_resource type="Curve" id="Curve_22p6x"]
_data = [Vector2(0, 1), 0.0, 0.0, 0, 0, Vector2(0.743682, 0.699254), -0.879484, -0.879484, 0, 0, Vector2(1, 0.0104477), 2.07887, 0.0, 0, 0]
point_count = 3
[sub_resource type="CurveTexture" id="CurveTexture_nm1g5"]
curve = SubResource("Curve_22p6x")
[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_hryxg"]
lifetime_randomness = 0.1
particle_flag_disable_z = true
inherit_velocity_ratio = -0.5
direction = Vector3(0, 0, 0)
spread = 180.0
initial_velocity_max = 32.0
gravity = Vector3(0, 98, 0)
scale_curve = SubResource("CurveTexture_nm1g5")
color = Color(0.47451, 0.254902, 0, 1)
color_ramp = SubResource("GradientTexture1D_6dbny")
turbulence_noise_speed = Vector3(2.73, 5.225, 0)
[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_hyh53"]
lifetime_randomness = 0.2
particle_flag_disable_z = true
inherit_velocity_ratio = -0.5
direction = Vector3(0, 0, 0)
spread = 180.0
initial_velocity_max = 32.0
gravity = Vector3(0, 98, 0)
scale_min = 0.8
scale_max = 0.9
scale_curve = SubResource("CurveTexture_nm1g5")
color = Color(0.47451, 0.254902, 0, 1)
turbulence_noise_speed = Vector3(2.73, 5.225, 0)
[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_n5pa8"]
lifetime_randomness = 0.1
particle_flag_disable_z = true
inherit_velocity_ratio = -0.5
direction = Vector3(0, 0, 0)
spread = 180.0
initial_velocity_max = 32.0
gravity = Vector3(0, 98, 0)
scale_min = 0.9
scale_curve = SubResource("CurveTexture_nm1g5")
color = Color(0.764706, 0.443137, 0, 1)
turbulence_noise_speed = Vector3(2.73, 5.225, 0)
[node name="TerrainHitFX" type="GPUParticles2D"]
emitting = false
amount = 24
lifetime = 0.35
one_shot = true
explosiveness = 1.0
fixed_fps = 24
process_material = SubResource("ParticleProcessMaterial_hryxg")
script = ExtResource("1_22p6x")
[node name="TerrainHitFX2" type="GPUParticles2D" parent="."]
emitting = false
amount = 24
lifetime = 0.35
one_shot = true
explosiveness = 1.0
fixed_fps = 24
process_material = SubResource("ParticleProcessMaterial_hyh53")
[node name="TerrainHitFX" type="GPUParticles2D" parent="."]
emitting = false
amount = 24
lifetime = 0.35
one_shot = true
explosiveness = 1.0
fixed_fps = 24
process_material = SubResource("ParticleProcessMaterial_n5pa8")

View File

@@ -1,13 +1,15 @@
[gd_scene load_steps=5 format=3 uid="uid://b4eifkc31jsun"]
[gd_scene load_steps=7 format=3 uid="uid://b4eifkc31jsun"]
[ext_resource type="Script" uid="uid://dd30bgqiagi25" path="res://scripts/game_manager.gd" id="1_58t7u"]
[ext_resource type="PackedScene" uid="uid://bol7g83v2accs" path="res://scenes/level_village_1.tscn" id="2_bentb"]
[ext_resource type="PackedScene" uid="uid://chqb11pfoqmeb" path="res://scenes/level_village_2.tscn" id="3_ajlkg"]
[ext_resource type="PackedScene" uid="uid://h60obxmju6mo" path="res://scenes/level_village_3.tscn" id="4_se5tb"]
[ext_resource type="PackedScene" uid="uid://bhad760x3vvco" path="res://scenes/level_village_4.tscn" id="5_mnosh"]
[ext_resource type="Script" uid="uid://bydv4g1n5s3nf" path="res://scripts/screenshot.gd" id="6_t2tr6"]
[node name="GameManager" type="Node"]
script = ExtResource("1_58t7u")
level_scenes = Array[PackedScene]([ExtResource("2_bentb"), ExtResource("3_ajlkg"), ExtResource("4_se5tb")])
level_scenes = Array[PackedScene]([ExtResource("2_bentb"), ExtResource("3_ajlkg"), ExtResource("4_se5tb"), ExtResource("5_mnosh")])
player_state = {
"coins": 0,
"current_level": 0,
@@ -15,3 +17,6 @@ player_state = {
"unlocked_levels": [ExtResource("4_se5tb")],
"unlocked_skills": []
}
[node name="Node" type="Node" parent="."]
script = ExtResource("6_t2tr6")

View File

@@ -1,8 +1,9 @@
[gd_scene load_steps=4 format=3 uid="uid://cb0mnye1ki5a6"]
[gd_scene load_steps=5 format=3 uid="uid://cb0mnye1ki5a6"]
[ext_resource type="Script" uid="uid://cie33tct7ehf0" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="1_5abjq"]
[ext_resource type="PackedScene" uid="uid://dtjrpkhssq32a" path="res://objects/bg.tscn" id="2_nd58g"]
[ext_resource type="PackedScene" uid="uid://bva54p1fxomu2" path="res://objects/parallax_background.tscn" id="3_cdmor"]
[ext_resource type="PackedScene" uid="uid://bva54p1fxomu2" path="res://objects/village_parallax_background.tscn" id="3_cdmor"]
[ext_resource type="PackedScene" uid="uid://blpk55m4e7y3a" path="res://objects/forest_parallax_background.tscn" id="4_nd58g"]
[node name="Camera2D" type="Camera2D"]
limit_left = 320
@@ -22,4 +23,7 @@ z_index = -3
scale = Vector2(1.5, 1.5)
metadata/_edit_lock_ = true
[node name="ParallaxBackground" parent="." instance=ExtResource("3_cdmor")]
[node name="VillageParallaxBackground" parent="." instance=ExtResource("3_cdmor")]
[node name="ParallaxBackground" parent="." instance=ExtResource("4_nd58g")]
visible = false

View File

@@ -48,14 +48,17 @@ theme_override_constants/margin_bottom = 8
[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer/MarginContainer"]
layout_mode = 2
theme_override_constants/separation = 8
alignment = 1
[node name="Health Label" type="Label" parent="PanelContainer/MarginContainer/HBoxContainer"]
visible = false
layout_mode = 2
text = "HEALTH_LABEL"
label_settings = ExtResource("1_4dsh5")
uppercase = true
[node name="ProgressBar" type="ProgressBar" parent="PanelContainer/MarginContainer/HBoxContainer"]
visible = false
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 1
@@ -68,12 +71,16 @@ show_percentage = false
[node name="Lives" type="Label" parent="PanelContainer/MarginContainer/HBoxContainer"]
layout_mode = 2
size_flags_horizontal = 3
text = "LIVES_LABEL"
label_settings = ExtResource("1_4dsh5")
horizontal_alignment = 1
uppercase = true
[node name="Coins label" type="Label" parent="PanelContainer/MarginContainer/HBoxContainer"]
layout_mode = 2
size_flags_horizontal = 3
text = "COINS_LABEL"
label_settings = ExtResource("1_4dsh5")
horizontal_alignment = 1
uppercase = true

View File

@@ -1,4 +1,4 @@
[gd_scene load_steps=11 format=3 uid="uid://dlm2ri562fynd"]
[gd_scene load_steps=12 format=3 uid="uid://dlm2ri562fynd"]
[ext_resource type="Script" uid="uid://duifmqjarjpuv" path="res://scripts/ui/marketplace.gd" id="1_ncpyg"]
[ext_resource type="FontFile" uid="uid://xm0vbusjr7b7" path="res://fonts/PressStart2P-Regular.ttf" id="2_ho1tm"]
@@ -9,11 +9,12 @@
[ext_resource type="Resource" uid="uid://cx5fsbexblp60" path="res://resources/skills/ice_brick.tres" id="6_6665y"]
[ext_resource type="Resource" uid="uid://d3bjre2etov1n" path="res://resources/skills/magnetic.tres" id="7_ukny6"]
[ext_resource type="PackedScene" uid="uid://dtl03rod7l2t0" path="res://objects/ui/marketplace_button.tscn" id="9_ode10"]
[ext_resource type="PackedScene" uid="uid://ceqjwmihj70lt" path="res://objects/ui/skill_button.tscn" id="10_c7w2b"]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ode10"]
bg_color = Color(0, 0, 0, 1)
[node name="Marketplace" type="Control" node_paths=PackedStringArray("root", "grid")]
[node name="Marketplace" type="Control" node_paths=PackedStringArray("root", "to_unlock_grid", "unlocked_grid")]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
@@ -23,9 +24,11 @@ grow_vertical = 2
script = ExtResource("1_ncpyg")
root = NodePath(".")
skill_data = Array[ExtResource("2_pg4mc")]([ExtResource("3_bk5yi"), ExtResource("4_tx0n3"), ExtResource("5_fqx8e"), ExtResource("6_6665y"), ExtResource("7_ukny6")])
grid = NodePath("PanelContainer/MarginContainer/VBoxContainer/GridContainer")
to_unlock_grid = NodePath("PanelContainer/MarginContainer/VBoxContainer/ToUnlockGridContainer")
unlocked_grid = NodePath("PanelContainer/MarginContainer/VBoxContainer/UnlockedGridContainer")
font = ExtResource("2_ho1tm")
marketplace_button = ExtResource("9_ode10")
skill_button = ExtResource("10_c7w2b")
[node name="PanelContainer" type="PanelContainer" parent="."]
layout_mode = 1
@@ -55,7 +58,14 @@ vertical_alignment = 1
justification_flags = 162
uppercase = true
[node name="GridContainer" type="GridContainer" parent="PanelContainer/MarginContainer/VBoxContainer"]
[node name="ToUnlockGridContainer" type="GridContainer" parent="PanelContainer/MarginContainer/VBoxContainer"]
layout_mode = 2
size_flags_vertical = 2
theme_override_constants/h_separation = 4
theme_override_constants/v_separation = 16
columns = 3
[node name="UnlockedGridContainer" type="GridContainer" parent="PanelContainer/MarginContainer/VBoxContainer"]
layout_mode = 2
size_flags_vertical = 2
theme_override_constants/h_separation = 4

View File

@@ -1,8 +1,11 @@
[gd_scene load_steps=2 format=3 uid="uid://dtl03rod7l2t0"]
[gd_scene load_steps=5 format=3 uid="uid://dtl03rod7l2t0"]
[ext_resource type="Texture2D" uid="uid://cvhoq7aubxlmq" path="res://sprites/ui/magnetic_skill_icon.png" id="1_5kqfg"]
[ext_resource type="Script" uid="uid://dx8lex40lotr5" path="res://scripts/ui/marketplace_button.gd" id="2_ulgvb"]
[ext_resource type="Texture2D" uid="uid://52adghxscdgy" path="res://sprites/locked_skill.png" id="2_vb2qn"]
[ext_resource type="Texture2D" uid="uid://rucyqmgrdld3" path="res://sprites/unlocked_skill.png" id="3_guyun"]
[node name="MarketplaceButton" type="Button"]
[node name="MarketplaceButton" type="Button" node_paths=PackedStringArray("skill_level_container")]
offset_right = 8.0
offset_bottom = 8.0
size_flags_horizontal = 3
@@ -12,3 +15,17 @@ text = "Fire brick 100"
icon = ExtResource("1_5kqfg")
flat = true
autowrap_mode = 2
script = ExtResource("2_ulgvb")
unlocked_skill_icon = ExtResource("3_guyun")
locked_skill_icon = ExtResource("2_vb2qn")
skill_level_container = NodePath("HBoxContainer")
[node name="HBoxContainer" type="HBoxContainer" parent="."]
layout_mode = 1
anchors_preset = 12
anchor_top = 1.0
anchor_right = 1.0
anchor_bottom = 1.0
offset_top = -8.0
grow_horizontal = 2
grow_vertical = 0

View File

@@ -0,0 +1,16 @@
[gd_scene load_steps=3 format=3 uid="uid://ceqjwmihj70lt"]
[ext_resource type="Texture2D" uid="uid://cvhoq7aubxlmq" path="res://sprites/ui/magnetic_skill_icon.png" id="1_wnfk3"]
[ext_resource type="Script" uid="uid://0obbehfd8fki" path="res://scripts/ui/skill_button.gd" id="2_m2732"]
[node name="SkillButton" type="Button"]
offset_right = 8.0
offset_bottom = 8.0
size_flags_horizontal = 3
size_flags_vertical = 3
theme_override_font_sizes/font_size = 8
text = "Fire brick 100"
icon = ExtResource("1_wnfk3")
flat = true
autowrap_mode = 2
script = ExtResource("2_m2732")

View File

@@ -1,9 +1,9 @@
[gd_scene load_steps=5 format=3 uid="uid://bva54p1fxomu2"]
[ext_resource type="Texture2D" uid="uid://d2f4ooucvrjcc" path="res://sprites/backgrounds/plains/1.png" id="1_rfutu"]
[ext_resource type="Texture2D" uid="uid://cdgk3fi8owc6o" path="res://sprites/backgrounds/plains/2.png" id="2_uysv2"]
[ext_resource type="Texture2D" uid="uid://p0bt2k2lihlx" path="res://sprites/backgrounds/plains/3.png" id="3_l6n33"]
[ext_resource type="Texture2D" uid="uid://bcahm7wqdbn6n" path="res://sprites/backgrounds/plains/4.png" id="4_jkhju"]
[ext_resource type="Texture2D" uid="uid://d2f4ooucvrjcc" path="res://sprites/backgrounds/plains/1.png" id="1_kdcp8"]
[ext_resource type="Texture2D" uid="uid://cdgk3fi8owc6o" path="res://sprites/backgrounds/plains/2.png" id="2_ev808"]
[ext_resource type="Texture2D" uid="uid://p0bt2k2lihlx" path="res://sprites/backgrounds/plains/3.png" id="3_sfana"]
[ext_resource type="Texture2D" uid="uid://bcahm7wqdbn6n" path="res://sprites/backgrounds/plains/4.png" id="4_8eim1"]
[node name="ParallaxBackground" type="ParallaxBackground"]
@@ -12,7 +12,7 @@ motion_scale = Vector2(0, 0)
motion_mirroring = Vector2(480, 0)
[node name="Sprite2D" type="Sprite2D" parent="Sky"]
texture = ExtResource("1_rfutu")
texture = ExtResource("1_kdcp8")
centered = false
[node name="Clouds" type="ParallaxLayer" parent="."]
@@ -20,7 +20,7 @@ motion_scale = Vector2(0.1, 0.1)
motion_mirroring = Vector2(480, 0)
[node name="Sprite2D" type="Sprite2D" parent="Clouds"]
texture = ExtResource("2_uysv2")
texture = ExtResource("2_ev808")
centered = false
[node name="Hills" type="ParallaxLayer" parent="."]
@@ -28,7 +28,7 @@ motion_scale = Vector2(0.2, 0.2)
motion_mirroring = Vector2(480, 0)
[node name="Sprite2D" type="Sprite2D" parent="Hills"]
texture = ExtResource("3_l6n33")
texture = ExtResource("3_sfana")
centered = false
[node name="Ground" type="ParallaxLayer" parent="."]
@@ -37,5 +37,5 @@ motion_mirroring = Vector2(480, 0)
[node name="Sprite2D" type="Sprite2D" parent="Ground"]
scale = Vector2(1, 1.14074)
texture = ExtResource("4_jkhju")
texture = ExtResource("4_8eim1")
centered = false

View File

@@ -17,6 +17,8 @@ config/name_localized={
}
config/version="in-dev"
run/main_scene="uid://cl00e2ocomk3m"
config/use_custom_user_dir=true
config/custom_user_dir_name="MrBrickAdventures"
config/features=PackedStringArray("4.4", "GL Compatibility")
run/max_fps=180
boot_splash/bg_color=Color(0, 0, 0, 1)
@@ -153,6 +155,11 @@ pause={
}
switch_movement={
"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":4194336,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
screenshot={
"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":4194333,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
@@ -160,7 +167,6 @@ switch_movement={
[internationalization]
locale/translations=PackedStringArray("res://translations.en.translation", "res://translations.pl.translation")
locale/test="pl"
[layer_names]

View File

@@ -4,4 +4,5 @@
[resource]
script = ExtResource("1_fudbo")
amount = 5
amount = 5.0
type = 0

View File

@@ -4,4 +4,5 @@
[resource]
script = ExtResource("1_037vi")
amount = 100
amount = 100.0
type = 0

View File

@@ -4,5 +4,5 @@
[resource]
script = ExtResource("1_2d5tb")
amount = 1
amount = 1.0
type = 1

View File

@@ -4,4 +4,5 @@
[resource]
script = ExtResource("1_veemo")
amount = 1
amount = 1.0
type = 0

View File

@@ -0,0 +1,9 @@
[gd_resource type="Resource" script_class="CollectableResource" load_steps=2 format=3 uid="uid://2tl3yoh202no"]
[ext_resource type="Script" uid="uid://cb5f0mx0hrt3b" path="res://scripts/resources/collectable_resource.gd" id="1_brkhb"]
[resource]
script = ExtResource("1_brkhb")
amount = 0.25
type = 2
metadata/_custom_type_script = "uid://cb5f0mx0hrt3b"

View File

@@ -4,5 +4,5 @@
[resource]
script = ExtResource("1_w50p5")
amount = 50
amount = 50.0
type = 0

View File

@@ -0,0 +1,9 @@
[gd_resource type="Resource" script_class="LevelResource" load_steps=2 format=3 uid="uid://dsq0y2iw7tfmk"]
[ext_resource type="Script" uid="uid://cp68km8bykymb" path="res://scripts/resources/level_resource.gd" id="1_8mmd7"]
[resource]
script = ExtResource("1_8mmd7")
level_name = "LEVEL_5_NAME"
scene_path = "res://scenes/level_forest_5.tscn"
metadata/_custom_type_script = "uid://cp68km8bykymb"

View File

@@ -11,9 +11,14 @@ name = "BRICK_POWER"
description = "BRICK_POWER_DESCRIPTION"
node = ExtResource("1_5gnea")
config = {
"fire_rate": 0.6,
"player_controller": NodePath("."),
"throw_input_behavior": ExtResource("1_xwijh"),
"timer": NodePath("ThrowTimer")
}
cost = 50
icon = ExtResource("2_yimbq")
type = 1
is_active = false
level = 0
max_level = 3

View File

@@ -19,3 +19,7 @@ config = {
}
cost = 180
icon = ExtResource("3_wkqmb")
type = 1
is_active = false
level = 0
max_level = 1

View File

@@ -19,3 +19,7 @@ config = {
}
cost = 150
icon = ExtResource("3_w87qb")
type = 1
is_active = false
level = 0
max_level = 3

View File

@@ -19,3 +19,7 @@ config = {
}
cost = 150
icon = ExtResource("3_6btth")
type = 1
is_active = false
level = 0
max_level = 3

View File

@@ -16,3 +16,7 @@ config = {
}
cost = 70
icon = ExtResource("1_16qcg")
type = 2
is_active = false
level = 1
max_level = 1

View File

@@ -131,7 +131,7 @@ texture = ExtResource("2_dfydr")
12:11/0 = 0
13:11/0 = 0
2:2/0 = 0
2:2/0/probability = 0.0
2:2/0/probability = 0.8
[resource]
sources/0 = SubResource("TileSetAtlasSource_cagp7")

View File

@@ -1,10 +1,11 @@
[gd_resource type="TileSet" load_steps=14 format=3 uid="uid://bc5a20s6kuy8e"]
[gd_resource type="TileSet" load_steps=15 format=3 uid="uid://bc5a20s6kuy8e"]
[ext_resource type="Texture2D" uid="uid://djifxc5x0dyrw" path="res://sprites/ppc_tileset.png" id="1_ej5iv"]
[ext_resource type="PackedScene" uid="uid://54w4wisfj8v8" path="res://objects/entities/coin.tscn" id="2_31a0q"]
[ext_resource type="PackedScene" uid="uid://c40r76qqacqie" path="res://objects/entities/collapsing_block.tscn" id="3_31a0q"]
[ext_resource type="PackedScene" uid="uid://ct8fim6mduyl3" path="res://objects/entities/collapsing_bridge.tscn" id="3_x63lh"]
[ext_resource type="PackedScene" uid="uid://bargnp4twtmxg" path="res://objects/entities/big_coin.tscn" id="4_ov0dn"]
[ext_resource type="PackedScene" uid="uid://buff711j0f2ph" path="res://objects/entities/spike_wheel.tscn" id="4_x63lh"]
[ext_resource type="PackedScene" uid="uid://d08dfqmirnd66" path="res://objects/entities/big_treasure.tscn" id="5_xxibl"]
[ext_resource type="PackedScene" uid="uid://073ts5cxtwbl" path="res://objects/entities/treasure.tscn" id="6_fmgww"]
[ext_resource type="PackedScene" uid="uid://cm3rixnnev1pg" path="res://objects/entities/jump_pad.tscn" id="7_0kjxj"]
@@ -147,6 +148,7 @@ scenes/7/scene = ExtResource("8_83o0w")
scenes/8/scene = ExtResource("9_at40q")
scenes/9/scene = ExtResource("10_ivcjr")
scenes/10/scene = ExtResource("3_31a0q")
scenes/11/scene = ExtResource("4_x63lh")
[resource]
physics_layer_0/collision_layer = 1

View File

@@ -1,7 +1,8 @@
[gd_resource type="TileSet" load_steps=5 format=3 uid="uid://bbppo0irxdmqy"]
[gd_resource type="TileSet" load_steps=7 format=3 uid="uid://bbppo0irxdmqy"]
[ext_resource type="Texture2D" uid="uid://djifxc5x0dyrw" path="res://sprites/ppc_tileset.png" id="1_6ec4i"]
[ext_resource type="Texture2D" uid="uid://cw42lvnqxubq2" path="res://sprites/PS_Tileset_10_nes.png" id="2_0dgh6"]
[ext_resource type="Texture2D" uid="uid://do6m4ry8ss01e" path="res://sprites/PS_Tileset_12_nes.png" id="3_0dgh6"]
[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_8ljy4"]
texture = ExtResource("1_6ec4i")
@@ -183,6 +184,68 @@ texture = ExtResource("2_0dgh6")
15:9/0 = 0
15:9/0/texture_origin = Vector2i(0, 8)
[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_a1mhh"]
texture = ExtResource("3_0dgh6")
13:5/0 = 0
14:5/0 = 0
15:5/0 = 0
15:6/0 = 0
14:7/0 = 0
13:7/0 = 0
13:8/0 = 0
14:8/0 = 0
14:6/0 = 0
13:6/0 = 0
17:6/0 = 0
17:7/0 = 0
19:5/0 = 0
20:5/0 = 0
21:5/0 = 0
21:6/0 = 0
20:6/0 = 0
19:6/0 = 0
20:7/0 = 0
21:7/0 = 0
21:8/0 = 0
20:8/0 = 0
18:9/0 = 0
17:9/0 = 0
16:9/0 = 0
15:9/0 = 0
14:9/0 = 0
13:9/0 = 0
12:9/0 = 0
13:11/0 = 0
12:11/0 = 0
12:12/0 = 0
13:12/0 = 0
14:10/0 = 0
15:10/0 = 0
15:11/0 = 0
15:12/0 = 0
14:12/0 = 0
14:11/0 = 0
16:10/0 = 0
17:10/0 = 0
17:11/0 = 0
17:12/0 = 0
16:12/0 = 0
16:11/0 = 0
18:10/0 = 0
19:10/0 = 0
19:11/0 = 0
18:11/0 = 0
18:12/0 = 0
19:12/0 = 0
21:10/0 = 0
20:10/0 = 0
20:11/0 = 0
21:12/0 = 0
21:11/0 = 0
22:11/0 = 0
22:10/0 = 0
[resource]
sources/0 = SubResource("TileSetAtlasSource_8ljy4")
sources/1 = SubResource("TileSetAtlasSource_jjobv")
sources/3 = SubResource("TileSetAtlasSource_a1mhh")

View File

@@ -1,7 +1,572 @@
[gd_resource type="TileSet" load_steps=3 format=3 uid="uid://cu2sx7qigrqnv"]
[gd_resource type="TileSet" load_steps=5 format=3 uid="uid://cu2sx7qigrqnv"]
[ext_resource type="Texture2D" uid="uid://do6m4ry8ss01e" path="res://sprites/PS_Tileset_12_nes.png" id="1_2p3w4"]
[ext_resource type="Texture2D" uid="uid://cw42lvnqxubq2" path="res://sprites/PS_Tileset_10_nes.png" id="2_43n76"]
[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_43n76"]
texture = ExtResource("1_2p3w4")
1:0/0 = 0
1:0/0/terrain_set = 0
1:0/0/terrain = 2
1:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
1:0/0/terrains_peering_bit/right_side = 2
1:0/0/terrains_peering_bit/bottom_right_corner = 2
1:0/0/terrains_peering_bit/bottom_side = 2
2:0/0 = 0
2:0/0/terrain_set = 0
2:0/0/terrain = 2
2:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
2:0/0/terrains_peering_bit/right_side = 2
2:0/0/terrains_peering_bit/bottom_right_corner = 2
2:0/0/terrains_peering_bit/bottom_side = 2
2:0/0/terrains_peering_bit/bottom_left_corner = 2
2:0/0/terrains_peering_bit/left_side = 2
3:0/0 = 0
3:0/0/terrain_set = 0
3:0/0/terrain = 2
3:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
3:0/0/terrains_peering_bit/bottom_side = 2
3:0/0/terrains_peering_bit/bottom_left_corner = 2
3:0/0/terrains_peering_bit/left_side = 2
6:0/0 = 0
6:0/0/terrain_set = 0
6:0/0/terrain = 2
6:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
6:0/0/terrains_peering_bit/right_side = 2
6:0/0/terrains_peering_bit/bottom_side = 2
7:0/0 = 0
7:0/0/terrain_set = 0
7:0/0/terrain = 2
7:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
7:0/0/terrains_peering_bit/right_side = 2
7:0/0/terrains_peering_bit/left_side = 2
8:0/0 = 0
8:0/0/terrain_set = 0
8:0/0/terrain = 2
8:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
8:0/0/terrains_peering_bit/bottom_side = 2
8:0/0/terrains_peering_bit/left_side = 2
13:0/0 = 0
15:0/0 = 0
15:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
20:0/0 = 0
21:0/0 = 0
22:0/0 = 0
0:1/0 = 0
0:1/0/terrain_set = 0
0:1/0/terrain = 2
0:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
0:1/0/terrains_peering_bit/right_side = 2
0:1/0/terrains_peering_bit/bottom_right_corner = 2
0:1/0/terrains_peering_bit/bottom_side = 2
1:1/0 = 0
1:1/0/terrain_set = 0
1:1/0/terrain = 2
1:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
1:1/0/terrains_peering_bit/right_side = 2
1:1/0/terrains_peering_bit/bottom_right_corner = 2
1:1/0/terrains_peering_bit/bottom_side = 2
1:1/0/terrains_peering_bit/bottom_left_corner = 2
1:1/0/terrains_peering_bit/left_side = 2
1:1/0/terrains_peering_bit/top_side = 2
1:1/0/terrains_peering_bit/top_right_corner = 2
2:1/0 = 0
2:1/0/terrain_set = 0
2:1/0/terrain = 2
2:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
2:1/0/terrains_peering_bit/right_side = 2
2:1/0/terrains_peering_bit/bottom_right_corner = 2
2:1/0/terrains_peering_bit/bottom_side = 2
2:1/0/terrains_peering_bit/bottom_left_corner = 2
2:1/0/terrains_peering_bit/left_side = 2
2:1/0/terrains_peering_bit/top_left_corner = 2
2:1/0/terrains_peering_bit/top_side = 2
2:1/0/terrains_peering_bit/top_right_corner = 2
3:1/0 = 0
3:1/0/terrain_set = 0
3:1/0/terrain = 2
3:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
3:1/0/terrains_peering_bit/right_side = 2
3:1/0/terrains_peering_bit/bottom_right_corner = 2
3:1/0/terrains_peering_bit/bottom_side = 2
3:1/0/terrains_peering_bit/bottom_left_corner = 2
3:1/0/terrains_peering_bit/left_side = 2
3:1/0/terrains_peering_bit/top_left_corner = 2
3:1/0/terrains_peering_bit/top_side = 2
4:1/0 = 0
4:1/0/terrain_set = 0
4:1/0/terrain = 2
4:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
4:1/0/terrains_peering_bit/bottom_side = 2
4:1/0/terrains_peering_bit/bottom_left_corner = 2
4:1/0/terrains_peering_bit/left_side = 2
5:1/0 = 0
5:1/0/terrain_set = 0
5:1/0/terrain = 2
5:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
5:1/0/terrains_peering_bit/right_side = 2
5:1/0/terrains_peering_bit/bottom_side = 2
6:1/0 = 0
6:1/0/terrain_set = 0
6:1/0/terrain = 2
6:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
6:1/0/terrains_peering_bit/left_side = 2
6:1/0/terrains_peering_bit/top_side = 2
8:1/0 = 0
8:1/0/terrain_set = 0
8:1/0/terrain = 2
8:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
8:1/0/terrains_peering_bit/right_side = 2
8:1/0/terrains_peering_bit/top_side = 2
9:1/0 = 0
9:1/0/terrain_set = 0
9:1/0/terrain = 2
9:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
9:1/0/terrains_peering_bit/bottom_side = 2
9:1/0/terrains_peering_bit/left_side = 2
11:1/0 = 0
11:1/0/terrain_set = 0
11:1/0/terrain = 2
11:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
11:1/0/terrains_peering_bit/bottom_side = 2
13:1/0 = 0
14:1/0 = 0
14:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
15:1/0 = 0
15:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
16:1/0 = 0
17:1/0 = 0
18:1/0 = 0
18:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
19:1/0 = 0
19:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
20:1/0 = 0
21:1/0 = 0
22:1/0 = 0
0:2/0 = 0
0:2/0/terrain_set = 0
0:2/0/terrain = 2
0:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
0:2/0/terrains_peering_bit/right_side = 2
0:2/0/terrains_peering_bit/bottom_right_corner = 2
0:2/0/terrains_peering_bit/bottom_side = 2
0:2/0/terrains_peering_bit/top_side = 2
0:2/0/terrains_peering_bit/top_right_corner = 2
1:2/0 = 0
1:2/0/terrain_set = 0
1:2/0/terrain = 2
1:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
1:2/0/terrains_peering_bit/right_side = 2
1:2/0/terrains_peering_bit/bottom_right_corner = 2
1:2/0/terrains_peering_bit/bottom_side = 2
1:2/0/terrains_peering_bit/bottom_left_corner = 2
1:2/0/terrains_peering_bit/left_side = 2
1:2/0/terrains_peering_bit/top_left_corner = 2
1:2/0/terrains_peering_bit/top_side = 2
1:2/0/terrains_peering_bit/top_right_corner = 2
2:2/0 = 0
2:2/0/terrain_set = 0
2:2/0/terrain = 2
2:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
2:2/0/terrains_peering_bit/right_side = 2
2:2/0/terrains_peering_bit/bottom_right_corner = 2
2:2/0/terrains_peering_bit/bottom_side = 2
2:2/0/terrains_peering_bit/bottom_left_corner = 2
2:2/0/terrains_peering_bit/left_side = 2
2:2/0/terrains_peering_bit/top_left_corner = 2
2:2/0/terrains_peering_bit/top_side = 2
2:2/0/terrains_peering_bit/top_right_corner = 2
3:2/0 = 0
3:2/0/terrain_set = 0
3:2/0/terrain = 2
3:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
3:2/0/terrains_peering_bit/right_side = 2
3:2/0/terrains_peering_bit/bottom_right_corner = 2
3:2/0/terrains_peering_bit/bottom_side = 2
3:2/0/terrains_peering_bit/bottom_left_corner = 2
3:2/0/terrains_peering_bit/left_side = 2
3:2/0/terrains_peering_bit/top_left_corner = 2
3:2/0/terrains_peering_bit/top_side = 2
3:2/0/terrains_peering_bit/top_right_corner = 2
4:2/0 = 0
4:2/0/terrain_set = 0
4:2/0/terrain = 2
4:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
4:2/0/terrains_peering_bit/bottom_side = 2
4:2/0/terrains_peering_bit/bottom_left_corner = 2
4:2/0/terrains_peering_bit/left_side = 2
4:2/0/terrains_peering_bit/top_left_corner = 2
4:2/0/terrains_peering_bit/top_side = 2
5:2/0 = 0
5:2/0/terrain_set = 0
5:2/0/terrain = 2
5:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
5:2/0/terrains_peering_bit/bottom_side = 2
5:2/0/terrains_peering_bit/top_side = 2
9:2/0 = 0
9:2/0/terrain_set = 0
9:2/0/terrain = 2
9:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
9:2/0/terrains_peering_bit/bottom_side = 2
9:2/0/terrains_peering_bit/top_side = 2
11:2/0 = 0
11:2/0/terrain_set = 0
11:2/0/terrain = 2
11:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
11:2/0/terrains_peering_bit/bottom_side = 2
11:2/0/terrains_peering_bit/top_side = 2
16:2/0 = 0
16:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
19:2/0 = 0
19:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
20:2/0 = 0
21:2/0 = 0
22:2/0 = 0
0:3/0 = 0
0:3/0/terrain_set = 0
0:3/0/terrain = 2
0:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
0:3/0/terrains_peering_bit/right_side = 2
0:3/0/terrains_peering_bit/top_side = 2
0:3/0/terrains_peering_bit/top_right_corner = 2
1:3/0 = 0
1:3/0/terrain_set = 0
1:3/0/terrain = 2
1:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
1:3/0/terrains_peering_bit/right_side = 2
1:3/0/terrains_peering_bit/bottom_right_corner = 2
1:3/0/terrains_peering_bit/bottom_side = 2
1:3/0/terrains_peering_bit/left_side = 2
1:3/0/terrains_peering_bit/top_left_corner = 2
1:3/0/terrains_peering_bit/top_side = 2
1:3/0/terrains_peering_bit/top_right_corner = 2
2:3/0 = 0
2:3/0/terrain_set = 0
2:3/0/terrain = 2
2:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
2:3/0/terrains_peering_bit/right_side = 2
2:3/0/terrains_peering_bit/bottom_right_corner = 2
2:3/0/terrains_peering_bit/bottom_side = 2
2:3/0/terrains_peering_bit/bottom_left_corner = 2
2:3/0/terrains_peering_bit/left_side = 2
2:3/0/terrains_peering_bit/top_left_corner = 2
2:3/0/terrains_peering_bit/top_side = 2
2:3/0/terrains_peering_bit/top_right_corner = 2
3:3/0 = 0
3:3/0/terrain_set = 0
3:3/0/terrain = 2
3:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
3:3/0/terrains_peering_bit/right_side = 2
3:3/0/terrains_peering_bit/bottom_side = 2
3:3/0/terrains_peering_bit/bottom_left_corner = 2
3:3/0/terrains_peering_bit/left_side = 2
3:3/0/terrains_peering_bit/top_left_corner = 2
3:3/0/terrains_peering_bit/top_side = 2
3:3/0/terrains_peering_bit/top_right_corner = 2
4:3/0 = 0
4:3/0/terrain_set = 0
4:3/0/terrain = 2
4:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
4:3/0/terrains_peering_bit/left_side = 2
4:3/0/terrains_peering_bit/top_left_corner = 2
4:3/0/terrains_peering_bit/top_side = 2
5:3/0 = 0
5:3/0/terrain_set = 0
5:3/0/terrain = 2
5:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
5:3/0/terrains_peering_bit/right_side = 2
5:3/0/terrains_peering_bit/top_side = 2
6:3/0 = 0
6:3/0/terrain_set = 0
6:3/0/terrain = 2
6:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
6:3/0/terrains_peering_bit/bottom_side = 2
6:3/0/terrains_peering_bit/left_side = 2
8:3/0 = 0
8:3/0/terrain_set = 0
8:3/0/terrain = 2
8:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
8:3/0/terrains_peering_bit/right_side = 2
8:3/0/terrains_peering_bit/bottom_side = 2
9:3/0 = 0
9:3/0/terrain_set = 0
9:3/0/terrain = 2
9:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
9:3/0/terrains_peering_bit/left_side = 2
9:3/0/terrains_peering_bit/top_side = 2
11:3/0 = 0
11:3/0/terrain_set = 0
11:3/0/terrain = 2
11:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
11:3/0/terrains_peering_bit/top_side = 2
13:3/0 = 0
14:3/0 = 0
14:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
15:3/0 = 0
15:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
16:3/0 = 0
16:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
17:3/0 = 0
17:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
18:3/0 = 0
19:3/0 = 0
20:3/0 = 0
21:3/0 = 0
22:3/0 = 0
1:4/0 = 0
1:4/0/terrain_set = 0
1:4/0/terrain = 2
1:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
1:4/0/terrains_peering_bit/right_side = 2
1:4/0/terrains_peering_bit/top_side = 2
1:4/0/terrains_peering_bit/top_right_corner = 2
2:4/0 = 0
2:4/0/terrain_set = 0
2:4/0/terrain = 2
2:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
2:4/0/terrains_peering_bit/right_side = 2
2:4/0/terrains_peering_bit/left_side = 2
2:4/0/terrains_peering_bit/top_left_corner = 2
2:4/0/terrains_peering_bit/top_side = 2
2:4/0/terrains_peering_bit/top_right_corner = 2
3:4/0 = 0
3:4/0/terrain_set = 0
3:4/0/terrain = 2
3:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
3:4/0/terrains_peering_bit/left_side = 2
3:4/0/terrains_peering_bit/top_left_corner = 2
3:4/0/terrains_peering_bit/top_side = 2
6:4/0 = 0
6:4/0/terrain_set = 0
6:4/0/terrain = 2
6:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
6:4/0/terrains_peering_bit/right_side = 2
6:4/0/terrains_peering_bit/top_side = 2
7:4/0 = 0
7:4/0/terrain_set = 0
7:4/0/terrain = 2
7:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
7:4/0/terrains_peering_bit/right_side = 2
7:4/0/terrains_peering_bit/left_side = 2
8:4/0 = 0
8:4/0/terrain_set = 0
8:4/0/terrain = 2
8:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
8:4/0/terrains_peering_bit/left_side = 2
8:4/0/terrains_peering_bit/top_side = 2
13:4/0 = 0
15:4/0 = 0
15:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
20:4/0 = 0
21:4/0 = 0
22:4/0 = 0
11:5/0 = 0
11:5/0/terrain_set = 0
11:5/0/terrain = 2
11:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
11:5/0/terrains_peering_bit/bottom_side = 2
13:5/0 = 0
14:5/0 = 0
15:5/0 = 0
19:5/0 = 0
20:5/0 = 0
21:5/0 = 0
22:5/0 = 0
0:6/0 = 0
0:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
1:6/0 = 0
1:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
2:6/0 = 0
2:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
3:6/0 = 0
3:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
4:6/0 = 0
4:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
6:6/0 = 0
6:6/0/terrain_set = 0
6:6/0/terrain = 2
6:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
6:6/0/terrains_peering_bit/right_side = 2
7:6/0 = 0
7:6/0/terrain_set = 0
7:6/0/terrain = 2
7:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
7:6/0/terrains_peering_bit/right_side = 2
7:6/0/terrains_peering_bit/left_side = 2
8:6/0 = 0
8:6/0/terrain_set = 0
8:6/0/terrain = 2
8:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
8:6/0/terrains_peering_bit/left_side = 2
10:6/0 = 0
10:6/0/terrain_set = 0
10:6/0/terrain = 2
10:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
10:6/0/terrains_peering_bit/right_side = 2
11:6/0 = 0
11:6/0/terrain_set = 0
11:6/0/terrain = 2
11:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
11:6/0/terrains_peering_bit/bottom_side = 2
11:6/0/terrains_peering_bit/left_side = 2
11:6/0/terrains_peering_bit/top_side = 2
13:6/0 = 0
14:6/0 = 0
15:6/0 = 0
17:6/0 = 0
19:6/0 = 0
20:6/0 = 0
21:6/0 = 0
22:6/0 = 0
0:7/0 = 0
0:7/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
1:7/0 = 0
1:7/0/physics_layer_0/polygon_0/points = PackedVector2Array(8, -8, -8, -8, -8, 8, 0, 0)
3:7/0 = 0
3:7/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, 0, 0)
4:7/0 = 0
4:7/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
11:7/0 = 0
11:7/0/terrain_set = 0
11:7/0/terrain = 2
11:7/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
11:7/0/terrains_peering_bit/top_side = 2
13:7/0 = 0
14:7/0 = 0
17:7/0 = 0
20:7/0 = 0
21:7/0 = 0
22:7/0 = 0
7:8/0 = 0
7:8/0/terrain_set = 0
7:8/0/terrain = 2
7:8/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
7:8/0/terrains_peering_bit/bottom_side = 2
13:8/0 = 0
14:8/0 = 0
20:8/0 = 0
21:8/0 = 0
0:9/0 = 0
0:9/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
1:9/0 = 0
1:9/0/physics_layer_0/polygon_0/points = PackedVector2Array(8, 8, -8, 8, -8, -8, 0, 0)
3:9/0 = 0
3:9/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, 8, 8, 8, 8, -8, 0, 0)
4:9/0 = 0
4:9/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
6:9/0 = 0
6:9/0/terrain_set = 0
6:9/0/terrain = 2
6:9/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
6:9/0/terrains_peering_bit/right_side = 2
7:9/0 = 0
7:9/0/terrain_set = 0
7:9/0/terrain = 2
7:9/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
7:9/0/terrains_peering_bit/right_side = 2
7:9/0/terrains_peering_bit/left_side = 2
7:9/0/terrains_peering_bit/top_side = 2
8:9/0 = 0
8:9/0/terrain_set = 0
8:9/0/terrain = 2
8:9/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
8:9/0/terrains_peering_bit/left_side = 2
10:9/0 = 0
10:9/0/terrain_set = 0
10:9/0/terrain = 2
10:9/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
10:9/0/terrains_peering_bit/bottom_side = 2
12:9/0 = 0
13:9/0 = 0
14:9/0 = 0
15:9/0 = 0
16:9/0 = 0
17:9/0 = 0
18:9/0 = 0
0:10/0 = 0
0:10/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
1:10/0 = 0
1:10/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
2:10/0 = 0
2:10/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
3:10/0 = 0
3:10/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
4:10/0 = 0
4:10/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
10:10/0 = 0
10:10/0/terrain_set = 0
10:10/0/terrain = 2
10:10/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
10:10/0/terrains_peering_bit/right_side = 2
10:10/0/terrains_peering_bit/bottom_side = 2
10:10/0/terrains_peering_bit/top_side = 2
11:10/0 = 0
11:10/0/terrain_set = 0
11:10/0/terrain = 2
11:10/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
11:10/0/terrains_peering_bit/left_side = 2
14:10/0 = 0
15:10/0 = 0
16:10/0 = 0
17:10/0 = 0
18:10/0 = 0
19:10/0 = 0
20:10/0 = 0
21:10/0 = 0
22:10/0 = 0
6:11/0 = 0
6:11/0/terrain_set = 0
6:11/0/terrain = 2
6:11/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
6:11/0/terrains_peering_bit/right_side = 2
7:11/0 = 0
7:11/0/terrain_set = 0
7:11/0/terrain = 2
7:11/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
7:11/0/terrains_peering_bit/right_side = 2
7:11/0/terrains_peering_bit/bottom_side = 2
7:11/0/terrains_peering_bit/left_side = 2
8:11/0 = 0
8:11/0/terrain_set = 0
8:11/0/terrain = 2
8:11/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
8:11/0/terrains_peering_bit/left_side = 2
10:11/0 = 0
10:11/0/terrain_set = 0
10:11/0/terrain = 2
10:11/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
10:11/0/terrains_peering_bit/top_side = 2
12:11/0 = 0
13:11/0 = 0
14:11/0 = 0
15:11/0 = 0
16:11/0 = 0
17:11/0 = 0
18:11/0 = 0
19:11/0 = 0
20:11/0 = 0
21:11/0 = 0
22:11/0 = 0
0:12/0 = 0
1:12/0 = 0
2:12/0 = 0
3:12/0 = 0
4:12/0 = 0
7:12/0 = 0
7:12/0/terrain_set = 0
7:12/0/terrain = 2
7:12/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
7:12/0/terrains_peering_bit/top_side = 2
12:12/0 = 0
13:12/0 = 0
14:12/0 = 0
15:12/0 = 0
16:12/0 = 0
17:12/0 = 0
18:12/0 = 0
19:12/0 = 0
21:12/0 = 0
[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_4xq2o"]
texture = ExtResource("2_43n76")
1:0/0 = 0
@@ -497,4 +1062,7 @@ terrain_set_0/terrain_0/name = "Village"
terrain_set_0/terrain_0/color = Color(1, 1, 1, 1)
terrain_set_0/terrain_1/name = "Platforms"
terrain_set_0/terrain_1/color = Color(0.46875, 0.5, 0.25, 1)
terrain_set_0/terrain_2/name = "Forest"
terrain_set_0/terrain_2/color = Color(0.536634, 0.836478, 0.371357, 1)
sources/1 = SubResource("TileSetAtlasSource_4xq2o")
sources/0 = SubResource("TileSetAtlasSource_43n76")

131
scenes/level_forest_5.tscn Normal file

File diff suppressed because one or more lines are too long

View File

@@ -1,4 +1,4 @@
[gd_scene load_steps=32 format=4 uid="uid://h60obxmju6mo"]
[gd_scene load_steps=33 format=4 uid="uid://h60obxmju6mo"]
[ext_resource type="PackedScene" uid="uid://dyp4i4ru2j2jh" path="res://objects/fxs/explosion_fx.tscn" id="1_p30ax"]
[ext_resource type="PackedScene" uid="uid://dx80ivlvuuew4" path="res://objects/fxs/fire_fx.tscn" id="2_a7yjf"]
@@ -22,6 +22,7 @@
[ext_resource type="Script" uid="uid://8r1y8elyw7kt" path="res://scripts/console_management.gd" id="19_0pba3"]
[ext_resource type="PackedScene" uid="uid://cawlpch2lk3a2" path="res://objects/level/world_environment.tscn" id="20_embdf"]
[ext_resource type="PackedScene" uid="uid://cywsu7yrtjdog" path="res://objects/level/global_light.tscn" id="21_fytod"]
[ext_resource type="PackedScene" uid="uid://t6h2ra7kjyq" path="res://objects/entities/small_heal_potion.tscn" id="23_m6h4x"]
[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_j7bvy"]
texture = ExtResource("7_uvxky")
@@ -356,6 +357,15 @@ skill_manager = NodePath("../Brick Player/SkillManager")
[node name="Global Light" parent="." instance=ExtResource("21_fytod")]
[node name="SmallHealPotion" parent="." instance=ExtResource("23_m6h4x")]
position = Vector2(1074, -105)
[node name="SmallHealPotion2" parent="." instance=ExtResource("23_m6h4x")]
position = Vector2(1244, -41)
[node name="SmallHealPotion3" parent="." instance=ExtResource("23_m6h4x")]
position = Vector2(1359, -42)
[connection signal="on_death" from="Brick Player/HealthComponent" to="UI Layer/DeathScreen" method="on_player_death"]
[connection signal="on_death" from="Brick Player/HealthComponent" to="UI Layer/GameOverScreen" method="on_player_death"]

File diff suppressed because one or more lines are too long

View File

@@ -40,6 +40,9 @@ func on_timer_timeout() -> void:
func throw_brick(power_multiplier: float = 1.0) -> void:
if not can_throw:
return
var instance: Node2D = brick_scene.instantiate()
var init := instance.get_node_or_null("ProjectileInitComponent") as ProjectileInitComponent
if init and player_controller.current_movement is PlatformMovement:

View File

@@ -3,6 +3,8 @@ extends Node
@export var root: Node2D
@export var area2d: Area2D
@export var hit_terrain_fx: TerrainHitFx
@export var bullet_sprite: Sprite2D
func _ready() -> void:
@@ -10,9 +12,26 @@ func _ready() -> void:
area2d.area_entered.connect(on_area2d_area_entered)
func on_area2d_body_entered(_body: Node2D) -> void:
func on_area2d_body_entered(body: Node2D) -> void:
if body is TileMapLayer:
if bullet_sprite:
bullet_sprite.visible = false
play_terrain_hit_fx()
return
root.queue_free()
func on_area2d_area_entered(_area: Area2D) -> void:
root.queue_free()
func play_terrain_hit_fx() -> void:
if not hit_terrain_fx:
return
await hit_terrain_fx.trigger_fx()
root.queue_free()

View File

@@ -8,7 +8,7 @@ var has_fade_away: bool = false
@export var collision_shape: CollisionShape2D
@export var collectable_data: CollectableResource
@export var sfx: AudioStreamPlayer2D
signal collected(amount: int, type: CollectableResource.CollectableType)
signal collected(amount: Variant, type: CollectableResource.CollectableType, body: Node2D)
func _ready() -> void:
@@ -25,11 +25,14 @@ func _ready() -> void:
func _on_area2d_body_entered(body: Node2D) -> void:
if body.has_node("CanPickUpComponent"):
collected.emit(collectable_data.amount, collectable_data.type)
collected.emit(collectable_data.amount, collectable_data.type, body)
if collision_shape:
collision_shape.call_deferred("set_disabled", true)
if sfx:
sfx.play()
if not has_fade_away:
if not has_fade_away and sfx:
await sfx.finished
root.queue_free()
elif not has_fade_away:
root.queue_free()

View File

@@ -0,0 +1,37 @@
class_name EnemyWaveTrigger
extends Node
@export var area2d: Area2D
@export var path_follow_node: PathFollow2D
@export var speed: float = 100.0
@export var loop: bool = false
@export var activate_on_enter: bool = true
var active: bool = false
func _ready() -> void:
area2d.body_entered.connect(_on_body_entered)
if path_follow_node:
path_follow_node.progress = 0
path_follow_node.set_process(false)
func _process(delta: float) -> void:
if not active or not path_follow_node:
return
path_follow_node.progress += speed * delta
if path_follow_node.progress_ratio >= 1.0 and not loop:
active = false
path_follow_node.set_process(false)
func _on_body_entered(body: Node2D) -> void:
if activate_on_enter:
start_wave()
func start_wave() -> void:
if path_follow_node:
path_follow_node.set_process(true)
active = true

View File

@@ -0,0 +1 @@
uid://tmahwsvpkrbv

View File

@@ -0,0 +1,40 @@
class_name HealComponent
extends Node
@export var heal_fx: GPUParticles2D
@export var collectable: CollectableComponent
func _ready() -> void:
if not collectable:
printerr("HealComponent: No CollectableComponent assigned.")
return
collectable.collected.connect(on_collected)
func on_collected(amount: float, type: CollectableResource.CollectableType, _body: Node2D) -> void:
if type != CollectableResource.CollectableType.HEALTH:
return
if not collectable:
printerr("HealComponent: No CollectableComponent assigned.")
return
var health_component := _body.get_node_or_null("HealthComponent") as HealthComponent
if not health_component or not health_component is HealthComponent:
printerr("HealComponent: No HealthComponent found on collected body.")
return
health_component.increase_health(amount)
if heal_fx:
play_heal_fx()
else:
owner.queue_free()
func play_heal_fx() -> void:
if not heal_fx:
return
heal_fx.restart()
heal_fx.emitting = true

View File

@@ -0,0 +1 @@
uid://cegdd1sravi5m

View File

@@ -9,64 +9,40 @@ signal on_health_change(delta: float, total_health: float)
signal on_death
func _get_delta(value: float) -> float:
var old_value = health
return value - old_value
func _get_delta(new_value: float) -> float:
return new_value - health
func set_health(new_value: float):
var delta = _get_delta(new_value)
if sign(delta) > 0:
if heal_fx:
heal_fx.play()
elif sign(delta) < 0:
if hurt_fx:
hurt_fx.play()
await hurt_fx.finished
if new_value >= max_health:
health = max_health
on_health_change.emit(delta, health)
return
health = new_value
if health <= 0:
on_death.emit()
return
on_health_change.emit(delta, health)
_apply_health_change(new_value)
func decrease_health(value: float):
var delta = _get_delta(value)
health -= value
if hurt_fx:
hurt_fx.play()
await hurt_fx.finished
if health <= 0:
on_death.emit()
return
on_health_change.emit(delta, health)
_apply_health_change(health - value)
func increase_health(value: float):
var delta = _get_delta(value)
_apply_health_change(health + value)
health += value
if health >= max_health:
health = max_health
func _apply_health_change(new_health: float, play_fx: bool = true) -> void:
new_health = clamp(new_health, 0.0, max_health)
var delta := new_health - health
if delta == 0.0:
return # No change
if play_fx:
if delta > 0 and heal_fx:
heal_fx.play()
elif delta < 0 and hurt_fx:
hurt_fx.play()
await hurt_fx.finished
health = new_health
if health <= 0:
on_death.emit()
else:
on_health_change.emit(delta, health)
return
health += value
if heal_fx:
heal_fx.play()
on_health_change.emit(delta, health)

View File

@@ -39,7 +39,7 @@ func on_health_change(delta: float, total_health: float) -> void:
await get_tree().create_timer(hit_duration).timeout
deactivate()
if total_health > 0:
if total_health > 0 and delta < 0:
handle_hit_fx()

View File

@@ -8,6 +8,7 @@ extends Node
@export var root: Node2D
@export var bullet_spawn_right: Node2D
@export var bullet_spawn_left: Node2D
@export var shooting_interval_variation: float = 0.0
var timer: Timer
@@ -43,9 +44,16 @@ func on_timer_timeout() -> void:
timer.start()
func get_shoot_interval() -> float:
if shooting_interval_variation > 0.0:
return shoot_interval + randf_range(-shooting_interval_variation, shooting_interval_variation)
return shoot_interval
func setup_timer() -> void:
timer = Timer.new()
timer.wait_time = shoot_interval
timer.wait_time = get_shoot_interval()
timer.one_shot = false
timer.autostart = true
timer.timeout.connect(on_timer_timeout)

View File

@@ -43,6 +43,8 @@ func _process(_delta: float) -> void:
else:
rotation_target.rotation = 0
calculate_jump_vars()
func _physics_process(delta) -> void:
if not body or not enabled:
@@ -106,6 +108,11 @@ func handle_direction(input_dir: float) -> Vector2:
return last_direction
func on_ship_entered() -> void:
rotation_target.rotation = 0
func calculate_jump_vars() -> void:
jump_velocity = ((2.0 * jump_height) / jump_time_to_peak) * -1.0
jump_gravity = ((-2.0 * jump_height) / (jump_time_to_peak * jump_time_to_peak)) * -1.0
fall_gravity = ((-2.0 * jump_height) / (jump_time_to_descent * jump_time_to_descent)) * -1.0

View File

@@ -0,0 +1,67 @@
class_name ProgressiveDamageComponent
extends Node
@export var health_component: HealthComponent
@export var sprite: Sprite2D
@export var platform_movement: PlatformMovement
@export var min_jump_height: float = 60.0
@export var jump_reduction_percentage: float = 0.1 # this is a percentage of the jump height per hit
@onready var max_health: float = health_component.max_health
var og_jump_height: float = 0.0
func _ready() -> void:
if not health_component:
printerr("ProgressiveDamageComponent: health_component is not set.")
return
if not sprite:
printerr("ProgressiveDamageComponent: sprite is not set.")
return
health_component.on_health_change.connect(on_health_change)
if platform_movement:
og_jump_height = platform_movement.jump_height
func get_damage_frame() -> int:
if not sprite or not health_component:
return 0
var frames_count := sprite.get_hframes()
if frames_count == 0:
return 0
var current_health := health_component.health
var health_ratio := current_health / max_health
return int(frames_count * (1.0 - health_ratio))
func get_jump_height() -> float:
if not platform_movement:
return 0.0
var jump_height := og_jump_height
if jump_height <= 0:
return 0.0
var damage_frame := get_damage_frame()
if damage_frame < 0 or damage_frame >= sprite.get_hframes():
return jump_height
var reduction := jump_reduction_percentage * jump_height
var calculated_jump_height := jump_height - (damage_frame * reduction)
return max(calculated_jump_height, min_jump_height)
func on_health_change(_delta: float, _total_health: float) -> void:
var frame := get_damage_frame()
if frame < 0 or frame >= sprite.get_hframes():
return
sprite.frame = frame
if platform_movement:
platform_movement.jump_height = get_jump_height()

View File

@@ -0,0 +1 @@
uid://d32kd83lf86iy

View File

@@ -19,7 +19,8 @@ func _ready() -> void:
collectable.collected.connect(on_collected)
func on_collected(amount: int, type: CollectableResource.CollectableType) -> void:
func on_collected(amount: int, type: CollectableResource.CollectableType, _body: Node2D) -> void:
if type != requirement_type:
return
add_progress(amount)

View File

@@ -12,7 +12,8 @@ func _ready():
coin.collected.connect(on_collected)
func on_collected(amount: int, type: CollectableResource.CollectableType) -> void:
func on_collected(amount: int, type: CollectableResource.CollectableType, _body: Node2D) -> void:
if not game_manager:
return
if type != CollectableResource.CollectableType.COIN:

View File

@@ -4,7 +4,7 @@ extends Node
@export var skill_manager: SkillManager
@onready var game_manager: GM = $"/root/GameManager"
signal skill_unlocked(skill_data: SkillData)
func has_enough_coins(amount: int) -> bool:
@@ -15,15 +15,20 @@ func try_unlock_skill(skill_data: SkillData) -> bool:
if not game_manager:
return false
if game_manager.is_skill_unlocked(skill_data.name):
if game_manager.is_skill_unlocked(skill_data):
return false
if not has_enough_coins(skill_data.cost):
return false
game_manager.remove_coins(skill_data.cost)
game_manager.current_session_state["skills_unlocked"].append(skill_data.name)
skill_manager.add_skill(skill_data)
var skill: SkillData = skill_data
skill.level = 1
skill.is_active = true
game_manager.remove_coins(skill.cost)
game_manager.current_session_state["skills_unlocked"].append(skill)
skill_manager.add_skill(skill)
skill_unlocked.emit(skill)
return true
@@ -33,6 +38,27 @@ func unlock_all_skills() -> void:
for skill in available_skills:
skills.append(skill.name)
skill_unlocked.emit(skill)
game_manager.unlock_skills(skills)
game_manager.unlock_skills(available_skills)
skill_manager.apply_unlocked_skills()
func try_upgrade_skill(skill_data: SkillData) -> bool:
if not game_manager:
return false
if not game_manager.is_skill_unlocked(skill_data):
return false
if skill_data.level >= skill_data.max_level:
return false
if not has_enough_coins(skill_data.cost):
return false
game_manager.remove_coins(skill_data.cost)
skill_data.level += 1
skill_unlocked.emit(skill_data)
return true

View File

@@ -0,0 +1,21 @@
class_name SpaceshipExitComponent
extends Node
@export var area2d: Area2D
signal spaceship_exited
func _ready() -> void:
if not area2d:
printerr("SpaceshipExitComponent: area2d is not set.")
return
area2d.body_entered.connect(_on_area2d_body_entered)
func _on_area2d_body_entered(body: Node2D) -> void:
if not body is PlayerController:
printerr("SpaceshipExitComponent: body is not a PlayerController.")
return
print("SpaceshipExitComponent: PlayerController exited spaceship.")
spaceship_exited.emit()

View File

@@ -0,0 +1 @@
uid://ybmwls7hv8j3

View File

@@ -0,0 +1,24 @@
class_name TerrainHitFx
extends Node
var gpu_particles: Array[GPUParticles2D] = []
func _ready() -> void:
if owner is GPUParticles2D:
gpu_particles.append(owner)
for child in get_children():
if child is GPUParticles2D:
gpu_particles.append(child)
func trigger_fx() -> Signal:
for fx in gpu_particles:
if fx:
fx.restart()
fx.emitting = true
return gpu_particles[0].finished

View File

@@ -0,0 +1 @@
uid://djfejwp6e402k

View File

@@ -56,10 +56,10 @@ func console_set_lives(amount: Variant) -> void:
func console_set_health(amount: Variant) -> void:
if not player_health:
return
if not amount.is_valid_int():
if not amount.is_valid_float():
Console.print_error("Invalid amount: " + str(amount))
return
player_health.set_health(int(amount))
player_health.set_health(float(amount))
Console.print_info("Set health to " + str(amount))
@@ -70,12 +70,16 @@ func console_unlock_skill(skill_name: Variant) -> void:
Console.print_error("Invalid skill name: " + str(skill_name))
return
game_manager.unlock_skill(skill_name)
var skill_data: SkillData = skill_manager.get_skill_by_name(skill_name)
skill_data.level = 1
if not skill_data:
Console.print_error("Skill not found: " + str(skill_name))
return
skill_manager.add_skill(skill_data)
game_manager.unlock_skill(skill_data)
skill_manager.activate_skill(skill_data)
skill_unlocker.skill_unlocked.emit(skill_data)
Console.print_info("Unlocked skill: " + str(skill_name))

View File

@@ -68,6 +68,13 @@ func get_kid_nodes() -> Array[CollectableComponent]:
return kid_nodes
func get_player_node() -> Node:
for node in nodes_in_scene:
if node is PlayerController:
return node
return null
func add_coins(amount: int) -> void:
player_state["coins"] += amount
player_state["coins"] = max(0, player_state["coins"])
@@ -110,23 +117,24 @@ func get_lives() -> int:
return player_state["lives"]
func is_skill_unlocked(skill_name: String) -> bool:
return skill_name in player_state["unlocked_skills"] or skill_name in current_session_state["skills_unlocked"]
func is_skill_unlocked(skill: SkillData) -> bool:
return skill in player_state["unlocked_skills"] or skill in current_session_state["skills_unlocked"]
func unlock_skill(skill_name: String) -> void:
if not is_skill_unlocked(skill_name):
player_state["unlocked_skills"].append(skill_name)
func unlock_skill(skill: SkillData) -> void:
if not is_skill_unlocked(skill):
player_state["unlocked_skills"].append(skill)
func remove_skill(skill_name: String) -> void:
if is_skill_unlocked(skill_name):
player_state["unlocked_skills"].erase(skill_name)
func remove_skill(skill: SkillData) -> void:
if is_skill_unlocked(skill):
player_state["unlocked_skills"].erase(skill)
func unlock_skills(skill_names: Array[String]) -> void:
for skill_name in skill_names:
unlock_skill(skill_name)
func unlock_skills(skills: Array[SkillData]) -> void:
for skill in skills:
unlock_skill(skill)
func reset_player_state() -> void:
@@ -163,7 +171,6 @@ func reset_current_session_state() -> void:
}
func restart_game() -> void:
reset_player_state()
reset_current_session_state()
@@ -206,9 +213,19 @@ func on_level_complete() -> void:
var level_index = player_state["current_level"]
mark_level_complete(level_index)
add_coins(current_session_state["coins_collected"])
for skill_name in current_session_state["skills_unlocked"]:
unlock_skill(skill_name)
for skill in current_session_state["skills_unlocked"]:
unlock_skill(skill)
reset_current_session_state()
try_to_go_to_next_level()
SaveSystem.save_game()
func get_unlocked_skills() -> Array:
var skills_unlocked = player_state.get("unlocked_skills", [])
var skills_current_session = current_session_state.get("skills_unlocked", [])
if not skills_current_session:
return skills_unlocked
if not skills_unlocked:
return skills_current_session
return skills_unlocked + skills_current_session

View File

@@ -6,5 +6,5 @@ enum CollectableType {
KID,
HEALTH,
}
@export var amount: int = 0
@export var amount: Variant = 0.0
@export var type: CollectableType = CollectableType.COIN

View File

@@ -1,9 +1,18 @@
class_name SkillData
extends Resource
enum SkillType {
ATTACK,
THROW,
MISC,
}
@export var name: String = ""
@export var description: String = ""
@export var node: PackedScene
@export var config: Dictionary = {}
@export var cost: int = 0
@export var icon: Texture2D
@export var type: SkillType = SkillType.ATTACK
@export var is_active: bool = false
@export var level: int = 1
@export var max_level: int = 1

View File

@@ -1,6 +1,6 @@
class_name TapThrowInputResource
extends ThrowInputResource
func process_input(event: InputEvent) -> void:
if event.is_action_pressed("attack"):
func update(_delta: float) -> void:
if Input.is_action_pressed("attack"):
throw_requested.emit(1.0)

8
scripts/screenshot.gd Normal file
View File

@@ -0,0 +1,8 @@
extends Node
func _process(_delta: float) -> void:
if OS.is_debug_build() and Input.is_action_just_pressed("screenshot"):
var img := get_viewport().get_texture().get_image()
var id := OS.get_unique_id() + "_" + Time.get_datetime_string_from_system()
var path := "user://screenshot_" + str(id) + ".png"
img.save_png(path)

View File

@@ -0,0 +1 @@
uid://bydv4g1n5s3nf

View File

@@ -16,6 +16,17 @@ func add_skill(skill_data: SkillData) -> void:
if active_components.has(skill_data.name):
return
if skill_data.type == SkillData.SkillType.THROW:
var unlocked_skills: Array = gm.get_unlocked_skills()
for skill in unlocked_skills:
var data = null
for s in available_skills:
if s == skill:
data = s
break
if data and data.type == SkillData.SkillType.THROW:
remove_skill(data.name)
var skill_instance := skill_data.node.instantiate()
for key in skill_data.config.keys():
if key in skill_instance:
@@ -44,12 +55,17 @@ func remove_skill(skill_name: String) -> void:
if is_instance_valid(skill_instance):
skill_instance.queue_free()
var skills: Array = gm.get_unlocked_skills()
for s in skills:
if s.name == skill_name:
s.is_active = false
break
active_components.erase(skill_name)
func apply_unlocked_skills() -> void:
for skill_data in available_skills:
if gm.is_skill_unlocked(skill_data.name):
if gm.is_skill_unlocked(skill_data):
print("Applying skill: ", skill_data.name)
call_deferred("add_skill", skill_data)
else:
@@ -61,3 +77,27 @@ func get_skill_by_name(skill_name: String) -> SkillData:
if skill_data.name == skill_name:
return skill_data
return null
func activate_skill(skill: SkillData) -> void:
if not active_components.has(skill.name):
if skill:
add_skill(skill)
skill.is_active = true
func deactivate_skill(skill: SkillData) -> void:
if active_components.has(skill.name):
remove_skill(skill.name)
if skill:
skill.is_active = false
func toggle_skill_activation(skill: SkillData) -> void:
if not skill:
return
if active_components.has(skill.name):
deactivate_skill(skill)
else:
activate_skill(skill)

View File

@@ -32,6 +32,8 @@ func _ready() -> void:
else:
continue_button.disabled = false
continue_button.grab_focus()
func _on_new_game_button_pressed() -> void:
if gm:

View File

@@ -3,15 +3,19 @@ extends Node
@export var root: Control
@export var skill_data: Array[SkillData] = []
@export var grid: GridContainer
@export var to_unlock_grid: GridContainer
@export var unlocked_grid: GridContainer
@export var font: Font
@export var skill_unlocker: SkillUnlockerComponent
@export var components_to_disable: Array[Node] = []
@export var marketplace_button: PackedScene
@export var skill_button: PackedScene
@onready var game_manager: GM = $"/root/GameManager"
var buttons: Array[Button] = []
var unlock_buttons: Array[Button] = []
var skill_buttons: Array[SkillButton] = []
func _ready() -> void:
@@ -21,13 +25,17 @@ func _ready() -> void:
var skills_to_unlock: Array[SkillData] = []
for skill in skill_data:
if skill.name in game_manager.player_state['unlocked_skills']:
continue
skills_to_unlock.append(skill)
for skill in skills_to_unlock:
create_upgrade_button(skill)
var unlocked_skills := game_manager.get_unlocked_skills()
for skill in unlocked_skills:
create_skill_button(skill)
skill_unlocker.skill_unlocked.connect(on_skill_unlocked)
func _input(event: InputEvent) -> void:
if event.is_action_pressed("show_marketplace"):
@@ -39,28 +47,40 @@ func _input(event: InputEvent) -> void:
root.show()
for component in components_to_disable:
component.process_mode = PROCESS_MODE_DISABLED
if buttons:
buttons[0].grab_focus()
func get_button_text(skill: SkillData) -> String:
return tr(skill.name) + " " + str(skill.cost)
func create_upgrade_button(skill: SkillData):
var button := marketplace_button.instantiate() as Button
func create_upgrade_button(skill: SkillData) -> void:
var button := marketplace_button.instantiate() as MarketplaceButton
button.text = get_button_text(skill)
button.icon = skill.icon
button.skill_data = skill
button.pressed.connect(func () -> void: _on_button_pressed(skill))
buttons.append(button)
grid.add_child(button)
grid.queue_sort()
unlock_buttons.append(button)
to_unlock_grid.add_child(button)
to_unlock_grid.queue_sort()
func create_skill_button(skill: SkillData) -> void:
var button := skill_button.instantiate() as SkillButton
button.skill_data = skill
button.setup()
button.pressed.connect(func() -> void: on_skill_button_pressed(button))
button.activate()
skill_buttons.append(button)
unlocked_grid.add_child(button)
unlocked_grid.queue_sort()
func remove_button(skill: SkillData):
for child in grid.get_children():
for child in to_unlock_grid.get_children():
if child.text == get_button_text(skill):
child.queue_free()
break
@@ -70,6 +90,38 @@ func _on_button_pressed(skill: SkillData) -> void:
if not skill_unlocker:
return
if skill_unlocker.try_unlock_skill(skill):
remove_button(skill)
if game_manager.is_skill_unlocked(skill):
if skill.level < skill.max_level:
skill_unlocker.try_upgrade_skill(skill)
if not skill.is_active:
skill_unlocker.skill_manager.toggle_skill_activation(skill)
else:
skill_unlocker.skill_manager.toggle_skill_activation(skill)
else:
skill_unlocker.try_unlock_skill(skill)
func on_skill_unlocked(skill: SkillData) -> void:
# need to fix this method
if not skill:
return
if skill_buttons.size() == 0:
create_skill_button(skill)
for button in skill_buttons:
if button.skill_data.is_active:
button.activate()
else:
button.deactivate()
func on_skill_button_pressed(button: SkillButton) -> void:
if not skill_unlocker or not button.skill_data:
return
skill_unlocker.skill_manager.toggle_skill_activation(button.skill_data)
button.activate()
for other_button in skill_buttons:
if other_button != button:
other_button.deactivate()

View File

@@ -0,0 +1,48 @@
class_name MarketplaceButton
extends Button
@export var skill_data: SkillData
@export var unlocked_skill_icon: Texture2D
@export var locked_skill_icon: Texture2D
@export var skill_level_container: Container
@onready var gm: GM = $"/root/GameManager"
func _ready() -> void:
if not skill_data:
printerr("MarketplaceButton: skill_data is not set.")
if not unlocked_skill_icon or not locked_skill_icon:
printerr("MarketplaceButton: unlocked_skill_icon or locked_skill_icon is not set.")
return
if not skill_level_container:
printerr("MarketplaceButton: skill_level_container is not set.")
return
setup()
var player := gm.get_player_node()
var skill_unlocker_component := player.get_node_or_null("SkillUnlockerComponent") as SkillUnlockerComponent
if skill_unlocker_component:
skill_unlocker_component.skill_unlocked.connect(_on_skill_unlock)
func setup() -> void:
if not skill_data:
return
for i in range(skill_data.max_level):
var _icon := TextureRect.new()
_icon.texture = unlocked_skill_icon if i < skill_data.level else locked_skill_icon
skill_level_container.add_child(_icon)
func _on_skill_unlock(skill: SkillData) -> void:
if skill.name == skill_data.name:
for i in range(skill_data.max_level):
var icon := skill_level_container.get_child(i) as TextureRect
if i < skill.level:
icon.texture = unlocked_skill_icon
else:
icon.texture = locked_skill_icon
disabled = skill.level >= skill_data.max_level

View File

@@ -0,0 +1 @@
uid://dx8lex40lotr5

View File

@@ -45,7 +45,6 @@ func _ready() -> void:
Console.console_closed.connect(_on_console_close)
func _unhandled_input(event: InputEvent) -> void:
if event.is_action_pressed("pause") and not is_console_open:
if UiManager.is_visible_on_stack(pause_menu_control):
@@ -78,6 +77,8 @@ func _on_exit_to_menu_button_pressed() -> void:
printerr("PauseMenu: Exit to menu scene not set.")
return
gm.resume_game()
gm.reset_current_session_state()
get_tree().change_scene_to_packed(exit_to_menu_scene)

View File

@@ -0,0 +1,22 @@
class_name SkillButton
extends Button
@export var skill_data: SkillData
func setup() -> void:
if not skill_data:
return
icon = skill_data.icon
text = tr(skill_data.name)
func activate() -> void:
set("theme_override_colors/font_color", Color("#49aa10"))
func deactivate() -> void:
set("theme_override_colors/font_color", Color("#ffffff"))

View File

@@ -0,0 +1 @@
uid://0obbehfd8fki

Binary file not shown.

After

Width:  |  Height:  |  Size: 577 B

View File

@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://0l454rfplmqg"
path="res://.godot/imported/MrBrick_base-sheet.png-48bb6ed32601bab7bff225ba37ca675b.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://sprites/MrBrick_base-sheet.png"
dest_files=["res://.godot/imported/MrBrick_base-sheet.png-48bb6ed32601bab7bff225ba37ca675b.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: 14 KiB

View File

@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://do6m4ry8ss01e"
path="res://.godot/imported/PS_Tileset_12_nes.png-39c3c997b86dfe7b17d7d91b44ae7d73.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://sprites/PS_Tileset_12_nes.png"
dest_files=["res://.godot/imported/PS_Tileset_12_nes.png-39c3c997b86dfe7b17d7d91b44ae7d73.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.1 KiB

View File

@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://055an6f4wluo"
path="res://.godot/imported/PS_Forest_01.png-da6cba79b5f1706b5dbc0b3c51c01252.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://sprites/backgrounds/forest/PS_Forest_01.png"
dest_files=["res://.godot/imported/PS_Forest_01.png-da6cba79b5f1706b5dbc0b3c51c01252.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.5 KiB

View File

@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dk8846ai1ht6i"
path="res://.godot/imported/PS_Forest_02.png-43be04dc74cc6fd4ea9c6246b949fa45.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://sprites/backgrounds/forest/PS_Forest_02.png"
dest_files=["res://.godot/imported/PS_Forest_02.png-43be04dc74cc6fd4ea9c6246b949fa45.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.6 KiB

View File

@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bl3iv071i34ge"
path="res://.godot/imported/PS_Forest_03.png-4314bdb5f37f4636262d67e5e27bce87.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://sprites/backgrounds/forest/PS_Forest_03.png"
dest_files=["res://.godot/imported/PS_Forest_03.png-4314bdb5f37f4636262d67e5e27bce87.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.5 KiB

View File

@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bcrqiyfk6fpgq"
path="res://.godot/imported/PS_Forest_04.png-ba579387b88579ce1bbc0472786a9093.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://sprites/backgrounds/forest/PS_Forest_04.png"
dest_files=["res://.godot/imported/PS_Forest_04.png-ba579387b88579ce1bbc0472786a9093.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
sprites/health_potions.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 476 B

View File

@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://1x4iq56rhc18"
path="res://.godot/imported/health_potions.png-2a428c62301dffcc03dfe6d0e2934ba4.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://sprites/health_potions.png"
dest_files=["res://.godot/imported/health_potions.png-2a428c62301dffcc03dfe6d0e2934ba4.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
sprites/locked_skill.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 B

View File

@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://52adghxscdgy"
path="res://.godot/imported/locked_skill.png-48fa9e93aa2c711c18fd9edb5233eb69.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://sprites/locked_skill.png"
dest_files=["res://.godot/imported/locked_skill.png-48fa9e93aa2c711c18fd9edb5233eb69.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
sprites/unlocked_skill.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 B

View File

@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://rucyqmgrdld3"
path="res://.godot/imported/unlocked_skill.png-be1990df98d42600170074fac52ea327.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://sprites/unlocked_skill.png"
dest_files=["res://.godot/imported/unlocked_skill.png-be1990df98d42600170074fac52ea327.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