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); }
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 }); } }
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 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); }