public void NewPositionNotExists_SerializedDeserialized_Success()
        {
            var target = ClientTurnDoneTransferMessage.Create();

            var parser = TransferMessageParserUtils.FindWriter(target);

            Assert.IsTrue(parser.IsWritable(target));
            var data = parser.Write(target);

            Console.WriteLine(data);
            var obj = (ClientTurnDoneTransferMessage)parser.Read(data);

            Assert.AreEqual(target.UnitActions.Count, obj.UnitActions.Count);
        }
Пример #2
0
        public ClientTurnDoneTransferMessage GetNextTurn()
        {
            var me     = FindMe();
            var result = ClientTurnDoneTransferMessage.Create();

            for (var i = 0; i < me.Units.Count; i++)
            {
                var unit = me.Units[i];
                if (unit.Hp <= 0)
                {
                    continue;
                }

                Do(unit, me.Units, result);
            }

            return(result);
        }
Пример #3
0
        public void Do(AIPlayerState.UnitSubMessage unit, List <AIPlayerState.UnitSubMessage> units, ClientTurnDoneTransferMessage result)
        {
            if (!SearchPoint.ContainsKey(unit.UnitId))
            {
                SearchPoint[unit.UnitId] = null;
            }

            if (SearchPoint[unit.UnitId] == null ||
                (SearchPoint[unit.UnitId].X == unit.Position.X && SearchPoint[unit.UnitId].Y == unit.Position.Y))
            {
                SearchPoint[unit.UnitId]?.Free();
                var point = AIPoint.Create();
                point.X = this.Exit?.X ?? Fate.GlobalFate.NextInt(Regions.GetLength(0));
                point.Y = this.Exit?.Y ?? Fate.GlobalFate.NextInt(Regions.GetLength(1));
                SearchPoint[unit.UnitId] = point;

                var pathfind = AStarPathfinder.Search(Pathfinding, new Point(unit.Position.X, unit.Position.Y), new Point(SearchPoint[unit.UnitId].X, SearchPoint[unit.UnitId].Y));
                if (pathfind == null)
                {
                    SearchPoint[unit.UnitId]?.Free();
                    SearchPoint[unit.UnitId] = null;
                    return;
                }
                this.SearchPath[unit.UnitId] = new Queue <Point>(pathfind);
            }

            var path = SearchPath[unit.UnitId];

            if (path == null || path.Count < 2)
            {
                SearchPoint[unit.UnitId]?.Free();
                SearchPoint[unit.UnitId] = null;
                return;
            }

            var unitDescription = UnitDesription[unit.UnitId];
            var distance        = Math.Min(unitDescription.MoveRange, path.Count - 1);

            Point target = path.Dequeue();

            if (target.X != unit.Position.X || target.Y != unit.Position.Y)
            {
                SearchPoint[unit.UnitId]?.Free();
                SearchPoint[unit.UnitId] = null;
                return;
            }

            for (var j = 0; j < distance - 1; j++)
            {
                target = path.Dequeue();
                if (Regions[target.X, target.Y] == RegionValue.Wall)
                {
                    SearchPoint[unit.UnitId]?.Free();
                    SearchPoint[unit.UnitId] = null;
                    return;
                }
            }

            target = path.Peek();
            if (Regions[target.X, target.Y] == RegionValue.Wall)
            {
                SearchPoint[unit.UnitId]?.Free();
                SearchPoint[unit.UnitId] = null;
                return;
            }

            for (var j = 0; j < units.Count; j++)
            {
                if (units[j].UnitId != unit.UnitId && units[j].Position.X == target.X && units[j].Position.Y == target.Y && this.Exit == null)
                {
                    SearchPoint[unit.UnitId]?.Free();
                    SearchPoint[unit.UnitId] = null;
                    return;
                }
            }

            result.SetNewPosition(unit.UnitId, target.X, target.Y);
            if (!unitDescription.AttackFriendlyFire)
            {
                result.SetAttackDirection(unit.UnitId, 0, 0);
            }
        }