Пример #1
0
        public void ResolveAction(Dictionary <ActionArgs, string> attackArgs)
        {
            //start location
            var hexPointTargetCord = HexPoint.StringToHexPoint(attackArgs[ActionArgs.TargetHexCord]);
            //get effected hexes
            //also an enum?
            List <HexPoint> effectedHexes = new List <HexPoint>();

            #region lineattacks hexpoints
            if (attackArgs[ActionArgs.EffectShape] == "line")
            {
                //check relative rotation, Q/R switched because we are getting it backwards...yeah
                var offsetDir = new Vector2(hexPointTargetCord.R - Location.R, hexPointTargetCord.Q - Location.Q);
                //simplify it down if hex more than one away
                if (Math.Abs(offsetDir.X) > 1)
                {
                    offsetDir.X = offsetDir.X / Math.Abs((offsetDir.X));
                }
                if (Math.Abs(offsetDir.Y) > 1)
                {
                    offsetDir.Y = offsetDir.Y / Math.Abs((offsetDir.Y));
                }
                //we should have the direction now

                //probs dont need this i already have the vector
                //var relativeRotation =
                //  RotationVector.FirstOrDefault(k => k.Value.X == offsetDir.X && k.Value.Y == offsetDir.Y);


                var rangeEnd = offsetDir * Convert.ToInt32(attackArgs[ActionArgs.EffectRange]);
                rangeEnd.X += Location.R;
                rangeEnd.Y += Location.Q;
                //first one is self
                effectedHexes = HexGrid.HexGrid.LineBetweenTwoPoints(Location, new HexPoint((int)rangeEnd.X, (int)rangeEnd.Y));
                effectedHexes.RemoveAt(0);
                ;
            }
            ;
            #endregion
            effectedHexes.ForEach(h =>
            {
                var effectedActor = ActorHexGrid.ActorStorage.FirstOrDefault(a => a.Location.Equals(h));
                if (effectedActor != null)
                {
                    //apply effects, including if defended against
                    effectedActor.DamageTaken += Convert.ToInt32(attackArgs[ActionArgs.BaseDamage]);

                    if (effectedActor.DamageTaken >= effectedActor.HP)
                    {
                        BasicActor.Die(effectedActor);
                    }
                }
                else
                {
                    //effect?
                }
            });
            ;
            //var actionTarget = ActorHexGrid.ActorStorage.FirstOrDefault(a => a.Location.Equals(hexPointTargetCord));
        }
Пример #2
0
        public void DoAttack(Dictionary <ActionArgs, string> attackArgs)
        {
            //
            //do validitiy check, if invalid just exit
            var targetable = CanSee(Int32.Parse(attackArgs[ActionArgs.EffectRange]));

            if (!targetable.Any(h => h.Equals(HexPoint.StringToHexPoint(attackArgs[ActionArgs.TargetHexCord]))) ||
                !CanSee().Any(h => h.Equals(HexPoint.StringToHexPoint(attackArgs[ActionArgs.TargetHexCord]))))
            {
                return;
            }
            //
            //attackArgs[ActionArgs.TargetHexCord] = hexPoint.ToString();
            if (Convert.ToBoolean(attackArgs[ActionArgs.Instant]) == false && false)//testing
            {
                QueuedActions.Add(attackArgs);
            }
            else
            {
                ResolveAction(attackArgs);
            }
            UseAp(APUseType.Attack);
        }