GS2-Quest
Manage the progress of the game and the quests.
Quests
A quest is the basic unit of in-game play, and is the entity you select when you start in-game. A quest can have a cost for the challenge and a reward for the challenge, and GS2-Quest accepts the start and end of the quest as an API. In other words, GS2-Quest is not involved in the in-game content.
Quest challenge cost
Sets the cost required to bring a quest to its starting state. In general, set the cost to consume stamina managed by GS2-Stamina or items managed by GS2-Inventory.
Rewards for completing quests
You can set the rewards you receive for attempting and completing quests. Multiple types of rewards can be set. With this feature, you can set up a version of the quest where a rare monster appears with a certain probability and the rewards are more luxurious than usual.
First Clear Reward
It is possible to set up a quest so that an additional reward is only earned the first time the quest is completed.
Reduced Clear Rewards
Quest rewards can be reduced from rewards if you do not defeat a monster that appears in the quest or if you miss a treasure chest.
The maximum reward received for the quest is reported in the response to the quest start API, and the actual number of rewards received is reported in the quest completion API. The reward can be reduced by reporting a lower reward in this report. If you attempt to report a reward that exceeds the maximum, an error will occur.
Quest Failure Rewards
You can set the reward you receive if you attempt a quest and fail. If a quest fails, the stamina paid at the time of the challenge may be refunded.
Prerequisites for Quests
You can set a requirement that another quest must be completed in order to challenge a quest. This allows you to link quests together like a chain.
Quests can be attempted for a certain period of time.
Quests can have GS2 Schedule events associated with them as challengeable periods. The challengeable period is determined at the time the start API is executed, not at the time of the end process.
Quest Group
An entity that groups together multiple Quests.
Quest Group Challengeable Period
A quest group can also have GS2 Schedule events associated with it as a challenge period. If you set a challenge period for a quest group, the condition is applied to all quests in the group.
If you set a challenge period for both a quest group and a quest, the quest will only be challengeable when both events are in session.
Example of implementation
Get a list of Quests
var items = await gs2.Quest.Namespace(
namespaceName: "namespace-0001"
).QuestGroupModel(
questGroupName: "quest-group-0001"
).QuestModelsAsync(
).ToListAsync();
const auto Domain = Gs2->Quest->Namespace(
"namespace-0001" // namespaceName
)->QuestGroupModel(
"quest-group-0001" // questGroupName
);
const auto It = Domain->QuestModels(
);
TArray<Gs2::UE5::Quest::Model::FEzQuestModelPtr> Result;
for (auto Item : *It)
{
if (Item.IsError())
{
return false;
}
Result.Add(Item.Current());
}
Get quest completion status
var item = await gs2.Quest.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).CompletedQuestList(
questGroupName: "main"
).ModelAsync();
const auto Domain = Gs2->Quest->Namespace(
"namespace-0001" // namespaceName
)->Me(
AccessToken
)->CompletedQuestList(
"main" // questGroupName
);
const auto item = Domain.Model();
Start a quest
var result = await gs2.Quest.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).StartAsync(
questGroupName: "group-0001",
questName: "quest-0001",
);
const auto Domain = Gs2->Quest->Namespace(
"namespace-0001" // namespaceName
)->Me(
AccessToken
)->CompletedQuestList(
"main" // questGroupName
);
const auto item = Domain.Model();
Get quest in progress
var item = await gs2.Quest.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).Progress(
).ModelAsync();
const auto Domain = Gs2->Quest->Namespace(
"namespace-0001" // namespaceName
)->Me(
AccessToken
)->Progress(
);
const auto item = Domain.Model();
Report the end of the quest
var result = await gs2.Quest.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).Progress(
).EndAsync(
isComplete: true,
rewards: new [] {
new Gs2.Unity.Gs2Quest.Model.EzReward{},
},
config: null
);
const auto Domain = Gs2->Quest->Namespace(
"namespace-0001" // namespaceName
)->Me(
AccessToken
)->Progress(
);
const auto Future = Domain->End(
true,
[]
{
const auto v = MakeShared<TArray<TSharedPtr<Gs2::Quest::Model::FReward>>>();
v->Add({});
return v;
}(), // rewards
nullptr // config
);
Future->StartSynchronousTask();
if (Future->GetTask().IsError()) return false;
Other Features
Branching quests
Under normal circumstances, it is not possible to branch quests. If you want to implement a quest that has two exits within the quest, and the next quest that can be attempted changes depending on which exit is used, please consider the following data structure.]
Quest Name | Prerequisite Quest |
---|---|
Quest1 | |
Quest1a | Phantom |
Quest1b | Phantom |
Quest2a | Quest1a |
Quest2b | Quest1b |
It is complicated, but you can set a quest name that does not exist in the master data as a prerequisite for a quest.
In this case, Quest1a / Quest1b is a prerequisite for a quest called Phantom, but the quest Phantom does not exist in the master data. Therefore, Quest1a / Quest1b is a quest that will never be made available as a challenge.
Quest2a / Quest2b is a prerequisite quest for Quest1a / Quest1b. In this state, the rewards “Complete Quest1a” and “Complete Quest1b” are set as the rewards for completing Quest1, and the following rewards are set as the rewards for completing Quest2a and Quest2b. Depending on the exit used, the player decides which of the two rewards will be given to the player to manipulate the completion state of Quest1a.
The reason for Quest1a / Quest1b is that quests that do not exist in the master data cannot be cleared.
graph TD Quest1 -- if use exit A --> Quest1a Quest1 -- if use exit B --> Quest1b phantom --- Quest1a phantom --- Quest1b Quest1a --> Quest2a Quest1b --> Quest2b linkStyle 2 stroke:#ccc,stroke-dasharray:4 linkStyle 3 stroke:#ccc,stroke-dasharray:4 style phantom fill:#fff,stroke:#ccc,stroke-dasharray:4 style Quest1a fill:#fff,stroke:#ccc,stroke-dasharray:4 style Quest1b fill:#fff,stroke:#ccc,stroke-dasharray:4