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); }