Compare commits

..

5 Commits

Author SHA1 Message Date
f9ca56e34a removed jump dash bug issue hand set back main scene to opening
All checks were successful
Create tag and build when new code gets to main / BumpTag (push) Successful in 25s
Create tag and build when new code gets to main / ReleaseName (push) Successful in 6s
Create tag and build when new code gets to main / Export (push) Successful in 7m10s
Create tag and build when new code gets to main / Release (push) Successful in 15m55s
2026-04-19 13:16:13 +02:00
5a59d50be5 Made a menu to select abilities and grant them (with a few hardcoded stuff)
All checks were successful
Create tag and build when new code gets to main / BumpTag (push) Successful in 26s
Create tag and build when new code gets to main / Export (push) Successful in 6m13s
2026-04-19 11:37:55 +02:00
9464fc7caa removed editor granted weapon abilities and prepared granting abilites through an inventory 2026-04-18 15:44:59 +02:00
9e57641a75 removend empower actions counter and references to previous tutorial 2026-04-18 09:41:38 +02:00
bb2b2ace06 cleanup and changed empowered action cost 2026-04-18 09:28:21 +02:00
27 changed files with 397 additions and 341 deletions

View File

@@ -13,8 +13,17 @@ public partial class CueHandlerInspectorPlugin : EditorInspectorPlugin
public override bool _CanHandle(GodotObject @object) public override bool _CanHandle(GodotObject @object)
{ {
// Find out if its an implementation of CueHandler without having to add [Tool] attribute to them. // Find out if its an implementation of CueHandler without having to add [Tool] attribute to them.
if (@object?.GetScript().As<CSharpScript>() is CSharpScript script) try
{ {
if (@object?.GetScript().As<CSharpScript>() is null)
return false;
}
catch (Exception e)
{
return false;
}
var script = @object?.GetScript().As<CSharpScript>();
StringName className = script.GetGlobalName(); StringName className = script.GetGlobalName();
Type baseType = typeof(ForgeCueHandler); Type baseType = typeof(ForgeCueHandler);
@@ -28,9 +37,6 @@ public partial class CueHandlerInspectorPlugin : EditorInspectorPlugin
return implementationType is not null; return implementationType is not null;
} }
return false;
}
public override bool _ParseProperty( public override bool _ParseProperty(
GodotObject @object, GodotObject @object,
Variant.Type type, Variant.Type type,

View File

@@ -2,5 +2,4 @@
[node name="BackgroundMusicPlayer" type="AudioStreamPlayer" unique_id=676077136] [node name="BackgroundMusicPlayer" type="AudioStreamPlayer" unique_id=676077136]
process_mode = 3 process_mode = 3
autoplay = true
bus = &"Music" bus = &"Music"

View File

@@ -24,6 +24,8 @@ var _initial_focus_control
var _scene_tree : SceneTree var _scene_tree : SceneTree
func _exit_tree() -> void: func _exit_tree() -> void:
if Engine.is_editor_hint(): return
GUIDE.disable_mapping_context(menu_context) GUIDE.disable_mapping_context(menu_context)
for previous_context in previous_mapping_contexts: for previous_context in previous_mapping_contexts:
GUIDE.enable_mapping_context(previous_context) GUIDE.enable_mapping_context(previous_context)

View File

@@ -14,7 +14,6 @@ public class EffectApplicationBehavior(EffectData effectData) : IAbilityBehavior
private ActiveEffectHandle? _effectHandle; private ActiveEffectHandle? _effectHandle;
public void OnStarted(AbilityBehaviorContext context) public void OnStarted(AbilityBehaviorContext context)
{ {
GD.Print("This is applying the periodic effect to the flying weapon");
_effect = new Effect(effectData, new EffectOwnership(context.Owner, context.Owner)); _effect = new Effect(effectData, new EffectOwnership(context.Owner, context.Owner));
_effectHandle = context.Owner.EffectsManager.ApplyEffect(_effect); _effectHandle = context.Owner.EffectsManager.ApplyEffect(_effect);
context.AbilityHandle.CommitAbility(); context.AbilityHandle.CommitAbility();
@@ -22,7 +21,6 @@ public class EffectApplicationBehavior(EffectData effectData) : IAbilityBehavior
public void OnEnded(AbilityBehaviorContext context) public void OnEnded(AbilityBehaviorContext context)
{ {
GD.Print("This is removing the periodic effect from the flying weapon");
if (_effectHandle is not null) if (_effectHandle is not null)
context.Owner.EffectsManager.RemoveEffect(_effectHandle); context.Owner.EffectsManager.RemoveEffect(_effectHandle);
context.InstanceHandle.End(); context.InstanceHandle.End();

View File

@@ -6,7 +6,7 @@ using Godot;
namespace Movementtests.forge.abilities; namespace Movementtests.forge.abilities;
public class ExplodingSwordBehavior(PackedScene explosion) : IAbilityBehavior public class ExplodingSwordBehavior(PackedScene explosion, float radius) : IAbilityBehavior
{ {
public void OnStarted(AbilityBehaviorContext context) public void OnStarted(AbilityBehaviorContext context)
{ {
@@ -28,10 +28,7 @@ public class ExplodingSwordBehavior(PackedScene explosion) : IAbilityBehavior
context.InstanceHandle.End(); context.InstanceHandle.End();
return; return;
} }
explo.Radius = radius;
GD.Print("EXPLOSION");
explo.Radius = 6f;
owner.GetTree().GetRoot().CallDeferred(Node.MethodName.AddChild, explo); owner.GetTree().GetRoot().CallDeferred(Node.MethodName.AddChild, explo);
explo.CallDeferred(Node3D.MethodName.SetGlobalPosition, owner.GlobalPosition); explo.CallDeferred(Node3D.MethodName.SetGlobalPosition, owner.GlobalPosition);
@@ -50,8 +47,9 @@ public class ExplodingSwordBehavior(PackedScene explosion) : IAbilityBehavior
public partial class ForgeExplodingSwordBehavior : ForgeAbilityBehavior public partial class ForgeExplodingSwordBehavior : ForgeAbilityBehavior
{ {
[Export] public PackedScene Explosion { get; set; } [Export] public PackedScene Explosion { get; set; }
[Export] public float Radius { get; set; } = 5f;
public override IAbilityBehavior GetBehavior() public override IAbilityBehavior GetBehavior()
{ {
return new ExplodingSwordBehavior(Explosion); return new ExplodingSwordBehavior(Explosion, Radius);
} }
} }

View File

@@ -22,10 +22,6 @@ public class RaiseEventTagExecution(TagContainer eventTags) : CustomExecution
{ {
var owner = effect.Ownership.Owner; var owner = effect.Ownership.Owner;
if (owner == null) return []; if (owner == null) return [];
foreach (var tag in eventTags.Tags)
{
GD.Print(tag);
}
owner.Events.Raise(new EventData owner.Events.Raise(new EventData
{ {

View File

@@ -39,6 +39,7 @@
[ext_resource type="Resource" uid="uid://brswsknpgwal2" path="res://inputs/base_mode/move_front.tres" id="34_rvpjj"] [ext_resource type="Resource" uid="uid://brswsknpgwal2" path="res://inputs/base_mode/move_front.tres" id="34_rvpjj"]
[ext_resource type="Resource" uid="uid://ca68r7n3bwba3" path="res://inputs/base_mode/toolbox.tres" id="34_s8kjn"] [ext_resource type="Resource" uid="uid://ca68r7n3bwba3" path="res://inputs/base_mode/toolbox.tres" id="34_s8kjn"]
[ext_resource type="Resource" uid="uid://f3vs6l4m623s" path="res://inputs/base_mode/move_left.tres" id="35_s8kjn"] [ext_resource type="Resource" uid="uid://f3vs6l4m623s" path="res://inputs/base_mode/move_left.tres" id="35_s8kjn"]
[ext_resource type="Resource" uid="uid://7ne5mdytlidm" path="res://inputs/base_mode/inventory.tres" id="36_4uwbh"]
[ext_resource type="Resource" uid="uid://t612lts1wi1s" path="res://inputs/base_mode/move_right.tres" id="36_vibkn"] [ext_resource type="Resource" uid="uid://t612lts1wi1s" path="res://inputs/base_mode/move_right.tres" id="36_vibkn"]
[sub_resource type="Resource" id="Resource_vkvga"] [sub_resource type="Resource" id="Resource_vkvga"]
@@ -487,16 +488,16 @@ action = ExtResource("29_q86qg")
input_mappings = Array[ExtResource("3_yp12v")]([SubResource("Resource_ai85f"), SubResource("Resource_1ycft")]) input_mappings = Array[ExtResource("3_yp12v")]([SubResource("Resource_ai85f"), SubResource("Resource_1ycft")])
metadata/_guide_input_mappings_collapsed = false metadata/_guide_input_mappings_collapsed = false
[sub_resource type="Resource" id="Resource_8e1uk"] [sub_resource type="Resource" id="Resource_qd4lk"]
script = ExtResource("19_qkgmj") script = ExtResource("19_qkgmj")
button = 4 button = 11
[sub_resource type="Resource" id="Resource_k8i2y"] [sub_resource type="Resource" id="Resource_k8i2y"]
script = ExtResource("15_fykw6") script = ExtResource("15_fykw6")
[sub_resource type="Resource" id="Resource_ilhhf"] [sub_resource type="Resource" id="Resource_ilhhf"]
script = ExtResource("3_yp12v") script = ExtResource("3_yp12v")
input = SubResource("Resource_8e1uk") input = SubResource("Resource_qd4lk")
triggers = Array[ExtResource("8_2tfaw")]([SubResource("Resource_k8i2y")]) triggers = Array[ExtResource("8_2tfaw")]([SubResource("Resource_k8i2y")])
[sub_resource type="Resource" id="Resource_qrtf1"] [sub_resource type="Resource" id="Resource_qrtf1"]
@@ -516,6 +517,35 @@ script = ExtResource("1_qmhk6")
action = ExtResource("34_s8kjn") action = ExtResource("34_s8kjn")
input_mappings = Array[ExtResource("3_yp12v")]([SubResource("Resource_ilhhf"), SubResource("Resource_4uwbh")]) input_mappings = Array[ExtResource("3_yp12v")]([SubResource("Resource_ilhhf"), SubResource("Resource_4uwbh")])
[sub_resource type="Resource" id="Resource_g1qol"]
script = ExtResource("19_qkgmj")
button = 4
[sub_resource type="Resource" id="Resource_xmmrk"]
script = ExtResource("15_fykw6")
[sub_resource type="Resource" id="Resource_oq22i"]
script = ExtResource("3_yp12v")
input = SubResource("Resource_g1qol")
triggers = Array[ExtResource("8_2tfaw")]([SubResource("Resource_xmmrk")])
[sub_resource type="Resource" id="Resource_krlhw"]
script = ExtResource("30_cvxqo")
key = 4194306
[sub_resource type="Resource" id="Resource_gpvxe"]
script = ExtResource("15_fykw6")
[sub_resource type="Resource" id="Resource_0nktr"]
script = ExtResource("3_yp12v")
input = SubResource("Resource_krlhw")
triggers = Array[ExtResource("8_2tfaw")]([SubResource("Resource_gpvxe")])
[sub_resource type="Resource" id="Resource_u35df"]
script = ExtResource("1_qmhk6")
action = ExtResource("36_4uwbh")
input_mappings = Array[ExtResource("3_yp12v")]([SubResource("Resource_oq22i"), SubResource("Resource_0nktr")])
[sub_resource type="Resource" id="Resource_kcylj"] [sub_resource type="Resource" id="Resource_kcylj"]
script = ExtResource("30_cvxqo") script = ExtResource("30_cvxqo")
key = 83 key = 83
@@ -570,5 +600,5 @@ input_mappings = Array[ExtResource("3_yp12v")]([SubResource("Resource_7io5e")])
[resource] [resource]
script = ExtResource("23_llfhp") script = ExtResource("23_llfhp")
mappings = Array[ExtResource("1_qmhk6")]([SubResource("Resource_88x08"), SubResource("Resource_tgr2g"), SubResource("Resource_iarn8"), SubResource("Resource_cvxqo"), SubResource("Resource_tb8ii"), SubResource("Resource_iihs4"), SubResource("Resource_vibkn"), SubResource("Resource_2hs2y"), SubResource("Resource_d2r0d"), SubResource("Resource_xt1x5"), SubResource("Resource_ew1hw"), SubResource("Resource_3frwi"), SubResource("Resource_0qat1"), SubResource("Resource_vtk18"), SubResource("Resource_weyro"), SubResource("Resource_o5fur"), SubResource("Resource_fjku4"), SubResource("Resource_odnhd"), SubResource("Resource_0eff7"), SubResource("Resource_gt77e")]) mappings = Array[ExtResource("1_qmhk6")]([SubResource("Resource_88x08"), SubResource("Resource_tgr2g"), SubResource("Resource_iarn8"), SubResource("Resource_cvxqo"), SubResource("Resource_tb8ii"), SubResource("Resource_iihs4"), SubResource("Resource_vibkn"), SubResource("Resource_2hs2y"), SubResource("Resource_d2r0d"), SubResource("Resource_xt1x5"), SubResource("Resource_ew1hw"), SubResource("Resource_3frwi"), SubResource("Resource_0qat1"), SubResource("Resource_vtk18"), SubResource("Resource_weyro"), SubResource("Resource_o5fur"), SubResource("Resource_u35df"), SubResource("Resource_fjku4"), SubResource("Resource_odnhd"), SubResource("Resource_0eff7"), SubResource("Resource_gt77e")])
metadata/_custom_type_script = "uid://dsa1dnifd6w32" metadata/_custom_type_script = "uid://dsa1dnifd6w32"

View File

@@ -0,0 +1,7 @@
[gd_resource type="Resource" script_class="GUIDEAction" format=3 uid="uid://7ne5mdytlidm"]
[ext_resource type="Script" uid="uid://cluhc11vixkf1" path="res://addons/guide/guide_action.gd" id="1_48ulw"]
[resource]
script = ExtResource("1_48ulw")
metadata/_custom_type_script = "uid://cluhc11vixkf1"

View File

@@ -257,6 +257,9 @@ script = ExtResource("1_5g5a0")
[node name="GuideDebugger" parent="DebugLayer" unique_id=636020765 instance=ExtResource("10_gm8ij")] [node name="GuideDebugger" parent="DebugLayer" unique_id=636020765 instance=ExtResource("10_gm8ij")]
visible = false visible = false
[node name="InventoryLayer" type="CanvasLayer" parent="." unique_id=406590925]
layer = 10
[node name="BackgroundMusicPlayer" parent="." unique_id=879496303 instance=ExtResource("2_roiv2")] [node name="BackgroundMusicPlayer" parent="." unique_id=879496303 instance=ExtResource("2_roiv2")]
stream = ExtResource("3_boadi") stream = ExtResource("3_boadi")
@@ -285,7 +288,6 @@ libraries/ = SubResource("AnimationLibrary_nyvgt")
[node name="Player" parent="." unique_id=1309399929 instance=ExtResource("17_clkha")] [node name="Player" parent="." unique_id=1309399929 instance=ExtResource("17_clkha")]
transform = Transform3D(0.99999994, 0, 0, 0, 1, 0, 0, 0, 0.99999994, 0, 0, 0) transform = Transform3D(0.99999994, 0, 0, 0, 1, 0, 0, 0, 0.99999994, 0, 0, 0)
TutorialDone = true
AccelerationAir = 1.5 AccelerationAir = 1.5
[node name="ShaderComp-Explosion" parent="Player" unique_id=1876014452 instance=ExtResource("9_r1bdn")] [node name="ShaderComp-Explosion" parent="Player" unique_id=1876014452 instance=ExtResource("9_r1bdn")]

View File

@@ -0,0 +1,55 @@
using System;
using Godot;
using Movementtests.systems;
[Tool, GlobalClass]
public partial class AbilitySelection : Control
{
[Signal] public delegate void AbilityAddedEventHandler(WeaponSystem.WeaponEvent forEvent, string abilityName);
[Export] public WeaponSystem.WeaponEvent ForEvent { get; set; } = WeaponSystem.WeaponEvent.StartedFlying;
private string _title = string.Empty;
[Export] public string Title {
get => _title;
set
{
_title = value;
TitleChanged();
}
}
[Export] public PackedScene AbilitySelectionItem { get; set; }
private VBoxContainer _abilities;
private MenuButton _addAbility;
private PopupMenu _addAbilityMenu;
public override void _Ready()
{
_abilities = GetNode<VBoxContainer>("%SelectedAbilities");
_addAbility = GetNode<MenuButton>("%AddAbility");
_addAbilityMenu = _addAbility.GetPopup();
_addAbilityMenu.IdPressed += AddAbilityMenuOnIdPressed;
_addAbilityMenu.IndexPressed += AddAbilityMenuOnIndexPressed;
}
private void AddAbilityMenuOnIndexPressed(long index)
{
var indexInt = Convert.ToInt32(index);
var metadata = _addAbilityMenu.GetItemMetadata(indexInt);
var name = _addAbilityMenu.GetItemText(indexInt);
EmitSignalAbilityAdded(ForEvent, name);
}
private void AddAbilityMenuOnIdPressed(long id)
{
}
public void TitleChanged()
{
var titleLabel = GetNode<Label>("%TitleLabel");
titleLabel.Text = Title;
}
}

View File

@@ -0,0 +1 @@
uid://5emed8iegtui

View File

@@ -0,0 +1,45 @@
[gd_scene format=3 uid="uid://dmv685sskgh3l"]
[ext_resource type="Script" uid="uid://5emed8iegtui" path="res://menus/scenes/components/AbilitySelection.cs" id="1_fcxyu"]
[ext_resource type="Texture2D" uid="uid://by5v33lu8v1fm" path="res://assets/ui/input-prompts/Flairs/Vector/flair_plus.svg" id="2_uf3m5"]
[ext_resource type="Texture2D" uid="uid://c2akxlg7tdb67" path="res://assets/ui/IconGodotNode/node/icon_projectile.png" id="3_41pdy"]
[node name="AbilitySelection" type="MarginContainer" unique_id=1373426933]
size_flags_horizontal = 3
theme_override_constants/margin_left = 4
theme_override_constants/margin_top = 4
theme_override_constants/margin_right = 4
theme_override_constants/margin_bottom = 4
script = ExtResource("1_fcxyu")
[node name="HBoxContainer" type="VBoxContainer" parent="." unique_id=364343452]
layout_mode = 2
[node name="TitleLabel" type="Label" parent="HBoxContainer" unique_id=8350369]
unique_name_in_owner = true
layout_mode = 2
[node name="SelectedAbilities" type="VBoxContainer" parent="HBoxContainer" unique_id=1173689490]
unique_name_in_owner = true
layout_mode = 2
[node name="MarginContainer" type="MarginContainer" parent="HBoxContainer" unique_id=51872459]
layout_mode = 2
theme_override_constants/margin_left = 4
theme_override_constants/margin_top = 4
theme_override_constants/margin_right = 4
theme_override_constants/margin_bottom = 4
[node name="PanelContainer" type="PanelContainer" parent="HBoxContainer/MarginContainer" unique_id=886085404]
layout_mode = 2
[node name="AddAbility" type="MenuButton" parent="HBoxContainer/MarginContainer/PanelContainer" unique_id=1898027483]
unique_name_in_owner = true
layout_mode = 2
focus_mode = 2
text = "Add ability"
icon = ExtResource("2_uf3m5")
item_count = 1
popup/item_0/text = "Weapon explosion"
popup/item_0/icon = ExtResource("3_41pdy")
popup/item_0/id = 0

View File

@@ -0,0 +1,28 @@
using Godot;
using Movementtests.systems;
[Tool, GlobalClass, Icon("res://assets/ui/IconGodotNode/control/icon_crate.png")]
public partial class Inventory : Control
{
public PlayerController? Player { get; set; }
private AbilitySelection _startedFlyingSelection;
private AbilitySelection _whileFlyingSelection;
private AbilitySelection _stoppedFlyingSelection;
public override void _Ready()
{
_startedFlyingSelection = GetNode<AbilitySelection>("%StartedFlying");
_whileFlyingSelection = GetNode<AbilitySelection>("%WhileFlying");
_stoppedFlyingSelection = GetNode<AbilitySelection>("%StoppedFlying");
_startedFlyingSelection.AbilityAdded += AddAbilityForEvent;
_whileFlyingSelection.AbilityAdded += AddAbilityForEvent;
_stoppedFlyingSelection.AbilityAdded += AddAbilityForEvent;
}
public void AddAbilityForEvent(WeaponSystem.WeaponEvent forEvent, string abilityName)
{
if (Player is null) return;
Player.GrantWeaponExplosionAbilityForEvent(forEvent, abilityName);
}
}

View File

@@ -0,0 +1 @@
uid://7yil0fiftvaf

View File

@@ -0,0 +1,95 @@
[gd_scene format=3 uid="uid://oq1jjvjs4qga"]
[ext_resource type="Script" uid="uid://vu5kh5amnta" path="res://menus/scenes/overlaid_menus/inventory_wrapper.gd" id="1_yst23"]
[ext_resource type="Script" uid="uid://1nf36h0gms3q" path="res://addons/maaacks_game_template/base/scripts/capture_focus.gd" id="2_ijoei"]
[ext_resource type="Script" uid="uid://7yil0fiftvaf" path="res://menus/scenes/overlaid_menus/Inventory.cs" id="2_sb1gh"]
[ext_resource type="PackedScene" uid="uid://dmv685sskgh3l" path="res://menus/scenes/components/ability_selection.tscn" id="3_ijoei"]
[node name="InventoryWrapper" type="Control" unique_id=1853168495]
process_mode = 3
top_level = true
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
script = ExtResource("1_yst23")
pauses_game = true
[node name="Inventory" type="MarginContainer" parent="." unique_id=1581374847]
unique_name_in_owner = true
layout_mode = 1
anchors_preset = 9
anchor_bottom = 1.0
offset_right = 1920.0
grow_vertical = 2
theme_override_constants/margin_left = 256
theme_override_constants/margin_top = 32
theme_override_constants/margin_right = 256
theme_override_constants/margin_bottom = 32
script = ExtResource("2_sb1gh")
[node name="MenuPanelContainer" type="PanelContainer" parent="Inventory" unique_id=494302799]
unique_name_in_owner = true
process_mode = 3
layout_mode = 2
[node name="MarginContainer" type="MarginContainer" parent="Inventory/MenuPanelContainer" unique_id=890844332]
layout_mode = 2
theme_override_constants/margin_left = 128
theme_override_constants/margin_top = 16
theme_override_constants/margin_right = 128
theme_override_constants/margin_bottom = 16
[node name="BoxContainer" type="BoxContainer" parent="Inventory/MenuPanelContainer/MarginContainer" unique_id=1551508149]
layout_mode = 2
vertical = true
[node name="TitleMargin" type="MarginContainer" parent="Inventory/MenuPanelContainer/MarginContainer/BoxContainer" unique_id=1278279788]
layout_mode = 2
[node name="TitleLabel" type="Label" parent="Inventory/MenuPanelContainer/MarginContainer/BoxContainer/TitleMargin" unique_id=1966063657]
layout_mode = 2
theme_override_font_sizes/font_size = 24
text = "Inventory"
horizontal_alignment = 1
[node name="PlayerSectionMargin" type="MarginContainer" parent="Inventory/MenuPanelContainer/MarginContainer/BoxContainer" unique_id=461792371]
layout_mode = 2
theme_override_constants/margin_top = 16
theme_override_constants/margin_bottom = 16
[node name="PlayerSection" type="BoxContainer" parent="Inventory/MenuPanelContainer/MarginContainer/BoxContainer/PlayerSectionMargin" unique_id=469432036]
custom_minimum_size = Vector2(128, 0)
layout_mode = 2
size_flags_vertical = 3
theme_override_constants/separation = 16
vertical = true
[node name="PlayerSectionLabel" type="Label" parent="Inventory/MenuPanelContainer/MarginContainer/BoxContainer/PlayerSectionMargin/PlayerSection" unique_id=1100827847]
layout_mode = 2
text = "Weapon abilities"
horizontal_alignment = 1
[node name="HBoxContainer" type="HBoxContainer" parent="Inventory/MenuPanelContainer/MarginContainer/BoxContainer/PlayerSectionMargin/PlayerSection" unique_id=75337901]
layout_mode = 2
script = ExtResource("2_ijoei")
search_depth = 10
[node name="StartedFlying" parent="Inventory/MenuPanelContainer/MarginContainer/BoxContainer/PlayerSectionMargin/PlayerSection/HBoxContainer" unique_id=1373426933 instance=ExtResource("3_ijoei")]
unique_name_in_owner = true
layout_mode = 2
Title = "Started flying"
[node name="WhileFlying" parent="Inventory/MenuPanelContainer/MarginContainer/BoxContainer/PlayerSectionMargin/PlayerSection/HBoxContainer" unique_id=1771285257 instance=ExtResource("3_ijoei")]
unique_name_in_owner = true
layout_mode = 2
ForEvent = 2
Title = "While flying"
[node name="StoppedFlying" parent="Inventory/MenuPanelContainer/MarginContainer/BoxContainer/PlayerSectionMargin/PlayerSection/HBoxContainer" unique_id=324047638 instance=ExtResource("3_ijoei")]
unique_name_in_owner = true
layout_mode = 2
ForEvent = 1
Title = "Stopped flying"

View File

@@ -0,0 +1,15 @@
@tool
@icon("res://assets/ui/IconGodotNode/control/icon_crate_02.png")
class_name InventoryWrapper
extends OverlaidMenu
@export var player: PlayerController
@onready var inventory: Control = %Inventory
func _ready() -> void:
if Engine.is_editor_hint(): return
inventory.Player = player
func _on_close_button_pressed() -> void:
close()

View File

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

View File

@@ -15,7 +15,7 @@ warnings/check_invalid_track_paths=false
[application] [application]
config/name="Movement tests" config/name="Movement tests"
run/main_scene="uid://dwo50456dv6va" run/main_scene="uid://vm22i5sv3p3s"
config/features=PackedStringArray("4.6", "C#", "Forward Plus") config/features=PackedStringArray("4.6", "C#", "Forward Plus")
config/icon="res://icon.svg" config/icon="res://icon.svg"

View File

@@ -14,6 +14,7 @@
[ext_resource type="Resource" uid="uid://ccrb5xsnphc8" path="res://inputs/base_mode/rotate_floorplane.tres" id="5_4u7i3"] [ext_resource type="Resource" uid="uid://ccrb5xsnphc8" path="res://inputs/base_mode/rotate_floorplane.tres" id="5_4u7i3"]
[ext_resource type="PackedScene" uid="uid://hpsg4fqwrx1u" path="res://scenes/components/damage/CDamageable.tscn" id="5_jb43f"] [ext_resource type="PackedScene" uid="uid://hpsg4fqwrx1u" path="res://scenes/components/damage/CDamageable.tscn" id="5_jb43f"]
[ext_resource type="Resource" uid="uid://f3vs6l4m623s" path="res://inputs/base_mode/move_left.tres" id="5_q14ux"] [ext_resource type="Resource" uid="uid://f3vs6l4m623s" path="res://inputs/base_mode/move_left.tres" id="5_q14ux"]
[ext_resource type="Resource" uid="uid://ifeavnlps7hy" path="res://scenes/player_controller/resources/forge/exploding_sword.tres" id="5_u8yay"]
[ext_resource type="PackedScene" uid="uid://duju3atqgltkg" path="res://scenes/explosion/explosion.tscn" id="5_ue7xq"] [ext_resource type="PackedScene" uid="uid://duju3atqgltkg" path="res://scenes/explosion/explosion.tscn" id="5_ue7xq"]
[ext_resource type="Resource" uid="uid://dyru7mxo121w6" path="res://scenes/player_controller/resources/player_normal_damage_mod.tres" id="6_cmijs"] [ext_resource type="Resource" uid="uid://dyru7mxo121w6" path="res://scenes/player_controller/resources/player_normal_damage_mod.tres" id="6_cmijs"]
[ext_resource type="Resource" uid="uid://t612lts1wi1s" path="res://inputs/base_mode/move_right.tres" id="6_q7bng"] [ext_resource type="Resource" uid="uid://t612lts1wi1s" path="res://inputs/base_mode/move_right.tres" id="6_q7bng"]
@@ -54,7 +55,6 @@
[ext_resource type="Script" uid="uid://cf1nsco3w0mf6" path="res://addons/godot_state_charts/transition.gd" id="28_n7qhm"] [ext_resource type="Script" uid="uid://cf1nsco3w0mf6" path="res://addons/godot_state_charts/transition.gd" id="28_n7qhm"]
[ext_resource type="PackedScene" uid="uid://ckm3d6k08a72u" path="res://scenes/player_controller/components/weapon/weapon.tscn" id="29_wv70j"] [ext_resource type="PackedScene" uid="uid://ckm3d6k08a72u" path="res://scenes/player_controller/components/weapon/weapon.tscn" id="29_wv70j"]
[ext_resource type="Script" uid="uid://bhuwv2nlcrunt" path="res://scenes/player_controller/PlayerUi.cs" id="30_2ghaa"] [ext_resource type="Script" uid="uid://bhuwv2nlcrunt" path="res://scenes/player_controller/PlayerUi.cs" id="30_2ghaa"]
[ext_resource type="Texture2D" uid="uid://bnwj7ltdfximr" path="res://icon.svg" id="30_h23go"]
[ext_resource type="Texture2D" uid="uid://chvt6g0xn5c2m" path="res://scenes/player_controller/components/dash/light-ring.jpg" id="32_lgpc8"] [ext_resource type="Texture2D" uid="uid://chvt6g0xn5c2m" path="res://scenes/player_controller/components/dash/light-ring.jpg" id="32_lgpc8"]
[ext_resource type="Script" uid="uid://b4dwolbvt8our" path="res://addons/godot_state_charts/history_state.gd" id="41_ruloh"] [ext_resource type="Script" uid="uid://b4dwolbvt8our" path="res://addons/godot_state_charts/history_state.gd" id="41_ruloh"]
[ext_resource type="Texture2D" uid="uid://c40orhfdgsim" path="res://assets/ui/IconGodotNode/white/icon_circle.png" id="45_u8rdp"] [ext_resource type="Texture2D" uid="uid://c40orhfdgsim" path="res://assets/ui/IconGodotNode/white/icon_circle.png" id="45_u8rdp"]
@@ -157,6 +157,7 @@ script = ExtResource("1_poq2x")
BaseTags = SubResource("Resource_mpigw") BaseTags = SubResource("Resource_mpigw")
EmpoweredActionUsed = SubResource("Resource_5gbhg") EmpoweredActionUsed = SubResource("Resource_5gbhg")
EmpoweredActionAbility = ExtResource("10_2rkt1") EmpoweredActionAbility = ExtResource("10_2rkt1")
WeaponExplosionBehavior = ExtResource("5_u8yay")
DefaultPermanentEffects = [ExtResource("5_2rkt1")] DefaultPermanentEffects = [ExtResource("5_2rkt1")]
EmpoweredActionEffects = [ExtResource("6_u8yay")] EmpoweredActionEffects = [ExtResource("6_u8yay")]
AimAssistStrength = 0.3 AimAssistStrength = 0.3
@@ -189,7 +190,8 @@ MaxNumberOfEmpoweredActions = 3
SimpleDashStrength = 18.0 SimpleDashStrength = 18.0
SimpleDashTime = 0.2 SimpleDashTime = 0.2
AimedDashTime = 0.2 AimedDashTime = 0.2
PostDashSpeed = 30.0 PostDashSpeed = 25.0
TimeScaleAimInAir = 0.08
SlamSpeed = 80.0 SlamSpeed = 80.0
FlatGroundSlideSpeedLossRate = 0.996 FlatGroundSlideSpeedLossRate = 0.996
GroundSlideJumpMultiplier = 0.1 GroundSlideJumpMultiplier = 0.1
@@ -467,10 +469,6 @@ one_shot = true
[node name="AirborneDashCooldown" type="Timer" parent="." unique_id=976335884] [node name="AirborneDashCooldown" type="Timer" parent="." unique_id=976335884]
one_shot = true one_shot = true
[node name="PowerCooldown" type="Timer" parent="." unique_id=1091679675]
wait_time = 2.0
one_shot = true
[node name="TimeScaleAimInAir" type="Timer" parent="." unique_id=1346687662] [node name="TimeScaleAimInAir" type="Timer" parent="." unique_id=1346687662]
wait_time = 5.0 wait_time = 5.0
one_shot = true one_shot = true
@@ -494,50 +492,6 @@ grow_vertical = 2
mouse_filter = 1 mouse_filter = 1
script = ExtResource("30_2ghaa") script = ExtResource("30_2ghaa")
[node name="MarginContainer" type="MarginContainer" parent="UI" unique_id=256626576]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 2
theme_override_constants/margin_left = 50
theme_override_constants/margin_top = 50
theme_override_constants/margin_right = 50
theme_override_constants/margin_bottom = 50
[node name="VBoxContainer" type="VBoxContainer" parent="UI/MarginContainer" unique_id=74238183]
layout_mode = 2
size_flags_horizontal = 0
size_flags_vertical = 0
[node name="DashesLabel" type="Label" parent="UI/MarginContainer/VBoxContainer" unique_id=245851052]
layout_mode = 2
text = "Empowered actions"
[node name="HBoxContainer" type="HBoxContainer" parent="UI/MarginContainer/VBoxContainer" unique_id=81461575]
custom_minimum_size = Vector2(0, 30)
layout_mode = 2
[node name="Dash1" type="TextureRect" parent="UI/MarginContainer/VBoxContainer/HBoxContainer" unique_id=108366179]
unique_name_in_owner = true
layout_mode = 2
texture = ExtResource("30_h23go")
expand_mode = 2
[node name="Dash2" type="TextureRect" parent="UI/MarginContainer/VBoxContainer/HBoxContainer" unique_id=140491034]
unique_name_in_owner = true
layout_mode = 2
texture = ExtResource("30_h23go")
expand_mode = 2
[node name="Dash3" type="TextureRect" parent="UI/MarginContainer/VBoxContainer/HBoxContainer" unique_id=1447308392]
unique_name_in_owner = true
layout_mode = 2
texture = ExtResource("30_h23go")
expand_mode = 2
[node name="CenterContainer" type="CenterContainer" parent="UI" unique_id=1479818685] [node name="CenterContainer" type="CenterContainer" parent="UI" unique_id=1479818685]
custom_minimum_size = Vector2(1920, 1080) custom_minimum_size = Vector2(1920, 1080)
layout_mode = 1 layout_mode = 1
@@ -556,24 +510,6 @@ layout_mode = 2
texture = ExtResource("32_lgpc8") texture = ExtResource("32_lgpc8")
expand_mode = 1 expand_mode = 1
[node name="CenterContainer2" type="CenterContainer" parent="UI" unique_id=1912042835]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 2
[node name="MarginContainer" type="MarginContainer" parent="UI/CenterContainer2" unique_id=812091083]
layout_mode = 2
theme_override_constants/margin_top = 50
[node name="DashCooldownIndicator" type="ColorRect" parent="UI/CenterContainer2/MarginContainer" unique_id=1946930017]
unique_name_in_owner = true
custom_minimum_size = Vector2(100, 10)
layout_mode = 2
[node name="EnemyTarget" type="TextureRect" parent="UI" unique_id=1113835926] [node name="EnemyTarget" type="TextureRect" parent="UI" unique_id=1113835926]
unique_name_in_owner = true unique_name_in_owner = true
modulate = Color(0, 0.61278194, 0.56044877, 1) modulate = Color(0, 0.61278194, 0.56044877, 1)
@@ -661,43 +597,6 @@ delay_in_seconds = "0.0"
[node name="Canceled" type="Node" parent="StateChart/Root/Aim" unique_id=623373725] [node name="Canceled" type="Node" parent="StateChart/Root/Aim" unique_id=623373725]
script = ExtResource("27_34snm") script = ExtResource("27_34snm")
[node name="PowerReserve" type="Node" parent="StateChart/Root" unique_id=240635144]
script = ExtResource("26_infe6")
initial_state = NodePath("Full")
[node name="ToExpired" type="Node" parent="StateChart/Root/PowerReserve" unique_id=1254755786]
script = ExtResource("28_n7qhm")
to = NodePath("../Expired")
event = &"expired"
delay_in_seconds = "0.0"
[node name="Recharge" type="Node" parent="StateChart/Root/PowerReserve" unique_id=832143267]
script = ExtResource("28_n7qhm")
to = NodePath("../AtLeastOneCharge")
event = &"recharge"
delay_in_seconds = "0.0"
[node name="ToFull" type="Node" parent="StateChart/Root/PowerReserve" unique_id=984127202]
script = ExtResource("28_n7qhm")
to = NodePath("../Full")
event = &"fully_charged"
delay_in_seconds = "0.0"
[node name="Expired" type="Node" parent="StateChart/Root/PowerReserve" unique_id=1558500638]
script = ExtResource("27_34snm")
[node name="AtLeastOneCharge" type="Node" parent="StateChart/Root/PowerReserve" unique_id=10506240]
script = ExtResource("27_34snm")
[node name="Full" type="Node" parent="StateChart/Root/PowerReserve" unique_id=1559116737]
script = ExtResource("27_34snm")
[node name="PowerUsed" type="Node" parent="StateChart/Root/PowerReserve/Full" unique_id=397112501]
script = ExtResource("28_n7qhm")
to = NodePath("../../AtLeastOneCharge")
event = &"power_used"
delay_in_seconds = "0.0"
[node name="Attack" type="Node" parent="StateChart/Root" unique_id=808083793] [node name="Attack" type="Node" parent="StateChart/Root" unique_id=808083793]
script = ExtResource("26_infe6") script = ExtResource("26_infe6")
initial_state = NodePath("Ready") initial_state = NodePath("Ready")

View File

@@ -10,7 +10,6 @@ using Movementtests.tools;
[GlobalClass, Icon("res://assets/ui/IconGodotNode/control/icon_text_panel.png")] [GlobalClass, Icon("res://assets/ui/IconGodotNode/control/icon_text_panel.png")]
public partial class PlayerUi : Control, ICueHandler public partial class PlayerUi : Control, ICueHandler
{ {
internal TextureRect[] DashIcons = new TextureRect[3];
private TextureRect _enemyTarget = null!; private TextureRect _enemyTarget = null!;
private Healthbar _healthbar = null!; private Healthbar _healthbar = null!;
private Healthbar _manabar = null!; private Healthbar _manabar = null!;
@@ -31,10 +30,6 @@ public partial class PlayerUi : Control, ICueHandler
public override void _Ready() public override void _Ready()
{ {
DashIcons[0] = GetNode<TextureRect>("%Dash1");
DashIcons[1] = GetNode<TextureRect>("%Dash2");
DashIcons[2] = GetNode<TextureRect>("%Dash3");
_enemyTarget = GetNode<TextureRect>("%EnemyTarget"); _enemyTarget = GetNode<TextureRect>("%EnemyTarget");
_healthbar = GetNode<Healthbar>("%Healthbar"); _healthbar = GetNode<Healthbar>("%Healthbar");
_manabar = GetNode<Healthbar>("%Manabar"); _manabar = GetNode<Healthbar>("%Manabar");
@@ -67,17 +62,6 @@ public partial class PlayerUi : Control, ICueHandler
_enemyTarget.SetModulate(modulation); _enemyTarget.SetModulate(modulation);
} }
public void SetNumberOfDashesLeft(int numberOfDashes)
{
int index = 1;
foreach (var dashIcon in DashIcons)
{
dashIcon.SetVisible(index <= numberOfDashes);
index++;
}
}
public void OnHealthChanged(IHealthable healthable, HealthChangedRecord healthChanged) public void OnHealthChanged(IHealthable healthable, HealthChangedRecord healthChanged)
{ {
_healthbar.CurrentHealth = healthChanged.CurrentHealth; _healthbar.CurrentHealth = healthChanged.CurrentHealth;

View File

@@ -41,13 +41,11 @@ public partial class WeaponSystem : RigidBody3D, IDamageDealer, IForgeEntity
[Export] [Export]
public ForgeTagContainer BaseTags { get; set; } public ForgeTagContainer BaseTags { get; set; }
[Export] public ForgeAbilityData[] WeaponAbilities { get; set; } = Array.Empty<ForgeAbilityData>();
[Export] public ForgeAbilityData FlyingTickAbility { get; set; } [Export] public ForgeAbilityData FlyingTickAbility { get; set; }
[Export] public ForgeEffectData[] PermanentEffects { get; set; } = Array.Empty<ForgeEffectData>();
[Export] [Export]
public RDamage RDamage { get; set; } public RDamage RDamage { get; set; }
[Export(PropertyHint.Range, "0,100,1,or_greater")] [Export(PropertyHint.Range, "0,2,0.01,or_greater")]
public float ThrowForce { get; set; } = 1f; public float ThrowForce { get; set; } = 1f;
[Export(PropertyHint.Range, "0,0.2,0.01,or_greater")] [Export(PropertyHint.Range, "0,0.2,0.01,or_greater")]
public float StraightThrowDuration { get; set; } = 0.1f; public float StraightThrowDuration { get; set; } = 0.1f;
@@ -168,30 +166,6 @@ public partial class WeaponSystem : RigidBody3D, IDamageDealer, IForgeEntity
// TODO: Waiting on bug resolve // TODO: Waiting on bug resolve
_weaponFlyingAbility = Abilities.GrantAbilityPermanently(FlyingTickAbility.GetAbilityData(), 1, LevelComparison.None, this); _weaponFlyingAbility = Abilities.GrantAbilityPermanently(FlyingTickAbility.GetAbilityData(), 1, LevelComparison.None, this);
foreach (var ability in WeaponAbilities)
{
var leftGrantAbilityConfig = new GrantAbilityConfig(
ability.GetAbilityData(),
ScalableLevel: new ScalableInt(1),
RemovalPolicy: AbilityDeactivationPolicy.CancelImmediately,
InhibitionPolicy: AbilityDeactivationPolicy.CancelImmediately,
TryActivateOnGrant: false,
TryActivateOnEnable: false,
LevelOverridePolicy: LevelComparison.Higher);
var leftGrantComponent = new GrantAbilityEffectComponent([leftGrantAbilityConfig]);
var leftGrantEffect = new EffectData(
"Grant Weapon Ability",
new DurationData(DurationType.Infinite),
effectComponents: [leftGrantComponent]);
EffectsManager.ApplyEffect(new Effect(leftGrantEffect, new EffectOwnership(this, this)));
}
foreach (var effect in PermanentEffects)
{
EffectsManager.ApplyEffect(new Effect(effect.GetEffectData(), new EffectOwnership(this, this)));
}
BodyEntered += OnThrownWeaponReachesGround; BodyEntered += OnThrownWeaponReachesGround;
InHandState.StateExited += WeaponLeft; InHandState.StateExited += WeaponLeft;
@@ -263,18 +237,62 @@ public partial class WeaponSystem : RigidBody3D, IDamageDealer, IForgeEntity
}); });
}; };
Events.Subscribe(WeaponStoppedFlyingEventTag, data => Events.Subscribe(WeaponStoppedFlyingEventTag, _ => { _weaponFlyingAbility.Cancel(); });
{
// TODO: Waiting on bug resolve
_weaponFlyingAbility.Cancel();
});
Events.Subscribe(Tag.RequestTag(tagsManager, "events.weapon.flyingtick"), data =>
{
GD.Print("Weapon tick triggered!");
});
} }
private List<ActiveEffectHandle> _grantedWeaponStartedFlyingAbilities = new List<ActiveEffectHandle>();
private List<ActiveEffectHandle> _grantedWeaponStoppedFlyingAbilities = new List<ActiveEffectHandle>();
private List<ActiveEffectHandle> _grantedWeaponFlyingTickAbilities = new List<ActiveEffectHandle>();
public enum WeaponEvent
{
StartedFlying,
StoppedFlying,
FlyingTick
}
public void GrantNewAbilityForEvent(WeaponEvent forEvent, ForgeAbilityBehavior abilityBehavior)
{
var abilitiesMap = new Dictionary<WeaponEvent, List<ActiveEffectHandle>>
{
{ WeaponEvent.StartedFlying, _grantedWeaponStartedFlyingAbilities },
{ WeaponEvent.StoppedFlying, _grantedWeaponStoppedFlyingAbilities },
{ WeaponEvent.FlyingTick, _grantedWeaponFlyingTickAbilities },
};
var eventTagsMap = new Dictionary<WeaponEvent, Tag>
{
{ WeaponEvent.StartedFlying, WeaponStartedFlyingEventTag },
{ WeaponEvent.StoppedFlying, WeaponStoppedFlyingEventTag },
{ WeaponEvent.FlyingTick, WeaponFlyingTickEventTag },
};
var ability = new AbilityData(
"Ability",
behaviorFactory: abilityBehavior.GetBehavior,
abilityTriggerData: AbilityTriggerData.ForEvent(eventTagsMap[forEvent]));
var leftGrantAbilityConfig = new GrantAbilityConfig(
ability,
ScalableLevel: new ScalableInt(1),
RemovalPolicy: AbilityDeactivationPolicy.CancelImmediately,
InhibitionPolicy: AbilityDeactivationPolicy.CancelImmediately,
TryActivateOnGrant: false,
TryActivateOnEnable: false,
LevelOverridePolicy: LevelComparison.Higher);
var leftGrantComponent = new GrantAbilityEffectComponent([leftGrantAbilityConfig]);
var leftGrantEffect = new EffectData(
"Grant Weapon Ability",
new DurationData(DurationType.Infinite),
effectComponents: [leftGrantComponent]);
var effectHandle = EffectsManager.ApplyEffect(new Effect(leftGrantEffect, new EffectOwnership(this, this)));
if (effectHandle == null) return;
abilitiesMap[forEvent].Add(effectHandle);
}
public void WeaponLeft() public void WeaponLeft()
{ {
Visible = true; Visible = true;

View File

@@ -3,11 +3,9 @@
[ext_resource type="Script" uid="uid://iii3wfto4t5b" path="res://scenes/player_controller/components/weapon/WeaponSystem.cs" id="1_csqwk"] [ext_resource type="Script" uid="uid://iii3wfto4t5b" path="res://scenes/player_controller/components/weapon/WeaponSystem.cs" id="1_csqwk"]
[ext_resource type="Script" uid="uid://cw525n4mjqgw0" path="res://addons/forge/resources/ForgeTagContainer.cs" id="2_l1xlx"] [ext_resource type="Script" uid="uid://cw525n4mjqgw0" path="res://addons/forge/resources/ForgeTagContainer.cs" id="2_l1xlx"]
[ext_resource type="Script" uid="uid://jitubgv6judn" path="res://scenes/components/damage/RDamage.cs" id="2_m0v1h"] [ext_resource type="Script" uid="uid://jitubgv6judn" path="res://scenes/components/damage/RDamage.cs" id="2_m0v1h"]
[ext_resource type="Resource" uid="uid://cu0685gspk2fk" path="res://scenes/player_controller/resources/forge/exploding_sword_weapon_land.tres" id="2_pgbtr"]
[ext_resource type="Script" uid="uid://cxihb42t2mfqi" path="res://addons/forge/nodes/ForgeAttributeSet.cs" id="3_3xjpi"] [ext_resource type="Script" uid="uid://cxihb42t2mfqi" path="res://addons/forge/nodes/ForgeAttributeSet.cs" id="3_3xjpi"]
[ext_resource type="Script" uid="uid://couw105c3bde4" path="res://addons/godot_state_charts/state_chart.gd" id="3_5owyf"] [ext_resource type="Script" uid="uid://couw105c3bde4" path="res://addons/godot_state_charts/state_chart.gd" id="3_5owyf"]
[ext_resource type="ArrayMesh" uid="uid://cho5fixitrbds" path="res://assets/meshes/swords/resources/sword23.tres" id="3_svc06"] [ext_resource type="ArrayMesh" uid="uid://cho5fixitrbds" path="res://assets/meshes/swords/resources/sword23.tres" id="3_svc06"]
[ext_resource type="Resource" uid="uid://bl0mng4kl1xy8" path="res://scenes/player_controller/resources/forge/exploding_sword_weapon_flight.tres" id="4_2wsgo"]
[ext_resource type="Resource" uid="uid://btnnpqann3ktp" path="res://scenes/player_controller/resources/forge/weapon_flying_tick_ability.tres" id="4_7bruw"] [ext_resource type="Resource" uid="uid://btnnpqann3ktp" path="res://scenes/player_controller/resources/forge/weapon_flying_tick_ability.tres" id="4_7bruw"]
[ext_resource type="Script" uid="uid://ccovd5i0wr3kk" path="res://addons/forge/editor/attributes/AttributeValues.cs" id="4_q6xv7"] [ext_resource type="Script" uid="uid://ccovd5i0wr3kk" path="res://addons/forge/editor/attributes/AttributeValues.cs" id="4_q6xv7"]
[ext_resource type="Script" uid="uid://jk2jm1g6q853" path="res://addons/godot_state_charts/compound_state.gd" id="4_svc06"] [ext_resource type="Script" uid="uid://jk2jm1g6q853" path="res://addons/godot_state_charts/compound_state.gd" id="4_svc06"]
@@ -66,7 +64,6 @@ contact_monitor = true
max_contacts_reported = 1 max_contacts_reported = 1
script = ExtResource("1_csqwk") script = ExtResource("1_csqwk")
BaseTags = SubResource("Resource_06gln") BaseTags = SubResource("Resource_06gln")
WeaponAbilities = [ExtResource("2_pgbtr"), ExtResource("4_2wsgo")]
FlyingTickAbility = ExtResource("4_7bruw") FlyingTickAbility = ExtResource("4_7bruw")
RDamage = SubResource("Resource_jpdh0") RDamage = SubResource("Resource_jpdh0")

View File

@@ -104,7 +104,7 @@ script = ExtResource("4_5fdax")
[sub_resource type="Resource" id="Resource_uv4a1"] [sub_resource type="Resource" id="Resource_uv4a1"]
script = ExtResource("4_5fdax") script = ExtResource("4_5fdax")
BaseValue = -30.0 BaseValue = -50.0
metadata/_custom_type_script = "uid://cn3b4ya15fg7e" metadata/_custom_type_script = "uid://cn3b4ya15fg7e"
[sub_resource type="Resource" id="Resource_dhni4"] [sub_resource type="Resource" id="Resource_dhni4"]

View File

@@ -39,7 +39,7 @@ script = ExtResource("3_fp8ou")
[sub_resource type="Resource" id="Resource_mbpss"] [sub_resource type="Resource" id="Resource_mbpss"]
script = ExtResource("3_fp8ou") script = ExtResource("3_fp8ou")
BaseValue = 1.0 BaseValue = 2.0
metadata/_custom_type_script = "uid://cn3b4ya15fg7e" metadata/_custom_type_script = "uid://cn3b4ya15fg7e"
[sub_resource type="Resource" id="Resource_exi3e"] [sub_resource type="Resource" id="Resource_exi3e"]

View File

@@ -85,8 +85,6 @@ public partial class PlayerController : CharacterBody3D,
public WeaponSystem WeaponSystem = null!; public WeaponSystem WeaponSystem = null!;
public WallHugSystem WallHugSystem = null!; public WallHugSystem WallHugSystem = null!;
public PlayerUi PlayerUi = null!; public PlayerUi PlayerUi = null!;
public TextureRect DashIndicator = null!;
public ColorRect PowerCooldownIndicator = null!;
public Node3D DashIndicatorNode = null!; public Node3D DashIndicatorNode = null!;
public MeshInstance3D DashIndicatorMesh = null!; public MeshInstance3D DashIndicatorMesh = null!;
public CylinderMesh DashIndicatorMeshCylinder = null!; public CylinderMesh DashIndicatorMeshCylinder = null!;
@@ -108,8 +106,6 @@ public partial class PlayerController : CharacterBody3D,
public Variables SharedVariables { get; } public Variables SharedVariables { get; }
// Inspector stuff // Inspector stuff
[Export] public Marker3D TutorialWeaponTarget = null!;
[Export] public bool TutorialDone { get; set; }
[Export] public bool HasSword { get; set; } = true; [Export] public bool HasSword { get; set; } = true;
[Export] public bool HasParry { get; set; } = true; [Export] public bool HasParry { get; set; } = true;
@@ -124,8 +120,9 @@ public partial class PlayerController : CharacterBody3D,
[ExportSubgroup("Common and defaults")] [ExportSubgroup("Common and defaults")]
[Export] public ForgeAbilityData EmpoweredActionAbility = null!; [Export] public ForgeAbilityData EmpoweredActionAbility = null!;
[Export] public ForgeAbilityData[] DefaultPermanentAbilities = []; [Export] public ForgeAbilityData[] DefaultPermanentAbilities = [];
[ExportSubgroup("WeaponThrow")]
[Export] public ForgeAbilityData[] AbilityLoadout = []; [ExportSubgroup("WeaponThrow")] [Export]
public ForgeAbilityBehavior WeaponExplosionBehavior;
[ExportGroup("Effects")] [ExportGroup("Effects")]
[ExportSubgroup("Common and defaults")] [ExportSubgroup("Common and defaults")]
@@ -350,16 +347,6 @@ public partial class PlayerController : CharacterBody3D,
private Vector3 _dashDirection = Vector3.Zero; private Vector3 _dashDirection = Vector3.Zero;
private Vector3 _postDashThroughPosition = Vector3.Zero; private Vector3 _postDashThroughPosition = Vector3.Zero;
private Vector3 _preDashVelocity = Vector3.Zero; private Vector3 _preDashVelocity = Vector3.Zero;
private int _empoweredActionsLeft;
public int EmpoweredActionsLeft
{
get => _empoweredActionsLeft;
set
{
_empoweredActionsLeft = value;
PlayerUi.SetNumberOfDashesLeft(value);
}
}
// Settings // Settings
private float _lookSensitivityMultiplier = 1.0f; private float _lookSensitivityMultiplier = 1.0f;
@@ -373,7 +360,6 @@ public partial class PlayerController : CharacterBody3D,
private Timer _weaponThrowUncatchableTimer = null!; private Timer _weaponThrowUncatchableTimer = null!;
private Timer _simpleDashCooldownTimer = null!; private Timer _simpleDashCooldownTimer = null!;
private Timer _airborneDashCooldownTimer = null!; private Timer _airborneDashCooldownTimer = null!;
private Timer _powerCooldownTimer = null!;
private Timer _invincibilityTimer = null!; private Timer _invincibilityTimer = null!;
private Timer _attackCooldown = null!; private Timer _attackCooldown = null!;
@@ -381,9 +367,6 @@ public partial class PlayerController : CharacterBody3D,
private StateChart _playerState = null!; private StateChart _playerState = null!;
private StateChartState _aiming = null!; private StateChartState _aiming = null!;
private StateChartState _powerExpired = null!;
private StateChartState _powerRecharging = null!;
private StateChartState _powerFull = null!;
private StateChartState _grounded = null!; private StateChartState _grounded = null!;
private StateChartState _airborne = null!; private StateChartState _airborne = null!;
@@ -510,9 +493,6 @@ public partial class PlayerController : CharacterBody3D,
} }
// DashIndicator = GetNode<TextureRect>("%DashIndicator"); // DashIndicator = GetNode<TextureRect>("%DashIndicator");
PowerCooldownIndicator = GetNode<ColorRect>("%DashCooldownIndicator");
PowerCooldownIndicator.Visible = false;
EmpoweredActionsLeft = MaxNumberOfEmpoweredActions;
TargetSpeed = WalkSpeed; TargetSpeed = WalkSpeed;
DashIndicatorNode = GetNode<Node3D>("DashIndicator"); DashIndicatorNode = GetNode<Node3D>("DashIndicator");
DashIndicatorMesh = GetNode<MeshInstance3D>("DashIndicator/DashIndicatorMesh"); DashIndicatorMesh = GetNode<MeshInstance3D>("DashIndicator/DashIndicatorMesh");
@@ -596,9 +576,6 @@ public partial class PlayerController : CharacterBody3D,
_onGroundSlideJump = Transition.Of(GetNode("StateChart/Root/Movement/Sliding/GroundSlide/OnJump")); _onGroundSlideJump = Transition.Of(GetNode("StateChart/Root/Movement/Sliding/GroundSlide/OnJump"));
_onAirGlideDoubleJump = Transition.Of(GetNode("StateChart/Root/Movement/Sliding/AirGlideDoubleJumpEnabled/OnJump")); _onAirGlideDoubleJump = Transition.Of(GetNode("StateChart/Root/Movement/Sliding/AirGlideDoubleJumpEnabled/OnJump"));
// _actionHanging = StateChartState.Of(GetNode("StateChart/Root/Actions/Hanging")); // _actionHanging = StateChartState.Of(GetNode("StateChart/Root/Actions/Hanging"));
_powerExpired = StateChartState.Of(GetNode("StateChart/Root/PowerReserve/Expired"));
_powerRecharging = StateChartState.Of(GetNode("StateChart/Root/PowerReserve/AtLeastOneCharge"));
_powerFull = StateChartState.Of(GetNode("StateChart/Root/PowerReserve/Full"));
_grounded = StateChartState.Of(GetNode("StateChart/Root/Movement/Grounded")); _grounded = StateChartState.Of(GetNode("StateChart/Root/Movement/Grounded"));
_airborne = StateChartState.Of(GetNode("StateChart/Root/Movement/Airborne")); _airborne = StateChartState.Of(GetNode("StateChart/Root/Movement/Airborne"));
@@ -625,7 +602,6 @@ public partial class PlayerController : CharacterBody3D,
_parryDash = StateChartState.Of(GetNode("StateChart/Root/Attack/DashParry")); _parryDash = StateChartState.Of(GetNode("StateChart/Root/Attack/DashParry"));
// State timers // State timers
_powerCooldownTimer = GetNode<Timer>("PowerCooldown");
_weaponThrowUncatchableTimer = GetNode<Timer>("WeaponThrowUncatchable"); _weaponThrowUncatchableTimer = GetNode<Timer>("WeaponThrowUncatchable");
_timeScaleAimInAirTimer = GetNode<Timer>("TimeScaleAimInAir"); _timeScaleAimInAirTimer = GetNode<Timer>("TimeScaleAimInAir");
_simpleDashCooldownTimer = GetNode<Timer>("DashCooldown"); _simpleDashCooldownTimer = GetNode<Timer>("DashCooldown");
@@ -653,8 +629,6 @@ public partial class PlayerController : CharacterBody3D,
WeaponSystem.Init(); WeaponSystem.Init();
WallHugSystem.Init(); WallHugSystem.Init();
EmpoweredActionsLeft = MaxNumberOfEmpoweredActions;
// if (!TutorialDone) // if (!TutorialDone)
// PlaceWeaponForTutorial(); // PlaceWeaponForTutorial();
@@ -680,13 +654,6 @@ public partial class PlayerController : CharacterBody3D,
_coyoteEnabled.StateEntered += StartCoyoteTime; _coyoteEnabled.StateEntered += StartCoyoteTime;
_timeScaleAimInAirTimer.Timeout += ResetTimeScale; _timeScaleAimInAirTimer.Timeout += ResetTimeScale;
_powerFull.StateEntered += StopPowerCooldown;
_powerFull.StateExited += StartPowerCooldown;
_powerRecharging.StateEntered += StartPowerCooldown;
_powerCooldownTimer.Timeout += PowerCooldownExpired;
_powerRecharging.StateProcessing += PowerRecharging;
_powerExpired.StateProcessing += PowerRecharging;
_simpleJump.StateEntered += OnSimpleJumpStarted; _simpleJump.StateEntered += OnSimpleJumpStarted;
_simpleJump.StatePhysicsProcessing += HandleSimpleJump; _simpleJump.StatePhysicsProcessing += HandleSimpleJump;
@@ -748,24 +715,6 @@ public partial class PlayerController : CharacterBody3D,
_parryStandard.StateEntered += OnStandardParryStarted; _parryStandard.StateEntered += OnStandardParryStarted;
_parryDash.StateEntered += OnDashParryStarted; _parryDash.StateEntered += OnDashParryStarted;
foreach (var weaponLandAbility in AbilityLoadout)
{
var leftGrantAbilityConfig = new GrantAbilityConfig(
weaponLandAbility.GetAbilityData(),
ScalableLevel: new ScalableInt(1),
RemovalPolicy: AbilityDeactivationPolicy.CancelImmediately,
InhibitionPolicy: AbilityDeactivationPolicy.CancelImmediately,
TryActivateOnGrant: false,
TryActivateOnEnable: false,
LevelOverridePolicy: LevelComparison.Higher);
var leftGrantComponent = new GrantAbilityEffectComponent([leftGrantAbilityConfig]);
var leftGrantEffect = new EffectData(
"Grant Weapon Left Ability",
new DurationData(DurationType.Infinite),
effectComponents: [leftGrantComponent]);
EffectsManager.ApplyEffect(new Effect(leftGrantEffect, new EffectOwnership(this, this)));
}
// Forge events // Forge events
var weaponLeftToken = WeaponSystem.Events.Subscribe(WeaponSystem.WeaponStartedFlyingEventTag, OnWeaponLeft); var weaponLeftToken = WeaponSystem.Events.Subscribe(WeaponSystem.WeaponStartedFlyingEventTag, OnWeaponLeft);
var weaponLandedToken = WeaponSystem.Events.Subscribe(WeaponSystem.WeaponStoppedFlyingEventTag, OnWeaponLanded); var weaponLandedToken = WeaponSystem.Events.Subscribe(WeaponSystem.WeaponStoppedFlyingEventTag, OnWeaponLanded);
@@ -798,6 +747,11 @@ public partial class PlayerController : CharacterBody3D,
out var failures); out var failures);
} }
public void GrantWeaponExplosionAbilityForEvent(WeaponSystem.WeaponEvent forEvent, string abilityName)
{
WeaponSystem.GrantNewAbilityForEvent(forEvent, WeaponExplosionBehavior);
}
/////////////////////////// ///////////////////////////
// Settings & tutorial // // Settings & tutorial //
/////////////////////////// ///////////////////////////
@@ -832,21 +786,6 @@ public partial class PlayerController : CharacterBody3D,
_fovChangeMultiplier = (float) config.GetValue("InputSettings", "FovChangeWithSpeed", 1.0f); _fovChangeMultiplier = (float) config.GetValue("InputSettings", "FovChangeWithSpeed", 1.0f);
_aimAssistMultiplier = (float) config.GetValue("InputSettings", "AimAssist", 1.0f); _aimAssistMultiplier = (float) config.GetValue("InputSettings", "AimAssist", 1.0f);
} }
public void OnTutorialDone(Node3D _)
{
TutorialDone = true;
}
public void PlaceWeaponForTutorial()
{
if (TutorialDone)
return;
RemoveChild(WeaponSystem);
GetTree().GetRoot().CallDeferred(Node.MethodName.AddChild, WeaponSystem);
WeaponSystem.CallDeferred(Node3D.MethodName.SetGlobalPosition, TutorialWeaponTarget.GlobalPosition);
WeaponSystem.CallDeferred(WeaponSystem.MethodName.PlaceWeaponForTutorial, TutorialWeaponTarget.GlobalPosition);
}
/////////////////////////// ///////////////////////////
// Toolbox Utils // // Toolbox Utils //
@@ -1267,7 +1206,7 @@ public partial class PlayerController : CharacterBody3D,
_currentInputBufferFrames = InputBufferFrames; _currentInputBufferFrames = InputBufferFrames;
_bufferedAction = _mantling.Active ? BufferedActions.MantleDash : BufferedActions.Dash; _bufferedAction = _mantling.Active ? BufferedActions.MantleDash : BufferedActions.Dash;
if (_airborne.Active) if (_airborne.Active || _jumping.Active)
{ {
if (!_canDashAirborne) if (!_canDashAirborne)
return; return;
@@ -2009,55 +1948,19 @@ public partial class PlayerController : CharacterBody3D,
/////////////////////////// ///////////////////////////
// Empowerement management // // Empowerement management //
/////////////////////////// ///////////////////////////
public void PowerRecharging(float delta)
{
var progress = (float) (_powerCooldownTimer.TimeLeft / _powerCooldownTimer.WaitTime);
PowerCooldownIndicator.SetCustomMinimumSize(new Vector2(100 * progress, 10));
}
public void StartPowerCooldown()
{
_powerCooldownTimer.Start();
PowerCooldownIndicator.Visible = true;
}
public void StopPowerCooldown()
{
_powerCooldownTimer.Stop();
PowerCooldownIndicator.Visible = false;
}
public void PowerCooldownExpired()
{
EmpoweredActionsLeft += 1;
var eventToSend = EmpoweredActionsLeft == MaxNumberOfEmpoweredActions ? "fully_charged" : "recharge";
_playerState.SendEvent(eventToSend);
}
public bool CanPerformEmpoweredAction() public bool CanPerformEmpoweredAction()
{ {
if(_empoweredActionHandle == null) return false; if(_empoweredActionHandle == null) return false;
var cooldowns = _empoweredActionHandle.GetCooldownData(); // var cooldowns = _empoweredActionHandle.GetCooldownData();
foreach (var cd in cooldowns) // var costs = _empoweredActionHandle.GetCostData();
{
//GD.Print($"Cooldown remaining: {cd.RemainingTime}");
}
var costs = _empoweredActionHandle.GetCostData();
foreach (var cost in costs)
{
// Assuming you want to check Mana costs
if (cost.Attribute == "PlayerAttributeSet.Mana")
{
//GD.Print($"Mana Cost: {cost.Cost}");
}
}
var canActivate = _empoweredActionHandle.CanActivate(out var failures); var canActivate = _empoweredActionHandle.CanActivate(out var failures);
if (!canActivate) if (!canActivate)
{ {
GD.PrintErr($"Cannot activate empowered action: {failures}");
if (failures.HasFlag(AbilityActivationFailures.Cooldown)) GD.PrintErr("In Cooldown"); if (failures.HasFlag(AbilityActivationFailures.Cooldown)) GD.PrintErr("In Cooldown");
if (failures.HasFlag(AbilityActivationFailures.InsufficientResources)) GD.PrintErr("Not Enough Mana"); if (failures.HasFlag(AbilityActivationFailures.InsufficientResources)) GD.PrintErr("Not Enough Mana");
} }
return canActivate; return canActivate;
return EmpoweredActionsLeft > 0 && TutorialDone;
} }
public void PerformEmpoweredAction() public void PerformEmpoweredAction()
{ {
@@ -2066,24 +1969,13 @@ public partial class PlayerController : CharacterBody3D,
var canActivate = _empoweredActionHandle.Activate(out var failures); var canActivate = _empoweredActionHandle.Activate(out var failures);
if (!canActivate) if (!canActivate)
{ {
GD.PrintErr($"Cannot activate empowered action: {failures}");
if (failures.HasFlag(AbilityActivationFailures.Cooldown)) GD.PrintErr("In Cooldown"); if (failures.HasFlag(AbilityActivationFailures.Cooldown)) GD.PrintErr("In Cooldown");
if (failures.HasFlag(AbilityActivationFailures.InsufficientResources)) GD.PrintErr("Not Enough Mana"); if (failures.HasFlag(AbilityActivationFailures.InsufficientResources)) GD.PrintErr("Not Enough Mana");
return;
} }
else
{
GD.Print($"Remaining mana: {Attributes["PlayerAttributeSet.Mana"].CurrentValue}");
}
// Inhibit Mana Regeneration for a while after using an empowered action
// TODO: Use Forge events instead of relying on direct referencing
// _manaRegenEffectHandle!.SetInhibit(true);
// GetTree().CreateTimer(EmpoweredAction.ManaRegenPause).Timeout += () => {_manaRegenEffectHandle!.SetInhibit(false);};
_isWallJumpAvailable = true; _isWallJumpAvailable = true;
_canDashAirborne = true; _canDashAirborne = true;
EmpoweredActionsLeft--;
_playerState.SendEvent(EmpoweredActionsLeft <= 0 ? "expired" : "power_used");
Events.Raise(new EventData<EmpoweredActionPayload> Events.Raise(new EventData<EmpoweredActionPayload>
{ {
@@ -2411,13 +2303,7 @@ public partial class PlayerController : CharacterBody3D,
{ {
// Manage head and camera movement // Manage head and camera movement
LookAround(delta); LookAround(delta);
EffectsManager.UpdateEffects(delta); EffectsManager.UpdateEffects(delta);
// TODO: change for actual Cue
// var currentMana = Attributes["PlayerAttributeSet.Mana"].CurrentValue;
// if (Mathf.Abs(currentMana - _oldMana) > Mathf.Epsilon)
// PlayerUi.OnManaChanged(currentMana);
// _oldMana = currentMana;
} }
/////////////////////////// ///////////////////////////

View File

@@ -94,22 +94,6 @@ public class PlayerControllerUnitTest
AssertFloat(_player.CHealth.CurrentHealth).IsEqual(75.0f); AssertFloat(_player.CHealth.CurrentHealth).IsEqual(75.0f);
} }
[TestCase]
public void TestEmpoweredActionsLeft()
{
var mockUi = new PlayerUi();
var dashIcons = new TextureRect[3] { new TextureRect(), new TextureRect(), new TextureRect() };
mockUi.DashIcons = dashIcons;
_player.PlayerUi = mockUi;
_player.EmpoweredActionsLeft = 2;
AssertInt(_player.EmpoweredActionsLeft).IsEqual(2);
AssertBool(dashIcons[0].Visible).IsTrue();
AssertBool(dashIcons[1].Visible).IsTrue();
AssertBool(dashIcons[2].Visible).IsFalse();
}
[TestCase] [TestCase]
public void TestDashCooldownTimeout() public void TestDashCooldownTimeout()
{ {

View File

@@ -9,22 +9,26 @@ extends Node
@export_group("Overlaid") @export_group("Overlaid")
@export var lost_menu_scene : PackedScene = preload("uid://ciyq8eiv1mtie") @export var lost_menu_scene : PackedScene = preload("uid://ciyq8eiv1mtie")
@export var toolbox_scene : PackedScene = preload("uid://bcn582q8qd4ns") @export var toolbox_scene : PackedScene = preload("uid://bcn582q8qd4ns")
@export var inventory_scene : PackedScene = preload("uid://oq1jjvjs4qga")
@export_category("Others") @export_category("Others")
@export var focused_viewport : Viewport @export var focused_viewport : Viewport
@export var toolbox_action:GUIDEAction = preload("uid://ca68r7n3bwba3") @export var toolbox_action:GUIDEAction = preload("uid://ca68r7n3bwba3")
@export var inventory_action:GUIDEAction = preload("uid://7ne5mdytlidm")
# Debug # Debug
@onready var debug_layer: CanvasLayer = $"../DebugLayer" @onready var debug_layer: CanvasLayer = $"../DebugLayer"
@onready var inventory_layer: CanvasLayer = $"../InventoryLayer"
@onready var player: PlayerController = $"../Player" @onready var player: PlayerController = $"../Player"
func _ready() -> void: func _ready() -> void:
toolbox_action.triggered.connect(open_toolbox) toolbox_action.triggered.connect(open_toolbox)
inventory_action.triggered.connect(open_inventory)
func open_overlaid_menu(menu: PackedScene) -> Node: func open_overlaid_menu(menu: PackedScene) -> Node:
if not focused_viewport: if not focused_viewport:
focused_viewport = get_viewport() focused_viewport = get_viewport()
var _initial_focus_control = focused_viewport.gui_get_focus_owner() var _initial_focus_control: Control = focused_viewport.gui_get_focus_owner()
return menu.instantiate() return menu.instantiate()
func open_toolbox() -> void: func open_toolbox() -> void:
@@ -32,6 +36,11 @@ func open_toolbox() -> void:
toolbox.player = player toolbox.player = player
debug_layer.call_deferred("add_child", toolbox) debug_layer.call_deferred("add_child", toolbox)
func open_inventory() -> void:
var inventory: Control = open_overlaid_menu(inventory_scene)
inventory.player = player
inventory_layer.call_deferred("add_child", inventory)
func on_player_died() -> void: func on_player_died() -> void:
var lost_menu: LevelLostMenu = open_overlaid_menu(lost_menu_scene) var lost_menu: LevelLostMenu = open_overlaid_menu(lost_menu_scene)
get_tree().current_scene.call_deferred("add_child", lost_menu) get_tree().current_scene.call_deferred("add_child", lost_menu)