Compare commits
41 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| dc81796d52 | |||
| 2103832e46 | |||
| 1898d91a28 | |||
| b3ae3e37ea | |||
| 4cd67023d9 | |||
| afa335e7bf | |||
| a0e99a959f | |||
| 0cd942d90e | |||
| 150e007b22 | |||
| 01a2e7582b | |||
| 7ba4a3db3f | |||
| bcc748ca6b | |||
| 1db30eafd9 | |||
| 68e36742af | |||
| 33f55d04f3 | |||
| a139990390 | |||
| b2b7baffe8 | |||
| bed1384dc7 | |||
| 99f383be00 | |||
| 631935fdc8 | |||
| 852f265b9f | |||
| 0e6211943d | |||
| fb30a08b89 | |||
| 24f057c15f | |||
| ec44306d48 | |||
| dcfd937e53 | |||
| cd7a230615 | |||
| 319cbf722e | |||
| bb21920488 | |||
| cd2b41b443 | |||
| d025618eb3 | |||
| 26f6a619cb | |||
| ce48f3b9d7 | |||
| 54796252ce | |||
| 054115aa89 | |||
| f5e47e9f5e | |||
| 99ed6375a2 | |||
| 6888499b78 | |||
| 2a98137653 | |||
| b0fe2549ea | |||
| 667d6b2588 |
@@ -38,22 +38,30 @@ jobs:
|
||||
PRERELEASE: false
|
||||
INITIAL_VERSION: 0.1.0
|
||||
DEFAULT_BUMP: patch
|
||||
|
||||
|
||||
# Test:
|
||||
# runs-on: godot
|
||||
## env:
|
||||
## RUNNER_TOOL_CACHE: /toolcache # Runner Tool Cache
|
||||
# env:
|
||||
# RUNNER_TOOL_CACHE: /toolcache # Runner Tool Cache
|
||||
# steps:
|
||||
# - name: Checkout with LFS
|
||||
# uses: https://git.game-dev.space/minimata/checkout-with-lfs.git@main
|
||||
#
|
||||
#
|
||||
# - name: Setup Godot
|
||||
# id: setup-godot
|
||||
# uses: https://git.game-dev.space/minimata/setup-godot.git@main
|
||||
# with:
|
||||
# godot-version: ${GODOT_VERSION}
|
||||
# dotnet-version: ${DOTNET_VERSION}
|
||||
#
|
||||
#
|
||||
# - name: 🔬 Verify Setup
|
||||
# run: |
|
||||
# dotnet --version
|
||||
# ${{ steps.setup-godot.outputs.godot_bin }} --version
|
||||
#
|
||||
# - name: 🧑🔬 Generate .NET Bindings
|
||||
# run: ${{ steps.setup-godot.outputs.godot_bin }} --headless --build-solutions --quit || exit 0
|
||||
#
|
||||
# - name: Run C# Tests
|
||||
# env:
|
||||
# GODOT_BIN: ${{ steps.setup-godot.outputs.godot_bin }}
|
||||
@@ -61,24 +69,80 @@ jobs:
|
||||
# run: |
|
||||
# dotnet test --no-build --settings .runsettings --results-directory ./reports --logger "console;verbosity=normal" --logger "trx;LogFileName=results.xml" -- GdUnit4.Parameters="--verbose --headless --import"
|
||||
#
|
||||
## - name: Run tests
|
||||
## uses: godot-gdunit-labs/gdUnit4-action@v1
|
||||
## with:
|
||||
## godot-version: ${GODOT_VERSION}
|
||||
## godot-net: true
|
||||
## godot-force-mono: true
|
||||
## dotnet-version: ${DOTNET_VERSION}
|
||||
## paths: |
|
||||
## res://tests/
|
||||
## publish-report: false
|
||||
## upload-report: false
|
||||
## console-verbosity: 'normal'
|
||||
## arguments: "--verbose --headless --import"
|
||||
# # - name: Run tests
|
||||
# # uses: godot-gdunit-labs/gdUnit4-action@v1
|
||||
# # with:
|
||||
# # godot-version: ${GODOT_VERSION}
|
||||
# # godot-net: true
|
||||
# # godot-force-mono: true
|
||||
# # dotnet-version: ${DOTNET_VERSION}
|
||||
# # paths: |
|
||||
# # res://tests/
|
||||
# # publish-report: false
|
||||
# # upload-report: false
|
||||
# # console-verbosity: 'normal'
|
||||
# # arguments: "--verbose --headless --import"
|
||||
#
|
||||
# - name: Upload test report
|
||||
# uses: actions/upload-artifact@v3-node20
|
||||
# with:
|
||||
# name: Test Report
|
||||
# path: ${{ github.workspace }}/reports/test-result.html
|
||||
#
|
||||
# OtherTest:
|
||||
# runs-on: godot
|
||||
# env:
|
||||
# RUNNER_TOOL_CACHE: /toolcache # Runner Tool Cache
|
||||
# steps:
|
||||
# - name: Checkout with LFS
|
||||
# uses: https://git.game-dev.space/minimata/checkout-with-lfs.git@main
|
||||
#
|
||||
# - uses: actions/setup-dotnet@v5
|
||||
# name: 💽 Setup .NET SDK
|
||||
# with:
|
||||
# dotnet-version: '9.0.x'
|
||||
#
|
||||
# - name: 📦 Restore Dependencies
|
||||
# run: |
|
||||
# dotnet --version
|
||||
# dotnet restore
|
||||
# dotnet build
|
||||
# dotnet list package
|
||||
#
|
||||
# - uses: chickensoft-games/setup-godot@v2
|
||||
# name: 🤖 Setup Godot
|
||||
# with:
|
||||
# # Version must include major, minor, and patch, and be >= 4.0.0
|
||||
# # Pre-release label is optional.
|
||||
# version: '4.6.2'
|
||||
# # Use .NET-enabled version of Godot (the default is also true).
|
||||
# use-dotnet: true
|
||||
# # Include the Godot Export Templates (the default is false).
|
||||
# include-templates: true
|
||||
#
|
||||
# - name: 🔬 Verify Setup
|
||||
# run: |
|
||||
# dotnet --version
|
||||
# godot --version
|
||||
#
|
||||
# - name: 🧑🔬 Generate .NET Bindings
|
||||
# run: godot --headless --build-solutions --import --quit || exit 0
|
||||
#
|
||||
# - name: 🦺 Build Projects
|
||||
# run: dotnet build --configuration ExportRelease
|
||||
#
|
||||
# - name: Run C# Tests
|
||||
# env:
|
||||
# GODOT_BIN: /root/bin/godot
|
||||
# shell: bash
|
||||
# run: |
|
||||
# dotnet test --no-build --settings .runsettings --results-directory ./reports --logger "console;verbosity=normal" --logger "trx;LogFileName=results.xml" -- GdUnit4.Parameters="--headless --import --quit"
|
||||
#
|
||||
# - name: Upload test report
|
||||
# uses: actions/upload-artifact@v3-node20
|
||||
# if: always()
|
||||
# with:
|
||||
# name: Test Report
|
||||
# path: ${{ github.workspace }}/reports/test-result.html
|
||||
|
||||
Export:
|
||||
|
||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -11,6 +11,7 @@
|
||||
|
||||
/builds
|
||||
/communication
|
||||
/reports
|
||||
|
||||
# Imported translations (automatically generated from CSV files)
|
||||
*.translation
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<MaxCpuCount>1</MaxCpuCount>
|
||||
<ResultsDirectory>./TestResults</ResultsDirectory>
|
||||
<TargetFrameworks>net8.0;net9.0</TargetFrameworks>
|
||||
<TestSessionTimeout>180000</TestSessionTimeout>
|
||||
<TestSessionTimeout>60000</TestSessionTimeout>
|
||||
<TreatNoTestsAsError>true</TreatNoTestsAsError>
|
||||
</RunConfiguration>
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
|
||||
<GdUnit4>
|
||||
<!-- Additional Godot runtime parameters. These are passed to the Godot executable when running tests.-->
|
||||
<Parameters>"--verbose"</Parameters>
|
||||
<Parameters>"--verbose --headless --import --quit"</Parameters>
|
||||
|
||||
<!-- Controls the display name format of test cases in the test results.
|
||||
Allowed values:
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
<TargetFramework>net9.0</TargetFramework>
|
||||
<EnableDynamicLoading>true</EnableDynamicLoading>
|
||||
<RootNamespace>Movementtests</RootNamespace>
|
||||
<!-- Catch compiler-mismatch issues with the Introspection generator -->
|
||||
<WarningsAsErrors>CS9057</WarningsAsErrors>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Content Include=".runsettings" />
|
||||
@@ -126,11 +128,18 @@
|
||||
<ItemGroup>
|
||||
<Folder Include="addons\" />
|
||||
<Folder Include="tests\" />
|
||||
<Folder Include="tools\" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Chickensoft.Sync" Version="2.3.0" />
|
||||
<PackageReference Include="RustyOptions" Version="0.10.1" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Chickensoft.GodotNodeInterfaces" Version="3.0.12" />
|
||||
<PackageReference Include="Chickensoft.Introspection" Version="3.0.2" />
|
||||
<PackageReference Include="Chickensoft.Introspection.Generator" Version="3.0.2" PrivateAssets="all" OutputItemType="analyzer" />
|
||||
<PackageReference Include="Chickensoft.AutoInject" Version="2.12.8" PrivateAssets="all" />
|
||||
<PackageReference Include="Chickensoft.AutoInject.Analyzers" Version="2.12.8" PrivateAssets="all" OutputItemType="analyzer" />
|
||||
</ItemGroup>
|
||||
<Import Project="addons/forge/Forge.props" />
|
||||
|
||||
<!-- gdUnit4 package dependencies -->
|
||||
|
||||
@@ -10,5 +10,9 @@ namespace Gamesmiths.Forge.Godot.Resources.Abilities;
|
||||
[Icon("uid://bcx7anhepqfmd")]
|
||||
public abstract partial class ForgeAbilityBehavior : Resource
|
||||
{
|
||||
[Export] public string? Name { get; set; }
|
||||
[Export] public string? Description { get; set; }
|
||||
[Export] public Texture2D? Icon { get; set; }
|
||||
|
||||
public abstract IAbilityBehavior GetBehavior();
|
||||
}
|
||||
|
||||
@@ -41,8 +41,8 @@ func _input(event : InputEvent) -> void:
|
||||
if event.is_action_released("ui_cancel"):
|
||||
if sub_menu:
|
||||
_close_sub_menu()
|
||||
else:
|
||||
get_tree().quit()
|
||||
# else:
|
||||
# get_tree().quit()
|
||||
if event.is_action_released("ui_accept") and get_viewport().gui_get_focus_owner() == null:
|
||||
%MenuButtonsBoxContainer.focus_first()
|
||||
|
||||
|
||||
@@ -32,12 +32,21 @@ func _exit_tree() -> void:
|
||||
|
||||
func close() -> void:
|
||||
menu_closing.emit()
|
||||
hide_menu()
|
||||
queue_free()
|
||||
|
||||
func hide_menu() -> void:
|
||||
_scene_tree.paused = _initial_pause_state
|
||||
Input.set_mouse_mode(_initial_mouse_mode)
|
||||
if is_instance_valid(_initial_focus_control) and _initial_focus_control.is_inside_tree():
|
||||
_initial_focus_control.focus_mode = _initial_focus_mode
|
||||
_initial_focus_control.grab_focus()
|
||||
queue_free()
|
||||
|
||||
GUIDE.disable_mapping_context(menu_context)
|
||||
for previous_context in previous_mapping_contexts:
|
||||
GUIDE.enable_mapping_context(previous_context)
|
||||
|
||||
visible = false
|
||||
|
||||
func _handle_cancel_input() -> void:
|
||||
close()
|
||||
@@ -45,7 +54,7 @@ func _handle_cancel_input() -> void:
|
||||
func _on_close_button_pressed() -> void:
|
||||
close()
|
||||
|
||||
func _enter_tree() -> void:
|
||||
func show_menu() -> void:
|
||||
_scene_tree = get_tree()
|
||||
_initial_pause_state = _scene_tree.paused
|
||||
_initial_mouse_mode = Input.get_mouse_mode()
|
||||
@@ -61,5 +70,10 @@ func _enter_tree() -> void:
|
||||
for previous_context in previous_mapping_contexts:
|
||||
GUIDE.disable_mapping_context(previous_context)
|
||||
GUIDE.enable_mapping_context(menu_context)
|
||||
|
||||
visible = true
|
||||
|
||||
func _enter_tree() -> void:
|
||||
show_menu()
|
||||
back_action.triggered.connect(_handle_cancel_input)
|
||||
|
||||
|
||||
@@ -3,19 +3,21 @@
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://bun38n3ff5wvv"
|
||||
path="res://.godot/imported/keyboard_shift_icon_outline.svg-21854f9aeab065c26ab9185b7d09e5f2.ctex"
|
||||
path.s3tc="res://.godot/imported/keyboard_shift_icon_outline.svg-21854f9aeab065c26ab9185b7d09e5f2.s3tc.ctex"
|
||||
path.etc2="res://.godot/imported/keyboard_shift_icon_outline.svg-21854f9aeab065c26ab9185b7d09e5f2.etc2.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
"imported_formats": ["s3tc_bptc", "etc2_astc"],
|
||||
"vram_texture": true
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://assets/ui/input-prompts/Keyboard & Mouse/Vector/keyboard_shift_icon_outline.svg"
|
||||
dest_files=["res://.godot/imported/keyboard_shift_icon_outline.svg-21854f9aeab065c26ab9185b7d09e5f2.ctex"]
|
||||
dest_files=["res://.godot/imported/keyboard_shift_icon_outline.svg-21854f9aeab065c26ab9185b7d09e5f2.s3tc.ctex", "res://.godot/imported/keyboard_shift_icon_outline.svg-21854f9aeab065c26ab9185b7d09e5f2.etc2.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/mode=2
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/uastc_level=0
|
||||
@@ -23,7 +25,7 @@ compress/rdo_quality_loss=0.0
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/generate=true
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
@@ -37,7 +39,7 @@ 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
|
||||
detect_3d/compress_to=0
|
||||
svg/scale=1.0
|
||||
editor/scale_with_editor_scale=false
|
||||
editor/convert_colors_with_editor_theme=false
|
||||
|
||||
73
forge/ForgeEntityNode.cs
Normal file
73
forge/ForgeEntityNode.cs
Normal file
@@ -0,0 +1,73 @@
|
||||
// Copyright © Gamesmiths Guild.
|
||||
|
||||
using Chickensoft.AutoInject;
|
||||
using Chickensoft.Introspection;
|
||||
using Gamesmiths.Forge.Core;
|
||||
using Gamesmiths.Forge.Cues;
|
||||
using Gamesmiths.Forge.Effects;
|
||||
using Gamesmiths.Forge.Events;
|
||||
using Gamesmiths.Forge.Godot.Core;
|
||||
using Gamesmiths.Forge.Godot.Resources;
|
||||
using Gamesmiths.Forge.Statescript;
|
||||
using Gamesmiths.Forge.Tags;
|
||||
using Godot;
|
||||
|
||||
namespace Movementtests.tools;
|
||||
|
||||
[GlobalClass]
|
||||
[Icon("uid://cu6ncpuumjo20")]
|
||||
[Meta(typeof(IAutoNode))]
|
||||
public partial class ForgeEntityNode : Node3D, IForgeEntity
|
||||
{
|
||||
public override void _Notification(int what) => this.Notify(what);
|
||||
|
||||
[Dependency]
|
||||
public TagsManager TagsManager => this.DependOn(() => ForgeManagers.Instance.TagsManager);
|
||||
[Dependency]
|
||||
public CuesManager CuesManager => this.DependOn(() => ForgeManagers.Instance.CuesManager);
|
||||
|
||||
[Export]
|
||||
public ForgeTagContainer? BaseTags { get; set; }
|
||||
[Export]
|
||||
public ForgeSharedVariableSet? SharedVariableDefinitions { get; set; }
|
||||
|
||||
public required EntityAttributes Attributes { get; set; }
|
||||
|
||||
public required EntityTags Tags { get; set; }
|
||||
|
||||
public required EffectsManager EffectsManager { get; set; }
|
||||
|
||||
public required EntityAbilities Abilities { get; set; }
|
||||
|
||||
public required EventManager Events { get; set; }
|
||||
|
||||
public required Variables SharedVariables { get; set; }
|
||||
|
||||
public void OnReady()
|
||||
{
|
||||
}
|
||||
|
||||
public void OnResolved()
|
||||
{
|
||||
BaseTags ??= new ForgeTagContainer();
|
||||
Tags = new EntityTags(BaseTags.GetTagContainer());
|
||||
Attributes = new EntityAttributes([.. ForgeUtils.CollectAttributeList(this)]);
|
||||
Abilities = new EntityAbilities(this);
|
||||
Events = new EventManager();
|
||||
|
||||
SharedVariables = new Variables();
|
||||
SharedVariableDefinitions?.PopulateVariables(SharedVariables);
|
||||
|
||||
EffectsManager = new EffectsManager(this, CuesManager);
|
||||
var effectApplier = new EffectApplier(this);
|
||||
effectApplier.ApplyEffects(this, this, this);
|
||||
}
|
||||
|
||||
public override void _Process(double delta)
|
||||
{
|
||||
base._Process(delta);
|
||||
|
||||
EffectsManager.UpdateEffects(delta);
|
||||
Abilities.UpdateAbilities(delta);
|
||||
}
|
||||
}
|
||||
1
forge/ForgeEntityNode.cs.uid
Normal file
1
forge/ForgeEntityNode.cs.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://rpcbb54q4atx
|
||||
@@ -12,6 +12,7 @@ public class ExplodingSwordBehavior(PackedScene explosion, float radius) : IAbil
|
||||
{
|
||||
if (context.Owner is not Node3D owner)
|
||||
{
|
||||
GD.Print("Owner isn't a Node3D");
|
||||
context.InstanceHandle.End();
|
||||
return;
|
||||
}
|
||||
@@ -29,8 +30,8 @@ public class ExplodingSwordBehavior(PackedScene explosion, float radius) : IAbil
|
||||
return;
|
||||
}
|
||||
explo.Radius = radius;
|
||||
|
||||
owner.GetTree().GetRoot().CallDeferred(Node.MethodName.AddChild, explo);
|
||||
|
||||
owner.GetTree().GetCurrentScene().CallDeferred(Node.MethodName.AddChild, explo);
|
||||
explo.CallDeferred(Node3D.MethodName.SetGlobalPosition, owner.GlobalPosition);
|
||||
|
||||
context.AbilityHandle.CommitAbility();
|
||||
|
||||
@@ -1,13 +1,20 @@
|
||||
using Gamesmiths.Forge.Abilities;
|
||||
using Gamesmiths.Forge.Effects;
|
||||
using Gamesmiths.Forge.Godot.Resources;
|
||||
using Gamesmiths.Forge.Godot.Resources.Abilities;
|
||||
using Godot;
|
||||
|
||||
namespace Movementtests.forge.abilities;
|
||||
|
||||
public class InstantEndBehavior : IAbilityBehavior
|
||||
public class InstantEndBehavior(ForgeEffectData? effectData) : IAbilityBehavior
|
||||
{
|
||||
public void OnStarted(AbilityBehaviorContext context)
|
||||
{
|
||||
if (effectData != null)
|
||||
{
|
||||
var effect = new Effect(effectData.GetEffectData(), new EffectOwnership(context.Owner, context.Owner));
|
||||
context.Owner.EffectsManager.ApplyEffect(effect);
|
||||
}
|
||||
context.AbilityHandle.CommitAbility();
|
||||
context.InstanceHandle.End();
|
||||
}
|
||||
@@ -19,5 +26,6 @@ public class InstantEndBehavior : IAbilityBehavior
|
||||
[GlobalClass]
|
||||
public partial class ForgeInstantEndBehavior : ForgeAbilityBehavior
|
||||
{
|
||||
public override IAbilityBehavior GetBehavior() => new InstantEndBehavior();
|
||||
[Export] public ForgeEffectData? OptionalEffectData { get; set; }
|
||||
public override IAbilityBehavior GetBehavior() => new InstantEndBehavior(OptionalEffectData);
|
||||
}
|
||||
38
forge/abilities/ForgeManualCancelHitBehavior.cs
Normal file
38
forge/abilities/ForgeManualCancelHitBehavior.cs
Normal file
@@ -0,0 +1,38 @@
|
||||
using Gamesmiths.Forge.Abilities;
|
||||
using Gamesmiths.Forge.Effects;
|
||||
using Gamesmiths.Forge.Godot.Resources;
|
||||
using Gamesmiths.Forge.Godot.Resources.Abilities;
|
||||
using Godot;
|
||||
|
||||
namespace Movementtests.forge.abilities;
|
||||
|
||||
public class ManualCancelHitBehavior(ForgeEffectData[] effects) : IAbilityBehavior
|
||||
{
|
||||
public void OnStarted(AbilityBehaviorContext context)
|
||||
{
|
||||
if (context.Target == null) return;
|
||||
|
||||
var sourceLocation = (context.Source as Node3D)?.GlobalPosition ?? Vector3.Zero;
|
||||
var targetLocation = (context.Target as Node3D)?.GlobalPosition ?? Vector3.Zero;
|
||||
var magnitude = context.Magnitude == 0 ? 1 : context.Magnitude;
|
||||
|
||||
foreach (var effectData in effects)
|
||||
{
|
||||
var effect = new Effect(effectData.GetEffectData(), new EffectOwnership(context.Owner, context.Owner));
|
||||
context.Target.EffectsManager.ApplyEffect(effect, new SimpleHitEffectData(sourceLocation, targetLocation, magnitude));
|
||||
}
|
||||
}
|
||||
|
||||
public void OnEnded(AbilityBehaviorContext context)
|
||||
{
|
||||
context.AbilityHandle.CommitAbility();
|
||||
}
|
||||
}
|
||||
|
||||
[Tool]
|
||||
[GlobalClass]
|
||||
public partial class ForgeManualCancelHitBehavior : ForgeAbilityBehavior
|
||||
{
|
||||
[Export] public ForgeEffectData[] OnHitEffects { get; set; } = [];
|
||||
public override IAbilityBehavior GetBehavior() => new ManualCancelHitBehavior(OnHitEffects);
|
||||
}
|
||||
1
forge/abilities/ForgeManualCancelHitBehavior.cs.uid
Normal file
1
forge/abilities/ForgeManualCancelHitBehavior.cs.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://d1bb1fvh1mnpd
|
||||
39
forge/abilities/ForgeSimpleHitBehavior.cs
Normal file
39
forge/abilities/ForgeSimpleHitBehavior.cs
Normal file
@@ -0,0 +1,39 @@
|
||||
using Gamesmiths.Forge.Abilities;
|
||||
using Gamesmiths.Forge.Effects;
|
||||
using Gamesmiths.Forge.Godot.Resources;
|
||||
using Gamesmiths.Forge.Godot.Resources.Abilities;
|
||||
using Godot;
|
||||
|
||||
namespace Movementtests.forge.abilities;
|
||||
|
||||
public record SimpleHitEffectData(Vector3 SourceLocation, Vector3 TargetLocation, float Magnitude = 1);
|
||||
|
||||
public class SimpleHitBehavior(ForgeEffectData? damage) : IAbilityBehavior
|
||||
{
|
||||
public void OnStarted(AbilityBehaviorContext context)
|
||||
{
|
||||
if (context.Target == null || damage == null) return;
|
||||
|
||||
var sourceLocation = (context.Source as Node3D)?.GlobalPosition ?? Vector3.Zero;
|
||||
var targetLocation = (context.Target as Node3D)?.GlobalPosition ?? Vector3.Zero;
|
||||
|
||||
var magnitude = context.Magnitude == 0 ? 1 : context.Magnitude;
|
||||
var effect = new Effect(damage.GetEffectData(), new EffectOwnership(context.Owner, context.Owner));
|
||||
context.Target.EffectsManager.ApplyEffect(effect, new SimpleHitEffectData(sourceLocation, targetLocation, magnitude));
|
||||
|
||||
context.AbilityHandle.CommitAbility();
|
||||
context.InstanceHandle.End();
|
||||
}
|
||||
|
||||
public void OnEnded(AbilityBehaviorContext context)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
[Tool]
|
||||
[GlobalClass]
|
||||
public partial class ForgeSimpleHitBehavior : ForgeAbilityBehavior
|
||||
{
|
||||
[Export] public ForgeEffectData? DamageEffect { get; set; }
|
||||
public override IAbilityBehavior GetBehavior() => new SimpleHitBehavior(DamageEffect);
|
||||
}
|
||||
1
forge/abilities/ForgeSimpleHitBehavior.cs.uid
Normal file
1
forge/abilities/ForgeSimpleHitBehavior.cs.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://n6efm5o4uxvr
|
||||
60
forge/abilities/ForgeSpawnProjectileBehavior.cs
Normal file
60
forge/abilities/ForgeSpawnProjectileBehavior.cs
Normal file
@@ -0,0 +1,60 @@
|
||||
using Gamesmiths.Forge.Abilities;
|
||||
using Gamesmiths.Forge.Core;
|
||||
using Gamesmiths.Forge.Effects;
|
||||
using Gamesmiths.Forge.Godot.Resources;
|
||||
using Gamesmiths.Forge.Godot.Resources.Abilities;
|
||||
using Godot;
|
||||
using Movementtests.interfaces;
|
||||
using Movementtests.managers;
|
||||
using Movementtests.tools;
|
||||
|
||||
namespace Movementtests.forge.abilities;
|
||||
|
||||
public record OnProjectileSpawned(Vector3 Direction, float SpeedMultiplier, Vector3? SpawnOffset = null, uint? CollisionOverride = null, TokenManager.Token? Token = null);
|
||||
|
||||
public class SpawnProjectileBehavior(PackedScene projectileScene) : IAbilityBehavior<OnProjectileSpawned>
|
||||
{
|
||||
public void OnStarted(AbilityBehaviorContext context, OnProjectileSpawned data)
|
||||
{
|
||||
if (context.Source is not Node3D source || projectileScene.Instantiate() is not Projectile projectile)
|
||||
{
|
||||
context.InstanceHandle.End();
|
||||
return;
|
||||
}
|
||||
|
||||
source.GetTree().GetCurrentScene().AddChild(projectile);
|
||||
|
||||
// Computing projectile properties
|
||||
var offset = data.SpawnOffset ?? Vector3.Zero;
|
||||
var startPos = source is ITargetable targetable ? targetable.GetTargetGlobalPosition() : source.GlobalPosition;
|
||||
var target = context.Target as Node3D;
|
||||
var magnitude = context.Magnitude != 0 ? context.Magnitude : 1;
|
||||
var impulse = data.Direction * data.SpeedMultiplier * magnitude;
|
||||
var collisionOverride = data.CollisionOverride ?? projectile.CollisionMask;
|
||||
|
||||
// Setting up projectile
|
||||
projectile.GlobalPosition = startPos + offset;
|
||||
projectile.Target = target;
|
||||
projectile.ImpulseDirection = impulse;
|
||||
projectile.CollisionMask = collisionOverride;
|
||||
projectile.Token = data.Token;
|
||||
|
||||
if (projectile is ISpawnable spawnable) spawnable.Init();
|
||||
|
||||
context.AbilityHandle.CommitAbility();
|
||||
context.InstanceHandle.End();
|
||||
}
|
||||
|
||||
public void OnEnded(AbilityBehaviorContext context)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
[Tool]
|
||||
[GlobalClass]
|
||||
public partial class ForgeSpawnProjectileBehavior : ForgeAbilityBehavior
|
||||
{
|
||||
[Export] public required PackedScene Projectile { get; set; }
|
||||
public override IAbilityBehavior GetBehavior() => new SpawnProjectileBehavior(Projectile);
|
||||
}
|
||||
1
forge/abilities/ForgeSpawnProjectileBehavior.cs.uid
Normal file
1
forge/abilities/ForgeSpawnProjectileBehavior.cs.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://dxtjifb8hv8k4
|
||||
13
forge/attribute_sets/CharacterAttributeSet.cs
Normal file
13
forge/attribute_sets/CharacterAttributeSet.cs
Normal file
@@ -0,0 +1,13 @@
|
||||
using Gamesmiths.Forge.Attributes;
|
||||
|
||||
namespace Movementtests.forge.attribute_sets;
|
||||
|
||||
public class CharacterAttributeSet : AttributeSet
|
||||
{
|
||||
public EntityAttribute Health { get; }
|
||||
|
||||
public CharacterAttributeSet()
|
||||
{
|
||||
Health = InitializeAttribute(nameof(Health), 100, 0, 100);
|
||||
}
|
||||
}
|
||||
1
forge/attribute_sets/CharacterAttributeSet.cs.uid
Normal file
1
forge/attribute_sets/CharacterAttributeSet.cs.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://cikbxmilitd1m
|
||||
@@ -1,15 +1,14 @@
|
||||
using Gamesmiths.Forge.Attributes;
|
||||
|
||||
namespace Movementtests.scenes.enemies;
|
||||
|
||||
public class EnemyAttributeSet : AttributeSet
|
||||
{
|
||||
public EntityAttribute Health { get; }
|
||||
public EntityAttribute Strength { get; }
|
||||
public EntityAttribute Speed { get; }
|
||||
|
||||
public EnemyAttributeSet()
|
||||
{
|
||||
Health = InitializeAttribute(nameof(Health), 100, 0, 150);
|
||||
Strength = InitializeAttribute(nameof(Strength), 10, 0, 99);
|
||||
Speed = InitializeAttribute(nameof(Speed), 5, 0, 10);
|
||||
}
|
||||
|
||||
14
forge/attribute_sets/MetaAttributeSet.cs
Normal file
14
forge/attribute_sets/MetaAttributeSet.cs
Normal file
@@ -0,0 +1,14 @@
|
||||
using Gamesmiths.Forge.Attributes;
|
||||
namespace Movementtests.scenes.enemies;
|
||||
|
||||
public class MetaAttributeSet : AttributeSet
|
||||
{
|
||||
public EntityAttribute IncomingDamage { get; private set; }
|
||||
public EntityAttribute Level { get; private set; }
|
||||
|
||||
public MetaAttributeSet()
|
||||
{
|
||||
IncomingDamage = InitializeAttribute(nameof(IncomingDamage), 0, 0, 1000, channels: 4);
|
||||
Level = InitializeAttribute(nameof(Level), 1, 1, 1000);
|
||||
}
|
||||
}
|
||||
1
forge/attribute_sets/MetaAttributeSet.cs.uid
Normal file
1
forge/attribute_sets/MetaAttributeSet.cs.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://d36s5oiy8ls0d
|
||||
@@ -4,16 +4,10 @@ namespace Movementtests.scenes.player_controller.scripts;
|
||||
|
||||
public class PlayerAttributeSet : AttributeSet
|
||||
{
|
||||
public EntityAttribute Health { get; }
|
||||
public EntityAttribute Mana { get; }
|
||||
public EntityAttribute Strength { get; }
|
||||
public EntityAttribute Speed { get; }
|
||||
|
||||
public PlayerAttributeSet()
|
||||
{
|
||||
Health = InitializeAttribute(nameof(Health), 100, 0, 150);
|
||||
Mana = InitializeAttribute(nameof(Mana), 100, 0, 100);
|
||||
Strength = InitializeAttribute(nameof(Strength), 10, 0, 99);
|
||||
Speed = InitializeAttribute(nameof(Speed), 5, 0, 10);
|
||||
}
|
||||
}
|
||||
9
forge/calculators/DamageType.cs
Normal file
9
forge/calculators/DamageType.cs
Normal file
@@ -0,0 +1,9 @@
|
||||
namespace Movementtests.tools.calculators;
|
||||
|
||||
public enum DamageType
|
||||
{
|
||||
Physical = 0,
|
||||
Magical = 1,
|
||||
Elemental = 2,
|
||||
Explosive = 3,
|
||||
}
|
||||
1
forge/calculators/DamageType.cs.uid
Normal file
1
forge/calculators/DamageType.cs.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://bne5gra0fmvsr
|
||||
139
forge/calculators/ForgeDamageExecution.cs
Normal file
139
forge/calculators/ForgeDamageExecution.cs
Normal file
@@ -0,0 +1,139 @@
|
||||
using System.Collections.Generic;
|
||||
using Gamesmiths.Forge.Attributes;
|
||||
using Gamesmiths.Forge.Core;
|
||||
using Gamesmiths.Forge.Effects;
|
||||
using Gamesmiths.Forge.Effects.Calculator;
|
||||
using Gamesmiths.Forge.Effects.Magnitudes;
|
||||
using Gamesmiths.Forge.Effects.Modifiers;
|
||||
using Gamesmiths.Forge.Events;
|
||||
using Gamesmiths.Forge.Godot.Core;
|
||||
using Gamesmiths.Forge.Godot.Resources;
|
||||
using Gamesmiths.Forge.Godot.Resources.Calculators;
|
||||
using Gamesmiths.Forge.Tags;
|
||||
using Godot;
|
||||
using Movementtests.forge.abilities;
|
||||
|
||||
namespace Movementtests.tools.calculators;
|
||||
|
||||
public record DamageDone(DamageType DamageType, float Damage, float OverkillDamage);
|
||||
|
||||
public class DamageExecution : CustomExecution
|
||||
{
|
||||
private readonly DamageType _damageType;
|
||||
private readonly ForgeTagContainer? _damageDealerEventTags;
|
||||
private readonly ForgeTagContainer? _damageReceiverEventTags;
|
||||
|
||||
// Define attributes to capture and modify
|
||||
public AttributeCaptureDefinition TargetHealth { get; }
|
||||
|
||||
public AttributeCaptureDefinition TargetIncomingDamage { get; }
|
||||
|
||||
public DamageExecution(DamageType damageType, ForgeTagContainer? damageDealerEventTags, ForgeTagContainer? damageReceiverEventTags)
|
||||
{
|
||||
|
||||
// Capture target mana and magic resistance
|
||||
TargetHealth = new AttributeCaptureDefinition(
|
||||
"CharacterAttributeSet.Health",
|
||||
AttributeCaptureSource.Target,
|
||||
false);
|
||||
|
||||
TargetIncomingDamage = new AttributeCaptureDefinition(
|
||||
"MetaAttributeSet.IncomingDamage",
|
||||
AttributeCaptureSource.Target);
|
||||
|
||||
// Register attributes for capture
|
||||
AttributesToCapture.Add(TargetHealth);
|
||||
AttributesToCapture.Add(TargetIncomingDamage);
|
||||
|
||||
_damageType = damageType;
|
||||
_damageDealerEventTags = damageDealerEventTags;
|
||||
_damageReceiverEventTags = damageReceiverEventTags;
|
||||
}
|
||||
|
||||
public override ModifierEvaluatedData[] EvaluateExecution(
|
||||
Effect effect, IForgeEntity target, EffectEvaluatedData? effectEvaluatedData)
|
||||
{
|
||||
var results = new List<ModifierEvaluatedData>();
|
||||
|
||||
float targetIncomingDamage = CaptureAttributeMagnitude(
|
||||
TargetIncomingDamage,
|
||||
effect,
|
||||
target,
|
||||
effectEvaluatedData);
|
||||
|
||||
GD.Print(targetIncomingDamage);
|
||||
|
||||
if (targetIncomingDamage <= 0)
|
||||
{
|
||||
return [.. results];
|
||||
}
|
||||
|
||||
if (effectEvaluatedData?.TryGetContextData(out SimpleHitEffectData? hitEffectData) == true)
|
||||
{
|
||||
targetIncomingDamage *= hitEffectData.Magnitude;
|
||||
}
|
||||
|
||||
|
||||
// Apply health reduction to target if attribute exists
|
||||
if (TargetHealth.TryGetAttribute(target, out EntityAttribute? targetHealthAttribute))
|
||||
{
|
||||
results.Add(new ModifierEvaluatedData(
|
||||
targetHealthAttribute,
|
||||
ModifierOperation.FlatBonus,
|
||||
-targetIncomingDamage)); // Negative for damage
|
||||
}
|
||||
|
||||
var finalDamage = targetIncomingDamage;
|
||||
var overkillDamage = 0.0f;
|
||||
if (targetHealthAttribute!.CurrentValue - targetIncomingDamage <= targetHealthAttribute.Min)
|
||||
{
|
||||
finalDamage = targetHealthAttribute.CurrentValue - targetHealthAttribute.Min;
|
||||
overkillDamage = targetIncomingDamage - finalDamage;
|
||||
}
|
||||
|
||||
if (_damageReceiverEventTags is null) return [.. results];
|
||||
|
||||
target.Events.Raise(new EventData<DamageDone>
|
||||
{
|
||||
EventTags = _damageReceiverEventTags.GetTagContainer(),
|
||||
Source = effect.Ownership.Owner,
|
||||
Target = target,
|
||||
EventMagnitude = finalDamage,
|
||||
Payload = new DamageDone(_damageType, finalDamage, overkillDamage)
|
||||
});
|
||||
|
||||
if (effect.Ownership.Source is null || _damageDealerEventTags is null)
|
||||
{
|
||||
return [.. results];
|
||||
}
|
||||
|
||||
effect.Ownership.Source.Events.Raise(new EventData<DamageDone>
|
||||
{
|
||||
EventTags = _damageDealerEventTags.GetTagContainer(),
|
||||
Source = effect.Ownership.Owner,
|
||||
Target = target,
|
||||
EventMagnitude = finalDamage,
|
||||
Payload = new DamageDone(_damageType, finalDamage, overkillDamage)
|
||||
});
|
||||
|
||||
return [.. results];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
[Tool]
|
||||
[GlobalClass]
|
||||
public partial class ForgeDamageExecution : ForgeCustomExecution
|
||||
{
|
||||
[Export]
|
||||
public DamageType DamageType { get; set; } = DamageType.Physical;
|
||||
[Export]
|
||||
public ForgeTagContainer? DamageDealerEventTags { get; set; }
|
||||
[Export]
|
||||
public ForgeTagContainer? DamageReceiverEventTags { get; set; }
|
||||
|
||||
public override CustomExecution GetExecutionClass()
|
||||
{
|
||||
return new DamageExecution(DamageType, DamageDealerEventTags, DamageReceiverEventTags);
|
||||
}
|
||||
}
|
||||
1
forge/calculators/ForgeDamageExecution.cs.uid
Normal file
1
forge/calculators/ForgeDamageExecution.cs.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://cfx62w40nd84v
|
||||
105
forge/calculators/ForgeKnockbackExecution.cs
Normal file
105
forge/calculators/ForgeKnockbackExecution.cs
Normal file
@@ -0,0 +1,105 @@
|
||||
using System.Collections.Generic;
|
||||
using Gamesmiths.Forge.Core;
|
||||
using Gamesmiths.Forge.Effects;
|
||||
using Gamesmiths.Forge.Effects.Calculator;
|
||||
using Gamesmiths.Forge.Effects.Magnitudes;
|
||||
using Gamesmiths.Forge.Events;
|
||||
using Gamesmiths.Forge.Godot.Resources;
|
||||
using Gamesmiths.Forge.Godot.Resources.Calculators;
|
||||
using Godot;
|
||||
using Movementtests.forge.abilities;
|
||||
using Movementtests.scenes.components.knockback;
|
||||
|
||||
namespace Movementtests.tools.calculators;
|
||||
|
||||
|
||||
public record KnockbackDone(float KnockbackValue, Vector3 knockbackDirection);
|
||||
|
||||
public class KnockbackExecution : CustomExecution
|
||||
{
|
||||
private readonly RKnockback _knockback;
|
||||
private readonly ForgeTag _knockbackableTag;
|
||||
private readonly ForgeTag _knockbackImmuneTag;
|
||||
private readonly ForgeTagContainer? _knockbackReceiverEventTags;
|
||||
private readonly ForgeTagContainer? _knockbackDealerEventTags;
|
||||
|
||||
public AttributeCaptureDefinition TargetIncomingDamage { get; }
|
||||
|
||||
public KnockbackExecution(ForgeTag knockbackableTag, ForgeTag knockbackImmuneTag, RKnockback knockback, ForgeTagContainer? knockbackDealerEventTags, ForgeTagContainer? knockbackReceiverEventTags)
|
||||
{
|
||||
_knockback = knockback;
|
||||
_knockbackableTag = knockbackableTag;
|
||||
_knockbackImmuneTag = knockbackImmuneTag;
|
||||
_knockbackDealerEventTags = knockbackDealerEventTags;
|
||||
_knockbackReceiverEventTags = knockbackReceiverEventTags;
|
||||
|
||||
TargetIncomingDamage = new AttributeCaptureDefinition(
|
||||
"MetaAttributeSet.IncomingDamage",
|
||||
AttributeCaptureSource.Target);
|
||||
AttributesToCapture.Add(TargetIncomingDamage);
|
||||
}
|
||||
|
||||
public override ModifierEvaluatedData[] EvaluateExecution(Effect effect, IForgeEntity target, EffectEvaluatedData? effectEvaluatedData)
|
||||
{
|
||||
var results = new List<ModifierEvaluatedData>();
|
||||
if (!target.Tags.CombinedTags.HasTag(_knockbackableTag.GetTag()) || target.Tags.CombinedTags.HasTag(_knockbackImmuneTag.GetTag()))
|
||||
return [.. results];
|
||||
|
||||
float targetIncomingDamage = CaptureAttributeMagnitude(
|
||||
TargetIncomingDamage,
|
||||
effect,
|
||||
target,
|
||||
effectEvaluatedData);
|
||||
|
||||
if (targetIncomingDamage <= 0)
|
||||
return [.. results];
|
||||
|
||||
var knockbackValue = _knockback.Modifier * targetIncomingDamage / 100.0f;
|
||||
|
||||
if (_knockbackReceiverEventTags is null)
|
||||
return [.. results];
|
||||
|
||||
var knockbackDirection = Vector3.Zero;
|
||||
if (effectEvaluatedData?.TryGetContextData(out SimpleHitEffectData? hitEffectData) == true)
|
||||
{
|
||||
knockbackDirection = hitEffectData.SourceLocation.DirectionTo(hitEffectData.TargetLocation);
|
||||
}
|
||||
target.Events.Raise(new EventData<KnockbackDone>
|
||||
{
|
||||
EventTags = _knockbackReceiverEventTags.GetTagContainer(),
|
||||
Source = effect.Ownership.Owner,
|
||||
Target = target,
|
||||
EventMagnitude = knockbackValue,
|
||||
Payload = new KnockbackDone(knockbackValue, knockbackDirection)
|
||||
});
|
||||
|
||||
if (effect.Ownership.Source is null || _knockbackDealerEventTags is null)
|
||||
return [.. results];
|
||||
|
||||
effect.Ownership.Source.Events.Raise(new EventData<KnockbackDone>
|
||||
{
|
||||
EventTags = _knockbackDealerEventTags.GetTagContainer(),
|
||||
Source = effect.Ownership.Owner,
|
||||
Target = target,
|
||||
EventMagnitude = knockbackValue,
|
||||
Payload = new KnockbackDone(knockbackValue, knockbackDirection)
|
||||
});
|
||||
|
||||
return [.. results];
|
||||
}
|
||||
}
|
||||
|
||||
[GlobalClass]
|
||||
public partial class ForgeKnockbackExecution : ForgeCustomExecution
|
||||
{
|
||||
[Export] public ForgeTag? KnockbackableTag { get; set; }
|
||||
[Export] public ForgeTag? KnockbackImmuneTag { get; set; }
|
||||
[Export] public RKnockback? Knockback { get; set; }
|
||||
[Export] public ForgeTagContainer? KnockbackDealerEventTags { get; set; }
|
||||
[Export] public ForgeTagContainer? KnockbackReceiverEventTags { get; set; }
|
||||
public override CustomExecution GetExecutionClass()
|
||||
{
|
||||
if (Knockback == null || KnockbackableTag == null || KnockbackImmuneTag == null) throw new System.ArgumentException("Knockback or KnockbackableTag is null");
|
||||
return new KnockbackExecution(KnockbackableTag, KnockbackImmuneTag, Knockback, KnockbackDealerEventTags, KnockbackReceiverEventTags);
|
||||
}
|
||||
}
|
||||
1
forge/calculators/ForgeKnockbackExecution.cs.uid
Normal file
1
forge/calculators/ForgeKnockbackExecution.cs.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://diondfg5xp78h
|
||||
@@ -16,19 +16,33 @@ using Movementtests.systems;
|
||||
namespace Movementtests.tools.calculators;
|
||||
|
||||
|
||||
public class RaiseEventTagExecution(TagContainer eventTags) : CustomExecution
|
||||
public class RaiseEventTagExecution(TagContainer? ownerEventTags, TagContainer? targetEventTags) : CustomExecution
|
||||
{
|
||||
public override ModifierEvaluatedData[] EvaluateExecution(Effect effect, IForgeEntity target, EffectEvaluatedData? effectEvaluatedData)
|
||||
{
|
||||
var owner = effect.Ownership.Owner;
|
||||
if (owner == null) return [];
|
||||
|
||||
owner.Events.Raise(new EventData
|
||||
var magnitude = effectEvaluatedData is { ModifiersEvaluatedData.Length: > 0 }
|
||||
? effectEvaluatedData.ModifiersEvaluatedData[0].Magnitude
|
||||
: 0f;
|
||||
if (owner != null && ownerEventTags != null)
|
||||
{
|
||||
EventTags = eventTags,
|
||||
Source = owner,
|
||||
EventMagnitude = 12f
|
||||
});
|
||||
owner.Events.Raise(new EventData
|
||||
{
|
||||
EventTags = ownerEventTags,
|
||||
Source = owner,
|
||||
EventMagnitude = magnitude
|
||||
});
|
||||
}
|
||||
|
||||
if (targetEventTags != null)
|
||||
{
|
||||
target.Events.Raise(new EventData
|
||||
{
|
||||
EventTags = targetEventTags,
|
||||
Source = owner,
|
||||
EventMagnitude = magnitude
|
||||
});
|
||||
}
|
||||
|
||||
return [];
|
||||
}
|
||||
@@ -39,10 +53,11 @@ public class RaiseEventTagExecution(TagContainer eventTags) : CustomExecution
|
||||
[GlobalClass]
|
||||
public partial class ForgeRaiseEventTagExecution : ForgeCustomExecution
|
||||
{
|
||||
[Export] ForgeTagContainer EventTags { get; set; }
|
||||
[Export] ForgeTagContainer? EventTags { get; set; }
|
||||
[Export] ForgeTagContainer? TargetEventTags { get; set; }
|
||||
|
||||
public override CustomExecution GetExecutionClass()
|
||||
{
|
||||
return new RaiseEventTagExecution(EventTags.GetTagContainer());
|
||||
return new RaiseEventTagExecution(EventTags?.GetTagContainer(), TargetEventTags?.GetTagContainer());
|
||||
}
|
||||
}
|
||||
@@ -4,4 +4,4 @@
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_l686n")
|
||||
RegisteredTags = Array[String](["character.player", "character.enemy", "weapon", "status.stunned", "status.burning", "status.frozen", "abilities.weapon.land", "abilities.weapon.flying", "abilities.weapon.left", "events.combat.damage", "events.combat.hit", "events.weapon.flyingTick", "events.weapon.startedFlying", "events.weapon.stoppedFlying", "events.weapon.handToFlying", "events.weapon.flyingToHand", "events.weapon.plantedToHand", "events.weapon.plantedToFlying", "events.weapon.planted", "cooldown.empoweredAction", "cooldown.empoweredSwordThrow", "cues.resources.mana", "events.player.empowered_action_used", "cues.resources.mana.inhibited"])
|
||||
RegisteredTags = Array[String](["character.player", "character.enemy", "status.stunned", "status.burning", "status.frozen", "abilities.weapon.land", "abilities.weapon.flying", "abilities.weapon.left", "events.combat.damage", "events.combat.hit", "events.weapon.flyingTick", "events.weapon.startedFlying", "events.weapon.stoppedFlying", "events.weapon.handToFlying", "events.weapon.flyingToHand", "events.weapon.plantedToHand", "events.weapon.plantedToFlying", "events.weapon.planted", "cooldown.empoweredAction", "cooldown.empoweredSwordThrow", "cues.resources.mana", "events.player.empowered_action_used", "cues.resources.mana.inhibited", "cues.resources.health", "cooldown.enemy.hit", "events.combat.death", "cooldown.hit", "events.player.hit", "cues.enemy.health", "immunity.damage", "status", "traits.damageable", "traits.knockbackable", "events.combat.knockback_dealt", "events.combat.knockback_received", "events.weapon.plantedtick", "events.weapon.unplanted", "abilities.weapon.planted", "events.enemy.try_hit", "events.enemy.launch_projectile", "objects.projectile", "objects.weapon", "events.enemy.request_projectile", "events.player.parry", "traits.stunnable", "immunity.knockback", "immunity.stun", "events.combat.stun_applied", "events.combat.stun_received"])
|
||||
|
||||
@@ -1,16 +1,22 @@
|
||||
[gd_resource type="Resource" script_class="ForgeAbilityData" format=3 uid="uid://dccuj66egxfwh"]
|
||||
|
||||
[ext_resource type="Resource" uid="uid://crgwob8t8yysq" path="res://scenes/player_controller/resources/forge/instant_end_behavior.tres" id="1_x7d0c"]
|
||||
[ext_resource type="Resource" uid="uid://c4ea6ktafqe0r" path="res://forge/resources/effect_datas/temp_invincibility.tres" id="1_ent4t"]
|
||||
[ext_resource type="Script" uid="uid://c7s5v7ii4nujg" path="res://forge/abilities/ForgeInstantEndBehavior.cs" id="2_ent4t"]
|
||||
[ext_resource type="Script" uid="uid://cw525n4mjqgw0" path="res://addons/forge/resources/ForgeTagContainer.cs" id="2_prg0a"]
|
||||
[ext_resource type="Script" uid="uid://dngf30hxy5go4" path="res://addons/forge/resources/components/ModifierTags.cs" id="3_k72m0"]
|
||||
[ext_resource type="Script" uid="uid://cn3b4ya15fg7e" path="res://addons/forge/resources/magnitudes/ForgeScalableFloat.cs" id="4_5fdax"]
|
||||
[ext_resource type="Script" uid="uid://2gm1hdhi8u08" path="res://addons/forge/resources/magnitudes/ForgeModifierMagnitude.cs" id="5_5qmmj"]
|
||||
[ext_resource type="Script" uid="uid://1hgogislo1l6" path="res://addons/forge/resources/magnitudes/ForgeScalableInt.cs" id="6_yi0bg"]
|
||||
[ext_resource type="Script" uid="uid://b83hf13nj37k3" path="res://addons/forge/resources/ForgeEffectData.cs" id="7_0rp6y"]
|
||||
[ext_resource type="Resource" uid="uid://dn7b8frkoxpxr" path="res://scenes/player_controller/resources/forge/player_mana_changed_cue.tres" id="8_0olwd"]
|
||||
[ext_resource type="Resource" uid="uid://dn7b8frkoxpxr" path="res://forge/resources/cues/player_mana_changed_cue.tres" id="8_0olwd"]
|
||||
[ext_resource type="Script" uid="uid://bdfcavbjyhxxa" path="res://addons/forge/resources/ForgeModifier.cs" id="9_wluo0"]
|
||||
[ext_resource type="Script" uid="uid://dhxfbxh54pyxp" path="res://addons/forge/resources/abilities/ForgeAbilityData.cs" id="10_2sq4o"]
|
||||
|
||||
[sub_resource type="Resource" id="Resource_xltxv"]
|
||||
script = ExtResource("2_ent4t")
|
||||
OptionalEffectData = ExtResource("1_ent4t")
|
||||
metadata/_custom_type_script = "uid://c7s5v7ii4nujg"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_h116a"]
|
||||
script = ExtResource("2_prg0a")
|
||||
ContainerTags = Array[String](["cooldown.empoweredaction"])
|
||||
@@ -78,6 +84,42 @@ InitialStack = SubResource("Resource_lmnuh")
|
||||
Cues = []
|
||||
metadata/_custom_type_script = "uid://b83hf13nj37k3"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_3usj8"]
|
||||
script = ExtResource("4_5fdax")
|
||||
BaseValue = 1.0
|
||||
|
||||
[sub_resource type="Resource" id="Resource_5q60v"]
|
||||
script = ExtResource("4_5fdax")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_eo5h0"]
|
||||
script = ExtResource("4_5fdax")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_c7uae"]
|
||||
script = ExtResource("4_5fdax")
|
||||
BaseValue = 1.0
|
||||
|
||||
[sub_resource type="Resource" id="Resource_7d1b0"]
|
||||
script = ExtResource("4_5fdax")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_jiq0x"]
|
||||
script = ExtResource("4_5fdax")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_kpieu"]
|
||||
script = ExtResource("4_5fdax")
|
||||
BaseValue = 0.3
|
||||
metadata/_custom_type_script = "uid://cn3b4ya15fg7e"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_rwc4g"]
|
||||
script = ExtResource("5_5qmmj")
|
||||
ScalableFloat = SubResource("Resource_kpieu")
|
||||
Coefficient = SubResource("Resource_c7uae")
|
||||
PreMultiplyAdditiveValue = SubResource("Resource_jiq0x")
|
||||
PostMultiplyAdditiveValue = SubResource("Resource_7d1b0")
|
||||
CalculatorCoefficient = SubResource("Resource_3usj8")
|
||||
CalculatorPreMultiplyAdditiveValue = SubResource("Resource_eo5h0")
|
||||
CalculatorPostMultiplyAdditiveValue = SubResource("Resource_5q60v")
|
||||
metadata/_custom_type_script = "uid://2gm1hdhi8u08"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_8dsdw"]
|
||||
script = ExtResource("6_yi0bg")
|
||||
BaseValue = 1
|
||||
@@ -129,6 +171,7 @@ Name = "Empowered Action Cost"
|
||||
Modifiers = Array[Object]([SubResource("Resource_dhni4")])
|
||||
Components = []
|
||||
Executions = []
|
||||
Duration = SubResource("Resource_rwc4g")
|
||||
StackLimit = SubResource("Resource_w5rmc")
|
||||
InitialStack = SubResource("Resource_8dsdw")
|
||||
Cues = Array[Object]([ExtResource("8_0olwd")])
|
||||
@@ -139,5 +182,5 @@ script = ExtResource("10_2sq4o")
|
||||
Name = "Empowered Action"
|
||||
CooldownEffects = [SubResource("Resource_egh2b")]
|
||||
CostEffect = SubResource("Resource_mtef8")
|
||||
AbilityBehavior = ExtResource("1_x7d0c")
|
||||
AbilityBehavior = SubResource("Resource_xltxv")
|
||||
metadata/_custom_type_script = "uid://dhxfbxh54pyxp"
|
||||
114
forge/resources/ability_datas/explosion_hit.tres
Normal file
114
forge/resources/ability_datas/explosion_hit.tres
Normal file
@@ -0,0 +1,114 @@
|
||||
[gd_resource type="Resource" script_class="ForgeAbilityData" format=3 uid="uid://nns16d5uhtl8"]
|
||||
|
||||
[ext_resource type="Resource" uid="uid://bpovqvlqv5bs5" path="res://forge/resources/effect_components/damageable.tres" id="1_w36j6"]
|
||||
[ext_resource type="Resource" uid="uid://sn6kndc6ukic" path="res://forge/resources/tag_containers/on_damage_dealt.tres" id="2_3ma4g"]
|
||||
[ext_resource type="Resource" uid="uid://5tr54q0rdpho" path="res://forge/resources/tag_containers/on_damage_taken.tres" id="3_kyfqu"]
|
||||
[ext_resource type="Script" uid="uid://cfx62w40nd84v" path="res://forge/calculators/ForgeDamageExecution.cs" id="4_xfamx"]
|
||||
[ext_resource type="Script" uid="uid://b44cse62qru7j" path="res://scenes/components/knockback/RKnockback.cs" id="5_tw4gc"]
|
||||
[ext_resource type="Resource" uid="uid://bhn27s8ne0uyg" path="res://forge/resources/tag_containers/on_knockback_dealt.tres" id="6_nq3a0"]
|
||||
[ext_resource type="Resource" uid="uid://5obdxlcpw8qt" path="res://forge/resources/tag_containers/knockback_immune.tres" id="7_3ma4g"]
|
||||
[ext_resource type="Resource" uid="uid://bkr6uu57wm3o3" path="res://forge/resources/tag_containers/on_knockback_received.tres" id="7_3utx7"]
|
||||
[ext_resource type="Resource" uid="uid://45l7vnfs72b" path="res://forge/resources/tag_containers/knockbackable_tag.tres" id="8_7hfxb"]
|
||||
[ext_resource type="Script" uid="uid://diondfg5xp78h" path="res://forge/calculators/ForgeKnockbackExecution.cs" id="9_lysxe"]
|
||||
[ext_resource type="Script" uid="uid://1hgogislo1l6" path="res://addons/forge/resources/magnitudes/ForgeScalableInt.cs" id="10_sd7ih"]
|
||||
[ext_resource type="Script" uid="uid://cn3b4ya15fg7e" path="res://addons/forge/resources/magnitudes/ForgeScalableFloat.cs" id="11_bs6rs"]
|
||||
[ext_resource type="Script" uid="uid://bdfcavbjyhxxa" path="res://addons/forge/resources/ForgeModifier.cs" id="12_a6jts"]
|
||||
[ext_resource type="Script" uid="uid://b83hf13nj37k3" path="res://addons/forge/resources/ForgeEffectData.cs" id="13_c85am"]
|
||||
[ext_resource type="Texture2D" uid="uid://c2akxlg7tdb67" path="res://assets/ui/IconGodotNode/node/icon_projectile.png" id="14_ow2i8"]
|
||||
[ext_resource type="Script" uid="uid://n6efm5o4uxvr" path="res://forge/abilities/ForgeSimpleHitBehavior.cs" id="15_ki7ct"]
|
||||
[ext_resource type="Script" uid="uid://dhxfbxh54pyxp" path="res://addons/forge/resources/abilities/ForgeAbilityData.cs" id="16_hhyju"]
|
||||
|
||||
[sub_resource type="Resource" id="Resource_vy8wr"]
|
||||
script = ExtResource("4_xfamx")
|
||||
DamageType = 3
|
||||
DamageDealerEventTags = ExtResource("2_3ma4g")
|
||||
DamageReceiverEventTags = ExtResource("3_kyfqu")
|
||||
metadata/_custom_type_script = "uid://cfx62w40nd84v"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_ndb8p"]
|
||||
script = ExtResource("5_tw4gc")
|
||||
Modifier = 500.0
|
||||
metadata/_custom_type_script = "uid://b44cse62qru7j"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_dy671"]
|
||||
script = ExtResource("9_lysxe")
|
||||
KnockbackableTag = ExtResource("8_7hfxb")
|
||||
KnockbackImmuneTag = ExtResource("7_3ma4g")
|
||||
Knockback = SubResource("Resource_ndb8p")
|
||||
KnockbackDealerEventTags = ExtResource("6_nq3a0")
|
||||
KnockbackReceiverEventTags = ExtResource("7_3utx7")
|
||||
metadata/_custom_type_script = "uid://diondfg5xp78h"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_i0sj3"]
|
||||
script = ExtResource("10_sd7ih")
|
||||
BaseValue = 1
|
||||
|
||||
[sub_resource type="Resource" id="Resource_1mvp7"]
|
||||
script = ExtResource("11_bs6rs")
|
||||
BaseValue = 1.0
|
||||
|
||||
[sub_resource type="Resource" id="Resource_jxdlf"]
|
||||
script = ExtResource("11_bs6rs")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_rslib"]
|
||||
script = ExtResource("11_bs6rs")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_3l3du"]
|
||||
script = ExtResource("11_bs6rs")
|
||||
BaseValue = 1.0
|
||||
|
||||
[sub_resource type="Resource" id="Resource_qqpg8"]
|
||||
script = ExtResource("11_bs6rs")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_igmn0"]
|
||||
script = ExtResource("11_bs6rs")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_acqnn"]
|
||||
script = ExtResource("11_bs6rs")
|
||||
BaseValue = 50.0
|
||||
metadata/_custom_type_script = "uid://cn3b4ya15fg7e"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_xwtie"]
|
||||
script = ExtResource("12_a6jts")
|
||||
Attribute = "MetaAttributeSet.IncomingDamage"
|
||||
Operation = 2
|
||||
CalculationType = 1
|
||||
ScalableFloat = SubResource("Resource_acqnn")
|
||||
CapturedAttribute = "MetaAttributeSet.Level"
|
||||
Coefficient = SubResource("Resource_3l3du")
|
||||
PreMultiplyAdditiveValue = SubResource("Resource_igmn0")
|
||||
PostMultiplyAdditiveValue = SubResource("Resource_qqpg8")
|
||||
CalculatorCoefficient = SubResource("Resource_1mvp7")
|
||||
CalculatorPreMultiplyAdditiveValue = SubResource("Resource_rslib")
|
||||
CalculatorPostMultiplyAdditiveValue = SubResource("Resource_jxdlf")
|
||||
metadata/_custom_type_script = "uid://bdfcavbjyhxxa"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_ikb7l"]
|
||||
script = ExtResource("10_sd7ih")
|
||||
BaseValue = 1
|
||||
|
||||
[sub_resource type="Resource" id="Resource_jdvg8"]
|
||||
script = ExtResource("13_c85am")
|
||||
Name = "Explosion hit"
|
||||
Modifiers = Array[Object]([SubResource("Resource_xwtie")])
|
||||
Components = [ExtResource("1_w36j6")]
|
||||
Executions = Array[Object]([SubResource("Resource_vy8wr"), SubResource("Resource_dy671")])
|
||||
StackLimit = SubResource("Resource_ikb7l")
|
||||
InitialStack = SubResource("Resource_i0sj3")
|
||||
Cues = []
|
||||
metadata/_custom_type_script = "uid://b83hf13nj37k3"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_ba5lh"]
|
||||
script = ExtResource("15_ki7ct")
|
||||
DamageEffect = SubResource("Resource_jdvg8")
|
||||
Name = "Explostion hit"
|
||||
Description = "Called by explosion scene"
|
||||
Icon = ExtResource("14_ow2i8")
|
||||
metadata/_custom_type_script = "uid://n6efm5o4uxvr"
|
||||
|
||||
[resource]
|
||||
script = ExtResource("16_hhyju")
|
||||
Name = "Explosion "
|
||||
CooldownEffects = []
|
||||
AbilityBehavior = SubResource("Resource_ba5lh")
|
||||
metadata/_custom_type_script = "uid://dhxfbxh54pyxp"
|
||||
161
forge/resources/ability_datas/grounded_enemy_hit.tres
Normal file
161
forge/resources/ability_datas/grounded_enemy_hit.tres
Normal file
@@ -0,0 +1,161 @@
|
||||
[gd_resource type="Resource" script_class="ForgeAbilityData" format=3 uid="uid://qpdw62ubaclc"]
|
||||
|
||||
[ext_resource type="Resource" uid="uid://bpovqvlqv5bs5" path="res://forge/resources/effect_components/damageable.tres" id="1_q2jt5"]
|
||||
[ext_resource type="Resource" uid="uid://dlu7l5egpexnn" path="res://forge/resources/custom_executions/raise_damage_dealing_events.tres" id="2_2dxcu"]
|
||||
[ext_resource type="Resource" uid="uid://4rkwr10pc6tp" path="res://forge/resources/custom_executions/physical_damage_calculator.tres" id="2_f6jpb"]
|
||||
[ext_resource type="Script" uid="uid://cw525n4mjqgw0" path="res://addons/forge/resources/ForgeTagContainer.cs" id="4_0mce3"]
|
||||
[ext_resource type="Script" uid="uid://1hgogislo1l6" path="res://addons/forge/resources/magnitudes/ForgeScalableInt.cs" id="6_41lep"]
|
||||
[ext_resource type="Script" uid="uid://cn3b4ya15fg7e" path="res://addons/forge/resources/magnitudes/ForgeScalableFloat.cs" id="7_jf6ii"]
|
||||
[ext_resource type="Script" uid="uid://bdfcavbjyhxxa" path="res://addons/forge/resources/ForgeModifier.cs" id="8_51ikp"]
|
||||
[ext_resource type="Script" uid="uid://b83hf13nj37k3" path="res://addons/forge/resources/ForgeEffectData.cs" id="9_bcnlx"]
|
||||
[ext_resource type="Script" uid="uid://n6efm5o4uxvr" path="res://forge/abilities/ForgeSimpleHitBehavior.cs" id="10_m4f1m"]
|
||||
[ext_resource type="Script" uid="uid://dngf30hxy5go4" path="res://addons/forge/resources/components/ModifierTags.cs" id="11_8c5sq"]
|
||||
[ext_resource type="Script" uid="uid://2gm1hdhi8u08" path="res://addons/forge/resources/magnitudes/ForgeModifierMagnitude.cs" id="12_2x5q6"]
|
||||
[ext_resource type="Resource" uid="uid://csh8jcxtrs11k" path="res://forge/resources/tag_containers/on_enemy_try_hit.tres" id="12_f6jpb"]
|
||||
[ext_resource type="Script" uid="uid://dhxfbxh54pyxp" path="res://addons/forge/resources/abilities/ForgeAbilityData.cs" id="13_4nn3y"]
|
||||
|
||||
[sub_resource type="Resource" id="Resource_rjo6h"]
|
||||
script = ExtResource("6_41lep")
|
||||
BaseValue = 1
|
||||
|
||||
[sub_resource type="Resource" id="Resource_8qlid"]
|
||||
script = ExtResource("7_jf6ii")
|
||||
BaseValue = 1.0
|
||||
|
||||
[sub_resource type="Resource" id="Resource_lbthk"]
|
||||
script = ExtResource("7_jf6ii")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_hguc3"]
|
||||
script = ExtResource("7_jf6ii")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_ugrvo"]
|
||||
script = ExtResource("7_jf6ii")
|
||||
BaseValue = 1.0
|
||||
|
||||
[sub_resource type="Resource" id="Resource_6406e"]
|
||||
script = ExtResource("7_jf6ii")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_x0rol"]
|
||||
script = ExtResource("7_jf6ii")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_1s1j3"]
|
||||
script = ExtResource("7_jf6ii")
|
||||
BaseValue = 10.0
|
||||
metadata/_custom_type_script = "uid://cn3b4ya15fg7e"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_khx4r"]
|
||||
script = ExtResource("8_51ikp")
|
||||
Attribute = "MetaAttributeSet.IncomingDamage"
|
||||
Operation = 2
|
||||
ScalableFloat = SubResource("Resource_1s1j3")
|
||||
Coefficient = SubResource("Resource_ugrvo")
|
||||
PreMultiplyAdditiveValue = SubResource("Resource_x0rol")
|
||||
PostMultiplyAdditiveValue = SubResource("Resource_6406e")
|
||||
CalculatorCoefficient = SubResource("Resource_8qlid")
|
||||
CalculatorPreMultiplyAdditiveValue = SubResource("Resource_hguc3")
|
||||
CalculatorPostMultiplyAdditiveValue = SubResource("Resource_lbthk")
|
||||
metadata/_custom_type_script = "uid://bdfcavbjyhxxa"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_xmw7i"]
|
||||
script = ExtResource("6_41lep")
|
||||
BaseValue = 1
|
||||
|
||||
[sub_resource type="Resource" id="Resource_lj45k"]
|
||||
script = ExtResource("9_bcnlx")
|
||||
Name = "SimpleHitEffect"
|
||||
Modifiers = Array[Object]([SubResource("Resource_khx4r")])
|
||||
Components = [ExtResource("1_q2jt5")]
|
||||
Executions = [ExtResource("2_f6jpb"), ExtResource("2_2dxcu")]
|
||||
StackLimit = SubResource("Resource_xmw7i")
|
||||
InitialStack = SubResource("Resource_rjo6h")
|
||||
Cues = []
|
||||
metadata/_custom_type_script = "uid://b83hf13nj37k3"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_m0osh"]
|
||||
script = ExtResource("10_m4f1m")
|
||||
DamageEffect = SubResource("Resource_lj45k")
|
||||
Name = "Simple hit"
|
||||
Description = "This is a simple hit from an enemy"
|
||||
metadata/_custom_type_script = "uid://n6efm5o4uxvr"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_msmv1"]
|
||||
script = ExtResource("4_0mce3")
|
||||
ContainerTags = Array[String](["status.stunned"])
|
||||
metadata/_custom_type_script = "uid://cw525n4mjqgw0"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_xdbds"]
|
||||
script = ExtResource("4_0mce3")
|
||||
ContainerTags = Array[String](["cooldown.enemy.hit"])
|
||||
metadata/_custom_type_script = "uid://cw525n4mjqgw0"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_gna8g"]
|
||||
script = ExtResource("11_8c5sq")
|
||||
TagsToAdd = SubResource("Resource_xdbds")
|
||||
metadata/_custom_type_script = "uid://dngf30hxy5go4"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_oo2a1"]
|
||||
script = ExtResource("7_jf6ii")
|
||||
BaseValue = 1.0
|
||||
|
||||
[sub_resource type="Resource" id="Resource_q86ag"]
|
||||
script = ExtResource("7_jf6ii")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_5eesh"]
|
||||
script = ExtResource("7_jf6ii")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_5lf6m"]
|
||||
script = ExtResource("7_jf6ii")
|
||||
BaseValue = 1.0
|
||||
|
||||
[sub_resource type="Resource" id="Resource_bv3hg"]
|
||||
script = ExtResource("7_jf6ii")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_tb7hu"]
|
||||
script = ExtResource("7_jf6ii")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_bw6ul"]
|
||||
script = ExtResource("7_jf6ii")
|
||||
BaseValue = 1.0
|
||||
metadata/_custom_type_script = "uid://cn3b4ya15fg7e"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_g5uhf"]
|
||||
script = ExtResource("12_2x5q6")
|
||||
ScalableFloat = SubResource("Resource_bw6ul")
|
||||
Coefficient = SubResource("Resource_5lf6m")
|
||||
PreMultiplyAdditiveValue = SubResource("Resource_tb7hu")
|
||||
PostMultiplyAdditiveValue = SubResource("Resource_bv3hg")
|
||||
CalculatorCoefficient = SubResource("Resource_oo2a1")
|
||||
CalculatorPreMultiplyAdditiveValue = SubResource("Resource_5eesh")
|
||||
CalculatorPostMultiplyAdditiveValue = SubResource("Resource_q86ag")
|
||||
metadata/_custom_type_script = "uid://2gm1hdhi8u08"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_vl5ta"]
|
||||
script = ExtResource("6_41lep")
|
||||
BaseValue = 1
|
||||
|
||||
[sub_resource type="Resource" id="Resource_82a7m"]
|
||||
script = ExtResource("6_41lep")
|
||||
BaseValue = 1
|
||||
|
||||
[sub_resource type="Resource" id="Resource_0gdnn"]
|
||||
script = ExtResource("9_bcnlx")
|
||||
Name = "HitCooldown"
|
||||
Modifiers = []
|
||||
Components = [SubResource("Resource_gna8g")]
|
||||
Executions = []
|
||||
DurationType = 2
|
||||
Duration = SubResource("Resource_g5uhf")
|
||||
StackLimit = SubResource("Resource_82a7m")
|
||||
InitialStack = SubResource("Resource_vl5ta")
|
||||
Cues = []
|
||||
metadata/_custom_type_script = "uid://b83hf13nj37k3"
|
||||
|
||||
[resource]
|
||||
script = ExtResource("13_4nn3y")
|
||||
Name = "Hit"
|
||||
CooldownEffects = [SubResource("Resource_0gdnn")]
|
||||
AbilityBehavior = SubResource("Resource_m0osh")
|
||||
TriggerSource = 1
|
||||
TriggerTag = ExtResource("12_f6jpb")
|
||||
ActivationBlockedTags = SubResource("Resource_msmv1")
|
||||
metadata/_custom_type_script = "uid://dhxfbxh54pyxp"
|
||||
23
forge/resources/ability_datas/lauche_projectile.tres
Normal file
23
forge/resources/ability_datas/lauche_projectile.tres
Normal file
@@ -0,0 +1,23 @@
|
||||
[gd_resource type="Resource" script_class="ForgeAbilityData" format=3 uid="uid://ckfbi6lu255ep"]
|
||||
|
||||
[ext_resource type="Texture2D" uid="uid://g0u88alm6hcb" path="res://assets/ui/IconGodotNode/node/icon_bullet.png" id="1_hixal"]
|
||||
[ext_resource type="PackedScene" uid="uid://bhp6qunnwhncf" path="res://scenes/projectile/Projectile.tscn" id="2_ljwqp"]
|
||||
[ext_resource type="Script" uid="uid://dxtjifb8hv8k4" path="res://forge/abilities/ForgeSpawnProjectileBehavior.cs" id="3_urund"]
|
||||
[ext_resource type="Resource" uid="uid://bkr1xfokymvp4" path="res://forge/resources/tag_containers/on_enemy_lauch_project.tres" id="4_5yymv"]
|
||||
[ext_resource type="Script" uid="uid://dhxfbxh54pyxp" path="res://addons/forge/resources/abilities/ForgeAbilityData.cs" id="5_xbj7n"]
|
||||
|
||||
[sub_resource type="Resource" id="Resource_idpl5"]
|
||||
script = ExtResource("3_urund")
|
||||
Projectile = ExtResource("2_ljwqp")
|
||||
Name = "Spawn projectile"
|
||||
Icon = ExtResource("1_hixal")
|
||||
metadata/_custom_type_script = "uid://dxtjifb8hv8k4"
|
||||
|
||||
[resource]
|
||||
script = ExtResource("5_xbj7n")
|
||||
Name = "Launch projectile"
|
||||
CooldownEffects = []
|
||||
AbilityBehavior = SubResource("Resource_idpl5")
|
||||
TriggerSource = 1
|
||||
TriggerTag = ExtResource("4_5yymv")
|
||||
metadata/_custom_type_script = "uid://dhxfbxh54pyxp"
|
||||
95
forge/resources/ability_datas/on_hit_invinciblity.tres
Normal file
95
forge/resources/ability_datas/on_hit_invinciblity.tres
Normal file
@@ -0,0 +1,95 @@
|
||||
[gd_resource type="Resource" script_class="ForgeAbilityData" format=3 uid="uid://b0ikxp5j8fn3n"]
|
||||
|
||||
[ext_resource type="Resource" uid="uid://cw2ytd34jsxj" path="res://forge/resources/tag_containers/immune_damage.tres" id="1_xjqwu"]
|
||||
[ext_resource type="Script" uid="uid://dngf30hxy5go4" path="res://addons/forge/resources/components/ModifierTags.cs" id="2_a16tf"]
|
||||
[ext_resource type="Script" uid="uid://cn3b4ya15fg7e" path="res://addons/forge/resources/magnitudes/ForgeScalableFloat.cs" id="3_1wliv"]
|
||||
[ext_resource type="Script" uid="uid://2gm1hdhi8u08" path="res://addons/forge/resources/magnitudes/ForgeModifierMagnitude.cs" id="4_7dtdc"]
|
||||
[ext_resource type="Script" uid="uid://1hgogislo1l6" path="res://addons/forge/resources/magnitudes/ForgeScalableInt.cs" id="5_ewbg3"]
|
||||
[ext_resource type="Script" uid="uid://b83hf13nj37k3" path="res://addons/forge/resources/ForgeEffectData.cs" id="6_0akms"]
|
||||
[ext_resource type="Script" uid="uid://cl5hudinl1rex" path="res://forge/abilities/ForgeEffectApplicationBehavior.cs" id="7_mhqpo"]
|
||||
[ext_resource type="Script" uid="uid://dpakv7agvir6y" path="res://addons/forge/resources/ForgeTag.cs" id="8_4vjp3"]
|
||||
[ext_resource type="Script" uid="uid://dhxfbxh54pyxp" path="res://addons/forge/resources/abilities/ForgeAbilityData.cs" id="9_go27d"]
|
||||
|
||||
[sub_resource type="Resource" id="Resource_5ht6k"]
|
||||
script = ExtResource("2_a16tf")
|
||||
TagsToAdd = ExtResource("1_xjqwu")
|
||||
metadata/_custom_type_script = "uid://dngf30hxy5go4"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_bn2qi"]
|
||||
script = ExtResource("3_1wliv")
|
||||
BaseValue = 1.0
|
||||
|
||||
[sub_resource type="Resource" id="Resource_pl2a2"]
|
||||
script = ExtResource("3_1wliv")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_g02pf"]
|
||||
script = ExtResource("3_1wliv")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_7ak88"]
|
||||
script = ExtResource("3_1wliv")
|
||||
BaseValue = 1.0
|
||||
|
||||
[sub_resource type="Resource" id="Resource_f12ll"]
|
||||
script = ExtResource("3_1wliv")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_xodo6"]
|
||||
script = ExtResource("3_1wliv")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_mcqfd"]
|
||||
script = ExtResource("3_1wliv")
|
||||
BaseValue = 2.0
|
||||
metadata/_custom_type_script = "uid://cn3b4ya15fg7e"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_w3q2i"]
|
||||
script = ExtResource("4_7dtdc")
|
||||
ScalableFloat = SubResource("Resource_mcqfd")
|
||||
Coefficient = SubResource("Resource_7ak88")
|
||||
PreMultiplyAdditiveValue = SubResource("Resource_xodo6")
|
||||
PostMultiplyAdditiveValue = SubResource("Resource_f12ll")
|
||||
CalculatorCoefficient = SubResource("Resource_bn2qi")
|
||||
CalculatorPreMultiplyAdditiveValue = SubResource("Resource_g02pf")
|
||||
CalculatorPostMultiplyAdditiveValue = SubResource("Resource_pl2a2")
|
||||
metadata/_custom_type_script = "uid://2gm1hdhi8u08"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_vgvi5"]
|
||||
script = ExtResource("5_ewbg3")
|
||||
BaseValue = 1
|
||||
|
||||
[sub_resource type="Resource" id="Resource_0ujop"]
|
||||
script = ExtResource("5_ewbg3")
|
||||
BaseValue = 1
|
||||
|
||||
[sub_resource type="Resource" id="Resource_s8mqp"]
|
||||
script = ExtResource("6_0akms")
|
||||
Name = "Add Invincible tag effect"
|
||||
Modifiers = Array[Object]([])
|
||||
Components = Array[Object]([SubResource("Resource_5ht6k")])
|
||||
Executions = []
|
||||
DurationType = 2
|
||||
Duration = SubResource("Resource_w3q2i")
|
||||
StackLimit = SubResource("Resource_0ujop")
|
||||
InitialStack = SubResource("Resource_vgvi5")
|
||||
Cues = []
|
||||
metadata/_custom_type_script = "uid://b83hf13nj37k3"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_tcrdt"]
|
||||
script = ExtResource("7_mhqpo")
|
||||
EffectData = SubResource("Resource_s8mqp")
|
||||
Name = "OnHitInvincibility"
|
||||
Description = "Adds the invincible tag for a given period"
|
||||
metadata/_custom_type_script = "uid://cl5hudinl1rex"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_xs7wf"]
|
||||
script = ExtResource("8_4vjp3")
|
||||
Tag = "events.combat.damage"
|
||||
metadata/_custom_type_script = "uid://dpakv7agvir6y"
|
||||
|
||||
[resource]
|
||||
script = ExtResource("9_go27d")
|
||||
Name = "OnHitInvincibility"
|
||||
InstancingPolicy = 1
|
||||
CooldownEffects = []
|
||||
AbilityBehavior = SubResource("Resource_tcrdt")
|
||||
TriggerSource = 1
|
||||
TriggerTag = SubResource("Resource_xs7wf")
|
||||
metadata/_custom_type_script = "uid://dhxfbxh54pyxp"
|
||||
183
forge/resources/ability_datas/player_hit.tres
Normal file
183
forge/resources/ability_datas/player_hit.tres
Normal file
@@ -0,0 +1,183 @@
|
||||
[gd_resource type="Resource" script_class="ForgeAbilityData" format=3 uid="uid://dgjsi1my7nlnk"]
|
||||
|
||||
[ext_resource type="Resource" uid="uid://bn1getr10b4dx" path="res://forge/resources/effect_datas/simple_player_hit.tres" id="1_c4wry"]
|
||||
[ext_resource type="Script" uid="uid://1hgogislo1l6" path="res://addons/forge/resources/magnitudes/ForgeScalableInt.cs" id="1_l0l1a"]
|
||||
[ext_resource type="Script" uid="uid://cw525n4mjqgw0" path="res://addons/forge/resources/ForgeTagContainer.cs" id="1_w1wo0"]
|
||||
[ext_resource type="Script" uid="uid://b83hf13nj37k3" path="res://addons/forge/resources/ForgeEffectData.cs" id="2_5vjbv"]
|
||||
[ext_resource type="Script" uid="uid://d1bb1fvh1mnpd" path="res://forge/abilities/ForgeManualCancelHitBehavior.cs" id="2_c4wry"]
|
||||
[ext_resource type="Script" uid="uid://dngf30hxy5go4" path="res://addons/forge/resources/components/ModifierTags.cs" id="2_jwyed"]
|
||||
[ext_resource type="Resource" uid="uid://vs6kfo2ubhvr" path="res://forge/resources/effect_components/stunnable.tres" id="2_r7waw"]
|
||||
[ext_resource type="Script" uid="uid://dhxfbxh54pyxp" path="res://addons/forge/resources/abilities/ForgeAbilityData.cs" id="3_w1wo0"]
|
||||
[ext_resource type="Script" uid="uid://cn3b4ya15fg7e" path="res://addons/forge/resources/magnitudes/ForgeScalableFloat.cs" id="4_c4wry"]
|
||||
[ext_resource type="Script" uid="uid://2gm1hdhi8u08" path="res://addons/forge/resources/magnitudes/ForgeModifierMagnitude.cs" id="5_0cyim"]
|
||||
[ext_resource type="Script" uid="uid://br7ut4lbau66w" path="res://forge/calculators/ForgeRaiseEventTagExecution.cs" id="7_l5emy"]
|
||||
|
||||
[sub_resource type="Resource" id="Resource_h8gc3"]
|
||||
script = ExtResource("1_w1wo0")
|
||||
ContainerTags = Array[String](["status.stunned"])
|
||||
metadata/_custom_type_script = "uid://cw525n4mjqgw0"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_vioyh"]
|
||||
script = ExtResource("2_jwyed")
|
||||
TagsToAdd = SubResource("Resource_h8gc3")
|
||||
metadata/_custom_type_script = "uid://dngf30hxy5go4"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_m6xnn"]
|
||||
script = ExtResource("4_c4wry")
|
||||
BaseValue = 1.0
|
||||
|
||||
[sub_resource type="Resource" id="Resource_uinv8"]
|
||||
script = ExtResource("4_c4wry")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_04hqa"]
|
||||
script = ExtResource("4_c4wry")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_8fbeq"]
|
||||
script = ExtResource("4_c4wry")
|
||||
BaseValue = 1.0
|
||||
|
||||
[sub_resource type="Resource" id="Resource_ees2v"]
|
||||
script = ExtResource("4_c4wry")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_6x2ov"]
|
||||
script = ExtResource("4_c4wry")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_ml8x2"]
|
||||
script = ExtResource("4_c4wry")
|
||||
BaseValue = 1.0
|
||||
metadata/_custom_type_script = "uid://cn3b4ya15fg7e"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_1uqo4"]
|
||||
script = ExtResource("5_0cyim")
|
||||
ScalableFloat = SubResource("Resource_ml8x2")
|
||||
Coefficient = SubResource("Resource_8fbeq")
|
||||
PreMultiplyAdditiveValue = SubResource("Resource_6x2ov")
|
||||
PostMultiplyAdditiveValue = SubResource("Resource_ees2v")
|
||||
CalculatorCoefficient = SubResource("Resource_m6xnn")
|
||||
CalculatorPreMultiplyAdditiveValue = SubResource("Resource_04hqa")
|
||||
CalculatorPostMultiplyAdditiveValue = SubResource("Resource_uinv8")
|
||||
metadata/_custom_type_script = "uid://2gm1hdhi8u08"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_fyrcc"]
|
||||
script = ExtResource("1_w1wo0")
|
||||
ContainerTags = Array[String](["events.combat.stun_applied"])
|
||||
metadata/_custom_type_script = "uid://cw525n4mjqgw0"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_sgtcb"]
|
||||
script = ExtResource("1_w1wo0")
|
||||
ContainerTags = Array[String](["events.combat.stun_received"])
|
||||
metadata/_custom_type_script = "uid://cw525n4mjqgw0"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_3p0ly"]
|
||||
script = ExtResource("7_l5emy")
|
||||
EventTags = SubResource("Resource_fyrcc")
|
||||
TargetEventTags = SubResource("Resource_sgtcb")
|
||||
metadata/_custom_type_script = "uid://br7ut4lbau66w"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_ewmvj"]
|
||||
script = ExtResource("1_l0l1a")
|
||||
BaseValue = 1
|
||||
|
||||
[sub_resource type="Resource" id="Resource_8wvcn"]
|
||||
script = ExtResource("1_l0l1a")
|
||||
BaseValue = 1
|
||||
|
||||
[sub_resource type="Resource" id="Resource_no8t2"]
|
||||
script = ExtResource("2_5vjbv")
|
||||
Name = "Basic stun"
|
||||
Modifiers = Array[Object]([])
|
||||
Components = Array[Object]([ExtResource("2_r7waw"), SubResource("Resource_vioyh")])
|
||||
Executions = [SubResource("Resource_3p0ly")]
|
||||
DurationType = 2
|
||||
Duration = SubResource("Resource_1uqo4")
|
||||
StackLimit = SubResource("Resource_8wvcn")
|
||||
InitialStack = SubResource("Resource_ewmvj")
|
||||
Cues = []
|
||||
metadata/_custom_type_script = "uid://b83hf13nj37k3"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_0cyim"]
|
||||
script = ExtResource("2_c4wry")
|
||||
OnHitEffects = [ExtResource("1_c4wry"), SubResource("Resource_no8t2")]
|
||||
Name = "Player hit"
|
||||
metadata/_custom_type_script = "uid://d1bb1fvh1mnpd"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_qk2av"]
|
||||
script = ExtResource("1_w1wo0")
|
||||
ContainerTags = Array[String](["status.stunned"])
|
||||
metadata/_custom_type_script = "uid://cw525n4mjqgw0"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_w857g"]
|
||||
script = ExtResource("1_w1wo0")
|
||||
ContainerTags = Array[String](["cooldown.hit"])
|
||||
metadata/_custom_type_script = "uid://cw525n4mjqgw0"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_n2s8d"]
|
||||
script = ExtResource("2_jwyed")
|
||||
TagsToAdd = SubResource("Resource_w857g")
|
||||
metadata/_custom_type_script = "uid://dngf30hxy5go4"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_l5emy"]
|
||||
script = ExtResource("4_c4wry")
|
||||
BaseValue = 1.0
|
||||
|
||||
[sub_resource type="Resource" id="Resource_agfn8"]
|
||||
script = ExtResource("4_c4wry")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_tkxxk"]
|
||||
script = ExtResource("4_c4wry")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_e4qbe"]
|
||||
script = ExtResource("4_c4wry")
|
||||
BaseValue = 1.0
|
||||
|
||||
[sub_resource type="Resource" id="Resource_coxn5"]
|
||||
script = ExtResource("4_c4wry")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_wak7n"]
|
||||
script = ExtResource("4_c4wry")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_bvwi7"]
|
||||
script = ExtResource("4_c4wry")
|
||||
BaseValue = 0.3
|
||||
metadata/_custom_type_script = "uid://cn3b4ya15fg7e"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_3wf5l"]
|
||||
script = ExtResource("5_0cyim")
|
||||
ScalableFloat = SubResource("Resource_bvwi7")
|
||||
Coefficient = SubResource("Resource_e4qbe")
|
||||
PreMultiplyAdditiveValue = SubResource("Resource_wak7n")
|
||||
PostMultiplyAdditiveValue = SubResource("Resource_coxn5")
|
||||
CalculatorCoefficient = SubResource("Resource_l5emy")
|
||||
CalculatorPreMultiplyAdditiveValue = SubResource("Resource_tkxxk")
|
||||
CalculatorPostMultiplyAdditiveValue = SubResource("Resource_agfn8")
|
||||
metadata/_custom_type_script = "uid://2gm1hdhi8u08"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_xs7wf"]
|
||||
script = ExtResource("1_l0l1a")
|
||||
BaseValue = 1
|
||||
|
||||
[sub_resource type="Resource" id="Resource_cm4e8"]
|
||||
script = ExtResource("1_l0l1a")
|
||||
BaseValue = 1
|
||||
|
||||
[sub_resource type="Resource" id="Resource_cmmfb"]
|
||||
script = ExtResource("2_5vjbv")
|
||||
Name = "PlayerHitCooldown"
|
||||
Modifiers = []
|
||||
Components = Array[Object]([SubResource("Resource_n2s8d")])
|
||||
Executions = []
|
||||
DurationType = 2
|
||||
Duration = SubResource("Resource_3wf5l")
|
||||
StackLimit = SubResource("Resource_cm4e8")
|
||||
InitialStack = SubResource("Resource_xs7wf")
|
||||
Cues = []
|
||||
metadata/_custom_type_script = "uid://b83hf13nj37k3"
|
||||
|
||||
[resource]
|
||||
script = ExtResource("3_w1wo0")
|
||||
Name = "PlayerHitAbility"
|
||||
RetriggerInstancedAbility = true
|
||||
CooldownEffects = [SubResource("Resource_cmmfb")]
|
||||
AbilityBehavior = SubResource("Resource_0cyim")
|
||||
ActivationBlockedTags = SubResource("Resource_qk2av")
|
||||
metadata/_custom_type_script = "uid://dhxfbxh54pyxp"
|
||||
@@ -1,6 +1,6 @@
|
||||
[gd_resource type="Resource" script_class="ForgeAbilityData" format=3 uid="uid://btnnpqann3ktp"]
|
||||
|
||||
[ext_resource type="Resource" uid="uid://1tmxayi3nygi" path="res://scenes/player_controller/resources/forge/flying tick application ability behavior.tres" id="1_twa0w"]
|
||||
[ext_resource type="Resource" uid="uid://1tmxayi3nygi" path="res://forge/resources/behaviors/flying tick application ability behavior.tres" id="1_twa0w"]
|
||||
[ext_resource type="Script" uid="uid://dhxfbxh54pyxp" path="res://addons/forge/resources/abilities/ForgeAbilityData.cs" id="1_vh0wp"]
|
||||
[ext_resource type="Script" uid="uid://dpakv7agvir6y" path="res://addons/forge/resources/ForgeTag.cs" id="6_napws"]
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
[gd_resource type="Resource" script_class="ForgeAbilityData" format=3 uid="uid://0oo3na61ot1o"]
|
||||
|
||||
[ext_resource type="Resource" uid="uid://bk3rv5jrutfjw" path="res://forge/resources/tag_containers/on_weapon_plantedtick.tres" id="1_4dvtr"]
|
||||
[ext_resource type="Script" uid="uid://br7ut4lbau66w" path="res://forge/calculators/ForgeRaiseEventTagExecution.cs" id="2_oo2u8"]
|
||||
[ext_resource type="Script" uid="uid://dpakv7agvir6y" path="res://addons/forge/resources/ForgeTag.cs" id="2_wolay"]
|
||||
[ext_resource type="Script" uid="uid://1hgogislo1l6" path="res://addons/forge/resources/magnitudes/ForgeScalableInt.cs" id="3_cykp3"]
|
||||
[ext_resource type="Script" uid="uid://dhxfbxh54pyxp" path="res://addons/forge/resources/abilities/ForgeAbilityData.cs" id="3_mqsqr"]
|
||||
[ext_resource type="Script" uid="uid://b83hf13nj37k3" path="res://addons/forge/resources/ForgeEffectData.cs" id="4_4348y"]
|
||||
[ext_resource type="Script" uid="uid://cn3b4ya15fg7e" path="res://addons/forge/resources/magnitudes/ForgeScalableFloat.cs" id="4_oo2u8"]
|
||||
[ext_resource type="Script" uid="uid://cl5hudinl1rex" path="res://forge/abilities/ForgeEffectApplicationBehavior.cs" id="5_drdls"]
|
||||
|
||||
[sub_resource type="Resource" id="Resource_l3tir"]
|
||||
script = ExtResource("2_oo2u8")
|
||||
EventTags = ExtResource("1_4dvtr")
|
||||
metadata/_custom_type_script = "uid://br7ut4lbau66w"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_yc0gp"]
|
||||
script = ExtResource("3_cykp3")
|
||||
BaseValue = 1
|
||||
|
||||
[sub_resource type="Resource" id="Resource_cykp3"]
|
||||
script = ExtResource("4_oo2u8")
|
||||
BaseValue = 0.5
|
||||
metadata/_custom_type_script = "uid://cn3b4ya15fg7e"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_rvogu"]
|
||||
script = ExtResource("3_cykp3")
|
||||
BaseValue = 1
|
||||
|
||||
[sub_resource type="Resource" id="Resource_hgeae"]
|
||||
script = ExtResource("4_4348y")
|
||||
Name = "Raise Planted Tick Periodically"
|
||||
Modifiers = []
|
||||
Components = []
|
||||
Executions = Array[Object]([SubResource("Resource_l3tir")])
|
||||
DurationType = 1
|
||||
HasPeriodicApplication = true
|
||||
Period = SubResource("Resource_cykp3")
|
||||
ExecuteOnApplication = true
|
||||
StackLimit = SubResource("Resource_rvogu")
|
||||
InitialStack = SubResource("Resource_yc0gp")
|
||||
Cues = []
|
||||
metadata/_custom_type_script = "uid://b83hf13nj37k3"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_jiqxq"]
|
||||
script = ExtResource("5_drdls")
|
||||
EffectData = SubResource("Resource_hgeae")
|
||||
metadata/_custom_type_script = "uid://cl5hudinl1rex"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_4aw8y"]
|
||||
script = ExtResource("2_wolay")
|
||||
Tag = "events.weapon.planted"
|
||||
metadata/_custom_type_script = "uid://dpakv7agvir6y"
|
||||
|
||||
[resource]
|
||||
script = ExtResource("3_mqsqr")
|
||||
Name = "Weapon Planted Tick"
|
||||
RetriggerInstancedAbility = true
|
||||
CooldownEffects = []
|
||||
AbilityBehavior = SubResource("Resource_jiqxq")
|
||||
TriggerSource = 1
|
||||
TriggerTag = SubResource("Resource_4aw8y")
|
||||
metadata/_custom_type_script = "uid://dhxfbxh54pyxp"
|
||||
@@ -2,7 +2,11 @@
|
||||
|
||||
[ext_resource type="PackedScene" uid="uid://duju3atqgltkg" path="res://scenes/explosion/explosion.tscn" id="1_mnals"]
|
||||
[ext_resource type="Script" uid="uid://bnee6amtc2bhj" path="res://forge/abilities/ForgeExplodingSwordBehavior.cs" id="1_ot53g"]
|
||||
[ext_resource type="Texture2D" uid="uid://c2akxlg7tdb67" path="res://assets/ui/IconGodotNode/node/icon_projectile.png" id="2_l3coe"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_ot53g")
|
||||
Explosion = ExtResource("1_mnals")
|
||||
Name = "Exploding Sword"
|
||||
Description = "Make the sword explode"
|
||||
Icon = ExtResource("2_l3coe")
|
||||
@@ -1,9 +1,10 @@
|
||||
[gd_resource type="Resource" script_class="ForgeEffectApplicationBehavior" format=3 uid="uid://1tmxayi3nygi"]
|
||||
|
||||
[ext_resource type="Resource" uid="uid://bvidrwyuoos4g" path="res://scenes/player_controller/resources/forge/raise_flying_tick_event_periodically.tres" id="1_hlq5f"]
|
||||
[ext_resource type="Resource" uid="uid://bvidrwyuoos4g" path="res://forge/resources/effect_datas/raise_flying_tick_event_periodically.tres" id="1_hlq5f"]
|
||||
[ext_resource type="Script" uid="uid://cl5hudinl1rex" path="res://forge/abilities/ForgeEffectApplicationBehavior.cs" id="2_f5qgs"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("2_f5qgs")
|
||||
EffectData = ExtResource("1_hlq5f")
|
||||
Name = "Flying tick application"
|
||||
metadata/_custom_type_script = "uid://cl5hudinl1rex"
|
||||
17
forge/resources/cues/player_health_changed_cue.tres
Normal file
17
forge/resources/cues/player_health_changed_cue.tres
Normal file
@@ -0,0 +1,17 @@
|
||||
[gd_resource type="Resource" script_class="ForgeCue" format=3 uid="uid://bsqvfefpb7jix"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://cw525n4mjqgw0" path="res://addons/forge/resources/ForgeTagContainer.cs" id="1_tvgrb"]
|
||||
[ext_resource type="Script" uid="uid://cmrsxccn0ei4j" path="res://addons/forge/resources/ForgeCue.cs" id="2_dyb6j"]
|
||||
|
||||
[sub_resource type="Resource" id="Resource_f35o6"]
|
||||
script = ExtResource("1_tvgrb")
|
||||
ContainerTags = Array[String](["cues.resources.health", "character.player"])
|
||||
metadata/_custom_type_script = "uid://cw525n4mjqgw0"
|
||||
|
||||
[resource]
|
||||
script = ExtResource("2_dyb6j")
|
||||
CueKeys = SubResource("Resource_f35o6")
|
||||
MaxValue = 100
|
||||
MagnitudeType = 2
|
||||
MagnitudeAttribute = "PlayerAttributeSet.Health"
|
||||
metadata/_custom_type_script = "uid://cmrsxccn0ei4j"
|
||||
@@ -1,15 +1,15 @@
|
||||
[gd_resource type="Resource" script_class="ForgeCue" format=3 uid="uid://dn7b8frkoxpxr"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://cw525n4mjqgw0" path="res://addons/forge/resources/ForgeTagContainer.cs" id="1_lbula"]
|
||||
[ext_resource type="Script" uid="uid://cmrsxccn0ei4j" path="res://addons/forge/resources/ForgeCue.cs" id="2_jijlk"]
|
||||
[ext_resource type="Script" uid="uid://cw525n4mjqgw0" path="res://addons/forge/resources/ForgeTagContainer.cs" id="1_0pc1u"]
|
||||
[ext_resource type="Script" uid="uid://cmrsxccn0ei4j" path="res://addons/forge/resources/ForgeCue.cs" id="2_g0vcr"]
|
||||
|
||||
[sub_resource type="Resource" id="Resource_4mhqs"]
|
||||
script = ExtResource("1_lbula")
|
||||
script = ExtResource("1_0pc1u")
|
||||
ContainerTags = Array[String](["cues.resources.mana"])
|
||||
metadata/_custom_type_script = "uid://cw525n4mjqgw0"
|
||||
|
||||
[resource]
|
||||
script = ExtResource("2_jijlk")
|
||||
script = ExtResource("2_g0vcr")
|
||||
CueKeys = SubResource("Resource_4mhqs")
|
||||
MaxValue = 100
|
||||
MagnitudeType = 2
|
||||
@@ -0,0 +1,11 @@
|
||||
[gd_resource type="Resource" script_class="ForgeDamageExecution" format=3 uid="uid://4rkwr10pc6tp"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://cfx62w40nd84v" path="res://forge/calculators/ForgeDamageExecution.cs" id="1_bo86y"]
|
||||
[ext_resource type="Resource" uid="uid://sn6kndc6ukic" path="res://forge/resources/tag_containers/on_damage_dealt.tres" id="1_hmxxf"]
|
||||
[ext_resource type="Resource" uid="uid://5tr54q0rdpho" path="res://forge/resources/tag_containers/on_damage_taken.tres" id="2_6r7e6"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_bo86y")
|
||||
DamageDealerEventTags = ExtResource("1_hmxxf")
|
||||
DamageReceiverEventTags = ExtResource("2_6r7e6")
|
||||
metadata/_custom_type_script = "uid://cfx62w40nd84v"
|
||||
@@ -0,0 +1,22 @@
|
||||
[gd_resource type="Resource" script_class="ForgeKnockbackExecution" format=3 uid="uid://cc1qrmbp12fk8"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://b44cse62qru7j" path="res://scenes/components/knockback/RKnockback.cs" id="1_kcl5u"]
|
||||
[ext_resource type="Resource" uid="uid://bhn27s8ne0uyg" path="res://forge/resources/tag_containers/on_knockback_dealt.tres" id="2_oqtq1"]
|
||||
[ext_resource type="Resource" uid="uid://bkr6uu57wm3o3" path="res://forge/resources/tag_containers/on_knockback_received.tres" id="3_1va1b"]
|
||||
[ext_resource type="Resource" uid="uid://5obdxlcpw8qt" path="res://forge/resources/tag_containers/knockback_immune.tres" id="3_oqtq1"]
|
||||
[ext_resource type="Resource" uid="uid://45l7vnfs72b" path="res://forge/resources/tag_containers/knockbackable_tag.tres" id="4_0i0oh"]
|
||||
[ext_resource type="Script" uid="uid://diondfg5xp78h" path="res://forge/calculators/ForgeKnockbackExecution.cs" id="5_babc1"]
|
||||
|
||||
[sub_resource type="Resource" id="Resource_6x2ov"]
|
||||
script = ExtResource("1_kcl5u")
|
||||
Modifier = 50.0
|
||||
metadata/_custom_type_script = "uid://b44cse62qru7j"
|
||||
|
||||
[resource]
|
||||
script = ExtResource("5_babc1")
|
||||
KnockbackableTag = ExtResource("4_0i0oh")
|
||||
KnockbackImmuneTag = ExtResource("3_oqtq1")
|
||||
Knockback = SubResource("Resource_6x2ov")
|
||||
KnockbackDealerEventTags = ExtResource("2_oqtq1")
|
||||
KnockbackReceiverEventTags = ExtResource("3_1va1b")
|
||||
metadata/_custom_type_script = "uid://diondfg5xp78h"
|
||||
@@ -0,0 +1,11 @@
|
||||
[gd_resource type="Resource" script_class="ForgeRaiseEventTagExecution" format=3 uid="uid://dlu7l5egpexnn"]
|
||||
|
||||
[ext_resource type="Resource" uid="uid://sn6kndc6ukic" path="res://forge/resources/tag_containers/on_damage_dealt.tres" id="1_cum8v"]
|
||||
[ext_resource type="Resource" uid="uid://5tr54q0rdpho" path="res://forge/resources/tag_containers/on_damage_taken.tres" id="2_w48xp"]
|
||||
[ext_resource type="Script" uid="uid://br7ut4lbau66w" path="res://forge/calculators/ForgeRaiseEventTagExecution.cs" id="3_ggrwn"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("3_ggrwn")
|
||||
EventTags = ExtResource("1_cum8v")
|
||||
TargetEventTags = ExtResource("2_w48xp")
|
||||
metadata/_custom_type_script = "uid://br7ut4lbau66w"
|
||||
@@ -1,6 +1,6 @@
|
||||
[gd_resource type="Resource" script_class="ForgeRaiseEventTagExecution" format=3 uid="uid://oe2suroa1klj"]
|
||||
|
||||
[ext_resource type="Resource" uid="uid://x7vtcobi7s4r" path="res://scenes/player_controller/resources/forge/weapon_flyingtick_tagcontainer.tres" id="1_ce5fv"]
|
||||
[ext_resource type="Resource" uid="uid://x7vtcobi7s4r" path="res://forge/resources/tag_containers/on_weapon_flyingtick.tres" id="1_ce5fv"]
|
||||
[ext_resource type="Script" uid="uid://br7ut4lbau66w" path="res://forge/calculators/ForgeRaiseEventTagExecution.cs" id="2_am2ak"]
|
||||
|
||||
[resource]
|
||||
11
forge/resources/effect_components/damageable.tres
Normal file
11
forge/resources/effect_components/damageable.tres
Normal file
@@ -0,0 +1,11 @@
|
||||
[gd_resource type="Resource" script_class="TargetTagRequirements" format=3 uid="uid://bpovqvlqv5bs5"]
|
||||
|
||||
[ext_resource type="Resource" uid="uid://cw2ytd34jsxj" path="res://forge/resources/tag_containers/immune_damage.tres" id="1_8qlnl"]
|
||||
[ext_resource type="Resource" uid="uid://bsogx7yhedjry" path="res://forge/resources/tag_containers/trait_damageable.tres" id="2_vxkk1"]
|
||||
[ext_resource type="Script" uid="uid://b0eq12mjqfage" path="res://addons/forge/resources/components/TargetTagRequirements.cs" id="3_1mj5a"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("3_1mj5a")
|
||||
ApplicationRequiredTags = ExtResource("2_vxkk1")
|
||||
ApplicationIgnoredTags = ExtResource("1_8qlnl")
|
||||
metadata/_custom_type_script = "uid://b0eq12mjqfage"
|
||||
20
forge/resources/effect_components/stunnable.tres
Normal file
20
forge/resources/effect_components/stunnable.tres
Normal file
@@ -0,0 +1,20 @@
|
||||
[gd_resource type="Resource" script_class="TargetTagRequirements" format=3 uid="uid://vs6kfo2ubhvr"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://cw525n4mjqgw0" path="res://addons/forge/resources/ForgeTagContainer.cs" id="1_52mex"]
|
||||
[ext_resource type="Script" uid="uid://b0eq12mjqfage" path="res://addons/forge/resources/components/TargetTagRequirements.cs" id="2_d06a4"]
|
||||
|
||||
[sub_resource type="Resource" id="Resource_r7waw"]
|
||||
script = ExtResource("1_52mex")
|
||||
ContainerTags = Array[String](["immunity.stun"])
|
||||
metadata/_custom_type_script = "uid://cw525n4mjqgw0"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_vioyh"]
|
||||
script = ExtResource("1_52mex")
|
||||
ContainerTags = Array[String](["traits.stunnable"])
|
||||
metadata/_custom_type_script = "uid://cw525n4mjqgw0"
|
||||
|
||||
[resource]
|
||||
script = ExtResource("2_d06a4")
|
||||
ApplicationRequiredTags = SubResource("Resource_vioyh")
|
||||
ApplicationIgnoredTags = SubResource("Resource_r7waw")
|
||||
metadata/_custom_type_script = "uid://b0eq12mjqfage"
|
||||
@@ -1,54 +1,54 @@
|
||||
[gd_resource type="Resource" script_class="ForgeEffectData" format=3 uid="uid://dh437cuxgjv6b"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://1hgogislo1l6" path="res://addons/forge/resources/magnitudes/ForgeScalableInt.cs" id="1_mlifq"]
|
||||
[ext_resource type="Resource" uid="uid://dn7b8frkoxpxr" path="res://scenes/player_controller/resources/forge/player_mana_changed_cue.tres" id="1_nsr3v"]
|
||||
[ext_resource type="Script" uid="uid://cw525n4mjqgw0" path="res://addons/forge/resources/ForgeTagContainer.cs" id="1_q8tml"]
|
||||
[ext_resource type="Script" uid="uid://b83hf13nj37k3" path="res://addons/forge/resources/ForgeEffectData.cs" id="2_5tp50"]
|
||||
[ext_resource type="Script" uid="uid://cn3b4ya15fg7e" path="res://addons/forge/resources/magnitudes/ForgeScalableFloat.cs" id="2_pm3n3"]
|
||||
[ext_resource type="Script" uid="uid://b0eq12mjqfage" path="res://addons/forge/resources/components/TargetTagRequirements.cs" id="2_xbgy2"]
|
||||
[ext_resource type="Script" uid="uid://bdfcavbjyhxxa" path="res://addons/forge/resources/ForgeModifier.cs" id="3_nsr3v"]
|
||||
[ext_resource type="Script" uid="uid://cw525n4mjqgw0" path="res://addons/forge/resources/ForgeTagContainer.cs" id="1_b244r"]
|
||||
[ext_resource type="Script" uid="uid://b0eq12mjqfage" path="res://addons/forge/resources/components/TargetTagRequirements.cs" id="2_h46co"]
|
||||
[ext_resource type="Resource" uid="uid://dn7b8frkoxpxr" path="res://forge/resources/cues/player_mana_changed_cue.tres" id="3_kw6jm"]
|
||||
[ext_resource type="Script" uid="uid://1hgogislo1l6" path="res://addons/forge/resources/magnitudes/ForgeScalableInt.cs" id="4_fgmkc"]
|
||||
[ext_resource type="Script" uid="uid://cn3b4ya15fg7e" path="res://addons/forge/resources/magnitudes/ForgeScalableFloat.cs" id="5_m4art"]
|
||||
[ext_resource type="Script" uid="uid://bdfcavbjyhxxa" path="res://addons/forge/resources/ForgeModifier.cs" id="6_73cww"]
|
||||
[ext_resource type="Script" uid="uid://b83hf13nj37k3" path="res://addons/forge/resources/ForgeEffectData.cs" id="7_xa46f"]
|
||||
|
||||
[sub_resource type="Resource" id="Resource_5yygy"]
|
||||
script = ExtResource("1_q8tml")
|
||||
script = ExtResource("1_b244r")
|
||||
ContainerTags = Array[String](["character.player.mana.regen.inhibited", "cues.resources.mana.inhibited"])
|
||||
metadata/_custom_type_script = "uid://cw525n4mjqgw0"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_ncjx6"]
|
||||
script = ExtResource("2_xbgy2")
|
||||
script = ExtResource("2_h46co")
|
||||
OngoingIgnoredTags = SubResource("Resource_5yygy")
|
||||
metadata/_custom_type_script = "uid://b0eq12mjqfage"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_pm3n3"]
|
||||
script = ExtResource("1_mlifq")
|
||||
script = ExtResource("4_fgmkc")
|
||||
BaseValue = 1
|
||||
|
||||
[sub_resource type="Resource" id="Resource_q8tml"]
|
||||
script = ExtResource("2_pm3n3")
|
||||
script = ExtResource("5_m4art")
|
||||
BaseValue = 1.0
|
||||
|
||||
[sub_resource type="Resource" id="Resource_xbgy2"]
|
||||
script = ExtResource("2_pm3n3")
|
||||
script = ExtResource("5_m4art")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_rhldn"]
|
||||
script = ExtResource("2_pm3n3")
|
||||
script = ExtResource("5_m4art")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_p6h8c"]
|
||||
script = ExtResource("2_pm3n3")
|
||||
script = ExtResource("5_m4art")
|
||||
BaseValue = 1.0
|
||||
|
||||
[sub_resource type="Resource" id="Resource_yqxv4"]
|
||||
script = ExtResource("2_pm3n3")
|
||||
script = ExtResource("5_m4art")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_b6opn"]
|
||||
script = ExtResource("2_pm3n3")
|
||||
script = ExtResource("5_m4art")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_5frso"]
|
||||
script = ExtResource("2_pm3n3")
|
||||
script = ExtResource("5_m4art")
|
||||
BaseValue = 2.0
|
||||
metadata/_custom_type_script = "uid://cn3b4ya15fg7e"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_okenf"]
|
||||
script = ExtResource("3_nsr3v")
|
||||
script = ExtResource("6_73cww")
|
||||
Attribute = "PlayerAttributeSet.Mana"
|
||||
ScalableFloat = SubResource("Resource_5frso")
|
||||
Coefficient = SubResource("Resource_p6h8c")
|
||||
@@ -60,16 +60,16 @@ CalculatorPostMultiplyAdditiveValue = SubResource("Resource_xbgy2")
|
||||
metadata/_custom_type_script = "uid://bdfcavbjyhxxa"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_w35mq"]
|
||||
script = ExtResource("2_pm3n3")
|
||||
script = ExtResource("5_m4art")
|
||||
BaseValue = 0.1
|
||||
metadata/_custom_type_script = "uid://cn3b4ya15fg7e"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_nsr3v"]
|
||||
script = ExtResource("1_mlifq")
|
||||
script = ExtResource("4_fgmkc")
|
||||
BaseValue = 1
|
||||
|
||||
[resource]
|
||||
script = ExtResource("2_5tp50")
|
||||
script = ExtResource("7_xa46f")
|
||||
Name = "Mana Regeneration"
|
||||
Modifiers = Array[Object]([SubResource("Resource_okenf")])
|
||||
Components = [SubResource("Resource_ncjx6")]
|
||||
@@ -79,5 +79,5 @@ HasPeriodicApplication = true
|
||||
Period = SubResource("Resource_w35mq")
|
||||
StackLimit = SubResource("Resource_nsr3v")
|
||||
InitialStack = SubResource("Resource_pm3n3")
|
||||
Cues = Array[Object]([ExtResource("1_nsr3v")])
|
||||
Cues = Array[Object]([ExtResource("3_kw6jm")])
|
||||
metadata/_custom_type_script = "uid://b83hf13nj37k3"
|
||||
@@ -1,6 +1,6 @@
|
||||
[gd_resource type="Resource" script_class="ForgeEffectData" format=3 uid="uid://bvidrwyuoos4g"]
|
||||
|
||||
[ext_resource type="Resource" uid="uid://oe2suroa1klj" path="res://scenes/player_controller/resources/forge/raise_flying_tick_event.tres" id="1_cd13a"]
|
||||
[ext_resource type="Resource" uid="uid://oe2suroa1klj" path="res://forge/resources/custom_executions/raise_flying_tick_event.tres" id="1_cd13a"]
|
||||
[ext_resource type="Script" uid="uid://1hgogislo1l6" path="res://addons/forge/resources/magnitudes/ForgeScalableInt.cs" id="2_yyxtw"]
|
||||
[ext_resource type="Script" uid="uid://cn3b4ya15fg7e" path="res://addons/forge/resources/magnitudes/ForgeScalableFloat.cs" id="3_skmyt"]
|
||||
[ext_resource type="Script" uid="uid://b83hf13nj37k3" path="res://addons/forge/resources/ForgeEffectData.cs" id="4_7ma6b"]
|
||||
66
forge/resources/effect_datas/simple_player_hit.tres
Normal file
66
forge/resources/effect_datas/simple_player_hit.tres
Normal file
@@ -0,0 +1,66 @@
|
||||
[gd_resource type="Resource" script_class="ForgeEffectData" format=3 uid="uid://bn1getr10b4dx"]
|
||||
|
||||
[ext_resource type="Resource" uid="uid://bpovqvlqv5bs5" path="res://forge/resources/effect_components/damageable.tres" id="1_uev3b"]
|
||||
[ext_resource type="Resource" uid="uid://4rkwr10pc6tp" path="res://forge/resources/custom_executions/physical_damage_calculator.tres" id="2_o3goh"]
|
||||
[ext_resource type="Resource" uid="uid://cc1qrmbp12fk8" path="res://forge/resources/custom_executions/player_hit_knoback_calculation.tres" id="3_bydif"]
|
||||
[ext_resource type="Script" uid="uid://1hgogislo1l6" path="res://addons/forge/resources/magnitudes/ForgeScalableInt.cs" id="4_sd5hm"]
|
||||
[ext_resource type="Script" uid="uid://cn3b4ya15fg7e" path="res://addons/forge/resources/magnitudes/ForgeScalableFloat.cs" id="5_l6rea"]
|
||||
[ext_resource type="Script" uid="uid://bdfcavbjyhxxa" path="res://addons/forge/resources/ForgeModifier.cs" id="6_juqkp"]
|
||||
[ext_resource type="Script" uid="uid://b83hf13nj37k3" path="res://addons/forge/resources/ForgeEffectData.cs" id="7_njbpb"]
|
||||
|
||||
[sub_resource type="Resource" id="Resource_0cyim"]
|
||||
script = ExtResource("4_sd5hm")
|
||||
BaseValue = 1
|
||||
|
||||
[sub_resource type="Resource" id="Resource_h8gc3"]
|
||||
script = ExtResource("5_l6rea")
|
||||
BaseValue = 1.0
|
||||
|
||||
[sub_resource type="Resource" id="Resource_ewmvj"]
|
||||
script = ExtResource("5_l6rea")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_8wvcn"]
|
||||
script = ExtResource("5_l6rea")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_no8t2"]
|
||||
script = ExtResource("5_l6rea")
|
||||
BaseValue = 1.0
|
||||
|
||||
[sub_resource type="Resource" id="Resource_vioyh"]
|
||||
script = ExtResource("5_l6rea")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_m6xnn"]
|
||||
script = ExtResource("5_l6rea")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_uinv8"]
|
||||
script = ExtResource("5_l6rea")
|
||||
BaseValue = 40.0
|
||||
metadata/_custom_type_script = "uid://cn3b4ya15fg7e"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_04hqa"]
|
||||
script = ExtResource("6_juqkp")
|
||||
Attribute = "MetaAttributeSet.IncomingDamage"
|
||||
Operation = 2
|
||||
ScalableFloat = SubResource("Resource_uinv8")
|
||||
Coefficient = SubResource("Resource_no8t2")
|
||||
PreMultiplyAdditiveValue = SubResource("Resource_m6xnn")
|
||||
PostMultiplyAdditiveValue = SubResource("Resource_vioyh")
|
||||
CalculatorCoefficient = SubResource("Resource_h8gc3")
|
||||
CalculatorPreMultiplyAdditiveValue = SubResource("Resource_8wvcn")
|
||||
CalculatorPostMultiplyAdditiveValue = SubResource("Resource_ewmvj")
|
||||
metadata/_custom_type_script = "uid://bdfcavbjyhxxa"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_8fbeq"]
|
||||
script = ExtResource("4_sd5hm")
|
||||
BaseValue = 1
|
||||
|
||||
[resource]
|
||||
script = ExtResource("7_njbpb")
|
||||
Name = "Player Hit Effect"
|
||||
Modifiers = Array[Object]([SubResource("Resource_04hqa")])
|
||||
Components = Array[Object]([ExtResource("1_uev3b")])
|
||||
Executions = Array[Object]([ExtResource("2_o3goh"), ExtResource("3_bydif")])
|
||||
StackLimit = SubResource("Resource_8fbeq")
|
||||
InitialStack = SubResource("Resource_0cyim")
|
||||
Cues = []
|
||||
metadata/_custom_type_script = "uid://b83hf13nj37k3"
|
||||
70
forge/resources/effect_datas/temp_invincibility.tres
Normal file
70
forge/resources/effect_datas/temp_invincibility.tres
Normal file
@@ -0,0 +1,70 @@
|
||||
[gd_resource type="Resource" script_class="ForgeEffectData" format=3 uid="uid://c4ea6ktafqe0r"]
|
||||
|
||||
[ext_resource type="Resource" uid="uid://cw2ytd34jsxj" path="res://forge/resources/tag_containers/immune_damage.tres" id="1_suvh6"]
|
||||
[ext_resource type="Script" uid="uid://dngf30hxy5go4" path="res://addons/forge/resources/components/ModifierTags.cs" id="2_7y7k0"]
|
||||
[ext_resource type="Script" uid="uid://cn3b4ya15fg7e" path="res://addons/forge/resources/magnitudes/ForgeScalableFloat.cs" id="3_wdmyo"]
|
||||
[ext_resource type="Script" uid="uid://2gm1hdhi8u08" path="res://addons/forge/resources/magnitudes/ForgeModifierMagnitude.cs" id="4_m2dme"]
|
||||
[ext_resource type="Script" uid="uid://1hgogislo1l6" path="res://addons/forge/resources/magnitudes/ForgeScalableInt.cs" id="5_uck3v"]
|
||||
[ext_resource type="Script" uid="uid://b83hf13nj37k3" path="res://addons/forge/resources/ForgeEffectData.cs" id="6_gt48y"]
|
||||
|
||||
[sub_resource type="Resource" id="Resource_xltxv"]
|
||||
script = ExtResource("2_7y7k0")
|
||||
TagsToAdd = ExtResource("1_suvh6")
|
||||
metadata/_custom_type_script = "uid://dngf30hxy5go4"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_60xl1"]
|
||||
script = ExtResource("3_wdmyo")
|
||||
BaseValue = 1.0
|
||||
|
||||
[sub_resource type="Resource" id="Resource_2rev5"]
|
||||
script = ExtResource("3_wdmyo")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_kxytj"]
|
||||
script = ExtResource("3_wdmyo")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_e5nje"]
|
||||
script = ExtResource("3_wdmyo")
|
||||
BaseValue = 1.0
|
||||
|
||||
[sub_resource type="Resource" id="Resource_xc8ja"]
|
||||
script = ExtResource("3_wdmyo")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_tan32"]
|
||||
script = ExtResource("3_wdmyo")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_l52b0"]
|
||||
script = ExtResource("3_wdmyo")
|
||||
BaseValue = 0.3
|
||||
metadata/_custom_type_script = "uid://cn3b4ya15fg7e"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_6jn6y"]
|
||||
script = ExtResource("4_m2dme")
|
||||
ScalableFloat = SubResource("Resource_l52b0")
|
||||
Coefficient = SubResource("Resource_e5nje")
|
||||
PreMultiplyAdditiveValue = SubResource("Resource_tan32")
|
||||
PostMultiplyAdditiveValue = SubResource("Resource_xc8ja")
|
||||
CalculatorCoefficient = SubResource("Resource_60xl1")
|
||||
CalculatorPreMultiplyAdditiveValue = SubResource("Resource_kxytj")
|
||||
CalculatorPostMultiplyAdditiveValue = SubResource("Resource_2rev5")
|
||||
metadata/_custom_type_script = "uid://2gm1hdhi8u08"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_ev6w4"]
|
||||
script = ExtResource("5_uck3v")
|
||||
BaseValue = 1
|
||||
|
||||
[sub_resource type="Resource" id="Resource_u8xa8"]
|
||||
script = ExtResource("5_uck3v")
|
||||
BaseValue = 1
|
||||
|
||||
[resource]
|
||||
script = ExtResource("6_gt48y")
|
||||
Name = "ApplyInvincibility"
|
||||
Modifiers = []
|
||||
Components = Array[Object]([SubResource("Resource_xltxv")])
|
||||
Executions = []
|
||||
DurationType = 2
|
||||
Duration = SubResource("Resource_6jn6y")
|
||||
StackLimit = SubResource("Resource_u8xa8")
|
||||
InitialStack = SubResource("Resource_ev6w4")
|
||||
Cues = []
|
||||
metadata/_custom_type_script = "uid://b83hf13nj37k3"
|
||||
8
forge/resources/tag_containers/enemy_base_tags.tres
Normal file
8
forge/resources/tag_containers/enemy_base_tags.tres
Normal file
@@ -0,0 +1,8 @@
|
||||
[gd_resource type="Resource" script_class="ForgeTagContainer" format=3 uid="uid://bocsykxbh8l0g"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://cw525n4mjqgw0" path="res://addons/forge/resources/ForgeTagContainer.cs" id="1_kdy2b"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_kdy2b")
|
||||
ContainerTags = Array[String](["character.enemy", "traits.damageable", "traits.knockbackable", "traits.stunnable"])
|
||||
metadata/_custom_type_script = "uid://cw525n4mjqgw0"
|
||||
8
forge/resources/tag_containers/immune_damage.tres
Normal file
8
forge/resources/tag_containers/immune_damage.tres
Normal file
@@ -0,0 +1,8 @@
|
||||
[gd_resource type="Resource" script_class="ForgeTagContainer" format=3 uid="uid://cw2ytd34jsxj"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://cw525n4mjqgw0" path="res://addons/forge/resources/ForgeTagContainer.cs" id="1_vmvhu"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_vmvhu")
|
||||
ContainerTags = Array[String](["immunity.damage"])
|
||||
metadata/_custom_type_script = "uid://cw525n4mjqgw0"
|
||||
8
forge/resources/tag_containers/knockback_immune.tres
Normal file
8
forge/resources/tag_containers/knockback_immune.tres
Normal file
@@ -0,0 +1,8 @@
|
||||
[gd_resource type="Resource" script_class="ForgeTag" format=3 uid="uid://5obdxlcpw8qt"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://dpakv7agvir6y" path="res://addons/forge/resources/ForgeTag.cs" id="1_pjklh"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_pjklh")
|
||||
Tag = "immunity.knockback"
|
||||
metadata/_custom_type_script = "uid://dpakv7agvir6y"
|
||||
8
forge/resources/tag_containers/knockbackable_tag.tres
Normal file
8
forge/resources/tag_containers/knockbackable_tag.tres
Normal file
@@ -0,0 +1,8 @@
|
||||
[gd_resource type="Resource" script_class="ForgeTag" format=3 uid="uid://45l7vnfs72b"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://dpakv7agvir6y" path="res://addons/forge/resources/ForgeTag.cs" id="1_1cy5u"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_1cy5u")
|
||||
Tag = "traits.knockbackable"
|
||||
metadata/_custom_type_script = "uid://dpakv7agvir6y"
|
||||
8
forge/resources/tag_containers/on_damage_dealt.tres
Normal file
8
forge/resources/tag_containers/on_damage_dealt.tres
Normal file
@@ -0,0 +1,8 @@
|
||||
[gd_resource type="Resource" script_class="ForgeTagContainer" format=3 uid="uid://sn6kndc6ukic"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://cw525n4mjqgw0" path="res://addons/forge/resources/ForgeTagContainer.cs" id="1_4beov"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_4beov")
|
||||
ContainerTags = Array[String](["events.combat.hit"])
|
||||
metadata/_custom_type_script = "uid://cw525n4mjqgw0"
|
||||
8
forge/resources/tag_containers/on_damage_taken.tres
Normal file
8
forge/resources/tag_containers/on_damage_taken.tres
Normal file
@@ -0,0 +1,8 @@
|
||||
[gd_resource type="Resource" script_class="ForgeTagContainer" format=3 uid="uid://5tr54q0rdpho"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://cw525n4mjqgw0" path="res://addons/forge/resources/ForgeTagContainer.cs" id="1_nvopg"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_nvopg")
|
||||
ContainerTags = Array[String](["events.combat.damage"])
|
||||
metadata/_custom_type_script = "uid://cw525n4mjqgw0"
|
||||
@@ -0,0 +1,8 @@
|
||||
[gd_resource type="Resource" script_class="ForgeTag" format=3 uid="uid://bkr1xfokymvp4"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://dpakv7agvir6y" path="res://addons/forge/resources/ForgeTag.cs" id="1_ux16b"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_ux16b")
|
||||
Tag = "events.enemy.launch_projectile"
|
||||
metadata/_custom_type_script = "uid://dpakv7agvir6y"
|
||||
8
forge/resources/tag_containers/on_enemy_try_hit.tres
Normal file
8
forge/resources/tag_containers/on_enemy_try_hit.tres
Normal file
@@ -0,0 +1,8 @@
|
||||
[gd_resource type="Resource" script_class="ForgeTag" format=3 uid="uid://csh8jcxtrs11k"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://dpakv7agvir6y" path="res://addons/forge/resources/ForgeTag.cs" id="1_3ab6s"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_3ab6s")
|
||||
Tag = "events.enemy.try_hit"
|
||||
metadata/_custom_type_script = "uid://dpakv7agvir6y"
|
||||
8
forge/resources/tag_containers/on_knockback_dealt.tres
Normal file
8
forge/resources/tag_containers/on_knockback_dealt.tres
Normal file
@@ -0,0 +1,8 @@
|
||||
[gd_resource type="Resource" script_class="ForgeTagContainer" format=3 uid="uid://bhn27s8ne0uyg"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://cw525n4mjqgw0" path="res://addons/forge/resources/ForgeTagContainer.cs" id="1_kgxiq"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_kgxiq")
|
||||
ContainerTags = Array[String](["events.combat.knockback_dealt"])
|
||||
metadata/_custom_type_script = "uid://cw525n4mjqgw0"
|
||||
@@ -0,0 +1,8 @@
|
||||
[gd_resource type="Resource" script_class="ForgeTagContainer" format=3 uid="uid://bkr6uu57wm3o3"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://cw525n4mjqgw0" path="res://addons/forge/resources/ForgeTagContainer.cs" id="1_ro1gp"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_ro1gp")
|
||||
ContainerTags = Array[String](["events.combat.knockback_received"])
|
||||
metadata/_custom_type_script = "uid://cw525n4mjqgw0"
|
||||
@@ -0,0 +1,8 @@
|
||||
[gd_resource type="Resource" script_class="ForgeTagContainer" format=3 uid="uid://bk3rv5jrutfjw"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://cw525n4mjqgw0" path="res://addons/forge/resources/ForgeTagContainer.cs" id="1_gt2iq"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_gt2iq")
|
||||
ContainerTags = Array[String](["events.weapon.plantedtick"])
|
||||
metadata/_custom_type_script = "uid://cw525n4mjqgw0"
|
||||
8
forge/resources/tag_containers/trait_damageable.tres
Normal file
8
forge/resources/tag_containers/trait_damageable.tres
Normal file
@@ -0,0 +1,8 @@
|
||||
[gd_resource type="Resource" script_class="ForgeTagContainer" format=3 uid="uid://bsogx7yhedjry"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://cw525n4mjqgw0" path="res://addons/forge/resources/ForgeTagContainer.cs" id="1_wyb42"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_wyb42")
|
||||
ContainerTags = Array[String](["traits.damageable"])
|
||||
metadata/_custom_type_script = "uid://cw525n4mjqgw0"
|
||||
@@ -1,12 +0,0 @@
|
||||
using Gamesmiths.Forge.Abilities;
|
||||
using Gamesmiths.Forge.Effects;
|
||||
using Gamesmiths.Forge.Tags;
|
||||
using Godot;
|
||||
|
||||
namespace Movementtests.interfaces;
|
||||
|
||||
public interface IAbilityBase<TCreation, TPayload>
|
||||
{
|
||||
AbilityData Ability(TCreation creationData, TagContainer? tags);
|
||||
IAbilityBehavior<TPayload> Behavior(TCreation creationData);
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
uid://de881c2xsbutk
|
||||
@@ -1,9 +0,0 @@
|
||||
using Godot;
|
||||
|
||||
namespace Movementtests.interfaces;
|
||||
|
||||
public interface IDamageDealer
|
||||
{
|
||||
[Export]
|
||||
RDamage RDamage { get; set; }
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
uid://wdqo51131g5
|
||||
@@ -1,14 +0,0 @@
|
||||
using System;
|
||||
using Godot;
|
||||
|
||||
namespace Movementtests.interfaces;
|
||||
|
||||
public record DamageRecord(Vector3 SourceLocation, RDamage Damage);
|
||||
|
||||
public interface IDamageable
|
||||
{
|
||||
event Action<IDamageable, DamageRecord> DamageTaken;
|
||||
|
||||
DamageRecord TakeDamage(DamageRecord damageRecord);
|
||||
DamageRecord ComputeDamage(DamageRecord damageRecord);
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
uid://cf56b2ep3bu3j
|
||||
12
interfaces/IDisableable.cs
Normal file
12
interfaces/IDisableable.cs
Normal file
@@ -0,0 +1,12 @@
|
||||
using Godot;
|
||||
|
||||
namespace Movementtests.interfaces;
|
||||
|
||||
public interface IDisableable
|
||||
{
|
||||
bool IsDisabled { get; set; }
|
||||
[Export] float DisableDuration { get; set; }
|
||||
|
||||
void Disable();
|
||||
void Enable();
|
||||
}
|
||||
@@ -1,18 +0,0 @@
|
||||
using System;
|
||||
using Godot;
|
||||
|
||||
namespace Movementtests.interfaces;
|
||||
|
||||
public record HealthChangedRecord(float CurrentHealth, float PreviousHealth, float MaxHealth);
|
||||
|
||||
public interface IHealthable
|
||||
{
|
||||
event Action<IHealthable, HealthChangedRecord> HealthChanged;
|
||||
event Action<IHealthable> HealthDepleted;
|
||||
|
||||
[Export] RHealth? RHealth { get; set; }
|
||||
|
||||
float CurrentHealth { get; set; }
|
||||
|
||||
HealthChangedRecord ReduceHealth(IDamageable source, DamageRecord damageRecord);
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
uid://bea2kvnu3kuhu
|
||||
@@ -2,5 +2,5 @@ namespace Movementtests.interfaces;
|
||||
|
||||
public interface IKillable
|
||||
{
|
||||
void Kill(IHealthable source);
|
||||
void Kill();
|
||||
}
|
||||
@@ -1,8 +1,9 @@
|
||||
using Godot;
|
||||
using Movementtests.scenes.components.knockback;
|
||||
|
||||
namespace Movementtests.interfaces;
|
||||
|
||||
public record KnockbackRecord(DamageRecord DamageRecord, float ForceMultiplier = 1.0f);
|
||||
public record KnockbackRecord(Vector3 Direction, float ForceMultiplier = 1.0f);
|
||||
|
||||
public interface IKnockbackable
|
||||
{
|
||||
|
||||
@@ -5,9 +5,10 @@ namespace Movementtests.interfaces;
|
||||
public record MovementInputs(
|
||||
Vector3 Velocity = default,
|
||||
Vector3 TargetLocation = default,
|
||||
bool isOnFloor = false,
|
||||
Vector3 gravity = default,
|
||||
double delta = 0);
|
||||
bool IsOnFloor = false,
|
||||
bool IsStunned = false,
|
||||
Vector3 Gravity = default,
|
||||
double Delta = 0);
|
||||
|
||||
public interface IMoveable
|
||||
{
|
||||
|
||||
@@ -3,5 +3,5 @@ using Godot;
|
||||
|
||||
interface ISpawnable
|
||||
{
|
||||
void Initialize();
|
||||
void Init();
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
using Godot;
|
||||
|
||||
namespace Movementtests.interfaces;
|
||||
|
||||
public interface IStunnable
|
||||
{
|
||||
bool IsStunned { get; set; }
|
||||
[Export] float StunDuration { get; set; }
|
||||
|
||||
void Stun();
|
||||
void Unstun();
|
||||
}
|
||||
@@ -5,10 +5,6 @@ namespace Movementtests.interfaces;
|
||||
|
||||
public static class NodeExtensions
|
||||
{
|
||||
public static IDamageable[] ToIDamageables(this GodotObject[] nodes)
|
||||
{
|
||||
return nodes == null ? System.Array.Empty<IDamageable>() : nodes.OfType<IDamageable>().ToArray();
|
||||
}
|
||||
public static IKillable[] ToIKillables(this GodotObject[] nodes)
|
||||
{
|
||||
return nodes == null ? System.Array.Empty<IKillable>() : nodes.OfType<IKillable>().ToArray();
|
||||
|
||||
86
managers/Inventory/InventoryManager.cs
Normal file
86
managers/Inventory/InventoryManager.cs
Normal file
@@ -0,0 +1,86 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Chickensoft.AutoInject;
|
||||
using Chickensoft.Introspection;
|
||||
using Chickensoft.Sync.Primitives;
|
||||
using Gamesmiths.Forge.Godot.Resources.Abilities;
|
||||
using Godot;
|
||||
using Movementtests.systems;
|
||||
|
||||
namespace Movementtests.managers;
|
||||
|
||||
|
||||
[GlobalClass, Meta(typeof(IAutoNode))]
|
||||
public partial class InventoryManager : Node, IDisposable
|
||||
{
|
||||
public override void _Notification(int what) => this.Notify(what);
|
||||
|
||||
private AutoSet<ForgeAbilityBehavior> _startedFlyingAbilities = new();
|
||||
private AutoSet<ForgeAbilityBehavior> _flyingTickAbilities = new();
|
||||
private AutoSet<ForgeAbilityBehavior> _stoppedFlyingAbilities = new();
|
||||
|
||||
private AutoSet<ForgeAbilityBehavior> _startedPlantedAbilities = new();
|
||||
private AutoSet<ForgeAbilityBehavior> _plantedTickAbilities = new();
|
||||
private AutoSet<ForgeAbilityBehavior> _stoppedPlantedAbilities = new();
|
||||
|
||||
public IAutoSet<ForgeAbilityBehavior> StartedFlyingAbilities => _startedFlyingAbilities;
|
||||
public IAutoSet<ForgeAbilityBehavior> FlyingTickAbilities => _flyingTickAbilities;
|
||||
public IAutoSet<ForgeAbilityBehavior> StoppedFlyingAbilities => _stoppedFlyingAbilities;
|
||||
|
||||
public IAutoSet<ForgeAbilityBehavior> StartedPlantedAbilities => _startedPlantedAbilities;
|
||||
public IAutoSet<ForgeAbilityBehavior> PlantedTickAbilities => _plantedTickAbilities;
|
||||
public IAutoSet<ForgeAbilityBehavior> StoppedPlantedAbilities => _stoppedPlantedAbilities;
|
||||
|
||||
private readonly AutoMap<WeaponSystem.WeaponEvent, AutoSet<ForgeAbilityBehavior>> _weaponEventsInventory = new();
|
||||
public IAutoMap<WeaponSystem.WeaponEvent, AutoSet<ForgeAbilityBehavior>> WeaponEventsInventory => _weaponEventsInventory;
|
||||
|
||||
public void OnReady()
|
||||
{
|
||||
_weaponEventsInventory[WeaponSystem.WeaponEvent.StartedFlying] = _startedFlyingAbilities;
|
||||
_weaponEventsInventory[WeaponSystem.WeaponEvent.StoppedFlying] = _stoppedFlyingAbilities;
|
||||
_weaponEventsInventory[WeaponSystem.WeaponEvent.FlyingTick] = _flyingTickAbilities;
|
||||
_weaponEventsInventory[WeaponSystem.WeaponEvent.StartedPlanted] = _startedPlantedAbilities;
|
||||
_weaponEventsInventory[WeaponSystem.WeaponEvent.StoppedPlanted] = _stoppedPlantedAbilities;
|
||||
_weaponEventsInventory[WeaponSystem.WeaponEvent.PlantedTick] = _plantedTickAbilities;
|
||||
}
|
||||
|
||||
public void InitializeFromResource(WeaponInventory inventory)
|
||||
{
|
||||
var eventMap = inventory.GetEventAbilitiesMap();
|
||||
_startedFlyingAbilities = new AutoSet<ForgeAbilityBehavior>(eventMap[WeaponSystem.WeaponEvent.StartedFlying]);
|
||||
_stoppedFlyingAbilities = new AutoSet<ForgeAbilityBehavior>(eventMap[WeaponSystem.WeaponEvent.StoppedFlying]);
|
||||
_flyingTickAbilities = new AutoSet<ForgeAbilityBehavior>(eventMap[WeaponSystem.WeaponEvent.FlyingTick]);
|
||||
|
||||
_startedPlantedAbilities = new AutoSet<ForgeAbilityBehavior>(eventMap[WeaponSystem.WeaponEvent.StartedPlanted]);
|
||||
_stoppedPlantedAbilities = new AutoSet<ForgeAbilityBehavior>(eventMap[WeaponSystem.WeaponEvent.StoppedPlanted]);
|
||||
_plantedTickAbilities = new AutoSet<ForgeAbilityBehavior>(eventMap[WeaponSystem.WeaponEvent.PlantedTick]);
|
||||
}
|
||||
|
||||
public new void Dispose()
|
||||
{
|
||||
GC.SuppressFinalize(this);
|
||||
|
||||
_startedFlyingAbilities.Dispose();
|
||||
_stoppedFlyingAbilities.Dispose();
|
||||
_flyingTickAbilities.Dispose();
|
||||
_startedPlantedAbilities.Dispose();
|
||||
_stoppedPlantedAbilities.Dispose();
|
||||
_plantedTickAbilities.Dispose();
|
||||
|
||||
_weaponEventsInventory.Dispose();
|
||||
|
||||
base.Dispose();
|
||||
}
|
||||
|
||||
public void AddAbilityForWeaponEvent(WeaponSystem.WeaponEvent forEvent, ForgeAbilityBehavior abilityBehavior)
|
||||
{
|
||||
var inventoryForEvent = _weaponEventsInventory[forEvent];
|
||||
inventoryForEvent.Add(abilityBehavior);
|
||||
}
|
||||
|
||||
public void RemoveAbilityForWeaponEvent(WeaponSystem.WeaponEvent forEvent, ForgeAbilityBehavior abilityBehavior)
|
||||
{
|
||||
var inventoryForEvent = _weaponEventsInventory[forEvent];
|
||||
inventoryForEvent.Remove(abilityBehavior);
|
||||
}
|
||||
}
|
||||
1
managers/Inventory/InventoryManager.cs.uid
Normal file
1
managers/Inventory/InventoryManager.cs.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://cgwhrwfqsiing
|
||||
51
managers/Inventory/WeaponInventory.cs
Normal file
51
managers/Inventory/WeaponInventory.cs
Normal file
@@ -0,0 +1,51 @@
|
||||
using System.Collections.Generic;
|
||||
using Gamesmiths.Forge.Godot.Resources.Abilities;
|
||||
using Godot;
|
||||
using Movementtests.systems;
|
||||
|
||||
namespace Movementtests.managers;
|
||||
|
||||
[GlobalClass]
|
||||
public partial class WeaponInventory(
|
||||
ForgeAbilityBehavior[] onWeaponStartedFlyingAbilities,
|
||||
ForgeAbilityBehavior[] onWeaponFlyingTickAbilities,
|
||||
ForgeAbilityBehavior[] onWeaponStoppedFlyingAbilities,
|
||||
ForgeAbilityBehavior[] onWeaponStartedPlantedAbilities,
|
||||
ForgeAbilityBehavior[] onWeaponPlantedTickAbilities,
|
||||
ForgeAbilityBehavior[] onWeaponStoppedPlantedAbilities
|
||||
) : Resource
|
||||
{
|
||||
[ExportGroup("Flying abilities")]
|
||||
[Export]
|
||||
public ForgeAbilityBehavior[] OnWeaponStartedFlyingAbilities { get; set; } = onWeaponStartedFlyingAbilities;
|
||||
[Export]
|
||||
public ForgeAbilityBehavior[] OnWeaponFlyingTickAbilities { get; set; } = onWeaponFlyingTickAbilities;
|
||||
[Export]
|
||||
public ForgeAbilityBehavior[] OnWeaponStoppedFlyingAbilities { get; set; } = onWeaponStoppedFlyingAbilities;
|
||||
|
||||
[ExportGroup("Planted abilities")]
|
||||
[Export]
|
||||
public ForgeAbilityBehavior[] OnWeaponStartedPlantedAbilities { get; set; } = onWeaponStartedPlantedAbilities;
|
||||
[Export]
|
||||
public ForgeAbilityBehavior[] OnWeaponPlantedTickAbilities { get; set; } = onWeaponPlantedTickAbilities;
|
||||
[Export]
|
||||
public ForgeAbilityBehavior[] OnWeaponStoppedPlantedAbilities { get; set; } = onWeaponStoppedPlantedAbilities;
|
||||
|
||||
public WeaponInventory() : this([], [], [], [], [], [])
|
||||
{
|
||||
}
|
||||
|
||||
public Dictionary<WeaponSystem.WeaponEvent, ForgeAbilityBehavior[]> GetEventAbilitiesMap()
|
||||
{
|
||||
return new Dictionary<WeaponSystem.WeaponEvent, ForgeAbilityBehavior[]>
|
||||
{
|
||||
{ WeaponSystem.WeaponEvent.StartedFlying, OnWeaponStartedFlyingAbilities },
|
||||
{ WeaponSystem.WeaponEvent.StoppedFlying, OnWeaponStoppedFlyingAbilities },
|
||||
{ WeaponSystem.WeaponEvent.FlyingTick, OnWeaponFlyingTickAbilities },
|
||||
|
||||
{ WeaponSystem.WeaponEvent.StartedPlanted, OnWeaponStartedPlantedAbilities },
|
||||
{ WeaponSystem.WeaponEvent.StoppedPlanted, OnWeaponStoppedPlantedAbilities },
|
||||
{ WeaponSystem.WeaponEvent.PlantedTick, OnWeaponPlantedTickAbilities },
|
||||
};
|
||||
}
|
||||
}
|
||||
1
managers/Inventory/WeaponInventory.cs.uid
Normal file
1
managers/Inventory/WeaponInventory.cs.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://cgaahnfgxcrr6
|
||||
61
managers/TokenManager.cs
Normal file
61
managers/TokenManager.cs
Normal file
@@ -0,0 +1,61 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Chickensoft.AutoInject;
|
||||
using Chickensoft.Introspection;
|
||||
using Godot;
|
||||
|
||||
namespace Movementtests.managers;
|
||||
|
||||
[GlobalClass, Meta(typeof(IAutoNode))]
|
||||
public partial class TokenManager : Node
|
||||
{
|
||||
public override void _Notification(int what) => this.Notify(what);
|
||||
|
||||
public record struct Token(ulong InstanceId, Action OnUse);
|
||||
|
||||
private Dictionary<ulong, Token> Tokens { get; set; } = [];
|
||||
public int TokenCount => Tokens.Count;
|
||||
|
||||
private Queue<ulong> RequestQueue { get; set; } = [];
|
||||
|
||||
public int MaxTokens { get; set;}
|
||||
|
||||
public void Initialize(int maxTokens)
|
||||
{
|
||||
MaxTokens = maxTokens;
|
||||
}
|
||||
|
||||
public Token? RequestToken(Node owner)
|
||||
{
|
||||
if (Tokens.ContainsKey(owner.GetInstanceId()))
|
||||
{
|
||||
GD.Print("Already has a token");
|
||||
return null; // Already has a token
|
||||
}
|
||||
if (TokenCount >= MaxTokens)
|
||||
{
|
||||
GD.Print($"Max tokens reached: {TokenCount}");
|
||||
return null; // Max tokens reached
|
||||
}
|
||||
if (!RequestQueue.Contains(owner.GetInstanceId()))
|
||||
{
|
||||
RequestQueue.Enqueue(owner.GetInstanceId());
|
||||
}
|
||||
if (RequestQueue.First() != owner.GetInstanceId())
|
||||
{
|
||||
GD.Print("Waiting its turn");
|
||||
return null; // Next in line is not the requester
|
||||
}
|
||||
|
||||
var ownerInstanceId = RequestQueue.Dequeue();
|
||||
var token = new Token(ownerInstanceId, () => UseToken(ownerInstanceId));
|
||||
Tokens.Add(token.InstanceId, token);
|
||||
return token;
|
||||
}
|
||||
|
||||
public void UseToken(ulong instanceId)
|
||||
{
|
||||
Tokens.Remove(instanceId);
|
||||
}
|
||||
}
|
||||
1
managers/TokenManager.cs.uid
Normal file
1
managers/TokenManager.cs.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://ckrhgyv5lv6xa
|
||||
22
managers/Wave/EnemyDescription.cs
Normal file
22
managers/Wave/EnemyDescription.cs
Normal file
@@ -0,0 +1,22 @@
|
||||
using Godot;
|
||||
|
||||
namespace Movementtests.managers;
|
||||
|
||||
[GlobalClass]
|
||||
public partial class EnemyDescription(PackedScene scene, EnemyDescription.EnemyType type, RMovement? movementOverride) : Resource
|
||||
{
|
||||
public enum EnemyType
|
||||
{
|
||||
Normal,
|
||||
Flying,
|
||||
Projectile,
|
||||
}
|
||||
|
||||
[Export(PropertyHint.NodeType)] public required PackedScene Scene { get; set; } = scene;
|
||||
|
||||
[Export] public required EnemyType Type { get; set; } = type;
|
||||
|
||||
[Export] public RMovement? MovementOverride { get; set; } = movementOverride;
|
||||
|
||||
public EnemyDescription() : this(ResourceLoader.Load<PackedScene>("uid://dxt0e2ugmttqq"), EnemyType.Normal, null) {}
|
||||
}
|
||||
1
managers/Wave/EnemyDescription.cs.uid
Normal file
1
managers/Wave/EnemyDescription.cs.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://rhdkfi7nuvu1
|
||||
13
managers/Wave/SingleWave.cs
Normal file
13
managers/Wave/SingleWave.cs
Normal file
@@ -0,0 +1,13 @@
|
||||
using System.Collections.Generic;
|
||||
using Godot;
|
||||
|
||||
namespace Movementtests.managers;
|
||||
|
||||
|
||||
[GlobalClass]
|
||||
public partial class SingleWave(EnemyDescription[] enemies) : Resource
|
||||
{
|
||||
[Export] public Godot.Collections.Dictionary<EnemyDescription, int> EnemiesToSpawn { get; set; } = [];
|
||||
|
||||
public SingleWave() : this([]) {}
|
||||
}
|
||||
1
managers/Wave/SingleWave.cs.uid
Normal file
1
managers/Wave/SingleWave.cs.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://cr8wog705ane6
|
||||
11
managers/Wave/WaveContent.cs
Normal file
11
managers/Wave/WaveContent.cs
Normal file
@@ -0,0 +1,11 @@
|
||||
using Godot;
|
||||
|
||||
namespace Movementtests.managers;
|
||||
|
||||
[GlobalClass]
|
||||
public partial class WaveContent(SingleWave[] waves) : Resource
|
||||
{
|
||||
[Export] public SingleWave[] Waves { get; set; } = waves;
|
||||
|
||||
public WaveContent() : this([]) {}
|
||||
}
|
||||
1
managers/Wave/WaveContent.cs.uid
Normal file
1
managers/Wave/WaveContent.cs.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://dijmv0wqc1xuv
|
||||
121
managers/Wave/WaveManager.cs
Normal file
121
managers/Wave/WaveManager.cs
Normal file
@@ -0,0 +1,121 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Chickensoft.AutoInject;
|
||||
using Chickensoft.Collections;
|
||||
using Chickensoft.Introspection;
|
||||
using Godot;
|
||||
using Movementtests.tools;
|
||||
|
||||
namespace Movementtests.managers;
|
||||
|
||||
|
||||
[GlobalClass, Meta(typeof(IAutoNode))]
|
||||
public partial class WaveManager : Node
|
||||
{
|
||||
public override void _Notification(int what) => this.Notify(what);
|
||||
|
||||
public WaveContent WaveContent { get; set; }
|
||||
|
||||
public int CurrentWaveIndex { get; set; }
|
||||
public int CurrentWaveCount => WaveContent.Waves.Length;
|
||||
|
||||
public Godot.Collections.Dictionary<EnemyDescription, int> CurrentWave =>
|
||||
WaveContent.Waves[CurrentWaveIndex].EnemiesToSpawn;
|
||||
|
||||
public Dictionary<ulong, Enemy?> CurrentSpawnedEnemies { get; set; } = [];
|
||||
public Set<Spawner> SpawnersInUse { get; set; } = [];
|
||||
|
||||
public List<Spawner> Spawners { get; set; } = [];
|
||||
public void RegisterSpawner(Spawner spawner) => Spawners.Add(spawner);
|
||||
|
||||
public void InitializeFromResource(WaveContent waveContent) => WaveContent = waveContent;
|
||||
|
||||
public void StartWaves()
|
||||
{
|
||||
CurrentWaveIndex = 0;
|
||||
StartNextWave();
|
||||
}
|
||||
|
||||
public void StartNextWave()
|
||||
{
|
||||
if (CurrentWave.Count == 0)
|
||||
{
|
||||
GD.PrintErr("Wave has no enemies");
|
||||
return;
|
||||
}
|
||||
|
||||
if (Spawners.Count == 0)
|
||||
{
|
||||
GD.PrintErr("No spawners registered");
|
||||
return;
|
||||
}
|
||||
|
||||
SpawnEnemiesAsAvailable();
|
||||
}
|
||||
|
||||
public void SpawnEnemiesAsAvailable()
|
||||
{
|
||||
var randomizedSpawners = Spawners.ToArray();
|
||||
randomizedSpawners.Shuffle();
|
||||
|
||||
foreach (var spawner in randomizedSpawners)
|
||||
{
|
||||
if (SpawnersInUse.Contains(spawner)) continue;
|
||||
foreach (var (enemyDescription, numberRemaining) in CurrentWave)
|
||||
{
|
||||
if (numberRemaining <= 0) continue;
|
||||
if (!spawner.SupportedEnemyTypes.Contains(enemyDescription.Type)) continue;
|
||||
|
||||
var spawnedEnemy = spawner.SpawnEnemy(enemyDescription);
|
||||
if (spawnedEnemy == null) continue;
|
||||
|
||||
CurrentSpawnedEnemies[spawnedEnemy.GetInstanceId()] = spawnedEnemy;
|
||||
SpawnersInUse.Add(spawner);
|
||||
|
||||
spawnedEnemy.OnKilled += instanceId=> SpawnedEnemyDied(instanceId, spawner);
|
||||
|
||||
CurrentWave[enemyDescription]--;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// foreach (var (enemyDescription, numberRemaining) in CurrentWave)
|
||||
// {
|
||||
// if (numberRemaining <= 0) continue;
|
||||
// foreach (var spawner in randomizedSpawners)
|
||||
// {
|
||||
// if (!spawner.SupportedEnemyTypes.Contains(enemyDescription.Type)) continue;
|
||||
// if (SpawnersInUse.Contains(spawner)) continue;
|
||||
//
|
||||
// var spawnedEnemy = spawner.SpawnEnemy(enemyDescription);
|
||||
// if (spawnedEnemy == null) continue;
|
||||
//
|
||||
// CurrentSpawnedEnemies[spawnedEnemy.GetInstanceId()] = spawnedEnemy;
|
||||
// SpawnersInUse.Add(spawner);
|
||||
//
|
||||
// spawnedEnemy.OnKilled += instanceId=> SpawnedEnemyDied(instanceId, spawner);
|
||||
//
|
||||
// CurrentWave[enemyDescription]--;
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
|
||||
var remainingEnemiesToSpawn = CurrentWave.Values.Sum();
|
||||
if (remainingEnemiesToSpawn <= 0) return; // Wave is fully spawned
|
||||
GetTree().CreateTimer(1.0f).Timeout += SpawnEnemiesAsAvailable; // Call back the same function later to try and spawn the rest
|
||||
}
|
||||
|
||||
public void SpawnedEnemyDied(ulong instanceId, Spawner spawner)
|
||||
{
|
||||
CurrentSpawnedEnemies.Remove(instanceId);
|
||||
SpawnersInUse.Remove(spawner);
|
||||
if (CurrentSpawnedEnemies.Count == 0) FinishWave();
|
||||
}
|
||||
|
||||
public void FinishWave()
|
||||
{
|
||||
if (CurrentWaveIndex >= CurrentWaveCount) return; // All waves finished
|
||||
CurrentWaveIndex++;
|
||||
GetTree().CreateTimer(1.0f).Timeout += StartNextWave; // Start next wave in 1s
|
||||
}
|
||||
}
|
||||
1
managers/Wave/WaveManager.cs.uid
Normal file
1
managers/Wave/WaveManager.cs.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://cprjrwfk8d0vf
|
||||
12
managers/Wave/resources/flying_enemy_desc.tres
Normal file
12
managers/Wave/resources/flying_enemy_desc.tres
Normal file
@@ -0,0 +1,12 @@
|
||||
[gd_resource type="Resource" script_class="EnemyDescription" format=3 uid="uid://cfyafss8ncbhh"]
|
||||
|
||||
[ext_resource type="Resource" uid="uid://bwqjaom4k7rc3" path="res://scenes/enemies/flying_enemy/flying_enemy_movement.tres" id="1_hsb6g"]
|
||||
[ext_resource type="PackedScene" uid="uid://cmlud1hwkd6sv" path="res://scenes/enemies/flying_enemy/flying_enemy.tscn" id="1_yvgr4"]
|
||||
[ext_resource type="Script" uid="uid://rhdkfi7nuvu1" path="res://managers/Wave/EnemyDescription.cs" id="2_hsb6g"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("2_hsb6g")
|
||||
Scene = ExtResource("1_yvgr4")
|
||||
Type = 1
|
||||
MovementOverride = ExtResource("1_hsb6g")
|
||||
metadata/_custom_type_script = "uid://rhdkfi7nuvu1"
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user