public override SpellVar Select(SpellCursor cursor) { Component host = cursor.BoundTo as Component; ICmpSpellInteractor hostInteractor = (host != null) ? host.GameObj.GetComponent <ICmpSpellInteractor>() : null; if (hostInteractor != null) { ObjectVar obj = new ObjectVar(); obj.Add(hostInteractor); return(obj); } else { if (host != null) { return(new PositionVar { RelativeTo = (host != null) ? host.GameObj : null, RelativePosition = Vector2.Zero }); } else { return(new PositionVar { Position = cursor.BoundTo.Pos }); } } }
public override float GetRessemblance(ICmpSpellInteractor interactor) { Component cmp = interactor as Component; float result = 0.0f; if (cmp.GameObj.GetComponent <MagicalFire>() != null) { result = 1.0f; } return(this.IsNegated ? (1.0f - result) : result); }
public void Add(ICmpSpellInteractor obj, float weight = 1.0f) { int index = this.elements.IndexOfFirst(e => e.Interactor == obj); if (index == -1) { this.elements.Add(new Element(obj, weight)); } else { Element element = this.elements[index]; element.Weight = MathF.Clamp(element.Weight + weight, 0.0f, 1.0f); this.elements[index] = element; } this.elements.StableSort((a, b) => Comparer <float> .Default.Compare(MathF.Abs(b.Weight), MathF.Abs(a.Weight))); this.count = this.elements.Sum(e => MathF.Abs(e.Weight)); }
public void Remove(ICmpSpellInteractor obj, float weight = 1.0f) { int index = this.elements.IndexOfFirst(e => e.Interactor == obj); if (index != -1) { Element element = this.elements[index]; element.Weight = MathF.Clamp(element.Weight - weight, 0.0f, 1.0f); if (element.Weight <= 0.0f) { this.elements.RemoveAt(index); } else { this.elements[index] = element; } this.count = this.elements.Sum(e => MathF.Abs(e.Weight)); } }
public float Contains(ICmpSpellInteractor obj) { Element element = this.elements.FirstOrDefault(e => e.Interactor == obj); return(element.Weight); }
public Element(ICmpSpellInteractor obj, float weight) { this.Weight = MathF.Abs(weight); this.Interactor = obj; }
public abstract float GetRessemblance(ICmpSpellInteractor interactor);
public override bool Activate(SpellCursor cursor) { float baseEnergy = this.GetEnergyConsumption(); float usedEnergy = cursor.BoundTo.DrainEnergy(baseEnergy); Vector2 boundPos = cursor.BoundTo.Pos; PositionVar posVar = cursor.GetAnnotation <PositionVar>(); ObjectVar objVar = cursor.GetAnnotation <ObjectVar>(); ObjectVar selectedObjects = new ObjectVar(); if (objVar != null) { var weightedPos = objVar.Elements.Select(e => new { Weight = e.Weight, Interactor = e.Interactor, Pos = e.Interactor.Pos }); foreach (var p in weightedPos) { float energyMult = Spell.GetEfficiency((p.Pos - boundPos).Length) * p.Weight / objVar.Count; foreach (T magic in this.Create(p.Pos, usedEnergy * energyMult)) { ICmpSpellInteractor interactor = magic.GameObj.GetComponent <ICmpSpellInteractor>(); if (interactor != null) { selectedObjects.Add(interactor, energyMult); } } } } else if (posVar != null) { Vector2 targetPos = posVar.Position; float energyMult = Spell.GetEfficiency((targetPos - boundPos).Length); foreach (T magic in this.Create(posVar.Position, usedEnergy * energyMult)) { ICmpSpellInteractor interactor = magic.GameObj.GetComponent <ICmpSpellInteractor>(); if (interactor != null) { selectedObjects.Add(interactor, energyMult); } } } else { foreach (T magic in this.Create(boundPos, usedEnergy)) { ICmpSpellInteractor interactor = magic.GameObj.GetComponent <ICmpSpellInteractor>(); if (interactor != null) { selectedObjects.Add(interactor); } } } if (selectedObjects.Count > 0.0f) { cursor.Annotate(selectedObjects); } return(true); }