Example #1
0
        public void OnMove(HexXY from, HexXY to, bool isDrawing)
        {
            EnsurePrevMoveFinished();

            if (!WorldBlock.CanTryToMoveToBlockType(Level.S.GetPFBlockedMap(to)))
            {
                avatar.finishState = Avatar.FinishedState.CantMoveThere;
                return;
            }

            if (!isDrawing)
            {
                if (!avatar.spell.caster.SpendMana(1))
                {
                    avatar.finishState = Avatar.FinishedState.NoManaLeft;
                    return;
                }
            }
            else
            {
                if (!avatar.spell.caster.SpendMana(5))
                {
                    avatar.finishState = Avatar.FinishedState.NoManaLeft;
                    return;
                }
            }

            this.isDrawing = isDrawing;

            Interfacing.PerformInterfaceMove(graphicsHandle, to, movTime);
            movTimeLeft = movTime * 0.75f; //TODO: this is point in time when avatar element entity changes pos
            movPos      = to;
        }
Example #2
0
 public void Move(HexXY p)
 {
     if (!cantMove && WorldBlock.CanTryToMoveToBlockType(Level.S.GetPFBlockedMap(p)) &&
         (!dest.HasValue || p != dest))
     {
         afterMoveAction = null;
         dest            = p;
         distToStop      = 0;
         MovePart();
     }
 }
Example #3
0
 public void OnMove(HexXY from, HexXY to, bool isDrawing)
 {
     if (!WorldBlock.CanTryToMoveToBlockType(Level.S.GetPFBlockedMap(to)))
     {
         avatar.finishState = Avatar.FinishedState.CantMoveThere;
     }
     else
     {
         Interfacing.PerformInterfaceMove(graphicsHandle, to, movTime);
         movTimeLeft = movTime * 0.75f; //TODO: this is point in time when avatar changes pos
     }
 }
Example #4
0
        public void OnMove(HexXY from, HexXY to, bool isDrawing)
        {
            if (!isDrawing || !WorldBlock.CanTryToMoveToBlockType(Level.S.GetPFBlockedMap(to)))
            {
                if (!avatar.spell.caster.SpendMana(1))
                {
                    avatar.finishState = Avatar.FinishedState.NoManaLeft;
                    return;
                }
            }
            else
            {
                if (!avatar.spell.caster.SpendMana(10))
                {
                    avatar.finishState = Avatar.FinishedState.NoManaLeft;
                    return;
                }

                var spellEffect = new SpellEffects.Stone(1);
                spellEffect.StackOn(to);
            }
        }
Example #5
0
        public static uint?FindPath(HexXY from, HexXY to, HexXY[] pathStorage, uint distToStop = 0, uint dynBlockCost = 0)
        {
            front.Reset();
            front.Enqueue(new XYCost(from, 0, 0, GetHeuristic(from, to)));

            //TODO: assume we're in the single worldblock for now
            ++Level.S.pfExpandMarker;
            Level.S.SetPFExpandMap(from, Level.S.pfExpandMarker);

            XYCost c;
            bool   isFound = false;

            do
            {
                c = front.Dequeue();

                if (HexXY.Dist(c.p, to) <= distToStop)
                {
                    isFound = true;
                    break;
                }

                foreach (var st in steps)
                {
                    var np        = c.p + st;
                    var blockType = Level.S.GetPFBlockedMap(np);
                    if (WorldBlock.CanTryToMoveToBlockType(blockType) &&
                        Level.S.GetPFExpandMap(np) < Level.S.pfExpandMarker)
                    {
                        Level.S.SetPFExpandMap(np, Level.S.pfExpandMarker);
                        uint cost = (uint)(c.cost + WorldBlock.PFGetPassCost(np));

                        if (dynBlockCost > 0 && np != to && blockType == WorldBlock.PFBlockType.DynamicBlocked)
                        {
                            cost += dynBlockCost;
                        }

                        var n = new XYCost(np, c.len + 1, cost, cost + GetHeuristic(np, to));
                        front.Enqueue(n);
                        Level.S.SetPFStepsMap(np, st.backIdx);
                    }
                }
            } while (front.Count > 0);

            if (isFound && c.len <= pathStorage.Length)
            {
                uint  pathLen = c.len;
                HexXY p       = c.p;
                for (int i = 0; i < pathLen; i++)
                {
                    pathStorage[pathLen - i - 1] = p;
                    var backIdx = Level.S.GetPFStepsMap(p);
                    p = p + steps[backIdx];
                }
                return(pathLen);
            }
            else
            {
                return(null);
            }
        }