示例#1
0
        public void MoveTo(Location newLocation)
        {
            // 1.1) Новото място има ли критерии (required items)?
            if (!HasRequiredItemToEnterThisLocation(newLocation))
            {
                // 1.1.1) Играчът няма нужният предмет за преминаване, следователно извежда съобщение и прекъсва Moving процеса (излиза от MoveTo функцията)
                //rtbMessages.Text += "You must have a " + newLocation.ItemRequiredToEnter.Name + " to enter this location." + Environment.NewLine;
                RaiseMessage("You must have a " + newLocation.ItemRequiredToEnter.Name + " to enter this location.");
                return;
            }
            // 1.1.2) Играчът има нужният предмет за преминаване щом не е минал през горния return

            // Обнови местоположението на играча
            CurrentLocation = newLocation;

            // 100% heal повреме на транспорта (героят се чувства отпочинал и зареден)
            CurrentHitPoints = MaximumHitPoints;

            // Отбележи промяната на HP на героя на екрана
            //lblHitPoints.Text = player.CurrentHitPoints.ToString();

            // 1.2) Тази нова локация има ли quest?
            if (newLocation.QuestAvailableHere != null)
            {
                // 1.2.1) Играчът притежава ли този quest

                //флаг дали играчът притежава quest-а
                bool playerAlreadyHasQuest = HasThisQuest(newLocation.QuestAvailableHere);
                //флаг дали играчът е завършил quest-a
                bool playerAlreadyCompletedQuest = CompletedThisQuest(newLocation.QuestAvailableHere);

                // Ако играчът притежава quest-a
                if (playerAlreadyHasQuest)
                {
                    // Играчът не е проверявал дали quest-a е завършен и все още е маркиран като незавършен
                    if (!playerAlreadyCompletedQuest)
                    {
                        // Флаг дали играчът притежава ВСИЧКИ (като бройка) quest items, нужни като критерии за завършването на quest-a
                        bool playerHasAllItemsToCompleteQuest = HasAllQuestCompletionItems(newLocation.QuestAvailableHere);

                        // 1.2.1.1.1.1) Играчът е изпълнил критериите за завършване на quest
                        if (playerHasAllItemsToCompleteQuest)
                        {
                            // 1.2.1.1.1.1.1) Изведи съобщение
                            RaiseMessage(""); // за да добави нов ред
                            RaiseMessage("You complete the '" + newLocation.QuestAvailableHere.Name + "' quest.");

                            // 1.2.1.1.1.1.2) Премахни quest items от Inventory на играча
                            RemoveQuestCompletionItems(newLocation.QuestAvailableHere);

                            // 1.2.1.1.1.1.3) Дай награда (увеличи gold, xp и евентуално добави Item/s в Inventory)
                            // Съобщение
                            RaiseMessage("You receive: ");
                            RaiseMessage(newLocation.QuestAvailableHere.RewardExperiencePoints + " experience points");
                            RaiseMessage(newLocation.QuestAvailableHere.RewardGold + " gold");
                            RaiseMessage(newLocation.QuestAvailableHere.RewardItem.Name, true); // addExtraNewLine=true, за да добави допълнителен празен ред накрая

                            //xp/gold награда
                            AddExperiencePoints(newLocation.QuestAvailableHere.RewardExperiencePoints);
                            Gold += newLocation.QuestAvailableHere.RewardGold;
                            //UpdatePlayerStats();

                            // Добави Item награда, ако има такава (засега правя реализация със задължителен Item reward, примерно potion)
                            AddItemToInventory(newLocation.QuestAvailableHere.RewardItem);

                            // 1.2.1.1.1.1.3) Маркирай quest-a като завършен (completed)
                            MarkQuestCompleted(newLocation.QuestAvailableHere);
                        }
                    }
                }
                else
                {
                    // 1.2.2) Играчът няма в quest log-a дадения quest

                    // 1.2.2.1) Изведи съобщение
                    RaiseMessage("You receive the " + newLocation.QuestAvailableHere.Name + " quest.");
                    RaiseMessage(newLocation.QuestAvailableHere.Description);
                    RaiseMessage("To complete it, return with:");
                    foreach (QuestCompletionItem qci in newLocation.QuestAvailableHere.QuestCompletionItems)
                    {
                        if (qci.Quantity == 1)
                        {
                            RaiseMessage(qci.Quantity + " " + qci.Details.Name);
                        }
                        else
                        {
                            RaiseMessage(qci.Quantity + " " + qci.Details.NamePlural);
                        }
                    }
                    RaiseMessage("");

                    // 1.2.2.2) Добави го в quest log-a
                    Quests.Add(new PlayerQuest(newLocation.QuestAvailableHere));
                }
            }

            // 1.3) Тази нова локация има ли enemy (enemies)?
            if (newLocation.EnemyLivingHere != null)
            {
                // 1.3.1.1) Съобщение
                RaiseMessage("You see a " + newLocation.EnemyLivingHere.Name);

                // 1.3.1.2) Създай противник, използвайки стойностите на стандартен противник от списъка с противници World.Enemies
                Enemy standardEnemy = World.EnemyByID(newLocation.EnemyLivingHere.ID);

                currentEnemy = new Enemy(standardEnemy.ID, standardEnemy.Name, standardEnemy.MaximumDamage, standardEnemy.RewardExperiencePoints, standardEnemy.RewardGold, standardEnemy.CurrentHitPoints, standardEnemy.MaximumHitPoints);

                foreach (LootItem lootItem in standardEnemy.LootTable)
                {
                    currentEnemy.LootTable.Add(lootItem);
                }

                // 1.3.1.3) Обнови потребителския интерфейс
                // автоматично с propertychanged event
            }
            else
            {
                // 1.3.2) Ако няма enemy
                currentEnemy = null;

                // 1.3.2.1) Скрий опциите за атака
                // автоматично
            }

            // 1.4) Обнови Inventory
            //UpdateInventoryListInUI();

            // 1.5) Oбнови quest log
            //UpdateQuestListInUI();

            // 1.6) Oбнови списъка с оръжията и в момента equipped (weapons' combobox)
            //UpdateWeaponListInUI();

            // 1.7) Oбнови списъка с Potions
            //UpdatePotionListInUI();
        }