Trying custom execution periodic data

This commit is contained in:
2026-03-28 18:20:47 +01:00
parent cc70fb361b
commit ef454e9502
5 changed files with 36 additions and 54 deletions

View File

@@ -11,6 +11,7 @@ public partial class ForgeManager : Node
[ [
// entities // entities
"character.player", "character.player",
"character.enemy",
"weapon", "weapon",
// Statuses // Statuses

View File

@@ -5,63 +5,25 @@ using Gamesmiths.Forge.Effects;
using Gamesmiths.Forge.Effects.Calculator; using Gamesmiths.Forge.Effects.Calculator;
using Gamesmiths.Forge.Effects.Magnitudes; using Gamesmiths.Forge.Effects.Magnitudes;
using Gamesmiths.Forge.Effects.Modifiers; using Gamesmiths.Forge.Effects.Modifiers;
using Gamesmiths.Forge.Events;
using Godot; using Godot;
using Movementtests.systems;
namespace Movementtests.tools.calculators; namespace Movementtests.tools.calculators;
public class FlyingWeaponExecution : CustomExecution public class FlyingWeaponExecution(WeaponSystem weaponSystem) : CustomExecution
{ {
private readonly Node3D _comboSystem;
public AttributeCaptureDefinition TargetHealth { get; }
public AttributeCaptureDefinition AttackerStrength { get; }
public FlyingWeaponExecution()
{
TargetHealth = new AttributeCaptureDefinition(
"CombatAttributeSet.CurrentHealth",
AttributeCaptureSource.Target,
Snapshot: false);
AttackerStrength = new AttributeCaptureDefinition(
"StatAttributeSet.Strength",
AttributeCaptureSource.Source,
Snapshot: true);
AttributesToCapture.Add(TargetHealth);
AttributesToCapture.Add(AttackerStrength);
CustomCueParameters.Add("cues.combat.combo_count", 0);
CustomCueParameters.Add("cues.combat.combo_damage", 0f);
}
public override ModifierEvaluatedData[] EvaluateExecution(Effect effect, IForgeEntity target, EffectEvaluatedData? effectEvaluatedData) public override ModifierEvaluatedData[] EvaluateExecution(Effect effect, IForgeEntity target, EffectEvaluatedData? effectEvaluatedData)
{ {
var results = new List<ModifierEvaluatedData>(); GD.Print("Custom execution executed");
weaponSystem.Events.Raise(new EventData<WeaponFlyingPayload>
int strength = CaptureAttributeMagnitude(AttackerStrength, effect, target, effectEvaluatedData);
int comboCount = 0;
// Calculate combo damage
float baseDamage = strength * 0.8f;
float comboDamage = baseDamage * (1 + comboCount * 0.2f);
// Apply health damage
if (TargetHealth.TryGetAttribute(target, out EntityAttribute? healthAttribute))
{ {
results.Add(new ModifierEvaluatedData( EventTags = weaponSystem.WeaponFlyingTickTag.GetSingleTagContainer()!,
healthAttribute, Source = weaponSystem,
ModifierOperation.FlatBonus, EventMagnitude = 12f,
-comboDamage, // Negative for damage Payload = new WeaponFlyingPayload(Message: "flying")
channel: 0 });
));
}
// Add combo to cue parameters return [];
CustomCueParameters["cues.combat.combo_count"] = comboCount;
CustomCueParameters["cues.combat.combo_damage"] = comboDamage;
return results.ToArray();
} }
} }

View File

@@ -90,8 +90,7 @@ public partial class Enemy : CharacterBody3D,
var baseTags = new TagContainer( var baseTags = new TagContainer(
forgeManager.TagsManager, forgeManager.TagsManager,
[ [
Tag.RequestTag(forgeManager.TagsManager, "character.player"), Tag.RequestTag(forgeManager.TagsManager, "character.enemy")
Tag.RequestTag(forgeManager.TagsManager, "class.warrior")
]); ]);
Attributes = new EntityAttributes(new EnemyAttributeSet()); Attributes = new EntityAttributes(new EnemyAttributeSet());

View File

@@ -106,7 +106,7 @@ public partial class WeaponSystem : RigidBody3D, IDamageDealer, IForgeEntity
FlyingState.StateEntered += FlyingStarted; FlyingState.StateEntered += FlyingStarted;
FlyingState.StateExited += FlyingEnded; FlyingState.StateExited += FlyingEnded;
WeaponFlyingTick.Timeout += RaiseWeaponFlyingTickEvent; // WeaponFlyingTick.Timeout += RaiseWeaponFlyingTickEvent;
} }
public void FlyingStarted() public void FlyingStarted()

