When working with quests, you need to understand and modify lua scripts. You need to understand or create the map in question so you can use specific zones and markers, as well as NPC Entity information. You can learn about maps in the CreateYourFirstMap tutorial.
You keep track of the progress of a player's quest by using quest variables. Note that when coding/scripting a game, the word "quest" doesn't necessarily mean the same thing as it does to a player. A player thinks of a quest as a long task. To a coder, a quest can be as simple as turning a light on or off. The light starts as off, and then the player turns it on. Now the quest is "completed." A quest is actually just a variable that gets retained across maps and is saved when the player saves their game.
Quest variables have two parts, the quest identifier, and the quest value. The quest identifier is a fixed constant that identifies a particular quest. In this tutorial, there are two quests, and therefore two quest constants. One is named P_STARTED_NEW, and the other P_WELCOMING_PARTY. Each quest also has an integer value. The value always starts at 0 for a new game. When the player saves and loads his game, this value is retained.
Old quest identifiers were set in progress.h, in the include directory. They are now set in global.lua. Right now, either place will work, but progress.h may be eliminated in the future. Adding a quest identifier is as simple as opening global.lua, and adding the following line, after the other quest identifiers:
P_STARTED_NEW = 200
Notice that I set the identifier to 200. (Do not confuse this with the quest value. We haven't gotten there yet.) The identifier is an arbitrary number. You can set the number to anything from 0 to 1000. Just make sure that this number is unique to this quest. KQ currently uses identifiers up to around 120. Don't add any identifiers less than that if you want to add your script/map to the official KQ client.
Now that I have explained quest identifiers, I will now explain quest values, and how to set them. When the player starts a new game, the value of every quest, such as P_STARTED_NEW starts at 0. Now suppose that the player has done something to further along this quest. When that happens, you want to keep track of this by setting the value of P_STARTED_NEW to something else. To set the value of this quest to something else, use the function, set_progress(). The syntax of set_progress is set_progress(quest_id, value). For example:
if (get_progress(P_STARTED_NEW) > 0) -- The player has started the P_STARTED_NEW quest end
function autoexec() function postexec() function entity_handler(en) function zone_handler()
Note that there is no map file that accompanies these scripts. However, assuming that you have read CreateYourFirstMap, you have the skills to create the map yourself. Consider it an exercise and a test to create a map to accompany these scripts. The tiles can be simple. You need two entities, one with ID 0 and one with ID 1. You do not need to place any zones, but you do need a marker titled "entrance." Also, remember that a full script file must have each of the four functions mentioned above, autoexec(), postexec(), etc. If you do not use these functions, create empty ones.
The following demonstrates a simple method, using quests, to show an intro dialog to the player. When you first enter the map, you want to immediately hear the intro dialog. Some Entity will be talking to you, but only if you haven't heard the speech before. If you have, you will skip that speech.
function postexec() if (get_progress(P_STARTED_NEW) == 0) then -- You have not had this "intro talk" yet bubble(0, "Hello, people. You are listening to the intro talk. Please talk to everyone.") -- Now you have heard it, so you can set the flag so you don't have to hear it each time you enter the map set_progress(P_STARTED_NEW, 1) end end