public void Execute(Collision collision)
        {
            IProjectile  proj = ((IProjectile)collision.Collider);
            IEnvironment envo = (IEnvironment)collision.Collidee;

            if (envo is LaserField)
            {
                proj.BeginDespawn();
            }
            else if (envo is PortalBlock portalBlock)
            {
                PortalUtil.HandleProjectilePortal(portalBlock, proj, game.Screen);
            }
            else if (proj is BombProjectile && proj.GetHitbox().Width > bombWidth && proj.GetHitbox().Height > bombHeight)
            {
                RoomUtil.OpenBombableDoor(game.Screen, envo);
            }
            else if (!(proj is SwordBeam) && !(proj is BombProjectile))
            {
                if (collision.IntersectionRec.X >= rightBorder || collision.IntersectionRec.X <= leftBorder || collision.IntersectionRec.Y >= bottomBorder || collision.IntersectionRec.Y <= topBorder)
                {
                    proj.BeginDespawn();
                }
            }
            else if (proj is Fireballs)
            {
                proj.BeginDespawn();
            }
        }
示例#2
0
        public void GeneratePseudoRandomNumber_MaxValue10_ExpectLowerThan10()
        {
            var maxValue = 10;

            var result = RoomUtil.GeneratePseudoRandomNumber(maxValue);

            Assert.IsTrue(result < 10);
        }
示例#3
0
        public void ComputeNextRoomId_2X2SizeStartRoom1DirectionE_ExpectResultMinus1()
        {
            var  roomId    = 1;
            char direction = 'e';
            var  mazeSize  = 2;

            var result = RoomUtil.ComputeNextRoomId(roomId, direction, mazeSize);

            Assert.AreEqual(result, -1);
        }
示例#4
0
        /// <summary>
        /// 开启连接
        /// </summary>
        /// <returns></returns>
        public async Task <bool> ConnectAsync()
        {
            _roomId = await RoomUtil.GetLongRoomId(_shotRoomId);

            if (_roomId == 0)
            {
                return(false);
            }
            var token = await RoomUtil.GetRoomTokenByShortRoomId(_shotRoomId);

            if (token.Equals(""))
            {
                return(false);
            }
            if (!await RoomUtil.ConnectRoomByShortRoomId(_tcpClient, _shotRoomId))
            {
                return(false);
            }
            _roomStream = _tcpClient.GetStream();
            if (!await SendJoinMsgAsync(token))
            {
                //这是错误处理的代码
                return(false);
            }

            var headBuffer = new byte[ProtocolHeadLength];
            await _roomStream.ReadAsync(headBuffer, 0, headBuffer.Length);

            DanmuHead danmuHead = DanmuHead.BufferToDanmuHead(headBuffer);

            if (danmuHead.HeaderLength != ProtocolHeadLength || danmuHead.Action != 8)
            {
                //如果头信息的长度不是16,或者Action的的值不是8 (服务器接受认证包后回应的第一个数据)
                //这是错误处理的代码
                return(false);
            }

            var dataBuffer = new byte[danmuHead.PacketLength - danmuHead.HeaderLength];
            await _roomStream.ReadAsync(dataBuffer, 0, danmuHead.MessageLength());

            var s    = Encoding.Default.GetString(dataBuffer);
            var data = JObject.Parse(s);

            if (int.Parse(data["code"].ToString()) != 0)
            {
                return(false);
            }

            _connected = true;
            //循环发送心跳信息
#pragma warning disable 4014
            SendHeartbeatLoop();
#pragma warning restore 4014
            return(true);
        }
        public int?GetRoom(int roomId, char direction)
        {
            var searchedRoomId = RoomUtil.ComputeNextRoomId(roomId, direction, _connectToMaze.GetMazeMapInstance().mazeSize);

            var room = _connectToMaze.GetMazeMapInstance().mazeRooms.Where(r => r.Id == searchedRoomId).FirstOrDefault();

            if (room != null)
            {
                return(room.Id);
            }

            return(null);
        }
