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
"character.player",
"character.enemy",
"weapon",
// Statuses

View File

@@ -5,63 +5,25 @@ using Gamesmiths.Forge.Effects;
using Gamesmiths.Forge.Effects.Calculator;
using Gamesmiths.Forge.Effects.Magnitudes;
using Gamesmiths.Forge.Effects.Modifiers;
using Gamesmiths.Forge.Events;
using Godot;
using Movementtests.systems;
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)
{
var results = new List<ModifierEvaluatedData>();
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))
GD.Print("Custom execution executed");
weaponSystem.Events.Raise(new EventData<WeaponFlyingPayload>
{
results.Add(new ModifierEvaluatedData(
healthAttribute,
ModifierOperation.FlatBonus,
-comboDamage, // Negative for damage
channel: 0
));
}
// Add combo to cue parameters
CustomCueParameters["cues.combat.combo_count"] = comboCount;
CustomCueParameters["cues.combat.combo_damage"] = comboDamage;
return results.ToArray();
EventTags = weaponSystem.WeaponFlyingTickTag.GetSingleTagContainer()!,
Source = weaponSystem,
EventMagnitude = 12f,
Payload = new WeaponFlyingPayload(Message: "flying")
});
return [];
}
}

View File

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

View File

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

View File

@@ -3,6 +3,7 @@ using System.Collections.Generic;
using Gamesmiths.Forge.Abilities;
using Gamesmiths.Forge.Core;
using Gamesmiths.Forge.Effects;
using Gamesmiths.Forge.Effects.Calculator;
using Gamesmiths.Forge.Effects.Components;
using Gamesmiths.Forge.Effects.Duration;
using Gamesmiths.Forge.Effects.Magnitudes;
@@ -22,6 +23,7 @@ using Movementtests.player_controller.Scripts;
using Movementtests.scenes.player_controller.scripts;
using Movementtests.tools;
using Movementtests.forge.abilities;
using Movementtests.tools.calculators;
using Movementtests.tools.effects;
using RustyOptions;
@@ -771,7 +773,18 @@ public partial class PlayerController : CharacterBody3D,
);
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
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);
}
private EffectData flyingWeaponEffect;
private ActiveEffectHandle? flyingWeaponEffectHandle;
public void OnWeaponLeft(EventData<WeaponLeftPayload> data)
{
//flyingWeaponEffectHandle?.SetInhibit(false);
var target = data.Target;
var tagsManager = ForgeManager.GetTagsManager(this);
@@ -791,6 +809,8 @@ public partial class PlayerController : CharacterBody3D,
public void OnWeaponLanded(EventData<WeaponLandPayload> data)
{
flyingWeaponEffectHandle?.SetInhibit(true);
var source = data.Source;
var target = data.Target;
var magnitude = data.EventMagnitude;