Esempio n. 1
0
        private bool _PlayerMove(PlayerCommand command)
        {
            // Исходя из команды, выполнить то или иное действие.
            // Если команда пройдёт успешно, то исчерпать запасы стамины и гонять Think, пока она не восстановится
            // Перемещение:
            if ((int)command < (int)PlayerCommand.Wait)
            {
                int x = PlayerPawn.X, y = PlayerPawn.Y;
                switch (command)
                {
                case PlayerCommand.Move0:
                    x++;
                    break;

                case PlayerCommand.Move45:
                    x++; y--;
                    break;

                case PlayerCommand.Move90:
                    y--;
                    break;

                case PlayerCommand.Move135:
                    x--; y--;
                    break;

                case PlayerCommand.Move180:
                    x--;
                    break;

                case PlayerCommand.Move225:
                    x--; y++;
                    break;

                case PlayerCommand.Move270:
                    y++;
                    break;

                case PlayerCommand.Move315:
                    x++; y++;
                    break;
                }

                return(_PlayerMove(x, y));
            }


            if (command == PlayerCommand.Wait)
            {
                // Во время отдыха игрок должен быстрее регенерировать здоровье
                //  и медленнее становиться голоднее
                PlayerPawn.Thoughts = ThoughtTypeEnum.Stand;
                return(true);
            }

            // Лестница
            if (command == PlayerCommand.LadderDown || command == PlayerCommand.LadderUp)
            {
                if (!(CurrentFloor.Tiles[PlayerPawn.X, PlayerPawn.Y] is Ladder))
                {
                    return(false);
                }

                Ladder ourpos    = CurrentFloor.Tiles[PlayerPawn.X, PlayerPawn.Y] as Ladder;
                int    nextlevel = currentLevel + ((ourpos.Direction == Ladder.LadderDirection.Up) ? -1 : 1);
                if (nextlevel < 0)
                {
                    return(false);
                }
                // Если следующий уровень ещё не сгенерирован, то сгенерировать и связать текущую лестницу со случайной
                if (nextlevel > floors.Count - 1)// Уравнял счетчик с индексами
                {
                    ourpos.LadderId = random.Next(1, Int32.MaxValue);
                    var newfloor = new DungeonFloor(
                        Spawner.Random.Next(currentLevel + 2 * 10, 81), Spawner.Random.Next(currentLevel + 2 * 10, 81)
                        );
                    floors.Add(newfloor); newfloor.FloorActors.AddLast(PlayerPawn);
                    int lx = 0;
                    int ly = 0;
                    for (int i = 0; i < newfloor.Width; i++)
                    {
                        for (int j = 0; j < newfloor.Height; j++)
                        {
                            if (newfloor.Tiles[i, j] is Ladder &&
                                (newfloor.Tiles[i, j] as Ladder).Direction == Ladder.LadderDirection.Up)
                            {
                                lx = i;
                                ly = j;
                                PlayerPawn.ChangePos(lx, ly);
                            }
                        }
                    }
                    (newfloor.Tiles[lx, ly] as Ladder).LadderId = ourpos.LadderId;
                    SendClientMessage(null,
                                      $"Вы {(nextlevel > CurrentLevel ? "спускаетесь" : "поднимаетесь")} на уровень {nextlevel+1}");
                }
                // Если он уже существует, то попытаться найти свободную лестницу, если не выйдет, то скинуть в случ.
                // позицию.
                else
                {
                    //Этаж на который переходим
                    var floor = floors[nextlevel];

                    if (ourpos.LadderId == 0)
                    {
                        int lx = 0;
                        int ly = 0;
                        //Задаем id для новой лестницы
                        ourpos.LadderId = random.Next(1, Int32.MaxValue);
                        for (int i = 0; i < floor.Width; i++)
                        {
                            for (int j = 0; j < floor.Height; j++)
                            {
                                //Если 2 лестницы не связаны, то ищем свободную
                                if (floor.Tiles[i, j] is Ladder &&
                                    (floor.Tiles[i, j] as Ladder).LadderId == 0 &&
                                    (floor.Tiles[i, j] as Ladder).Direction != ourpos.Direction)
                                {
                                    lx = i;
                                    ly = j;
                                    PlayerPawn.ChangePos(lx, ly);
                                }
                            }
                        }
                        (floor.Tiles[lx, ly] as Ladder).LadderId = ourpos.LadderId;
                    }

                    else
                    {
                        for (int i = 0; i < floor.Width; i++)
                        {
                            for (int j = 0; j < floor.Height; j++)
                            {
                                //Если 2 лестницы связаны то перемещаемся по ним
                                if (floor.Tiles[i, j] is Ladder &&
                                    (floor.Tiles[i, j] as Ladder).LadderId == ourpos.LadderId)
                                {
                                    PlayerPawn.ChangePos(i, j);
                                }
                            }
                        }
                    }
                    SendClientMessage(null, $"Вы возвращаетесь на уровень {nextlevel}");
                }

                currentLevel = nextlevel;
                return(true);
            }

            // Поднятие предмета
            if (command == PlayerCommand.PickupItem)
            {
                var item = CurrentFloor.FloorItems.FirstOrDefault(x => x.X == PlayerPawn.X && x.Y == PlayerPawn.Y);
                if (item == null)
                {
                    return(false);
                }

                CurrentFloor.FloorItems.Remove(item);

                /*if (item.RemoveOnPickup)
                 *  item.Use(PlayerPawn);
                 * else*/
                PlayerPawn.AddItem(item);
                return(true);
            }

            // Открытие / закрытие дверей
            if (command == PlayerCommand.OpenDoor || command == PlayerCommand.CloseDoor)
            {
                for (int i = PlayerPawn.X - 1; i <= PlayerPawn.X + 1; i++)
                {
                    for (int j = PlayerPawn.Y - 1; j <= PlayerPawn.Y + 1; j++)
                    {
                        if (CurrentFloor.Tiles[i, j] is Door)
                        {
                            (CurrentFloor.Tiles[i, j] as Door).IsOpen =
                                (command == PlayerCommand.OpenDoor) ? true : false;
                            return(true);
                        }
                    }
                }
                return(false);
            }
            if (command == PlayerCommand.EquipItem || command == PlayerCommand.RemoveItem)
            {
                return(true);
            }

            return(false);
        }