Пример #1
0
        internal void UseItem(string itemName)
        {
            if (Player.Health <= 0)
            {
                throw new DefeatedException();
            }

            var item = unitOfWork.Items.Find(itemName);

            if (item == null)
            {
                throw new InvalidItemException();
            }
            else if (!Player.Inventory.Contains(item.Id))
            {
                throw new DoNotOwnItemException();
            }
            else if (item is HealthPotion hp)
            {
                Player.Inventory.Remove(item.Id);
                Player.Health = Math.Min(Player.MaxHealth, Player.Health + hp.Health);
                PlayerHealthChanged?.Invoke(this, new PlayerHealthChangedEventArgs(Player.Health));
            }
            else
            {
                throw new CanNotUseItemException();
            }
        }
Пример #2
0
 public static void OnPlayerHealthChanged(float prevValue, float newValue)
 {
     PlayerHealthChanged?.Invoke(prevValue, newValue);
 }
Пример #3
0
        internal void Attack()
        {
            if (Player.Health <= 0)
            {
                throw new DefeatedException();
            }

            if (CurrentMonster == null)
            {
                throw new NotInBattleModeException();
            }

            var attackRollPlayer = dice.Roll();
            var weapon           = Player.WeaponId.HasValue ? ((Weapon)unitOfWork.Items.Get(Player.WeaponId.Value)) : null;
            var elementAttack    = weapon == null ? 0 : GetElementAttack(weapon.ElementAttacks, CurrentMonster.ElementDefenses);
            var weaponAttack     = Player.WeaponId.HasValue ? ((Weapon)unitOfWork.Items.Get(Player.WeaponId.Value)).Attack : 0;
            var attackPlayer     = Player.Attack + attackRollPlayer + weaponAttack + elementAttack - CurrentMonster.Defense;

            attackPlayer = Math.Max(0, attackPlayer);
            if (attackPlayer > CurrentMonster.Health)
            {
                CurrentMonster.Health = 0;
            }
            else
            {
                CurrentMonster.Health -= attackPlayer;
            }

            if (CurrentMonster.Health == 0)
            {
                var loot = GetLoot();
                foreach (var item in loot)
                {
                    Player.Inventory.Add(item.Id);
                }

                MonsterDefeated?.Invoke(this, new MonsterDefeatedEventArgs(CurrentMonster, loot));

                CurrentMonster = encounters.Next();
                if (CurrentMonster == null)
                {
                    encounters = null;
                    ArrivedAtLocation?.Invoke(this, new ArrivedAtLocationEventArgs(CurrentTown));
                }
                else
                {
                    MonsterEncountered?.Invoke(this, new MonsterEncounteredEventArgs(CurrentMonster));
                }

                return;
            }
            else
            {
                MonsterHealthChanged?.Invoke(this, new MonsterHealthChangedEventArgs(CurrentMonster.Health));
            }

            var attackRollMonster = dice.Roll();
            var legDefencePlayer  = Player.LegArmorId.HasValue ? ((LegArmor)unitOfWork.Items.Get(Player.LegArmorId.Value)).Defence : 0;
            var bodyDefencePlayer = Player.BodyArmorId.HasValue ? ((BodyArmor)unitOfWork.Items.Get(Player.BodyArmorId.Value)).Defence : 0;
            var attackMonster     = CurrentMonster.Attack + attackRollMonster - Player.Defense - legDefencePlayer - bodyDefencePlayer;

            attackMonster = Math.Max(0, attackMonster);
            if (attackMonster > Player.Health)
            {
                Player.Health = 0;
            }
            else
            {
                Player.Health -= attackMonster;
            }

            if (Player.Health <= 0)
            {
                PlayerDefeated.Invoke(this, EventArgs.Empty);
            }
            else if (attackMonster != 0)
            {
                PlayerHealthChanged?.Invoke(this, new PlayerHealthChangedEventArgs(Player.Health));
            }
        }
Пример #4
0
 private void OnPlayerHealthChanged(PlayerHealthChangedEventArgs args) => PlayerHealthChanged?.Invoke(this, args);