コード例 #1
0
        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);
        }
コード例 #2
0
 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();
     }
 }