Trying custom execution periodic data
This commit is contained in:
@@ -11,6 +11,7 @@ public partial class ForgeManager : Node
|
||||
[
|
||||
// entities
|
||||
"character.player",
|
||||
"character.enemy",
|
||||
"weapon",
|
||||
|
||||
// Statuses
|
||||
|
||||
@@ -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
|
||||
));
|
||||
}
|
||||
EventTags = weaponSystem.WeaponFlyingTickTag.GetSingleTagContainer()!,
|
||||
Source = weaponSystem,
|
||||
EventMagnitude = 12f,
|
||||
Payload = new WeaponFlyingPayload(Message: "flying")
|
||||
});
|
||||
|
||||
// Add combo to cue parameters
|
||||
CustomCueParameters["cues.combat.combo_count"] = comboCount;
|
||||
CustomCueParameters["cues.combat.combo_damage"] = comboDamage;
|
||||
|
||||
return results.ToArray();
|
||||
return [];
|
||||
}
|
||||
}
|
||||
@@ -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());
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -772,6 +774,17 @@ 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;
|
||||
|
||||
Reference in New Issue
Block a user