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(); }