示例#6
0
 protected override void Page_Load(object sender, EventArgs e)
 {
     //if (!UserIdentity.HasPermission(AccessLevel.Administrator))
     //{
     //    ShowErrors("You don't have permission to view this info, please go away");
     //    return;
     //}
     if (AllCruises.Count == 1 && Request.QueryString["cruiseid"] == null)
     {
         Cruise cruise = (Cruise)AllCruises[0];
         PageRedirect(string.Format("BookingReportPeriod.aspx?NodeId={0}&SectionId={1}&cruiseid={2}", Node.Id, Section.Id, cruise.Id));
     }
     _util = new RoomUtil(Module);
     base.Page_Load(sender, e);
 }
        public int ComputeTreasureRoomId(int roomsNumber, List <int> forbiddenIds)
        {
            // Set random, only rule not the be in the same room as entrace or trap
            // Additional business rules could be added.
            int possibleRoomId = 0;

            while (true)
            {
                possibleRoomId = RoomUtil.GeneratePseudoRandomNumber(roomsNumber);
                if (!forbiddenIds.Contains(possibleRoomId))
                {
                    return(possibleRoomId);
                }
            }
        }
        public List <Room> CreateRooms(int roomsNumber, int numberOfTraps)
        {
            var        rooms        = new List <Room>();
            List <int> forbiddenIds = new List <int>(); // Not allow to add treasure or trap room id list
            List <int> trapIds      = new List <int>();

            // Compute entrance room Id
            var entranceId = ComputeEntranceRoomId(roomsNumber);

            forbiddenIds.Add(entranceId);

            // Compute the list of trap room Ids
            for (int trap = 0; trap < numberOfTraps; trap++)
            {
                var trapIdd = ComputeTrapRoomId(roomsNumber, forbiddenIds);
                forbiddenIds.Add(trapIdd); // Not to overlapp with another trap
                trapIds.Add(trapIdd);
            }

            // Compute treasure room Id
            var treasureId = ComputeTreasureRoomId(roomsNumber, forbiddenIds);

            // Create rooms
            for (int x = 0; x < Math.Sqrt(roomsNumber); x++)
            {
                for (int y = 0; y < Math.Sqrt(roomsNumber); y++)
                {
                    var roomId = x * (int)Math.Sqrt(roomsNumber) + y; // Create a number based on the tile position in the matrix
                    //  TODO add descriptions for room
                    var room = new Room
                    {
                        X           = x, // Save tile position
                        Y           = y, // Save tile position
                        Id          = roomId,
                        HasTrap     = trapIds.Contains(roomId),
                        HasTreasure = treasureId == roomId ? true : false,
                        IsEntrance  = entranceId == roomId ? true : false,
                        IsVisited   = entranceId == roomId ? true : false,
                    };
                    room.Description = RoomUtil.GenerateRoomDescription(room);
                    rooms.Add(room);
                }
            }

            return(rooms);
        }
        public int ComputeEntranceRoomId(int roomsNumber)
        {
            // Random selection of entrance
            // The only rule is to be on the edges which means that one of axis(x or y)
            // has to be 0 or maxValue-1 since we are counting from 0.
            int possibleRoomId = 0;

            while (true)
            {
                possibleRoomId = RoomUtil.GeneratePseudoRandomNumber(roomsNumber - 1);

                // Get room position on axys -- reverse process of constructing id
                var size = (int)Math.Sqrt(roomsNumber);
                var y    = possibleRoomId % 10;
                var x    = possibleRoomId / size;

                // Check that room has external walls on the edge.
                if (y == 0 || y == size - 1 || x == 0 || x == size - 1)
                {
                    return(possibleRoomId);
                }
            }
        }
