Пример #1
0
        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));
        }
Пример #2
0
        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));
            }
        }
Пример #3
0
        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)));
            }
        }
Пример #4
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));
            }
        }