View File

@@ -3,6 +3,7 @@ using System.Collections.Generic;
using Gamesmiths.Forge.Abilities; using Gamesmiths.Forge.Abilities;
using Gamesmiths.Forge.Core; using Gamesmiths.Forge.Core;
using Gamesmiths.Forge.Effects; using Gamesmiths.Forge.Effects;
using Gamesmiths.Forge.Effects.Calculator;
using Gamesmiths.Forge.Effects.Components; using Gamesmiths.Forge.Effects.Components;
using Gamesmiths.Forge.Effects.Duration; using Gamesmiths.Forge.Effects.Duration;
using Gamesmiths.Forge.Effects.Magnitudes; using Gamesmiths.Forge.Effects.Magnitudes;
@@ -22,6 +23,7 @@ using Movementtests.player_controller.Scripts;
using Movementtests.scenes.player_controller.scripts; using Movementtests.scenes.player_controller.scripts;
using Movementtests.tools; using Movementtests.tools;
using Movementtests.forge.abilities; using Movementtests.forge.abilities;
using Movementtests.tools.calculators;
using Movementtests.tools.effects; using Movementtests.tools.effects;
using RustyOptions; using RustyOptions;
@@ -772,6 +774,17 @@ public partial class PlayerController : CharacterBody3D,
EffectsManager.ApplyEffect(new Effect(flyingGrantEffect, new EffectOwnership(this, this))); EffectsManager.ApplyEffect(new Effect(flyingGrantEffect, new EffectOwnership(this, this)));
flyingWeaponEffect = new EffectData(
"Flying Weapon",
new DurationData(DurationType.Infinite),
customExecutions:
[
new FlyingWeaponExecution(WeaponSystem)
],
periodicData: new PeriodicData(new ScalableFloat(1f), false, PeriodInhibitionRemovedPolicy.ResetPeriod)
);
flyingWeaponEffectHandle = EffectsManager.ApplyEffect(new Effect(flyingWeaponEffect, new EffectOwnership(this, this)));
flyingWeaponEffectHandle?.SetInhibit(true);
} }
// Forge events // Forge events
var weaponLeftToken = WeaponSystem.Events.Subscribe<WeaponLeftPayload>(WeaponSystem.WeaponLeftTag, OnWeaponLeft); var weaponLeftToken = WeaponSystem.Events.Subscribe<WeaponLeftPayload>(WeaponSystem.WeaponLeftTag, OnWeaponLeft);
@@ -779,8 +792,13 @@ public partial class PlayerController : CharacterBody3D,
var weaponLandedToken = WeaponSystem.Events.Subscribe<WeaponLandPayload>(WeaponSystem.WeaponLandTag, OnWeaponLanded); var weaponLandedToken = WeaponSystem.Events.Subscribe<WeaponLandPayload>(WeaponSystem.WeaponLandTag, OnWeaponLanded);
} }
private EffectData flyingWeaponEffect;
private ActiveEffectHandle? flyingWeaponEffectHandle;
public void OnWeaponLeft(EventData<WeaponLeftPayload> data) public void OnWeaponLeft(EventData<WeaponLeftPayload> data)
{ {
//flyingWeaponEffectHandle?.SetInhibit(false);
var target = data.Target; var target = data.Target;
var tagsManager = ForgeManager.GetTagsManager(this); var tagsManager = ForgeManager.GetTagsManager(this);
@@ -791,6 +809,8 @@ public partial class PlayerController : CharacterBody3D,
public void OnWeaponLanded(EventData<WeaponLandPayload> data) public void OnWeaponLanded(EventData<WeaponLandPayload> data)
{ {
flyingWeaponEffectHandle?.SetInhibit(true);
var source = data.Source; var source = data.Source;
var target = data.Target; var target = data.Target;
var magnitude = data.EventMagnitude; var magnitude = data.EventMagnitude;