bool StartBattle(Monster beast, bool initiative) { bool fleed = false; InBattle = true; var battleground = new BattleWindow(Sam, beast, initiative); battleground.Owner = this; Visibility = Visibility.Hidden; battleground.ShowDialog(); fleed = battleground.Fleed; if (!IsLoaded) { return(false); } Visibility = Visibility.Visible; if (beast.HP == 0) { //Выбираем награду if (beast is Goblin) { WeaponChooseWindow weapon = new WeaponChooseWindow(Sam, LeftHand, RightHand); weapon.Owner = this; weapon.ShowDialog(); } //Убираем мимика else if (beast is Mimic) { Dungeon.Chests.Remove(Sam.Position); Dungeon.Map[Sam.Position.Y, Sam.Position.X].ID = 'e'; } //Телепорт ко входу else if (beast is Shadow) { if (Dungeon.Map[Dungeon.Start.Y + 1, Dungeon.Start.X].ID == '0' || Dungeon.Map[Dungeon.Start.Y + 1, Dungeon.Start.X].ID == 'b') { Sam.Position = new Coords(Dungeon.Start.Y, Dungeon.Start.X + 1); } else { Sam.Position = new Coords(Dungeon.Start.Y + 1, Dungeon.Start.X); } } //Находим лут else if (beast.Loot.Count > 0) { WeaponChangeWindow wcw = new WeaponChangeWindow(beast.Loot[DataBase.RNG.Next(beast.Loot.Count)], Sam, LeftHand, RightHand); wcw.ShowDialog(); } if (beast.Food && DataBase.RNG.Next(3) == 0) { var food = new FoodWindow(); food.Owner = this; food.ShowDialog(); FoodChange(1); } Killed.Add(beast); } Keyboard.Focus(this); InBattle = false; ChangeHealth(0); EnergyChange(0); FoodChange(0); return(fleed); }
void Move(int vertical, int horizontal) { try { int coordY = Sam.Position.Y + vertical; int coordX = Sam.Position.X + horizontal; //Пытаемся сделать шаг не в стену if (!(Dungeon.Map[coordY, coordX].ID == '0')) { if (Dungeon.Map[coordY, coordX].ID == 'b') { //Если кирпичи, то нужна кирка. Из воды кирпичи ломать нельзя, потому что нельзя if (Sam.LeftHand == 'p' || Sam.RightHand == 'p') { if (Dungeon.Map[Sam.Position.Y, Sam.Position.X].ID != 'w') { //Предупреждаем о трате энергии EnergySpendWindow esw = new EnergySpendWindow(); esw.ShowDialog(); if (esw.OK) { Sam.Position.Y = coordY; Sam.Position.X = coordX; Dungeon.Map[coordY, coordX] = new Tile('e'); Redraw(); EnergyChange(-1); WanderingMonsters(); RemoveMonsters(); Redraw(); } } } } else if (Dungeon.Map[coordY, coordX].ID == 'h') { //Пытаемся спуститься в дыру на веревке. Опять же, тратим энергию. Тратим еще энергию, если выходим из воды. if (Sam.LeftHand == 'r' || Sam.RightHand == 'r') { EnergySpendWindow esw = new EnergySpendWindow(); esw.ShowDialog(); if (esw.OK) { int energySpent = 1; if (Dungeon.Map[Sam.Position.Y, Sam.Position.X].ID == 'w') { energySpent++; } if (Sam.EP >= energySpent) { //Возможно деремся, возможно что-то находим if (DataBase.RNG.Next(3) > 0) { StartBattle(new Bat(Dungeon, Sam, Table), false); } if (DataBase.RNG.Next(3) > 1) { var wcw = new WeaponChooseWindow(Sam, LeftHand, RightHand); wcw.Owner = this; wcw.ShowDialog(); Dungeon.MonsterTier = 2; } else { var food = new FoodWindow(); food.Owner = this; food.ShowDialog(); FoodChange(1); } //Вылезаем из другой случайной дыры int nextHole = DataBase.RNG.Next(Dungeon.Holes.Count); Coords jump = Dungeon.Holes[nextHole]; if (jump.Equals(new Coords(coordY, coordX))) { jump = Dungeon.Holes[(nextHole + 1) % Dungeon.Holes.Count]; } Sam.Position.X = jump.X; Sam.Position.Y = jump.Y; EnergyChange(-energySpent); Redraw(); WanderingMonsters(); Redraw(); Keyboard.Focus(this); } } } } else { //Тратим энергию при выходе из воды if (Dungeon.Map[Sam.Position.Y, Sam.Position.X].ID == 'w') { Sam.Position.Y = coordY; Sam.Position.X = coordX; Redraw(); EnergyChange(-1); } else { Sam.Position.Y = coordY; Sam.Position.X = coordX; Redraw(); } //Происходит событие. Передаем туда координаты, откуда пришли на случай, если придется убегать Interaction(-vertical, -horizontal); Redraw(); } //Лечение зависит от текущей энергии int healChance = DataBase.RNG.Next(5); if (Sam.EP > healChance) { ChangeHealth(1); } } } catch (ArgumentOutOfRangeException) { Redraw(); } }