Files
2024-11-20 15:21:28 +01:00

127 lines
7.7 KiB
C#

/* [REMOVE THIS LINE]
using UnityEngine;
namespace PixelCrushers.QuestMachine.Demo
{
/// <summary>
/// This example script demonstrates how to create a quest using QuestBuilder.
/// </summary>
[RequireComponent(typeof(QuestGiver))]
public class QuestBuilderExample : MonoBehaviour
{
// Quest parameters:
public string questId = "FindCoins";
public string questTitle = "Find Coins";
public Sprite questIcon;
public string questOfferText = "Orcs stole my gold and hid it in containers around the village! Will you please find 3 coins so I can buy seeds next season?";
// Counter parameters:
public string counterName = "coins";
public int counterInitial = 0;
public int counterMin = 0;
public int counterMax = 3;
public bool counterRandomizeInitialValue = false;
// Condition node parameters:
public string node1Id = "Condition";
public string node1Name = "Find Coins";
public string node1ActDialogText = "Please find my money.";
public string node1ActJournalText = "Find the farmer's coins hidden in containers.";
public string node1HUDText = "{#coins}/3 Coins"; // {#coins} is a special tag representing the current value of the coins counter.
// Return to NPC node parameters:
public string node2Id = "Talk to NPC";
public string node2ActDialogText = "Thanks for finding my coins!";
public string node2ActJournalText = "Return to the villager.";
public string node2HUDText = "Return to villager";
public string node2TrueJournalText = "You found the farmer's coins and saved the farm!";
private void Start()
{
// Start our QuestBuilder: (It's like .NET's StringBuilder, but for quests.)
var questBuilder = new QuestBuilder(name, questId, questTitle);
// Set up some basic properties:
questBuilder.quest.icon = questIcon;
questBuilder.quest.isTrackable = true;
questBuilder.quest.showInTrackHUD = true;
// You could also set questBuilder.quest.group if you want to put this quest in a group.
// Add offer text:
questBuilder.AddOfferContents(questBuilder.CreateTitleContent(), questBuilder.CreateBodyContent(questOfferText));
// Add quest title to the Active and Successful states' dialogue, journal, and HUD text:
//
// The first line below looks up the Active state, and the Dialogue content for the Active state.
// Then it adds title content, which is a HeadingTextQuestContent object with useQuestTitle set true.
questBuilder.AddContents(questBuilder.quest.GetStateInfo(QuestState.Active).GetContentList(QuestContentCategory.Dialogue), questBuilder.CreateTitleContent());
// The remaining lines do the same for Journal and HUD content in the Active and Successful states.
questBuilder.AddContents(questBuilder.quest.GetStateInfo(QuestState.Active).GetContentList(QuestContentCategory.Journal), questBuilder.CreateTitleContent());
questBuilder.AddContents(questBuilder.quest.GetStateInfo(QuestState.Active).GetContentList(QuestContentCategory.HUD), questBuilder.CreateTitleContent());
questBuilder.AddContents(questBuilder.quest.GetStateInfo(QuestState.Successful).GetContentList(QuestContentCategory.Dialogue), questBuilder.CreateTitleContent());
questBuilder.AddContents(questBuilder.quest.GetStateInfo(QuestState.Successful).GetContentList(QuestContentCategory.Journal), questBuilder.CreateTitleContent());
//===== COUNTER CONDITION NODE =====
// Add counter to keep track of number of coins picked up:
var counter = questBuilder.AddCounter(counterName, counterInitial, counterMin, counterMax, counterRandomizeInitialValue, QuestCounterUpdateMode.Messages);
// When picked up, coins send the message "Get" "Coin". Tell the counter to increment when this message is sent:
var counterMessageEvent = new QuestCounterMessageEvent(null, new StringField("Get"), new StringField("Coin"), QuestCounterMessageEvent.Operation.ModifyByLiteralValue, 1);
counter.messageEventList.Add(counterMessageEvent);
// Add the counter condition node ([START] --> [Condition]):
var conditionNode = questBuilder.AddConditionNode(questBuilder.GetStartNode(), node1Id, node1Name, ConditionCountMode.All);
questBuilder.AddCounterCondition(conditionNode, counterName, CounterValueConditionMode.AtLeast, counterMax);
// Add text to show when node is active:
questBuilder.AddContents(conditionNode.GetStateInfo(QuestNodeState.Active).GetContentList(QuestContentCategory.Dialogue), questBuilder.CreateBodyContent(node1ActDialogText));
questBuilder.AddContents(conditionNode.GetStateInfo(QuestNodeState.Active).GetContentList(QuestContentCategory.Journal), questBuilder.CreateBodyContent(node1ActJournalText));
questBuilder.AddContents(conditionNode.GetStateInfo(QuestNodeState.Active).GetContentList(QuestContentCategory.HUD), questBuilder.CreateBodyContent(node1HUDText));
//===== RETURN TO NPC NODE =====
// Add a "return to quest giver" node ([START] --> [Condition] --> [Return]):
var questGiver = GetComponent<QuestGiver>();
var returnNode = questBuilder.AddDiscussQuestNode(conditionNode, QuestMessageParticipant.QuestGiver, questGiver.id);
// Text when active:
// Add text to show when node is active:
questBuilder.AddContents(returnNode.GetStateInfo(QuestNodeState.Active).GetContentList(QuestContentCategory.Dialogue), questBuilder.CreateBodyContent(node2ActDialogText));
questBuilder.AddContents(returnNode.GetStateInfo(QuestNodeState.Active).GetContentList(QuestContentCategory.Journal), questBuilder.CreateBodyContent(node2ActJournalText));
questBuilder.AddContents(returnNode.GetStateInfo(QuestNodeState.Active).GetContentList(QuestContentCategory.HUD), questBuilder.CreateBodyContent(node2HUDText));
// Add text to show when node is true:
questBuilder.AddContents(returnNode.GetStateInfo(QuestNodeState.True).GetContentList(QuestContentCategory.Dialogue), questBuilder.CreateBodyContent(node2ActDialogText));
questBuilder.AddContents(returnNode.GetStateInfo(QuestNodeState.True).GetContentList(QuestContentCategory.Journal), questBuilder.CreateBodyContent(node2TrueJournalText));
// Add an alert action when this node becomes active:
var actionList = returnNode.GetStateInfo(QuestNodeState.Active).actionList;
var alertAction = questBuilder.CreateAlertAction(node2HUDText);
actionList.Add(alertAction);
// Set the quest indicator to Talk when active:
var indicatorAction = questBuilder.CreateSetIndicatorAction(questBuilder.quest.id, questGiver.id, QuestIndicatorState.Talk);
returnNode.GetStateInfo(QuestNodeState.Active).actionList.Add(indicatorAction);
// Set the Indicator to None when true:
indicatorAction = questBuilder.CreateSetIndicatorAction(questBuilder.quest.id, questGiver.id, QuestIndicatorState.None);
returnNode.GetStateInfo(QuestNodeState.True).actionList.Add(indicatorAction);
//===== SUCCESS NODE =====
// Add a Success node: [START] --> [Condition] --> [Return] -- > [SUCCESS]
questBuilder.AddSuccessNode(returnNode);
//===== FINISH CREATION PROCESS =====
// Finally, get the quest:
Quest myQuest = questBuilder.ToQuest();
// And add it to the QuestGiver:
GetComponent<QuestGiver>().AddQuest(myQuest);
}
}
}
/**/