示例#10
0
        // Collision order: player to item, player to enemy
        public List <Collision> GetCollisionList()
        {
            foreach (IPlayer player in players)
            {
                playerHitbox = player.GetPlayerHitbox();
                swordHitbox  = player.GetSwordHitbox();

                // Player/Sword collides with Item
                foreach (IItem item in ItemList)
                {
                    if (!DetectionUtil.AddCollision(playerHitbox, item.GetHitbox(), player, item, collisionList) && !InvalidSwordPickups.Contains(item.GetType()))
                    {
                        DetectionUtil.AddCollision(swordHitbox, item.GetHitbox(), player, item, collisionList);
                    }
                }

                // Sword collides with Enemy
                foreach (IEnemy enemy in EnemyList)
                {
                    foreach (Rectangle enemyHitbox in enemy.GetHitboxes())
                    {
                        DetectionUtil.AddCollision(swordHitbox, enemyHitbox, player, enemy, collisionList);
                    }
                }

                bool collision = false;
                foreach (IEnvironment environment in CollisionDetectionUtil.DetectionUtil.GetSingleCollisionObjects(EnvironmentList))
                {
                    foreach (Rectangle envHitbox in environment.GetHitboxes())
                    {
                        // Player collides with Environment
                        Rectangle intersectPlayer = Rectangle.Intersect(playerHitbox, envHitbox);
                        if (!intersectPlayer.IsEmpty)
                        {
                            var side = CollisionDetectionUtil.DetectionUtil.DetermineSide(playerHitbox, envHitbox, intersectPlayer);
                            collisionList.Add(new Collision(side, intersectPlayer, player, environment));

                            if (environment is LoadZone)
                            {
                                foundLoadZoneCollision[outerLoadZoneLoopCounter] = true;
                            }

                            collision = true;
                            break;
                        }
                    }
                    if (collision)
                    {
                        break;
                    }
                }

                // Player collides with multi-collision environment
                foreach (IEnvironment environment in CollisionDetectionUtil.DetectionUtil.GetMultiCollisionObjects(EnvironmentList))
                {
                    foreach (Rectangle envHitbox in environment.GetHitboxes())
                    {
                        DetectionUtil.AddCollision(playerHitbox, envHitbox, player, environment, collisionList);
                    }
                }

                // Player collides with Player
                innerLoadZoneLoopCounter = 0;
                foreach (IPlayer player2 in players)
                {
                    Rectangle player2Hitbox = player2.GetPlayerHitbox();

                    Rectangle intersectPlayer = Rectangle.Intersect(playerHitbox, player2Hitbox);
                    if ((intersectPlayer.Width == playerHitbox.Width && intersectPlayer.Height == playerHitbox.Height) || player.requesting || player2.requesting)
                    {
                        // Do nothing if they are the same or if player is requesting
                    }
                    else if (!intersectPlayer.IsEmpty)
                    {
                        var side = CollisionDetectionUtil.DetectionUtil.DetermineSide(playerHitbox, player2Hitbox, intersectPlayer);
                        collisionList.Add(new Collision(side, intersectPlayer, player, player2));
                        collision = true;
                        break;
                    }

                    innerLoadZoneLoopCounter++;

                    if (collision)
                    {
                        break;
                    }
                }

                //player intersecting with outside bounds
                foreach (Rectangle bound in roomBounds)
                {
                    Rectangle intersectPlayer = Rectangle.Intersect(playerHitbox, bound);
                    if (!intersectPlayer.IsEmpty)
                    {
                        var side = CollisionDetectionUtil.DetectionUtil.DetermineSide(playerHitbox, bound, intersectPlayer);
                        collisionList.Add(new Collision(side, intersectPlayer, player, EnvironmentList[0])); //environment object here is passed as a "dummy". There will always be at least 1 evnironment object
                        foundLoadZoneCollision[outerLoadZoneLoopCounter] = true;
                    }
                }
                player.requesting = foundLoadZoneCollision[outerLoadZoneLoopCounter];

                Rectangle innerRoomInt = Rectangle.Intersect(playerHitbox, roomInner);
                if (!innerRoomInt.IsEmpty)
                {
                    RoomUtil.ExitDoor(player.playerID);
                }
                else
                {
                    foundLoadZoneCollision[outerLoadZoneLoopCounter] = true;
                    player.requesting = true;
                }

                outerLoadZoneLoopCounter++;
            }
            return(collisionList);
        }
        public int ComputeNumberOfTraps(int sizeOfMaze)
        {
            var maxNumber = (sizeOfMaze / 3) + 1;

            return(RoomUtil.GeneratePseudoRandomNumber(maxNumber)); // Total number of traps
        }