X6CHZAXRC53ABZQSK5QK5PP3QTNJOSGRFGJHNEQBLRSD2UB32AFQC
3AONCSBYJ6T2HXAZFLCJGGV6SRNYJW3PEJ5GMGN3FYB2NGPVIQIQC
J75RIWLT42QXABT6GQMAVIOP5XDUF7UAGFQUSSKDIULB3LEB22EQC
VZRSH4U473FCZOP5EXURPXXN5J6F3ZLT435YY7A2JHLG2ZZB5KLQC
754VCJRLAZAVIQP7STLUIHP3U7PUHBTYAHLNQK4A2H6IKYVNTDKAC
DTKCWM4J7PFNWAAES3RZHQGDA6PTDNX4TZVOXAKF5V7LCZBI3XUAC
TKLR43RQKXB47J2YVVSJ7CAZAJZYOKXSDUXAUOVQMFUN73KZVUVQC
3UN6NREN32ZBQW4EWI7ED4WVQILCU2EIE7DQGFWZR3OUDCO3ZSPQC
JAZ27QX53QXAN4JVMMX2KYKN4GCULWFMXYSPFZ5HWW4T7FUB5EHAC
FXM5KEZSKC2Z4LH4SEM6SSXN7WXH7B35MO4PQ4HMW5CFYFTCSNPQC
EISA46SXVFL3UEYJBHVU4RFWKRU5ZJNN7Q7ATAYKCTSAMSPLL7RAC
D4K77RTIZUI46DIDLVOR42DW3EP6IOMEAASAPZQ5XA2J7GEYFQIAC
XTNHXKSQ4PQS6CN3ATENRI7JUXU7DYZMRW4PBSEABN4S4VQHFUMAC
FNS4LRFQNFM4BCB23CYHOWA2N4MG2DEUMNK6D55BQ26TX6OJLIBQC
R475KN7MR3OG7EBLVNOO7QRIKXDGY2PIDXXV3HW4KBD5QM7B5OJQC
RZAMG2H2NY73KZJIV4VXLJHJVSRGJDRWWZJERAI6O7AVDW64JEQQC
RJXFDWT7OWTX3DQ7SBJFK6M66AQ2LGGIO32QD6G7VTJJS7U2R7XQC
NPTXIY5PL7XQUOFJ2WRAZUBHMC4OFZVF4EA74GBI63TJ4QXDKMAAC
33YYBTSQFQMGO5RYBAFYGX3L4N7YS4DT4CEJKB6ZVYCIIZGDQD2QC
IXGU2SOXBCQYBV3S5EHZFEFJKSCVUQPVZ3NY7KPG2UHWTEVGRZCAC
CD5FF75KTOBTMVMTMCKMR6F5DFKOF26I5K43ITNHGBI3ZAZHA4RAC
HXTSBPAP75A7EC4RKWYQMVPPHPNZFPHUORBZWDHGEB6MPAGI7G7AC
using System;
using TagFighter.Effects;
using TagFighter.Resources;
using UnityEngine;
namespace TagFighter
{
public class WeaveAction : IAction
{
FollowAction _followAction;
Transform _target;
Weaver _weaver;
RuneWeavingContainer _runeWeaving;
Resources.Range _range;
bool _startedWeaving = false;
static State s_resetState = new(true, 1f, false, default);
bool _disposed = false;
int _lastRange;
EffectContext _context;
ITimeContextContainer _timeContextContainer;
public WeaveAction(Weaver unit, RuneWeavingContainer runeWeaving, Transform target, Resources.Range range) {
if (range is null) {
throw new ArgumentNullException("range");
}
_target = target;
_range = range;
_weaver = unit;
_runeWeaving = runeWeaving;
var currentRange = _range.GetCurrent();
_lastRange = currentRange.AsPrimitive();
_followAction = new(_weaver, _target, currentRange.ToMeter());
_range.ResourceChanged += OnResourceChanged;
_context = new EffectContext() {
EffectLocation = target,
Caster = unit.transform
};
}
void OnResourceChanged(object sender, ResourceChangeArgs e) {
if (_lastRange != e.Current) {
_followAction.Dispose();
_followAction = new(_weaver, _target, _range.GetCurrent().ToMeter());
_lastRange = e.Current;
}
}
public IActionState Advance() {
var stateToReturn = _followAction.Advance();
if (IsInAttackRange()) {
if (_startedWeaving == false) {
Debug.Log("Target got in range, weaving");
_timeContextContainer = _runeWeaving.RuneWeaving.CreateTimeContexts();
}
_startedWeaving = true;
var isAdvanced = _runeWeaving.RuneWeaving.Advance(_timeContextContainer, _context, Time.deltaTime);
stateToReturn = new State(isAdvanced, CompletionStatus(), false, _runeWeaving.RuneWeaving.GetCurrentMove(_timeContextContainer));
}
else {
if (_startedWeaving) {
Debug.Log("Target escaped");
stateToReturn = new State(false, CompletionStatus(), stateToReturn.IsMoving, _runeWeaving.RuneWeaving.GetCurrentMove(_timeContextContainer));
}
}
return stateToReturn;
}
IActionState Cancel() {
_timeContextContainer = null;
return s_resetState;
}
public float CompletionStatus() => _runeWeaving.RuneWeaving.CompletionStatus(_timeContextContainer);
public bool IsSimilarAction(IActionRead action) {
if (action is not WeaveAction other) {
return false;
}
return other != null && _target == other._target && _weaver == other._weaver && _runeWeaving.WeaveName == other._runeWeaving.WeaveName;
}
public override string ToString() {
return $"{_runeWeaving.WeaveName} -> {_target.name}";
}
bool IsInAttackRange() {
// Incorrect in case there are hills. should calc range from feet.
Vector3 source = new(_weaver.transform.position.x, 0, _weaver.transform.position.z);
Vector3 target = new(_target.position.x, 0, _target.position.z);
return Vector3.Distance(source, target) <= _range.GetCurrent().ToMeter();
}
public void Dispose() {
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing) {
if (!_disposed) {
if (disposing) {
Cancel();
_followAction.Dispose();
_followAction = null;
_range.ResourceChanged -= OnResourceChanged;
_range = null;
_runeWeaving = null;
_target = null;
_weaver = null;
}
_disposed = true;
}
}
public readonly struct State : IActionState
{
public bool IsAdvanced { get; }
public float CompletionStatus { get; }
public bool IsMoving { get; }
public CombatMove Move { get; }
public State(bool isAdvanced, float completionStatus, bool isMoving, CombatMove move) {
IsAdvanced = isAdvanced;
CompletionStatus = completionStatus;
IsMoving = isMoving;
Move = move;
}
}
}
}
using System;
using TagFighter.Effects;
using TagFighter.Resources;
using UnityEngine;
namespace TagFighter
{
public class WeaveAction : IAction
{
FollowAction _followAction;
Transform _target;
Weaver _weaver;
RuneWeavingContainer _runeWeaving;
Resources.Range _range;
bool _startedWeaving = false;
static State s_resetState = new(true, 1f, false, default);
bool _disposed = false;
int _lastRange;
EffectContext _context;
ITimeContextContainer _timeContextContainer;
public WeaveAction(Weaver unit, RuneWeavingContainer runeWeaving, Transform target, Resources.Range range) {
if (range == null) {
throw new ArgumentNullException("range");
}
_target = target;
_range = range;
_weaver = unit;
_runeWeaving = runeWeaving;
var currentRange = _range.GetCurrent();
_lastRange = currentRange.AsPrimitive();
_followAction = new(_weaver, _target, currentRange.ToMeter());
_range.ResourceChanged += OnResourceChanged;
_context = new EffectContext(caster: unit.transform, effectLocation: target);
}
void OnResourceChanged(object sender, ResourceChangeArgs e) {
if (_lastRange != e.Current) {
_followAction.Dispose();
_followAction = new(_weaver, _target, _range.GetCurrent().ToMeter());
_lastRange = e.Current;
}
}
public IActionState Advance() {
var stateToReturn = _followAction.Advance();
if (IsInAttackRange()) {
if (_startedWeaving == false) {
Debug.Log("Target got in range, weaving");
_timeContextContainer = _runeWeaving.RuneWeaving.CreateTimeContexts();
}
_startedWeaving = true;
var isAdvanced = _runeWeaving.RuneWeaving.Advance(_timeContextContainer, _context, Time.deltaTime);
stateToReturn = new State(isAdvanced, CompletionStatus(), false, _runeWeaving.RuneWeaving.GetCurrentMove(_timeContextContainer));
}
else {
if (_startedWeaving) {
Debug.Log("Target escaped");
stateToReturn = new State(false, CompletionStatus(), stateToReturn.IsMoving, _runeWeaving.RuneWeaving.GetCurrentMove(_timeContextContainer));
}
}
return stateToReturn;
}
IActionState Cancel() {
_timeContextContainer = null;
return s_resetState;
}
public float CompletionStatus() => _runeWeaving.RuneWeaving.CompletionStatus(_timeContextContainer);
public bool IsSimilarAction(IActionRead action) {
if (action is not WeaveAction other) {
return false;
}
return other != null && _target == other._target && _weaver == other._weaver && _runeWeaving.WeaveName == other._runeWeaving.WeaveName;
}
public override string ToString() {
return $"{_runeWeaving.WeaveName} -> {_target.name}";
}
bool IsInAttackRange() {
// Incorrect in case there are hills. should calc range from feet.
Vector3 source = new(_weaver.transform.position.x, 0, _weaver.transform.position.z);
Vector3 target = new(_target.position.x, 0, _target.position.z);
return Vector3.Distance(source, target) <= _range.GetCurrent().ToMeter();
}
public void Dispose() {
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing) {
if (!_disposed) {
if (disposing) {
Cancel();
_followAction.Dispose();
_followAction = null;
_range.ResourceChanged -= OnResourceChanged;
_range = null;
_runeWeaving = null;
_target = null;
_weaver = null;
}
_disposed = true;
}
}
public readonly struct State : IActionState
{
public bool IsAdvanced { get; }
public float CompletionStatus { get; }
public bool IsMoving { get; }
public CombatMove Move { get; }
public State(bool isAdvanced, float completionStatus, bool isMoving, CombatMove move) {
IsAdvanced = isAdvanced;
CompletionStatus = completionStatus;
IsMoving = isMoving;
Move = move;
}
}
}
}
var effectData = new EffectInput(context, new Transform[] { context.EffectLocation }, TagFighter.Resources.StatModifierAccessor.Permanent);
var root = runeEffect.Nodes.Where(effectStep => effectStep is EffectEndNode).FirstOrDefault() as EffectEndNode;
var blackBoard = new EffectInput(context, new Transform[] { context.EffectLocation }, TagFighter.Resources.StatModifierAccessor.Permanent);
var root = runeEffect.Nodes.Where(effectStep => effectStep is ReleaseStep).FirstOrDefault() as ReleaseStep;
fileFormatVersion: 2
guid: ae5625888aa1b3849a0329320febbfa9
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
{
public class EffectEndNode : EffectStepNode
{
[UnityEngine.SerializeField]
get {
}
}
public void Run() {
}
}
}
_in.Node.Run();
public override string ToString() => "Root";
public override bool IsValid => true;
yield return _in;
public override IEnumerable<IPort> Inputs {
SinglePort<bool> _in = new();
using System.Collections.Generic;
namespace TagFighter.Effects.Steps
public override IEnumerable<double> Run() {
if (!IsValid) {
UnityEngine.Debug.Log($"{Guid} Inner types are null");
return GetDefault();
public override IEnumerable<double> Run(EffectInput blackBoard) {
if (!IsValid || Operator == null) {
UnityEngine.Debug.LogError($"{Guid} Inner types are null");
return GetDefault(blackBoard);
return _in.Nodes.Select(getter => getter.Run()).Concat(_const.Select(value => Data.Affected.Select(transform => value)))
.DefaultIfEmpty(GetDefault())
return _in.Nodes.Select(getter => getter.Run(blackBoard)).Concat(_const.Select(value => blackBoard.Affected.Select(transform => value)))
.DefaultIfEmpty(GetDefault(blackBoard))
fileFormatVersion: 2
guid: e51d75726b56ec84cba9cf181e46171f
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
#nullable enable
namespace TagFighter.Effects.Steps
{
using System.Collections.Generic;
using System.Linq;
[StepType(StepTypeAttribute.TesterStep)]
public class BoolTester : OutputStep<bool>
{
[UnityEngine.SerializeField]
SinglePort<bool> _in = new();
[UnityEngine.SerializeField]
bool _value = true;
[UnityEngine.SerializeField]
string _displayName = nameof(BoolTester);
public override IEnumerable<IPort> Inputs {
get {
yield return _in;
}
}
public override bool IsValid => true;
public override bool Run(EffectInput blackBoard) {
var value = _in.Node != null && _in.Node.Run(blackBoard);
if (value == _value) {
UnityEngine.Debug.Log($"<color=green>PASSED: {this} Got {value}</color>");
}
else {
UnityEngine.Debug.Log($"<color=red>FAILED: {this} Got {value}</color>");
}
return value;
}
public override string ToString() {
return $"{_displayName} Expected {_value}";
}
public override EffectStepNodeData ToData() {
var effectStepNodeData = base.ToData();
effectStepNodeData.Const = new() { _value == false ? 0d : 1d };
effectStepNodeData.DisplayName = _displayName;
return effectStepNodeData;
}
public override bool FromData(EffectStepNodeData effectStepNodeData, Dictionary<string, EffectStepNode> guidToNode) {
base.FromData(effectStepNodeData, guidToNode);
_value = effectStepNodeData.Const != null && effectStepNodeData.Const.FirstOrDefault() != 0;
_displayName = effectStepNodeData.DisplayName ?? "";
return true;
}
}
}
public override IEnumerable<double> Run() {
var value = _in.Node.Run();
return Data.Affected.Select(transform => value);
public override IEnumerable<double> Run(EffectInput blackBoard) {
var value = _in.Node != null ? _in.Node.Run(blackBoard) : default;
return blackBoard.Affected.Select(transform => value);
fileFormatVersion: 2
guid: 9b22197569b18af4dac9fe059961c8d7
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 764bf749fcec46941823b5e738935454
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
#nullable enable
namespace TagFighter.Effects.Steps
{
using System.Collections.Generic;
using System.Linq;
[StepType(StepTypeAttribute.ReleaseStep)]
public class ReleaseWeave : ReleaseStep
{
public override IEnumerable<IPort> Inputs {
get {
return Enumerable.Empty<IPort>();
}
}
public override bool IsValid => true;
public override string ToString() => "Release Weave";
public override void Run(EffectInput blackBoard) {
blackBoard.Affected = blackBoard.Context.GetAffectedUnits();
foreach (var effect in blackBoard.Context.EffectStepsToTrigger) {
effect.Run(blackBoard);
}
blackBoard.Context.EffectStepsToTrigger.Clear();
}
}
}
fileFormatVersion: 2
guid: 5acbc57f0a2f2e8429192a0c0bc720fd
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
#nullable enable
namespace TagFighter.Effects.Steps
{
using System.Collections.Generic;
[StepType(StepTypeAttribute.ReleaseStep)]
public class ReleaseEffect : ReleaseStep
{
[UnityEngine.SerializeField]
SinglePort<bool> _in = new();
[UnityEngine.SerializeField]
SinglePort<IAreaOfEffect> _aoe = new() {
DisplayName = "Area"
};
static SingleTarget s_defaultAOE = new();
public override IEnumerable<IPort> Inputs {
get {
yield return _in;
yield return _aoe;
}
}
public override bool IsValid => true;
public override string ToString() => "Release Effect";
public override void Run(EffectInput blackBoard) {
var aoe = _aoe.Node != null ? _aoe.Node.Run(blackBoard) : s_defaultAOE;
blackBoard.Affected = aoe.GetAffectedUnits(blackBoard.Context.EffectLocation);
if (_in.Node != null) {
_in.Node.Run(blackBoard);
}
}
}
}
fileFormatVersion: 2
guid: ed5e9577851397743b99b967d16e30be
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
#nullable enable
namespace TagFighter.Effects.Steps
{
using System.Collections.Generic;
[StepType(StepTypeAttribute.ReleaseStep)]
public class DelayEffect : ReleaseStep
{
[UnityEngine.SerializeField]
SinglePort<bool> _in = new();
public override IEnumerable<IPort> Inputs {
get {
yield return _in;
}
}
public override bool IsValid => true;
public override string ToString() => "Delay Effect";
public override void Run(EffectInput blackBoard) {
if (_in.Node != null) {
blackBoard.Context.EffectStepsToTrigger.Add(_in.Node);
}
}
}
}
var set = result.Zip(Data.Affected.Select(transform => transform.GetComponent<TResource>()), (value, resource) => (value, resource));
foreach (var (value, resource) in set) {
Data.StatAccessor.AddCurrentModifier(resource, (Resources.Unit<TUnitType>)value);
var success = false;
if (_in.Node != null) {
var result = _in.Node.Run(Data);
UnityEngine.Debug.Log($"{nameof(PawnResourceSet)} result {string.Join(",", result)}");
var set = result.Zip(Data.Affected.Select(transform => transform.GetComponent<TResource>()), (value, resource) => (value, resource));
foreach (var (value, resource) in set) {
Data.StatAccessor.AddCurrentModifier(resource, (Resources.Unit<TUnitType>)value);
}
success = true;
UnityEngine.Debug.Log($"{nameof(PawnResourceGet)} {typeof(TResource)}");
return Data.Affected.Select(transform => (double)transform.GetComponent<TResource>().GetCurrent().AsPrimitive());
return blackBoard.Affected.Select(transform => (double)transform.GetComponent<TResource>().GetCurrent().AsPrimitive());
public IResourceOperator Operator;
public IResourceOperator? Operator;
public double GetDefault() {
const double DefaultVal = 0;
return DefaultVal;
}
public override double Run(EffectInput blackBoard) {
if (!IsValid || Operator == null) {
UnityEngine.Debug.LogError($"{Guid} Inner types are null");
return GetDefault();
}
if (_in.Node == null) {
return GetDefault();
}
public string Guid;
public EffectInput Data;
public event EventHandler<EffectStepValidatedEventArgs> EffectStepValidated;
public string? Guid;
public event EventHandler<EffectStepValidatedEventArgs>? EffectStepValidated;
public override bool Run() {
if (!IsValid) {
UnityEngine.Debug.Log($"{Guid} Inner types are null");
public override bool Run(EffectInput Data) {
if (!IsValid || Resource == null || Register == null) {
UnityEngine.Debug.LogError($"{Guid} Inner types are null");
Data.Context.SetResource<TResource, TUnitType, TContextRegister>((Resources.Unit<TUnitType>)result);
var success = false;
if (blackBoard != null) {
blackBoard.Context.SetResource<TResource, TUnitType, TContextRegister>((Resources.Unit<TUnitType>)result);
success = true;
}
public override double Run() {
if (Register.Type == null || Resource.Type == null) {
UnityEngine.Debug.Log($"{Guid} Inner types are null");
public override double Run(EffectInput blackBoard) {
if (!IsValid || Register == null || Resource == null) {
UnityEngine.Debug.LogError($"{Guid} Inner types are null");
UnityEngine.Debug.Log($"{nameof(ContextResourceGet)} {typeof(TResource)} {typeof(TContextRegister)}");
return Data.Context.GetResource<TResource, TUnitType, TContextRegister>().AsPrimitive();
return blackBoard != null ? blackBoard.Context.GetResource<TResource, TUnitType, TContextRegister>().AsPrimitive() : 0;
using System;
using System.Collections.Generic;
using System.Linq;
using CareBoo.Serially;
using TagFighter.Effects.ResourceLocationAccessors.ContextRegisters;
using TagFighter.Resources;
using UnityEngine;
namespace TagFighter.Effects
{
public interface IDelayedEffect
{
void DelayedAction(EffectInput data);
}
public interface IImmediateEffect
{
void ImmediateAction(EffectContext context, IEffect effect);
}
public interface IEffectMode
{
void Apply(EffectContext context);
void Effect(EffectContext context, IEffect effect);
}
[ProvideSourceInfo]
[Serializable]
public class DelayedEffect : IImmediateEffect, IDelayedEffect
{
IEffect _effect;
public void DelayedAction(EffectInput data) {
_effect.Apply(data);
// direction towards target
var directionVector = (data.Context.EffectLocation.position - data.Context.Caster.position).normalized;
directionVector.y = 0;
var direction = Quaternion.LookRotation(directionVector, Vector3.up);
var appliedResource = data.Context.GetAllResourcesInRegister<Added>();
data.Context.EffectSystem.ApplyTagsEffect(appliedResource, data.Context.EffectLocation, direction, data.Context.AreaOfEffect);
}
public void ImmediateAction(EffectContext context, IEffect effect) {
if (effect != null) {
_effect = effect;
context.EffectsToTrigger.Add(this);
}
}
}
[ProvideSourceInfo]
[Serializable]
public class ImmediateEffect : IImmediateEffect
{
[SerializeReference, ShowSerializeReference]
AoeShapes.IAoeShape _areaOfEffect;
public void ImmediateAction(EffectContext context, IEffect effect) {
if (effect != null) {
// direction towards target
var directionVector = (context.EffectLocation.position - context.Caster.position).normalized;
directionVector.y = 0;
var direction = Quaternion.LookRotation(directionVector, Vector3.up);
EffectInput data = new(context, Enumerable.Empty<Transform>(), StatModifierAccessor.Permanent);
var areaOfEffect = _areaOfEffect.AreaOfEffect(data);
// Copy the location of the effect and merge with the direction caster -> target
GameObject tmpGo = new();
tmpGo.transform.position = context.EffectLocation.position;
tmpGo.transform.rotation = direction;
data.Affected = areaOfEffect.GetAffectedUnits(tmpGo.transform);
GameObject.Destroy(tmpGo);
effect.Apply(data);
var appliedResource = context.GetAllResourcesInRegister<Added>();
context.EffectSystem.ApplyTagsEffect(appliedResource, context.EffectLocation, direction, areaOfEffect);
}
}
}
[ProvideSourceInfo]
[Serializable]
public class ImmediateWeave : IImmediateEffect
{
public void ImmediateAction(EffectContext context, IEffect effect) {
EffectInput data = new(context, context.GetAffectedUnits(), StatModifierAccessor.Permanent);
if (effect != null) {
effect.Apply(data);
data.Affected = context.GetAffectedUnits();
}
Materialize(data);
}
void Materialize(EffectInput data) {
foreach (var effect in data.Context.EffectsToTrigger) {
effect.DelayedAction(data);
}
data.Context.EffectsToTrigger.Clear();
}
}
[ProvideSourceInfo]
[Serializable]
public class PeriodicWeave : IImmediateEffect
{
[SerializeReference, ShowSerializeReference]
public AoeShapes.IAoeShape AreaOfEffect;
[SerializeReference, ShowSerializeReference]
public Triggers.ITrigger ApplyTrigger;
[SerializeReference, ShowSerializeReference]
public Triggers.ITrigger EndTrigger;
public bool IsPermanent;
public void ImmediateAction(EffectContext context, IEffect effect) {
EffectInput data = new(context, context.GetAffectedUnits(), StatModifierAccessor.Permanent);
if (effect != null) {
effect.Apply(data);
data.Affected = context.GetAffectedUnits();
}
Materialize(data);
}
void Materialize(EffectInput data) {
var areaOfEffect = AreaOfEffect.AreaOfEffect(data);
/// Move all effects in context to condition context.
List<IDelayedEffect> effectsToTrigger = new(data.Context.EffectsToTrigger);
data.Context.EffectsToTrigger.Clear();
var origin = data.Context.Caster;
foreach (var affectedPawn in data.Affected) {
var condition = IsPermanent ? affectedPawn.gameObject.AddComponent<PawnCondition>() : affectedPawn.gameObject.AddComponent<TransientPawnCondition>();
condition.EndTrigger = EndTrigger?.ShallowCopy();
condition.ApplyTrigger = ApplyTrigger?.ShallowCopy();
condition.Origin = origin;
condition.Context = new EffectContext() {
AreaOfEffect = areaOfEffect,
Caster = affectedPawn,
EffectLocation = affectedPawn,
EffectsToTrigger = effectsToTrigger
};
condition.Apply();
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using CareBoo.Serially;
using TagFighter.Effects.ResourceLocationAccessors.ContextRegisters;
using TagFighter.Resources;
using UnityEngine;
namespace TagFighter.Effects
{
public interface IDelayedEffect
{
void DelayedAction(EffectInput data);
}
public interface IImmediateEffect
{
void ImmediateAction(EffectContext context, IEffect effect);
}
public interface IEffectMode
{
void Apply(EffectContext context);
void Effect(EffectContext context, IEffect effect);
}
[ProvideSourceInfo]
[Serializable]
public class DelayedEffect : IImmediateEffect, IDelayedEffect
{
IEffect _effect;
public void DelayedAction(EffectInput data) {
_effect.Apply(data);
// direction towards target
var directionVector = (data.Context.EffectLocation.position - data.Context.Caster.position).normalized;
directionVector.y = 0;
var direction = Quaternion.LookRotation(directionVector, Vector3.up);
var appliedResource = data.Context.GetAllResourcesInRegister<Added>();
data.Context.EffectSystem.ApplyTagsEffect(appliedResource, data.Context.EffectLocation, direction, data.Context.AreaOfEffect);
}
public void ImmediateAction(EffectContext context, IEffect effect) {
if (effect != null) {
_effect = effect;
context.EffectsToTrigger.Add(this);
}
}
}
[ProvideSourceInfo]
[Serializable]
public class ImmediateEffect : IImmediateEffect
{
[SerializeReference, ShowSerializeReference]
AoeShapes.IAoeShape _areaOfEffect;
public void ImmediateAction(EffectContext context, IEffect effect) {
if (effect != null) {
// direction towards target
var directionVector = (context.EffectLocation.position - context.Caster.position).normalized;
directionVector.y = 0;
var direction = Quaternion.LookRotation(directionVector, Vector3.up);
EffectInput data = new(context, Enumerable.Empty<Transform>(), StatModifierAccessor.Permanent);
var areaOfEffect = _areaOfEffect.AreaOfEffect(data);
// Copy the location of the effect and merge with the direction caster -> target
GameObject tmpGo = new();
tmpGo.transform.position = context.EffectLocation.position;
tmpGo.transform.rotation = direction;
data.Affected = areaOfEffect.GetAffectedUnits(tmpGo.transform);
GameObject.Destroy(tmpGo);
effect.Apply(data);
var appliedResource = context.GetAllResourcesInRegister<Added>();
context.EffectSystem.ApplyTagsEffect(appliedResource, context.EffectLocation, direction, areaOfEffect);
}
}
}
[ProvideSourceInfo]
[Serializable]
public class ImmediateWeave : IImmediateEffect
{
public void ImmediateAction(EffectContext context, IEffect effect) {
EffectInput data = new(context, context.GetAffectedUnits(), StatModifierAccessor.Permanent);
if (effect != null) {
effect.Apply(data);
data.Affected = context.GetAffectedUnits();
}
Materialize(data);
}
void Materialize(EffectInput data) {
foreach (var effect in data.Context.EffectsToTrigger) {
effect.DelayedAction(data);
}
data.Context.EffectsToTrigger.Clear();
}
}
[ProvideSourceInfo]
[Serializable]
public class PeriodicWeave : IImmediateEffect
{
[SerializeReference, ShowSerializeReference]
public AoeShapes.IAoeShape AreaOfEffect;
[SerializeReference, ShowSerializeReference]
public Triggers.ITrigger ApplyTrigger;
[SerializeReference, ShowSerializeReference]
public Triggers.ITrigger EndTrigger;
public bool IsPermanent;
public void ImmediateAction(EffectContext context, IEffect effect) {
EffectInput data = new(context, context.GetAffectedUnits(), StatModifierAccessor.Permanent);
if (effect != null) {
effect.Apply(data);
data.Affected = context.GetAffectedUnits();
}
Materialize(data);
}
void Materialize(EffectInput data) {
var areaOfEffect = AreaOfEffect.AreaOfEffect(data);
/// Move all effects in context to condition context.
List<IDelayedEffect> effectsToTrigger = new(data.Context.EffectsToTrigger);
data.Context.EffectsToTrigger.Clear();
var origin = data.Context.Caster;
foreach (var affectedPawn in data.Affected) {
var condition = IsPermanent ? affectedPawn.gameObject.AddComponent<PawnCondition>() : affectedPawn.gameObject.AddComponent<TransientPawnCondition>();
condition.EndTrigger = EndTrigger?.ShallowCopy();
condition.ApplyTrigger = ApplyTrigger?.ShallowCopy();
condition.Origin = origin;
condition.Context = new EffectContext(caster: affectedPawn, effectLocation: affectedPawn) {
AreaOfEffect = areaOfEffect,
EffectsToTrigger = effectsToTrigger
};
condition.Apply();
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using TagFighter.Effects.ResourceLocationAccessors.ContextRegisters;
using TagFighter.Resources;
using UnityEngine;
namespace TagFighter.Effects
{
public class ReleaseMultiplier
{
public Type MatchingAoe { get; set; }
public float MatchingAoeReleaseMultiplier { get; set; } = 1f;
public float NonMatchingAoeReleaseMultiplier { get; set; } = 1f;
}
public record RegistryKey
{
public Type ContextRegisterType;
public Type ResourceType;
public RegistryKey(Type contextRegisterType, Type resourceType) {
ContextRegisterType = contextRegisterType;
ResourceType = resourceType;
}
}
public class EffectContext
{
Dictionary<RegistryKey, IUnit> _resourceRegistry = new();
public Transform Caster { get; set; }
public Transform EffectLocation { get; set; }
public IAreaOfEffect AreaOfEffect;
public List<IDelayedEffect> EffectsToTrigger { get; set; } = new();
public IEffectSystem EffectSystem { get; private set; }
public ReleaseMultiplier ReleaseMultiplier { get; set; }
public EffectContext() {
EffectSystem = SystemsHandler.EffectSystem;
ReleaseMultiplier = new();
}
public Unit<TUnit> GetResource<TResource, TUnit, TContextRegister>()
where TResource : Resource<TUnit>
where TUnit : IUnitType
where TContextRegister : IContextRegister {
var key = new RegistryKey(typeof(TContextRegister), typeof(TResource));
var value = (Unit<TUnit>)_resourceRegistry.GetValueOrDefault(key, (Unit<TUnit>)0);
Debug.Log($"{nameof(GetResource)} ({typeof(TResource).Name},{typeof(TContextRegister).Name}) = {value}");
return value;
}
public Unit<TUnit> SetResource<TResource, TUnit, TContextRegister>(Unit<TUnit> value)
where TResource : Resource<TUnit>
where TUnit : IUnitType
where TContextRegister : IContextRegister {
var key = new RegistryKey(typeof(TContextRegister), typeof(TResource));
var newValue = (Unit<TUnit>)(_resourceRegistry[key] = value);
Debug.Log($"{nameof(SetResource)} ({typeof(TResource).Name},{typeof(TContextRegister).Name}) = {newValue}");
return newValue;
}
public IEnumerable<(Type, IUnit)> GetAllResourcesInRegister<TContextRegister>() where TContextRegister : IContextRegister {
return _resourceRegistry.Where(x => x.Key.ContextRegisterType == typeof(TContextRegister)).Select(x => (x.Key.ResourceType, x.Value));
}
public IEnumerable<Transform> GetAffectedUnits() {
if (AreaOfEffect == null) {
return Enumerable.Empty<Transform>();
}
var directionVector = (EffectLocation.position - Caster.position).normalized;
directionVector.y = 0;
var direction = Quaternion.LookRotation(directionVector, Vector3.up);
GameObject tmpGo = new();
tmpGo.transform.position = EffectLocation.position;
tmpGo.transform.rotation = direction;
var affectedUnits = AreaOfEffect.GetAffectedUnits(EffectLocation);
GameObject.Destroy(tmpGo);
return affectedUnits;
}
void ResetEffects() {
EffectsToTrigger.Clear();
}
public void Reset() {
ResetEffects();
}
}
}
#nullable enable
using System;
using System.Collections.Generic;
using System.Linq;
using TagFighter.Effects.ResourceLocationAccessors.ContextRegisters;
using TagFighter.Effects.Steps;
using TagFighter.Resources;
using UnityEngine;
namespace TagFighter.Effects
{
public class ReleaseMultiplier
{
public Type? MatchingAoe { get; set; }
public float MatchingAoeReleaseMultiplier { get; set; } = 1f;
public float NonMatchingAoeReleaseMultiplier { get; set; } = 1f;
}
public record RegistryKey
{
public Type ContextRegisterType;
public Type ResourceType;
public RegistryKey(Type contextRegisterType, Type resourceType) {
ContextRegisterType = contextRegisterType;
ResourceType = resourceType;
}
}
public class EffectContext
{
Dictionary<RegistryKey, IUnit> _resourceRegistry = new();
public Transform Caster { get; set; }
public Transform EffectLocation { get; set; }
public IAreaOfEffect AreaOfEffect;
public List<IDelayedEffect> EffectsToTrigger { get; set; } = new();
public List<OutputStep<bool>> EffectStepsToTrigger { get; set; } = new();
public IEffectSystem EffectSystem { get; private set; }
public ReleaseMultiplier ReleaseMultiplier { get; set; }
public EffectContext(Transform caster, Transform effectLocation) {
EffectSystem = SystemsHandler.EffectSystem;
ReleaseMultiplier = new();
Caster = caster;
EffectLocation = effectLocation;
AreaOfEffect = new SingleTarget();
}
public Unit<TUnit> GetResource<TResource, TUnit, TContextRegister>()
where TResource : Resource<TUnit>
where TUnit : IUnitType
where TContextRegister : IContextRegister {
var key = new RegistryKey(typeof(TContextRegister), typeof(TResource));
var value = (Unit<TUnit>)_resourceRegistry.GetValueOrDefault(key, (Unit<TUnit>)0);
Debug.Log($"{nameof(GetResource)} ({typeof(TResource).Name},{typeof(TContextRegister).Name}) = {value}");
return value;
}
public Unit<TUnit> SetResource<TResource, TUnit, TContextRegister>(Unit<TUnit> value)
where TResource : Resource<TUnit>
where TUnit : IUnitType
where TContextRegister : IContextRegister {
var key = new RegistryKey(typeof(TContextRegister), typeof(TResource));
var newValue = (Unit<TUnit>)(_resourceRegistry[key] = value);
Debug.Log($"{nameof(SetResource)} ({typeof(TResource).Name},{typeof(TContextRegister).Name}) = {newValue}");
return newValue;
}
public IEnumerable<(Type, IUnit)> GetAllResourcesInRegister<TContextRegister>() where TContextRegister : IContextRegister {
return _resourceRegistry.Where(x => x.Key.ContextRegisterType == typeof(TContextRegister)).Select(x => (x.Key.ResourceType, x.Value));
}
public IEnumerable<Transform> GetAffectedUnits() {
var directionVector = (EffectLocation.position - Caster.position).normalized;
directionVector.y = 0;
var direction = Quaternion.LookRotation(directionVector, Vector3.up);
GameObject tmpGo = new();
tmpGo.transform.position = EffectLocation.position;
tmpGo.transform.rotation = direction;
var affectedUnits = AreaOfEffect.GetAffectedUnits(EffectLocation);
GameObject.Destroy(tmpGo);
return affectedUnits;
}
void ResetEffects() {
EffectsToTrigger.Clear();
EffectStepsToTrigger.Clear();
}
public void Reset() {
ResetEffects();
}
}
}
--- !u!114 &-9140780982687876379
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: e51d75726b56ec84cba9cf181e46171f, type: 3}
m_Name: BoolTester
m_EditorClassIdentifier:
Position: {x: 707, y: 285}
Guid: 1e36be7c-1241-49fa-8b38-324dbb6bcba0
_in:
Node: {fileID: 4689584426374042219}
_value: 1
_displayName: BoolTester
--- !u!114 &-8769192718861223218
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 5379282b606b40d41b3f107d66364266, type: 3}
m_Name: SequenceTester
m_EditorClassIdentifier:
Position: {x: 213, y: 486}
Guid: 1c87f8d2-5d70-44d9-963a-52e9a0358714
_in:
Node: {fileID: -8243589536771261292}
_value:
- 10
- 10
_displayName: SequenceTester
--- !u!114 &-8372440445323862882
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 05c74f9724c88004184e3074359893c6, type: 3}
m_Name: CircleAreaGet
m_EditorClassIdentifier:
Position: {x: 486, y: 492}
Guid: 2c7f9f28-234e-4907-a66e-8cb597e160fb
_radius:
Node: {fileID: -6555239679874132939}
--- !u!114 &-8243589536771261292
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: bb9a9a2cce40a384084a18925a111186, type: 3}
m_Name: Repeat
m_EditorClassIdentifier:
Position: {x: 118, y: 368}
Guid: f73d2a47-a410-40e6-ba18-ad0eb473fdaa
_in:
Node: {fileID: 9147507608421950613}
--- !u!114 &-6555239679874132939
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: c419ef0e55c3e694cb24080375e68c2e, type: 3}
m_Name: ConstValue
m_EditorClassIdentifier:
Position: {x: 381, y: 492}
Guid: d8b2b59d-0449-45dc-8f83-ce2c96a72d51
_value: 5
--- !u!114 &-5665980743981963155
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: ed5e9577851397743b99b967d16e30be, type: 3}
m_Name: DelayEffect
m_EditorClassIdentifier:
Position: {x: 795, y: 368}
Guid: f06774e5-1993-4af5-a60b-462c5ffff88a
_in:
Node: {fileID: -5369720702700849526}
--- !u!114 &-5369720702700849526
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: e51d75726b56ec84cba9cf181e46171f, type: 3}
m_Name: BoolTester
m_EditorClassIdentifier:
Position: {x: 673, y: 486}
Guid: b0e61a4e-c9dc-4be1-b417-239ebb32783e
_in:
Node: {fileID: 5582286459452380511}
_value: 1
_displayName: BoolTester
--- !u!114 &-5229030080647256284
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: c419ef0e55c3e694cb24080375e68c2e, type: 3}
m_Name: ConstValue
m_EditorClassIdentifier:
Position: {x: 101, y: 362}
Guid: d981da00-a478-4d48-93bc-5aea31bb4a56
_value: 5
--- !u!114 &-4792174090053785434
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 9aba2983d5b304644a37facc1967f5de, type: 3}
m_Name: PawnResourceGet
m_EditorClassIdentifier:
Position: {x: 121, y: 381}
Guid: c643eae1-6b88-476a-bc73-2799916975dc
Resource:
typeId: aecc1739-a0df-4013-b430-22d2eb13f0ff
--- !u!114 &-3769531130963694833
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: c5c37fc06b3d0ad45b6305eb93d68542, type: 3}
m_Name: ContextResourceGet
m_EditorClassIdentifier:
Position: {x: -143.03998, y: 368}
Guid: e1546d02-6809-4d8a-9bad-6a2da14b81ba
Resource:
typeId: da13f1c1-4359-4eb9-b969-7db50afe6423
Register:
typeId: 47eae1ff-9ff5-41fd-b08e-0f674b3848e6
--- !u!114 &-3729415841761862503
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4585b32f67d50794cad3c057a0f091a1, type: 3}
m_Name: 8c28189e-066f-484d-9bd9-f3760b56e183
m_EditorClassIdentifier:
DisplayName: Pawn.BlueTag to Context.GreenTag
_nodes:
- {fileID: 4174329379412594160}
- {fileID: -6555239679874132939}
- {fileID: -8372440445323862882}
- {fileID: -4792174090053785434}
- {fileID: 1266651803470590499}
- {fileID: 4689584426374042219}
- {fileID: -9140780982687876379}
--- !u!114 &-2937174536174348270
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4585b32f67d50794cad3c057a0f091a1, type: 3}
m_Name: 63e4b81d-2a5c-426f-8f07-25268e5f6ef1
m_EditorClassIdentifier:
DisplayName: Set Circle AOE
_nodes:
- {fileID: 6214092623383595095}
- {fileID: -789133638073664749}
- {fileID: 7852711552070706258}
- {fileID: -5229030080647256284}
Guid: 6ea59218-4bd5-451a-8e73-2838dbf717fe
_nodes: []
DisplayName: Delayed Context.GreenTag to Context.BlueTag
_nodes:
- {fileID: 6560319404935981921}
- {fileID: 5582286459452380511}
- {fileID: -8243589536771261292}
- {fileID: -5665980743981963155}
- {fileID: -3769531130963694833}
- {fileID: 9147507608421950613}
- {fileID: -8769192718861223218}
- {fileID: -5369720702700849526}
--- !u!114 &-789133638073664749
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 81d788b04f027ce4080f0b8736d97a71, type: 3}
m_Name: ContextAreaSet
m_EditorClassIdentifier:
Position: {x: 500, y: 362}
Guid: d64642b3-d6db-40a0-914d-59894349744d
_in:
Node: {fileID: 7852711552070706258}
--- !u!114 &1266651803470590499
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: ba8070acc07ec7f448050fe3c5cd4278, type: 3}
m_Name: Fold
m_EditorClassIdentifier:
Position: {x: 318, y: 381}
Guid: 48742a87-3297-48ff-a3d6-2300197da282
_in:
Node: {fileID: -4792174090053785434}
Operator:
rid: 1712398208611385344
references:
version: 2
RefIds:
- rid: 1712398208611385344
type: {class: Sum, ns: TagFighter.Effects.Operators, asm: Assembly-CSharp}
--- !u!114 &4174329379412594160
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 5acbc57f0a2f2e8429192a0c0bc720fd, type: 3}
m_Name: ReleaseEffect
m_EditorClassIdentifier:
Position: {x: 782, y: 420}
Guid: d19a30a7-4dd7-4542-88e0-200f10ab3084
_in:
Node: {fileID: -9140780982687876379}
_aoe:
Node: {fileID: -8372440445323862882}
--- !u!114 &4689584426374042219
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 95498ab7ed723494fb6b3c000a0f1c35, type: 3}
m_Name: ContextResourceSet
m_EditorClassIdentifier:
Position: {x: 517, y: 381}
Guid: dd72f5f6-31a1-4b8e-90f5-29f666b2d3b9
_in:
Node: {fileID: 1266651803470590499}
Resource:
typeId: da13f1c1-4359-4eb9-b969-7db50afe6423
Register:
typeId: 47eae1ff-9ff5-41fd-b08e-0f674b3848e6
--- !u!114 &5582286459452380511
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 95498ab7ed723494fb6b3c000a0f1c35, type: 3}
m_Name: ContextResourceSet
m_EditorClassIdentifier:
Position: {x: 549, y: 368}
Guid: 544e2620-98c1-489d-b45a-70582afad0bd
_in:
Node: {fileID: 6560319404935981921}
Resource:
typeId: aecc1739-a0df-4013-b430-22d2eb13f0ff
Register:
typeId: 47eae1ff-9ff5-41fd-b08e-0f674b3848e6
--- !u!114 &6214092623383595095
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 5acbc57f0a2f2e8429192a0c0bc720fd, type: 3}
m_Name: ReleaseEffect
m_EditorClassIdentifier:
Position: {x: 751, y: 362}
Guid: c2152e63-2bcb-45df-95f7-74fd0fb403bb
_in:
Node: {fileID: -789133638073664749}
_aoe:
Node: {fileID: 0}
--- !u!114 &6560319404935981921
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: ba8070acc07ec7f448050fe3c5cd4278, type: 3}
m_Name: Fold
m_EditorClassIdentifier:
Position: {x: 331.5, y: 368}
Guid: 5dea9d08-1513-4836-b836-96aa56f7a4d2
_in:
Node: {fileID: -8769192718861223218}
Operator:
rid: 1712398182965051392
references:
version: 2
RefIds:
- rid: 1712398182965051392
type: {class: Sum, ns: TagFighter.Effects.Operators, asm: Assembly-CSharp}
--- !u!114 &7690443498484320853
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4585b32f67d50794cad3c057a0f091a1, type: 3}
m_Name: 6839f90b-565c-48c3-a626-dda30f57f80b
m_EditorClassIdentifier:
DisplayName: Release Weave
_nodes:
- {fileID: 8353540962358571519}
--- !u!114 &7852711552070706258
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 05c74f9724c88004184e3074359893c6, type: 3}
m_Name: CircleAreaGet
m_EditorClassIdentifier:
Position: {x: 221, y: 362}
Guid: 2d238859-6c99-4cbc-a639-e3f808217dad
_radius:
Node: {fileID: -5229030080647256284}
--- !u!114 &8353540962358571519
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 764bf749fcec46941823b5e738935454, type: 3}
m_Name: ReleaseWeave
m_EditorClassIdentifier:
Position: {x: 765, y: 428}
Guid: 71b47ad6-8ad4-4290-a6e4-671a30c601e5
--- !u!114 &9147507608421950613
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 2937882e2c8591347b1cd105b9591834, type: 3}
m_Name: DoubleTester
m_EditorClassIdentifier:
Position: {x: 5, y: 486}
Guid: 5f29948c-d8f2-40d8-97cc-ce01a7ab4e3f
_in:
Node: {fileID: -3769531130963694833}
_value: 10
_displayName: DoubleTester