예제 #1
0
        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
                    });
                }
            }
        }
예제 #2
0
        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);
        }
예제 #3
0
        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));
        }
예제 #4
0
        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));
            }
        }
예제 #5
0
        public float Contains(ICmpSpellInteractor obj)
        {
            Element element = this.elements.FirstOrDefault(e => e.Interactor == obj);

            return(element.Weight);
        }
예제 #6
0
 public Element(ICmpSpellInteractor obj, float weight)
 {
     this.Weight     = MathF.Abs(weight);
     this.Interactor = obj;
 }
예제 #7
0
 public abstract float GetRessemblance(ICmpSpellInteractor interactor);
예제 #8
0
        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);
        }