예제 #1
0
        public override SpellVar Select(SpellCursor cursor)
        {
            // Determine additional selection parameters
            List <Func <ICmpSpellInteractor, float> > predicateList = new List <Func <ICmpSpellInteractor, float> >();

            foreach (SpellGlyph param in cursor.Parameters)
            {
                if (param is ICreationGlyph)
                {
                    predicateList.Add(i => (param as ICreationGlyph).GetRessemblance(i));
                }
            }

            // Select objects
            Vector2 myPos         = cursor.BoundTo.Pos;
            var     pickedObjects = Scene.Current.FindComponents <ICmpSpellInteractor>()
                                    .Select(i => new {
                Interactor = i,
                Distance   = (myPos - i.Pos).Length,
                MatchRate  = predicateList.Aggregate(1.0f, (r, p) => r * p(i))
            })
                                    .Where(e => e.MatchRate > 0.01f && Spell.GetEfficiency(e.Distance) > 0.01f && (e.Interactor as Component).GameObj != (cursor.BoundTo as Component).GameObj)
                                    .ToArray();

            ObjectVar objVar = new ObjectVar();

            float[] scores = Spell.WeightByProximity(pickedObjects.Length, i => pickedObjects[i].Distance, i => pickedObjects[i].MatchRate);
            for (int i = 0; i < pickedObjects.Length; i++)
            {
                objVar.Add(pickedObjects[i].Interactor, scores[i] * pickedObjects[i].MatchRate);
            }
            return(objVar);
        }
예제 #2
0
        public override SpellVar Select(SpellCursor cursor)
        {
            Camera  mainCam  = Scene.Current.FindComponent <Camera>();
            Vector3 worldPos = mainCam.GetSpaceCoord(DualityApp.Mouse.Pos);

            var pickedObjects = RigidBody.PickShapesGlobal(worldPos.Xy)
                                .Select(s => new {
                Interactor = s.Parent.GameObj.GetComponent <ICmpSpellInteractor>(),
                Distance   = (s.Parent.GameObj.Transform.Pos.Xy - worldPos.Xy).Length
            })
                                .Where(e => e.Interactor != null)
                                .ToArray();

            float[] scores = Spell.WeightByProximity(pickedObjects.Length, i => pickedObjects[i].Distance);

            if (pickedObjects.Length > 0)
            {
                ObjectVar objVar = new ObjectVar();
                for (int i = 0; i < pickedObjects.Length; i++)
                {
                    objVar.Add(pickedObjects[i].Interactor, scores[i]);
                }
                return(objVar);
            }
            else
            {
                return(new PositionVar
                {
                    Position = worldPos.Xy
                });
            }
        }
예제 #3
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
                    });
                }
            }
        }
예제 #4
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);
        }