godot-4.5 (#5)

Reviewed-on: #5
This commit was merged in pull request #5.
This commit is contained in:
2026-01-31 13:06:43 +00:00
parent bc3108ea37
commit dde3eaa52e
45 changed files with 5779 additions and 271 deletions

View File

@@ -1,6 +1,4 @@
using Godot;
using Limbo.Console.Sharp;
using Mr.BrickAdventures.scripts;
using Mr.BrickAdventures.scripts.components;
namespace Mr.BrickAdventures.Autoloads;
@@ -17,66 +15,42 @@ public partial class ConsoleManager : Node
_gameManager = GetNode<GameManager>("/root/GameManager");
_achievementManager = GetNode<AchievementManager>("/root/AchievementManager");
_skillManager = GetNode<SkillManager>("/root/SkillManager");
RegisterConsoleCommands();
}
public override void _ExitTree()
{
UnregisterConsoleCommands();
}
[ConsoleCommand("add_coins", "Adds a specified amount of coins to the player's total.")]
private void AddCoinsCommand(int amount)
{
_gameManager.AddCoins(amount);
LimboConsole.Info($"Increased coins by {amount}. Total coins: {_gameManager.GetCoins()}");
}
[ConsoleCommand("set_coins", "Sets the player's total coins to a specified amount.")]
private void SetCoinsCommand(int amount)
{
_gameManager.SetCoins(amount);
LimboConsole.Info($"Set coins to {amount}. Total coins: {_gameManager.GetCoins()}");
}
[ConsoleCommand("set_lives", "Sets the player's total lives to a specified amount.")]
private void SetLivesCommand(int amount)
{
_gameManager.SetLives(amount);
LimboConsole.Info($"Set lives to {amount}.");
}
[ConsoleCommand("add_lives", "Adds a specified amount of lives to the player's total.")]
private void AddLivesCommand(int amount)
{
_gameManager.AddLives(amount);
LimboConsole.Info($"Increased lives by {amount}. Total lives: {_gameManager.GetLives()}");
}
[ConsoleCommand("set_health", "Sets the player's health to a specified amount.")]
private void SetHealthCommand(float amount)
{
var playerHealthComponent = _gameManager.Player.GetNode<HealthComponent>("HealthComponent");
if (playerHealthComponent != null)
{
playerHealthComponent.Health = amount;
LimboConsole.Info($"Set player health to {amount}.");
}
else
{
LimboConsole.Warn("Player HealthComponent not found.");
}
}
[ConsoleCommand("reset_session", "Resets the current session state.")]
private void ResetSessionCommand()
{
_gameManager.ResetCurrentSessionState();
LimboConsole.Info("Current session state has been reset.");
}
[ConsoleCommand("unlock_skill", "Unlocks and activates a skill by its name.")]
private void UnlockSkillCommand(string skillName)
{
if (!GetSkillManagement()) return;
@@ -84,14 +58,12 @@ public partial class ConsoleManager : Node
var skill = _skillManager.GetSkillByName(skillName);
if (skill == null)
{
LimboConsole.Warn($"Skill '{skillName}' not found.");
return;
}
_gameManager.UnlockSkill(skill);
_skillManager.ActivateSkill(skill);
_skillUnlockerComponent.EmitSignal(SkillUnlockerComponent.SignalName.SkillUnlocked, skill);
LimboConsole.Info($"Skill '{skillName}' has been unlocked and activated.");
}
private bool GetSkillManagement()
@@ -99,7 +71,6 @@ public partial class ConsoleManager : Node
var player = _gameManager.Player;
if (player == null || !IsInstanceValid(player))
{
LimboConsole.Warn("Player node not found or is invalid.");
return false;
}
@@ -107,21 +78,17 @@ public partial class ConsoleManager : Node
if (_skillManager != null && _skillUnlockerComponent != null) return true;
LimboConsole.Warn("SkillManager or SkillUnlockerComponent not found on the player.");
return false;
}
[ConsoleCommand("unlock_all_skills", "Unlocks and activates all available skills.")]
private void UnlockAllSkillsCommand()
{
if (!GetSkillManagement()) return;
_skillUnlockerComponent.UnlockAllSkills();
LimboConsole.Info("All skills have been unlocked and activated.");
}
[ConsoleCommand("remove_skill", "Deactivates and removes a skill by its name.")]
private void RemoveSkillCommand(string skillName)
{
if (!GetSkillManagement()) return;
@@ -129,16 +96,13 @@ public partial class ConsoleManager : Node
var skill = _skillManager.GetSkillByName(skillName);
if (skill == null)
{
LimboConsole.Warn($"Skill '{skillName}' not found.");
return;
}
_gameManager.RemoveSkill(skill.Name);
_skillManager.DeactivateSkill(skill);
LimboConsole.Info($"Skill '{skillName}' has been deactivated.");
}
[ConsoleCommand("remove_all_skills", "Deactivates and removes all skills.")]
private void RemoveAllSkillsCommand()
{
if (!GetSkillManagement()) return;
@@ -148,23 +112,18 @@ public partial class ConsoleManager : Node
_gameManager.RemoveSkill(skill.Name);
_skillManager.DeactivateSkill(skill);
}
LimboConsole.Info("All skills have been deactivated.");
}
[ConsoleCommand("next_level", "Advances the game to the next level.")]
private void GoToNextLevelCommand()
{
_gameManager.OnLevelComplete();
}
[ConsoleCommand("unlock_achievement", "Unlocks an achievement by its ID.")]
private void UnlockAchievementCommand(string achievementId)
{
_achievementManager.UnlockAchievement(achievementId);
LimboConsole.Info($"Attempted to unlock achievement '{achievementId}'.");
}
[ConsoleCommand("reset_achievement", "Resets (locks) an achievement by its ID.")]
private void ResetAchievementCommand(string achievementId)
{
_achievementManager.LockAchievement(achievementId);

View File

@@ -1,4 +1,4 @@
<Project Sdk="Godot.NET.Sdk/4.4.1">
<Project Sdk="Godot.NET.Sdk/4.5.1">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<EnableDynamicLoading>true</EnableDynamicLoading>
@@ -8,6 +8,5 @@
<PackageReference Include="Facepunch.Steamworks" Version="2.3.3" />
<PackageReference Include="Facepunch.Steamworks.Dlls" Version="2.3.2" />
<PackageReference Include="Facepunch.Steamworks.Library" Version="2.3.3" />
<PackageReference Include="LimboConsole.Sharp" Version="0.0.1-beta-008" />
</ItemGroup>
</Project>

View File

@@ -1,4 +1,5 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AArea2D_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E2_003Fresharper_002Dhost_003FSourcesCache_003F116d8c5f8dae51522ba398e1d89e3d4722f4af7b6e7f071196b928be44af7_003FArea2D_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ACamera2D_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E2_003Fresharper_002Dhost_003FSourcesCache_003Fa2e12a1a67ad701a97608de6be85250e3e353951ecf8058a02c703490c753_003FCamera2D_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ACanvasItem_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FSourcesCache_003Fef7b819b226fab796d1dfe66d415dd7510bcac87675020ddb8f03a828e763_003FCanvasItem_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ACecovym_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003Ftmp_003FJetBrainsPerUserTemp_002D1000_002D1_003FSandboxFiles_003FSadijuw_003FCecovym_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
@@ -10,5 +11,7 @@
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AList_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E2_003Fresharper_002Dhost_003FSourcesCache_003Fe747192abb38e2df82cbdb37e721567726f559914a7b81f8b26ba537de632f4_003FList_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AMr_002EBrickAdventures_002Escripts_002Ecomponents_002ECollectableComponent_005FScriptSignals_002Egenerated_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E2_003Fresharper_002Dhost_003FSourcesCache_003F80d9408eb7280c15eb4a12b61cdf8f7f1b0c5a2_003FMr_002EBrickAdventures_002Escripts_002Ecomponents_002ECollectableComponent_005FScriptSignals_002Egenerated_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ANode2D_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FSourcesCache_003F86db9cd834346aad02d74c1b66dd9c64d6ef3147435dd9c9c9477b48f7_003FNode2D_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003APhysicsBody2D_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E2_003Fresharper_002Dhost_003FSourcesCache_003F4fcd28ddaffa68e6fe53288161b788dea7d402b4a41b9d9f0f0f2c52f9af075_003FPhysicsBody2D_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ARectangleShape2D_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FSourcesCache_003Fa1cc98873548652da0c14ecefa4737431426fcbb24a7f0641e3d9c266c3_003FRectangleShape2D_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ARigidBody2D_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E2_003Fresharper_002Dhost_003FSourcesCache_003F7bc3ccc1ac5bbc68933d64c7b7eb5ab4aecde2b73c686dd6495b68bdf08ba5b2_003FRigidBody2D_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AShape2D_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FSourcesCache_003F3671dbbd9b17cdf2bf9075b468b6bd7e3ab13fc3be7a116484085d3b6cc9fe_003FShape2D_002Ecs/@EntryIndexedValue">ForceIncluded</s:String></wpf:ResourceDictionary>

View File

@@ -15,7 +15,7 @@ radius = 4.0
[node name="Bullet" type="Area2D"]
collision_layer = 64
collision_mask = 21
collision_mask = 85
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
shape = SubResource("CircleShape2D_txsw8")
@@ -47,7 +47,7 @@ VisibilityNotifier = NodePath("../VisibleOnScreenNotifier2D")
[node name="LifetimeComponent" type="Node" parent="."]
script = ExtResource("4_aniyw")
LifeTime = 10.0
LifeTime = 3.0
[node name="LaunchComponent" type="Node2D" parent="."]
script = ExtResource("5_3ks47")

View File

@@ -0,0 +1,48 @@
[gd_scene load_steps=7 format=3 uid="uid://qrbiu1qo4tt5"]
[ext_resource type="Texture2D" uid="uid://djifxc5x0dyrw" path="res://sprites/ppc_tileset.png" id="1_0efvn"]
[ext_resource type="Script" uid="uid://bnaxy8cw3wrko" path="res://scripts/components/PeriodicShootingComponent.cs" id="2_4ycs1"]
[ext_resource type="PackedScene" uid="uid://chetx6gmnwbxi" path="res://objects/entities/cannon_bullet.tscn" id="3_ab2uh"]
[ext_resource type="Script" uid="uid://b3j23e7b7x8ro" path="res://scripts/components/RecoilComponent.cs" id="4_tynaf"]
[ext_resource type="Script" uid="uid://c707c53k7c5ae" path="res://scripts/components/SquashAndStretchComponent.cs" id="5_0xigu"]
[sub_resource type="RectangleShape2D" id="RectangleShape2D_j5sus"]
size = Vector2(16, 16)
[node name="Cannon" type="StaticBody2D"]
collision_layer = 0
collision_mask = 0
[node name="Sprite2D" type="Sprite2D" parent="."]
rotation = 3.14159
texture = ExtResource("1_0efvn")
hframes = 12
vframes = 12
frame = 42
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
shape = SubResource("RectangleShape2D_j5sus")
[node name="PeriodicShootingComponent" type="Node" parent="." node_paths=PackedStringArray("BulletSpawnPointRight")]
script = ExtResource("2_4ycs1")
BulletScene = ExtResource("3_ab2uh")
ShootInterval = 3.0
ShootDirection = Vector2(0, 1)
BulletSpawnPointRight = NodePath("../Bullet spawn")
ShootingIntervalVariation = 0.61
metadata/_custom_type_script = "uid://bnaxy8cw3wrko"
[node name="Bullet spawn" type="Marker2D" parent="."]
position = Vector2(0, 12)
[node name="RecoilComponent" type="Node" parent="." node_paths=PackedStringArray("RecoilTarget")]
script = ExtResource("4_tynaf")
RecoilTarget = NodePath("../Sprite2D")
RecoilDistance = 4.0
RecoilDuration = 0.12
metadata/_custom_type_script = "uid://b3j23e7b7x8ro"
[node name="SquashAndStretchComponent" type="Node" parent="." node_paths=PackedStringArray("TargetNode")]
script = ExtResource("5_0xigu")
TargetNode = NodePath("../Sprite2D")
metadata/_custom_type_script = "uid://c707c53k7c5ae"

View File

@@ -0,0 +1,48 @@
[gd_scene load_steps=7 format=3 uid="uid://cm0rd70wafif1"]
[ext_resource type="Texture2D" uid="uid://djifxc5x0dyrw" path="res://sprites/ppc_tileset.png" id="1_hnnrt"]
[ext_resource type="Script" uid="uid://bnaxy8cw3wrko" path="res://scripts/components/PeriodicShootingComponent.cs" id="2_cho7n"]
[ext_resource type="PackedScene" uid="uid://chetx6gmnwbxi" path="res://objects/entities/cannon_bullet.tscn" id="3_kgmtj"]
[ext_resource type="Script" uid="uid://b3j23e7b7x8ro" path="res://scripts/components/RecoilComponent.cs" id="4_nfk87"]
[ext_resource type="Script" uid="uid://c707c53k7c5ae" path="res://scripts/components/SquashAndStretchComponent.cs" id="5_43fqe"]
[sub_resource type="RectangleShape2D" id="RectangleShape2D_j5sus"]
size = Vector2(16, 16)
[node name="Cannon" type="StaticBody2D"]
collision_layer = 0
collision_mask = 0
[node name="Sprite2D" type="Sprite2D" parent="."]
rotation = -1.5708
texture = ExtResource("1_hnnrt")
hframes = 12
vframes = 12
frame = 42
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
shape = SubResource("RectangleShape2D_j5sus")
[node name="PeriodicShootingComponent" type="Node" parent="." node_paths=PackedStringArray("BulletSpawnPointRight")]
script = ExtResource("2_cho7n")
BulletScene = ExtResource("3_kgmtj")
ShootInterval = 3.0
ShootDirection = Vector2(-1, 0)
BulletSpawnPointRight = NodePath("../Bullet spawn")
ShootingIntervalVariation = 0.61
metadata/_custom_type_script = "uid://bnaxy8cw3wrko"
[node name="Bullet spawn" type="Marker2D" parent="."]
position = Vector2(-12, 0)
[node name="RecoilComponent" type="Node" parent="." node_paths=PackedStringArray("RecoilTarget")]
script = ExtResource("4_nfk87")
RecoilTarget = NodePath("../Sprite2D")
RecoilDistance = 4.0
RecoilDuration = 0.12
metadata/_custom_type_script = "uid://b3j23e7b7x8ro"
[node name="SquashAndStretchComponent" type="Node" parent="." node_paths=PackedStringArray("TargetNode")]
script = ExtResource("5_43fqe")
TargetNode = NodePath("../Sprite2D")
metadata/_custom_type_script = "uid://c707c53k7c5ae"

View File

@@ -0,0 +1,47 @@
[gd_scene load_steps=7 format=3 uid="uid://dr6srln4mckwn"]
[ext_resource type="Texture2D" uid="uid://djifxc5x0dyrw" path="res://sprites/ppc_tileset.png" id="1_r5bjs"]
[ext_resource type="Script" uid="uid://bnaxy8cw3wrko" path="res://scripts/components/PeriodicShootingComponent.cs" id="2_gd3be"]
[ext_resource type="PackedScene" uid="uid://chetx6gmnwbxi" path="res://objects/entities/cannon_bullet.tscn" id="3_1gufj"]
[ext_resource type="Script" uid="uid://b3j23e7b7x8ro" path="res://scripts/components/RecoilComponent.cs" id="4_hwc6x"]
[ext_resource type="Script" uid="uid://c707c53k7c5ae" path="res://scripts/components/SquashAndStretchComponent.cs" id="5_o674s"]
[sub_resource type="RectangleShape2D" id="RectangleShape2D_j5sus"]
size = Vector2(16, 16)
[node name="Cannon" type="StaticBody2D"]
collision_layer = 0
collision_mask = 0
[node name="Sprite2D" type="Sprite2D" parent="."]
rotation = 1.5708
texture = ExtResource("1_r5bjs")
hframes = 12
vframes = 12
frame = 42
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
shape = SubResource("RectangleShape2D_j5sus")
[node name="PeriodicShootingComponent" type="Node" parent="." node_paths=PackedStringArray("BulletSpawnPointRight")]
script = ExtResource("2_gd3be")
BulletScene = ExtResource("3_1gufj")
ShootInterval = 3.0
BulletSpawnPointRight = NodePath("../Bullet spawn")
ShootingIntervalVariation = 0.61
metadata/_custom_type_script = "uid://bnaxy8cw3wrko"
[node name="Bullet spawn" type="Marker2D" parent="."]
position = Vector2(12, 0)
[node name="RecoilComponent" type="Node" parent="." node_paths=PackedStringArray("RecoilTarget")]
script = ExtResource("4_hwc6x")
RecoilTarget = NodePath("../Sprite2D")
RecoilDistance = 4.0
RecoilDuration = 0.12
metadata/_custom_type_script = "uid://b3j23e7b7x8ro"
[node name="SquashAndStretchComponent" type="Node" parent="." node_paths=PackedStringArray("TargetNode")]
script = ExtResource("5_o674s")
TargetNode = NodePath("../Sprite2D")
metadata/_custom_type_script = "uid://c707c53k7c5ae"

View File

@@ -0,0 +1,78 @@
[gd_scene load_steps=11 format=3 uid="uid://bmk3ddwv33dud"]
[ext_resource type="Texture2D" uid="uid://ccjihsk6w8sow" path="res://sprites/BFT - Mega Metroidvania Tileset.png" id="1_erbp6"]
[ext_resource type="Script" uid="uid://2i7p7v135u7c" path="res://scripts/components/DamageComponent.cs" id="2_fq2gn"]
[ext_resource type="Script" uid="uid://v7tt4w6bejux" path="res://scripts/components/CleanupComponent.cs" id="4_mgh1e"]
[ext_resource type="Script" uid="uid://nhu2xd8611fk" path="res://scripts/components/HazardComponent.cs" id="5_8g254"]
[ext_resource type="Script" uid="uid://chusyr5vwgwf0" path="res://scripts/components/CleanupOnCollisionComponent.cs" id="6_2rpon"]
[ext_resource type="Script" uid="uid://cgfynrn68lp12" path="res://scripts/components/KnockbackComponent.cs" id="6_3n0l8"]
[ext_resource type="Script" uid="uid://co05ugnvx0v3e" path="res://scripts/components/FallOnDetectionComponent.cs" id="7_mgh1e"]
[sub_resource type="RectangleShape2D" id="RectangleShape2D_t3a48"]
size = Vector2(16, 8)
[sub_resource type="RectangleShape2D" id="RectangleShape2D_fq2gn"]
size = Vector2(16, 320)
[sub_resource type="RectangleShape2D" id="RectangleShape2D_2rpon"]
size = Vector2(17, 9)
[node name="FallingSpike" type="RigidBody2D"]
collision_mask = 5
gravity_scale = 0.0
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
position = Vector2(0, -4)
shape = SubResource("RectangleShape2D_t3a48")
[node name="Sprite2D" type="Sprite2D" parent="."]
rotation = -3.14159
texture = ExtResource("1_erbp6")
hframes = 13
vframes = 45
frame = 9
[node name="DamageComponent" type="Node" parent="." node_paths=PackedStringArray("Area")]
script = ExtResource("2_fq2gn")
Area = NodePath("")
metadata/_custom_type_script = "uid://2i7p7v135u7c"
[node name="HazardComponent" type="Node2D" parent="." node_paths=PackedStringArray("KnockbackComponent", "HazardArea")]
script = ExtResource("5_8g254")
KnockbackComponent = NodePath("../KnockbackComponent")
HazardArea = NodePath("../HazardArea")
metadata/_custom_type_script = "uid://nhu2xd8611fk"
[node name="KnockbackComponent" type="Node" parent="."]
script = ExtResource("6_3n0l8")
metadata/_custom_type_script = "uid://cgfynrn68lp12"
[node name="FallTriggerArea" type="Area2D" parent="."]
collision_mask = 4
[node name="CollisionShape2D" type="CollisionShape2D" parent="FallTriggerArea"]
position = Vector2(0, 155)
shape = SubResource("RectangleShape2D_fq2gn")
debug_color = Color(0.916282, 7.47952e-05, 0.709809, 0.42)
[node name="CleanupComponent" type="Node" parent="."]
script = ExtResource("4_mgh1e")
metadata/_custom_type_script = "uid://v7tt4w6bejux"
[node name="CleanupOnCollisionComponent" type="Node" parent="."]
script = ExtResource("6_2rpon")
metadata/_custom_type_script = "uid://chusyr5vwgwf0"
[node name="FallOnDetectionComponent" type="Node2D" parent="." node_paths=PackedStringArray("DetectionArea", "TargetBody")]
script = ExtResource("7_mgh1e")
DetectionArea = NodePath("../FallTriggerArea")
TargetBody = NodePath("..")
metadata/_custom_type_script = "uid://co05ugnvx0v3e"
[node name="HazardArea" type="Area2D" parent="."]
collision_mask = 4
[node name="CollisionShape2D" type="CollisionShape2D" parent="HazardArea"]
position = Vector2(0, -4.5)
shape = SubResource("RectangleShape2D_2rpon")
debug_color = Color(0.73011, 0.468379, 0.188355, 0.42)

View File

@@ -1,15 +1,16 @@
[gd_scene load_steps=7 format=3 uid="uid://b4eifkc31jsun"]
[gd_scene load_steps=8 format=3 uid="uid://b4eifkc31jsun"]
[ext_resource type="Script" uid="uid://c6eoi3ymefc0x" path="res://Autoloads/GameManager.cs" id="1_t2tr6"]
[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="PackedScene" uid="uid://bbwef3n2gjkt8" path="res://scenes/level_village_5.tscn" id="6_7rb6w"]
[ext_resource type="Script" uid="uid://chrhjch4ymfvr" path="res://scripts/Screenshot.cs" id="6_bbtu1"]
[node name="GameManager" type="Node"]
script = ExtResource("1_t2tr6")
LevelScenes = Array[PackedScene]([ExtResource("2_bentb"), ExtResource("3_ajlkg"), ExtResource("4_se5tb"), ExtResource("5_mnosh")])
LevelScenes = Array[PackedScene]([ExtResource("2_bentb"), ExtResource("3_ajlkg"), ExtResource("4_se5tb"), ExtResource("5_mnosh"), ExtResource("6_7rb6w")])
[node name="Screenshot" type="Node" parent="."]
script = ExtResource("6_bbtu1")

View File

@@ -53,11 +53,13 @@ size_flags_vertical = 3
[node name="Input Settings Button" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer"]
layout_mode = 2
disabled = true
text = "INPUT_BUTTON"
flat = true
[node name="Display Settings Button" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer"]
layout_mode = 2
disabled = true
text = "DISPLAY_BUTTON"
flat = true
@@ -68,6 +70,7 @@ flat = true
[node name="Gameplay Settings Button" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer"]
layout_mode = 2
disabled = true
text = "GAMEPLAY_BUTTON"
flat = true

View File

@@ -19,7 +19,7 @@ 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", "C#", "GL Compatibility")
config/features=PackedStringArray("4.5", "C#", "GL Compatibility")
run/max_fps=180
boot_splash/bg_color=Color(0, 0, 0, 1)
boot_splash/show_image=false
@@ -80,6 +80,17 @@ movie_writer/fps=24
enabled=PackedStringArray("res://addons/dialogue_manager/plugin.cfg", "res://addons/limbo_console/plugin.cfg", "res://addons/phantom_camera/plugin.cfg")
[file_customization]
folder_colors={
"res://objects/": "red",
"res://objects/entities/": "yellow",
"res://resources/": "orange",
"res://scenes/": "purple",
"res://scripts/": "teal",
"res://sprites/": "green"
}
[global_group]
coins=""
@@ -89,9 +100,9 @@ Collectables=""
[gui]
theme/default_font_antialiasing=0
theme/default_theme_scale=0.5
theme/custom_font="res://fonts/PressStart2P-Regular.ttf"
theme/default_font_antialiasing=0
[input]
@@ -182,18 +193,15 @@ screenshot={
}
limbo_console_toggle={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":96,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
"events": []
}
limbo_auto_complete_reverse={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":true,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194306,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
"events": []
}
limbo_console_search_history={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":true,"meta_pressed":false,"pressed":false,"keycode":82,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
"events": []
}
[internationalization]

View File

@@ -0,0 +1,8 @@
[gd_resource type="Resource" script_class="LevelResource" load_steps=2 format=3 uid="uid://qld841xv5ui0"]
[ext_resource type="Script" uid="uid://c2h0pqhxiqswe" path="res://scripts/Resources/LevelResource.cs" id="1_chped"]
[resource]
script = ExtResource("1_chped")
LevelName = "LEVEL_5_NAME"
ScenePath = "res://scenes/level_village_5.tscn"

View File

@@ -17,9 +17,6 @@ metadata/_custom_type_script = "uid://dwb0e05pewcsn"
script = ExtResource("1_unqwr")
Name = "BRICK_ARMOR"
Description = "BRICK_ARMOR_DESCRIPTION"
IsActive = false
Level = 1
Type = 1
Node = ExtResource("1_aqcna")
Upgrades = Array[ExtResource("2_kqsqd")]([SubResource("Resource_xwv1u"), SubResource("Resource_xwv1u")])
metadata/_custom_type_script = "uid://d4crrfmbgxnqf"

View File

@@ -26,8 +26,6 @@ metadata/_custom_type_script = "uid://dwb0e05pewcsn"
script = ExtResource("1_m360g")
Name = "BRICK_SHIELD"
Description = "BRICK_SHIELD_DESCRIPTION"
IsActive = false
Level = 1
Type = 2
Node = ExtResource("1_xjknp")
Upgrades = Array[ExtResource("2_lr0w4")]([SubResource("Resource_mu2sy"), SubResource("Resource_5ab4a")])

View File

@@ -8,15 +8,12 @@
script = ExtResource("2_kywbf")
Cost = 80
Description = ""
Properties = Dictionary[String, Variant]({})
metadata/_custom_type_script = "uid://dwb0e05pewcsn"
[resource]
script = ExtResource("1_p5qvt")
Name = "DOUBLE_JUMP"
Description = "DOUBLE_JUMP_DESCRIPTION"
IsActive = false
Level = 1
Type = 2
Node = ExtResource("1_t7o84")
Upgrades = Array[ExtResource("2_kywbf")]([SubResource("Resource_0fn2n")])

View File

@@ -8,15 +8,12 @@
script = ExtResource("2_tkhf7")
Cost = 300
Description = ""
Properties = Dictionary[String, Variant]({})
metadata/_custom_type_script = "uid://dwb0e05pewcsn"
[resource]
script = ExtResource("1_i1qac")
Name = "GROUND_POUND_SKILL"
Description = "GROUND_POUND_SKILL_DESCRIPTION"
IsActive = false
Level = 1
Type = 2
Node = ExtResource("1_auljr")
Upgrades = Array[ExtResource("2_tkhf7")]([SubResource("Resource_upxa7")])

View File

@@ -26,9 +26,6 @@ metadata/_custom_type_script = "uid://dwb0e05pewcsn"
script = ExtResource("1_g8qe3")
Name = "XRAY_VISION"
Description = "XRAY_VISION_DESCRIPTION"
IsActive = false
Level = 1
Type = 1
Node = ExtResource("1_ax2d8")
Upgrades = Array[ExtResource("2_o726x")]([SubResource("Resource_72ltj"), SubResource("Resource_2kdfi")])
metadata/_custom_type_script = "uid://d4crrfmbgxnqf"

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -1,8 +1,9 @@
[gd_scene load_steps=26 format=4 uid="uid://chqb11pfoqmeb"]
[gd_scene load_steps=27 format=4 uid="uid://chqb11pfoqmeb"]
[ext_resource type="PackedScene" uid="uid://bqi5s710xb1ju" path="res://objects/entities/brick_player.tscn" id="1_wcma7"]
[ext_resource type="PackedScene" uid="uid://cawlpch2lk3a2" path="res://objects/level/world_environment.tscn" id="2_ot3dy"]
[ext_resource type="PackedScene" uid="uid://6foggu31cu14" path="res://objects/level/ui_layer.tscn" id="3_cjqhe"]
[ext_resource type="Resource" uid="uid://dlwkbjw1l33uq" path="res://resources/levels/village/village_2.tres" id="4_h4uvs"]
[ext_resource type="PackedScene" uid="uid://cywsu7yrtjdog" path="res://objects/level/global_light.tscn" id="4_wykfl"]
[ext_resource type="PackedScene" uid="uid://cb0mnye1ki5a6" path="res://objects/level/camera_2d.tscn" id="5_8nvkd"]
[ext_resource type="Script" uid="uid://d23haq52m7ulv" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_2d.gd" id="6_ono4h"]
@@ -54,7 +55,6 @@ color_ramp = SubResource("GradientTexture1D_f1fvy")
script = ExtResource("7_y1tp2")
duration = 0.1
transition = 3
ease = 2
[node name="World" type="Node2D"]
@@ -75,6 +75,9 @@ process_mode = 4
[node name="HUD" parent="UI Layer" index="0" node_paths=PackedStringArray("Health")]
Health = NodePath("../../Brick Player/HealthComponent")
[node name="DeathScreen" parent="UI Layer" index="1"]
CurrentLevel = ExtResource("4_h4uvs")
[node name="Marketplace" parent="UI Layer" index="3" node_paths=PackedStringArray("SkillUnlockerComponent", "ComponentsToDisable")]
SkillUnlockerComponent = NodePath("../../Brick Player/SkillUnlockerComponent")
ComponentsToDisable = [NodePath("../../Brick Player")]
@@ -132,6 +135,7 @@ tile_set = ExtResource("13_lc0ll")
[node name="ExitLevel" parent="." instance=ExtResource("15_hcsb6")]
position = Vector2(987, -776)
AchievementId = "level_complete_2"
[node name="Child" parent="." instance=ExtResource("16_lc0ll")]
position = Vector2(-1326, 176)
@@ -156,18 +160,18 @@ position = Vector2(1272, -143)
[node name="Enemy" parent="Enemies" instance=ExtResource("18_girek")]
position = Vector2(-1526, 256)
[node name="Enemy2" parent="Enemies" instance=ExtResource("18_girek")]
position = Vector2(-1098, 254)
[node name="Enemy3" parent="Enemies" instance=ExtResource("18_girek")]
position = Vector2(-1190, 175)
[node name="Enemy4" parent="Enemies" instance=ExtResource("18_girek")]
position = Vector2(-1326, 320)
[node name="Enemy6" parent="Enemies" instance=ExtResource("18_girek")]
position = Vector2(1648, -352)
[node name="Enemy9" parent="Enemies" instance=ExtResource("16_h4uvs")]
position = Vector2(-1097, 255)
[node name="Enemy2" parent="Enemies" instance=ExtResource("16_h4uvs")]
position = Vector2(-1326, 320)
[node name="Lever" parent="." instance=ExtResource("20_h4uvs")]
position = Vector2(-231, -776)

View File

@@ -1,4 +1,4 @@
[gd_scene load_steps=31 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"]
@@ -16,10 +16,12 @@
[ext_resource type="Script" uid="uid://ccfft4b8rwgbo" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="14_k7w2w"]
[ext_resource type="PackedScene" uid="uid://d0s2abysa86rq" path="res://objects/entities/child.tscn" id="15_dv6gh"]
[ext_resource type="PackedScene" uid="uid://6foggu31cu14" path="res://objects/level/ui_layer.tscn" id="16_nr2eo"]
[ext_resource type="Resource" uid="uid://b63u5qfp8p7pv" path="res://resources/levels/village/village_3.tres" id="17_m6h4x"]
[ext_resource type="PackedScene" uid="uid://b4pdt1gv2ymyi" path="res://objects/tooltip.tscn" id="18_l3a7y"]
[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://bqom4cm7r18db" path="res://objects/entities/killzone.tscn" id="21_p30ax"]
[ext_resource type="PackedScene" uid="uid://12jnkdygpxwc" path="res://objects/entities/exit_level.tscn" id="22_a7yjf"]
[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"]
@@ -234,7 +236,6 @@ color_ramp = SubResource("GradientTexture1D_f1fvy")
script = ExtResource("14_k7w2w")
duration = 0.25
transition = 3
ease = 2
[node name="World" type="Node2D"]
@@ -254,7 +255,7 @@ tile_map_data = PackedByteArray("AABiAAcAAQAEAAMAAABiAAYAAQAEAAIAAABiAAUAAQAEAAI
tile_set = ExtResource("4_6fdf4")
[node name="Entities layer" type="TileMapLayer" parent="."]
tile_map_data = PackedByteArray("AABAAAAAAAAJAAYAAABFAAAAAAALAAYAAABEAAAAAAAKAAYAAABDAAAAAAAKAAYAAABCAAAAAAAKAAYAAABBAAAAAAAKAAYAAABAAPr/AAAJAAYAAABBAPr/AAAKAAYAAABCAPr/AAAKAAYAAABDAPr/AAAKAAYAAABEAPr/AAAKAAYAAABFAPr/AAAKAAYAAABGAPr/AAAKAAYAAABHAPr/AAAKAAYAAABIAPr/AAAKAAYAAABJAPr/AAAKAAYAAABKAPr/AAAKAAYAAABLAPr/AAALAAYAAABjAP7/AAAHAAQAAAB8AP7/AAAKAAQAAABkAP7/AQAAAAAAAgBlAP7/AQAAAAAAAgBmAP7/AQAAAAAAAgBnAP7/AQAAAAAAAgBoAP7/AQAAAAAAAgBpAP7/AQAAAAAAAgBsAP7/AQAAAAAAAgBtAP7/AQAAAAAAAgBrAP7/AQAAAAAAAgBqAP7/AQAAAAAAAgBuAP7/AQAAAAAAAgBvAP7/AQAAAAAAAgBwAP7/AQAAAAAAAgBxAP7/AQAAAAAAAgByAP7/AQAAAAAAAgBzAP7/AQAAAAAAAgB0AP7/AQAAAAAAAgB1AP7/AQAAAAAAAgB2AP7/AQAAAAAAAgB3AP7/AQAAAAAAAgB4AP7/AQAAAAAAAgB5AP7/AQAAAAAAAgB6AP7/AQAAAAAAAgB7AP7/AQAAAAAAAgCJAPr/AAAJAAYAAACKAPr/AAAKAAYAAACLAPr/AAALAAYAAABOAOz/AQAAAAAAAQBNAOz/AQAAAAAAAQBMAOz/AQAAAAAAAQBNAOv/AQAAAAAAAQBDAOf/AQAAAAAAAQBCAOf/AQAAAAAAAQBBAOf/AQAAAAAAAQBCAOb/AQAAAAAAAQBIAOP/AQAAAAAAAQBHAOP/AQAAAAAAAQBGAOP/AQAAAAAAAQBHAOL/AQAAAAAAAQBBAN7/AQAAAAAAAQBCAN7/AQAAAAAAAQBDAN7/AQAAAAAAAQBCAN3/AQAAAAAAAQBDAOb/AQAAAAAAAQBGAOL/AQAAAAAAAQBDAN3/AQAAAAAAAQBMAOv/AQAAAAAAAQCRAOv/AQAAAAAAAQCRAOr/AQAAAAAAAQCRAOn/AQAAAAAAAQCSAOn/AQAAAAAAAQCTAOn/AQAAAAAAAQCTAOr/AQAAAAAAAQCTAOv/AQAAAAAAAQCSAOv/AQAAAAAAAQCSAOr/AQAAAAAAAQCAAOv/AQAAAAAAAQB/AOv/AQAAAAAAAQB+AOv/AQAAAAAAAQB+AOr/AQAAAAAAAQB/AOr/AQAAAAAAAQBAAP//AQAAAAAAAQBBAP//AQAAAAAAAQBCAP//AQAAAAAAAQBDAP//AQAAAAAAAQBEAP//AQAAAAAAAQClAP//AQAAAAAAAQCmAP//AQAAAAAAAQCnAP//AQAAAAAAAQCnAP7/AQAAAAAAAQClAP7/AQAAAAAAAQD4APT/AQAAAAAAAwC5AP3/AQAAAAAAAwCnACwAAQAAAAAABQChACwAAQAAAAAABgCvACwAAQAAAAAABgA2ANz/AQAAAAAABwD5APX/AQAAAAAACAABAQIAAQAAAAAACQA=")
tile_map_data = PackedByteArray("AABAAAAAAAAJAAYAAABFAAAAAAALAAYAAABEAAAAAAAKAAYAAABDAAAAAAAKAAYAAABCAAAAAAAKAAYAAABBAAAAAAAKAAYAAABAAPr/AAAJAAYAAABBAPr/AAAKAAYAAABCAPr/AAAKAAYAAABDAPr/AAAKAAYAAABEAPr/AAAKAAYAAABFAPr/AAAKAAYAAABGAPr/AAAKAAYAAABHAPr/AAAKAAYAAABIAPr/AAAKAAYAAABJAPr/AAAKAAYAAABKAPr/AAAKAAYAAABLAPr/AAALAAYAAABjAP7/AAAHAAQAAAB8AP7/AAAKAAQAAABkAP7/AQAAAAAAAgBlAP7/AQAAAAAAAgBmAP7/AQAAAAAAAgBnAP7/AQAAAAAAAgBoAP7/AQAAAAAAAgBpAP7/AQAAAAAAAgBsAP7/AQAAAAAAAgBtAP7/AQAAAAAAAgBrAP7/AQAAAAAAAgBqAP7/AQAAAAAAAgBuAP7/AQAAAAAAAgBvAP7/AQAAAAAAAgBwAP7/AQAAAAAAAgBxAP7/AQAAAAAAAgByAP7/AQAAAAAAAgBzAP7/AQAAAAAAAgB0AP7/AQAAAAAAAgB1AP7/AQAAAAAAAgB2AP7/AQAAAAAAAgB3AP7/AQAAAAAAAgB4AP7/AQAAAAAAAgB5AP7/AQAAAAAAAgB6AP7/AQAAAAAAAgB7AP7/AQAAAAAAAgCJAPr/AAAJAAYAAACKAPr/AAAKAAYAAACLAPr/AAALAAYAAABOAOz/AQAAAAAAAQBNAOz/AQAAAAAAAQBMAOz/AQAAAAAAAQBNAOv/AQAAAAAAAQBDAOf/AQAAAAAAAQBCAOf/AQAAAAAAAQBBAOf/AQAAAAAAAQBCAOb/AQAAAAAAAQBIAOP/AQAAAAAAAQBHAOP/AQAAAAAAAQBGAOP/AQAAAAAAAQBHAOL/AQAAAAAAAQBBAN7/AQAAAAAAAQBCAN7/AQAAAAAAAQBDAN7/AQAAAAAAAQBCAN3/AQAAAAAAAQBDAOb/AQAAAAAAAQBGAOL/AQAAAAAAAQBDAN3/AQAAAAAAAQBMAOv/AQAAAAAAAQCRAOv/AQAAAAAAAQCRAOr/AQAAAAAAAQCRAOn/AQAAAAAAAQCSAOn/AQAAAAAAAQCTAOn/AQAAAAAAAQCTAOr/AQAAAAAAAQCTAOv/AQAAAAAAAQCSAOv/AQAAAAAAAQCSAOr/AQAAAAAAAQCAAOv/AQAAAAAAAQB/AOv/AQAAAAAAAQB+AOv/AQAAAAAAAQB+AOr/AQAAAAAAAQB/AOr/AQAAAAAAAQBAAP//AQAAAAAAAQBBAP//AQAAAAAAAQBCAP//AQAAAAAAAQBDAP//AQAAAAAAAQBEAP//AQAAAAAAAQClAP//AQAAAAAAAQCmAP//AQAAAAAAAQCnAP//AQAAAAAAAQCnAP7/AQAAAAAAAQClAP7/AQAAAAAAAQD4APT/AQAAAAAAAwC5AP3/AQAAAAAAAwCnACwAAQAAAAAABQChACwAAQAAAAAABgCvACwAAQAAAAAABgA2ANz/AQAAAAAABwD5APX/AQAAAAAACAA=")
tile_set = ExtResource("5_ipoec")
[node name="Foreground layer" type="TileMapLayer" parent="."]
@@ -272,6 +273,10 @@ tile_map_data = PackedByteArray("AAA2AVkAAAAAAAAAAAA6AVkAAAACAAAAAAA8AVkAAAABAAA
tile_set = ExtResource("9_ma4yh")
collision_enabled = false
[node name="ExitLevel" parent="." instance=ExtResource("22_a7yjf")]
position = Vector2(4138, 40)
AchievementId = "level_complete_3"
[node name="Enemies" type="Node2D" parent="."]
process_mode = 1
@@ -295,7 +300,7 @@ z_index = 5
position = Vector2(903, -118)
metadata/_edit_group_ = true
[node name="HitParticles" parent="Brick Player" index="25"]
[node name="HitParticles" parent="Brick Player" index="24"]
process_material = SubResource("ParticleProcessMaterial_lgb3u")
[node name="Camera2D" parent="." instance=ExtResource("12_qhkyq")]
@@ -328,15 +333,20 @@ position = Vector2(880, -578)
[node name="HUD" parent="UI Layer" index="0" node_paths=PackedStringArray("Health")]
Health = NodePath("../../Brick Player/HealthComponent")
[node name="DeathScreen" parent="UI Layer" index="1"]
CurrentLevel = ExtResource("17_m6h4x")
[node name="Marketplace" parent="UI Layer" index="3" node_paths=PackedStringArray("SkillUnlockerComponent", "ComponentsToDisable")]
SkillUnlockerComponent = NodePath("../../Brick Player/SkillUnlockerComponent")
ComponentsToDisable = [NodePath("../../Brick Player")]
[node name="Tooltip" parent="." instance=ExtResource("18_l3a7y")]
position = Vector2(1016, -104)
Text = "WIP"
[node name="Tooltip2" parent="." instance=ExtResource("18_l3a7y")]
position = Vector2(1576, -40)
Text = "WIP"
[node name="WorldEnvironment" parent="." instance=ExtResource("20_embdf")]

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,46 @@
using Godot;
namespace Mr.BrickAdventures.scripts.components;
[GlobalClass]
public partial class CleanupOnCollisionComponent : Node
{
[Export(PropertyHint.Range, "0, 5, 0.1")] public float CleanupDelay { get; set; } = 0.5f;
private RigidBody2D _body;
private CleanupComponent _cleanupComponent;
private bool _isCleaningUp = false;
public override void _Ready()
{
_body = Owner as RigidBody2D;
if (_body == null)
{
GD.PrintErr("CleanupOnCollisionComponent must be attached to a RigidBody2D.");
SetProcess(false);
return;
}
_cleanupComponent = Owner.GetNode<CleanupComponent>("CleanupComponent");
if (_cleanupComponent == null)
{
GD.PrintErr("CleanupOnCollisionComponent requires a CleanupComponent on the same node.");
SetProcess(false);
return;
}
_body.BodyEntered += (_) => OnBodyEntered();
}
private async void OnBodyEntered()
{
if (_isCleaningUp) return;
_isCleaningUp = true;
await ToSignal(GetTree().CreateTimer(CleanupDelay), Timer.SignalName.Timeout);
_cleanupComponent?.CleanUp();
}
}

View File

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

View File

@@ -9,14 +9,20 @@ namespace Mr.BrickAdventures.scripts.components;
public partial class CollectableComponent : Node
{
private bool _hasFadeAway = false;
[Export] public Area2D Area2D { get; set; }
[Export] public CollisionShape2D CollisionShape { get; set; }
[Export] public CollectableResource Data { get; set; }
[Export] public AudioStreamPlayer2D Sfx {get; set; }
[Export] public AudioStreamPlayer2D Sfx { get; set; }
[Signal] public delegate void CollectedEventHandler(float amount, CollectableType type, Node2D body);
/// <summary>
/// Delegate for checking if collection should be allowed.
/// Return false to prevent collection.
/// </summary>
public Func<Node2D, bool> CanCollect { get; set; }
private FloatingTextManager _floatingTextManager;
public override void _Ready()
@@ -25,10 +31,10 @@ public partial class CollectableComponent : Node
Area2D.BodyEntered += OnArea2DBodyEntered;
else
GD.PushError("Collectable node missing Area2D node.");
if (Owner.HasNode("FadeAwayComponent"))
_hasFadeAway = true;
_floatingTextManager = GetNode<FloatingTextManager>("/root/FloatingTextManager");
}
@@ -38,6 +44,9 @@ public partial class CollectableComponent : Node
{
if (!body.HasNode("CanPickUpComponent")) return;
// Allow components to veto collection (e.g., full health for potions)
if (CanCollect != null && !CanCollect(body)) return;
if (Owner is Node2D ownerNode)
{
switch (Data.Type)
@@ -53,13 +62,13 @@ public partial class CollectableComponent : Node
break;
}
}
EmitSignalCollected(Data.Amount, Data.Type, body);
CollisionShape?.CallDeferred("set_disabled", true);
Sfx?.Play();
if (_hasFadeAway) return;
if (Sfx != null)
await ToSignal(Sfx, AudioStreamPlayer2D.SignalName.Finished);
Owner.QueueFree();

View File

@@ -0,0 +1,47 @@
using Godot;
namespace Mr.BrickAdventures.scripts.components;
[GlobalClass]
public partial class FallOnDetectionComponent : Node2D
{
[Export] public Area2D DetectionArea { get; set; }
[Export] public RigidBody2D TargetBody { get; set; }
[Export] public float FallDelay { get; set; } = 0.2f;
private bool _hasTriggered = false;
public override void _Ready()
{
if (DetectionArea == null)
{
GD.PrintErr("FallOnDetectionComponent: DetectionArea is not set.");
SetProcess(false);
return;
}
if (TargetBody == null)
{
GD.PrintErr("FallOnDetectionComponent: TargetBody is not set.");
SetProcess(false);
return;
}
DetectionArea.BodyEntered += OnBodyEntered;
}
private async void OnBodyEntered(Node2D body)
{
if (_hasTriggered) return;
_hasTriggered = true;
if (FallDelay > 0)
{
await ToSignal(GetTree().CreateTimer(FallDelay), Timer.SignalName.Timeout);
}
if (IsInstanceValid(TargetBody))
{
TargetBody.GravityScale = 1.0f;
}
}
}

View File

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

View File

@@ -16,16 +16,27 @@ public partial class HealComponent : Node
GD.PushError("HealComponent: Collectable is not set.");
return;
}
// Register check to prevent collecting when at full health
Collectable.CanCollect = CanCollectHealth;
Collectable.Collected += OnCollected;
}
private bool CanCollectHealth(Node2D body)
{
var healthComponent = body.GetNodeOrNull<HealthComponent>("HealthComponent");
if (healthComponent == null) return true; // Allow collection if no health component
// Prevent collection if already at full health
return healthComponent.Health < healthComponent.MaxHealth;
}
private void OnCollected(float amount, CollectableType type, Node2D body)
{
if (type != CollectableType.Health) return;
if (Collectable == null) return;
var healthComponent = body.GetNodeOrNull<HealthComponent>("HealthComponent");
if (healthComponent == null) return;
@@ -34,14 +45,14 @@ public partial class HealComponent : Node
{
PlayHealFx();
}
Owner.QueueFree();
}
private void PlayHealFx()
{
if (HealFx == null) return;
HealFx.Restart();
HealFx.Emitting = true;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

View File

@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://ccjihsk6w8sow"
path="res://.godot/imported/BFT - Mega Metroidvania Tileset.png-19c14f630afbe7f12271eafb441c25f8.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://sprites/BFT - Mega Metroidvania Tileset.png"
dest_files=["res://.godot/imported/BFT - Mega Metroidvania Tileset.png-19c14f630afbe7f12271eafb441c25f8.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: 5.8 KiB

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://btiaah4jcpqht"
path="res://.godot/imported/PS_Tileset_10_nes_extended.png-10092908d64a9b283078c9c31b7f7cc3.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://sprites/PS_Tileset_10_nes_extended.png"
dest_files=["res://.godot/imported/PS_Tileset_10_nes_extended.png-10092908d64a9b283078c9c31b7f7cc3.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

BIN
sprites/cave_tileset.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

34
sprites/emotes.png.import Normal file
View File

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

Before

Width:  |  Height:  |  Size: 2.1 KiB

View File

@@ -1,105 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 192 192"
version="1.1"
id="svg1"
inkscape:version="1.4.1 (93de688d07, 2025-03-30)"
sodipodi:docname="grass_tile.svg"
inkscape:export-filename="grass_tile.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#ffffff"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="1"
inkscape:deskcolor="#505050"
inkscape:document-units="px"
inkscape:zoom="4.1513748"
inkscape:cx="39.986753"
inkscape:cy="96.474064"
inkscape:window-width="2560"
inkscape:window-height="1374"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer1"
showgrid="true">
<inkscape:grid
id="grid1"
units="px"
originx="0"
originy="0"
spacingx="8"
spacingy="8"
empcolor="#0099e5"
empopacity="0.30196078"
color="#0099e5"
opacity="0.14901961"
empspacing="8"
enabled="true"
visible="true" />
</sodipodi:namedview>
<defs
id="defs1">
<inkscape:path-effect
effect="fillet_chamfer"
id="path-effect2"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1"
radius="0"
unit="px"
method="auto"
mode="F"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" />
</defs>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<rect
style="fill:#ff9959;stroke:none;stroke-width:0.687408"
id="rect2"
width="192"
height="144"
x="0"
y="48"
sodipodi:type="rect"
inkscape:label="mid"
ry="15.251407"
rx="0" />
<rect
style="fill:#bf6060;stroke:none;stroke-width:0.627513"
id="rect3"
width="160"
height="144"
x="16.000006"
y="24"
sodipodi:type="rect"
inkscape:label="bottom"
ry="12" />
<path
id="rect1"
style="display:inline;fill:#21a65d;stroke-width:1.6"
d="M 43,0 C 19,0 0,22.400001 0,51.2 V 64 H 192 V 51.2 C 192,22.400001 173,0 149,0 Z"
inkscape:label="top" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.8 KiB

BIN
sprites/ppc-tileset.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cysarpu6snb2y"
path="res://.godot/imported/ppc-tileset.png-9fa878d605ba142a07487f571cb041bd.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://sprites/ppc-tileset.png"
dest_files=["res://.godot/imported/ppc-tileset.png-9fa878d605ba142a07487f571cb041bd.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1