private static void analyzeRE(HtmlNode eventPane) { var div1 = eventPane.Element("div"); if (div1 is null) { return; } var a = eventPane.Descendants("a").FirstOrDefault(); if (a is null) { return; } var uri = a.GetAttribute("href", default(Uri)); MonsterEncountered?.Invoke(Client.Current, new RandomEncounterEventArgs(uri)); }
public void GoToTown(string townName) { if (Player.Health <= 0) { throw new DefeatedException(); } if (encounters != null) { throw new InBattleModeException(); } var town = unitOfWork.Towns.Find(townName); if (town == null) { throw new InvalidTownException(); } if (town == CurrentTown) { throw new SameTownException(); } var route = unitOfWork.Routes.FindBetweenTowns(CurrentTown.Id, town.Id); if (route == null) { throw new NoRouteToTownException(); } encounters = BuildEncounters(route).GetEnumerator(); CurrentTown = town; CurrentMonster = encounters.Next(); CurrentMerchant = null; if (CurrentMonster != null) { MonsterEncountered?.Invoke(this, new MonsterEncounteredEventArgs(CurrentMonster)); } }
internal static void AnalyzePage(HtmlDocument doc) { var eventPane = doc.GetElementbyId("eventpane"); if (eventPane == null) { return; } var div1 = eventPane.Element("div"); if (div1 == null) { return; } var a = eventPane.Descendants("a").FirstOrDefault(); if (a != null && MonsterEncountered != null) { var uri = a.GetAttributeValue("href", "").DeEntitize(); MonsterEncountered?.Invoke(Client.Current, new MonsterEncounteredEventArgs(new Uri(uri))); } }
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)); } }