Implementing different types of quests in an RPG.

Started by
3 comments, last by GameDev.net 18 years ago
I and a couple of friends are having hard time thinking of a way to store the quests for our web-based RPG. We can't think of a pattern to store the quests, because each quest will be unique and can't be categorized. Should we hard-code the quests or there are other ways to acomplish this challenging task? Our language of choice is PHP and our database MySQL, if it matters.
Advertisement
I would imagine the individual components of your quest could be categorized: for example, talk to Bob, give item Foo to Bob, kill Steve...

You can store those as an enumerated value and simply make a "quest file" that lists the objectives of the quest piece by piece until you complete them.

When your user does something, figure out if that completes an objective, and if so, mark it off on that user's progress somehow. Then once all the objectives for that quest are done, announce the quest completed and give them an item or something.

Additional features of the objectives might be order, or minimum level, or something so you could enforce a certain order to the objectives.
Represent quests as a directed graph. Users actions move them along the edges from starting to ending node.

       +-> C -+      /       | A -> B --> D -+-> W      \<---+       \   V        \> E -> X

A - (Accept quest, abandon quest)
B - quest accepted (kill target - C, talk to target - D, kill quest giver - E)
C - Loot target, move to W, you win
D - If your charisma is > 20, you get the item - go to W, you win,
If your charisma is 0 - 10, try different aproach, go to B
If your charisma is < 0, target escapes - you fail, go to E
E - You have failed

This can be easily stored in any format. You store:
- Graph structure
- Node entry/exit events
- Action triggers
- Choices at each node
- Conditions
- Descriptive text

Action triggers will usually be bound to your game, the rest will be part of game engine.

By properly designing the graph, you can also check for completability of the quest (so you don't end up in dead-end), if you formalize your triggers/actions/conditions.

If entire graph is formalized, you can auto-generate quests as well (the quality may be lacking though).
In many professional games, quests are represented as state machines, with transitions driven by script. (This is similar to Antheus's graph approach)

Each node is a state:

STATE1. INITIAL STATE (player has not accepted quest)
STATE2. QUEST ALREADY COMPLETED
STATE3. QUEST LEVEL TOO LOW
STATE4. QUEST LEVEL TOO HIGH
STATE5. QUEST AVAILABLE
STATE6. QUEST ACCEPTED
STATE7. QUEST PART1 COMPLETE
STATE8. QUEST PART2 COMPLETE
STATE9. QUEST PART3 COMPLETE
STATE10. QUEST COMPLETE
STATE10. QUEST FAILED

Between nodes, you have transitions which run scripts assigned to them

STATE1 - STATE2 Transition: {Quest in completed list}
STATE1 - STATE3 Transition: {Player Level > Quest Max Level}
STATE1 - STATE4 Transition: {Player Level <
In many professional games, quests are represented as state machines, with transitions driven by script. (This is similar to Antheus's graph approach)

Each node is a state:

STATE1. INITIAL STATE (player has not accepted quest)
STATE2. QUEST ALREADY COMPLETED
STATE3. QUEST LEVEL TOO LOW
STATE4. QUEST LEVEL TOO HIGH
STATE5. QUEST AVAILABLE
STATE6. QUEST ACCEPTED
STATE7. QUEST PART1 COMPLETE
STATE8. QUEST PART2 COMPLETE
STATE9. QUEST PART3 COMPLETE
STATE10. QUEST COMPLETE
STATE10. QUEST FAILED

Between nodes, you have transitions which run scripts assigned to them

STATE1 - STATE2  Transition: {Quest in completed list}STATE1 - STATE3  Transition: {Player Level > Quest Max Level}STATE1 - STATE4  Transition: {Player Level < Quest Min Level}STATE1 - STATE5  Transition: {Player Level Within Quest Level range}STATE5 - STATE6  Transition: {Quest in player's quest list}STATE6 - STATE7  Transition: {Head of Bob in player's inventory}STATE7 - STATE8  Transition: {Player has spoken to hermit}STATE8 - STATE9  Transition: {Player killed Joe}STATE9 - STATE10 Transition: {Player Speaking to questmaster}STATE6 - STATE11 Transition: {Player Dead}STATE7 - STATE11 Transition: {Player Dead}STATE8 - STATE11 Transition: {Player Dead}STATE9 - STATE11 Transition: {Player Dead}STATE11 - STATE1 Transition: {}


So the transitions and nodes together form a graph, the transitions coming out of the current node are all evaluated, if one is true, then it changes state to a different node, and the transition at that node is evaluated.

This data structure can be saved as 2 lists, 1 list of nodes, and one list of transitions.

You probably want to be able to execute code during a transition, or while in a node, and that could be added











This topic is closed to new replies.

Advertisement