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(); } }
public static void OnPlayerHealthChanged(float prevValue, float newValue) { PlayerHealthChanged?.Invoke(prevValue, newValue); }
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)); } }
private void OnPlayerHealthChanged(PlayerHealthChangedEventArgs args) => PlayerHealthChanged?.Invoke(this, args);