Crossfire Server, Trunk
R22010
|
#include "global.h"
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include "output_file.h"
#include "sproto.h"
Go to the source code of this file.
Data Structures | |
struct | quest_condition |
struct | quest_definition |
struct | quest_player |
struct | quest_state |
struct | quest_step_definition |
Macros | |
#define | QC_CAN_RESTART -1 |
#define | QUESTFILE_NEXTQUEST 0 |
#define | QUESTFILE_QUEST 1 |
#define | QUESTFILE_QUESTDESC 2 |
#define | QUESTFILE_STEP 3 |
#define | QUESTFILE_STEPCOND 5 |
#define | QUESTFILE_STEPDESC 4 |
#define | TAG_END "[/color]" |
#define | TAG_START "[color=#aa55ff]" |
Typedefs | |
typedef struct quest_condition | quest_condition |
typedef struct quest_definition | quest_definition |
typedef struct quest_player | quest_player |
typedef struct quest_state | quest_state |
typedef struct quest_step_definition | quest_step_definition |
Variables | |
static quest_player * | player_states = NULL |
static quest_definition * | quests = NULL |
static int | quests_loaded = 0 |
Quest-related low-level mechanisms.
You should only need to call the public functions, all that are not static.
Data is loaded on a need-only basis - when a player quest state is queried or modified, data is read. Also, free_quest() can be called to release memory without preventing quest operations after.
Write is done for each player whenever the state changes, to ensure data integrity.
Definition in file quest.c.
#define QC_CAN_RESTART -1 |
Quest status that indicates a quest was completed and may be restarted.
Definition at line 42 of file quest.c.
Referenced by get_quest_by_number(), quest_display(), quest_get_player_state(), quest_info(), and quest_set_state().
#define TAG_END "[/color]" |
Definition at line 39 of file quest.c.
Referenced by quest_info().
#define TAG_START "[color=#aa55ff]" |
Definition at line 38 of file quest.c.
Referenced by quest_info().
typedef struct quest_condition quest_condition |
One condition to automatically move to a quest step.
typedef struct quest_definition quest_definition |
Definition of an in-game quest.
typedef struct quest_player quest_player |
Information about a player.
typedef struct quest_state quest_state |
Information about a quest for a player.
typedef struct quest_step_definition quest_step_definition |
One step of a quest.
void command_quest | ( | object * | op, |
const char * | params | ||
) |
Command handler for 'quest'.
op | player asking for information, warning emitted if not a player. |
params | extra parameters for command. |
Definition at line 1146 of file quest.c.
References quest_definition::client_code, quest_state::code, draw_ext_info(), draw_ext_info_format(), find_player_partial_name(), FLAG_WIZ, get_quest(), get_quest_by_number(), llevError, LOG(), MSG_TYPE_ADMIN_DM, MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_FAILURE, MSG_TYPE_COMMAND_QUESTS, MSG_TYPE_COMMAND_SUCCESS, NDI_UNIQUE, quest_state::next, pl::ob, QUERY_FLAG, quest_get_by_code(), quest_help(), quest_info(), quest_list(), quest_set_state(), quest_player::quests, and quest_state::state.
void dump_quests | ( | void | ) |
Dump all of the quests, then calls exit() - useful in terms of debugging to make sure that quests are set up and recognised correctly.
Definition at line 1295 of file quest.c.
References output_quests().
|
static |
Checks whether the conditions for a given step are met.
condition | the linked list of conditions to check. |
pl | the player to evaluate conditions for. |
Definition at line 672 of file quest.c.
References quest_condition::maxstep, quest_condition::minstep, quest_condition::next, quest_condition::quest_code, quest_get_player_state(), and quest_was_completed().
Referenced by update_quests().
void free_quest | ( | void | ) |
Free all quest status structures. It is all right to call quest functions again after that.
Definition at line 1303 of file quest.c.
References free_state(), free_string(), quest_state::next, quest_player::next, quest_player::player_name, and player_states.
Referenced by cleanup(), command_purge_quest(), and free_server().
void free_quest_definitions | ( | void | ) |
Free all quest definitions and steps. Can be called multiple times. Used by DMs through the 'purge_quests' command.
Definition at line 1321 of file quest.c.
References quest_step_definition::conditions, free_string(), quest_condition::next, quest_step_definition::next, quest_definition::next, quest_condition::quest_code, quest_definition::quest_code, quest_definition::quest_description, quest_definition::quest_title, quests, quests_loaded, quest_step_definition::step_description, and quest_definition::steps.
Referenced by cleanup(), command_purge_quest_definitions(), and free_server().
|
static |
Free quests structures.
pq | what to free. |
Definition at line 1047 of file quest.c.
References quest_state::code, free_string(), quest_state::next, and quest_player::quests.
Referenced by free_quest().
|
static |
Return a new quest_state*, calling fatal() if memory shortage.
Definition at line 462 of file quest.c.
References fatal(), and OUT_OF_MEMORY.
Referenced by quest_read_player_data().
|
static |
Get quest status for a player, creating it if it doesn't exist yet. Calls fatal() if memory allocation error.
pl | player to get information of. |
Definition at line 647 of file quest.c.
References add_refcount(), fatal(), get_quest(), quest_player::next, pl::ob, OUT_OF_MEMORY, quest_player::player_name, player_states, quest_definition::quest_code, quest_read_player_data(), quest_set_state(), and quest_state::state.
Referenced by get_quest_by_number(), quest_get_player_state(), quest_info(), quest_list(), quest_send_initial_states(), quest_set_state(), quest_start(), and quest_was_completed().
|
static |
Get the state of a quest for a player, creating it if not existing yet.
pq | player to get state for. |
name | quest to get state of. |
Definition at line 603 of file quest.c.
References add_refcount(), quest_state::code, fatal(), get_state(), quest_state::next, OUT_OF_MEMORY, and quest_player::quests.
Referenced by quest_set_state(), and quest_start().
|
static |
Get quest status for a player, not creating it if it doesn't exist.
pl | player to get information of. |
Definition at line 629 of file quest.c.
References quest_player::next, pl::ob, quest_player::player_name, and player_states.
Referenced by command_quest(), get_or_create_quest(), and quest_first_player_save().
|
static |
returns the quest state which corresponds to a certain number for the given player.
pl | player asking for details. |
number | quest number. |
Definition at line 946 of file quest.c.
References quest_state::code, get_or_create_quest(), quest_state::is_complete, quest_state::next, quest_definition::parent, QC_CAN_RESTART, quest_get(), quest_player::quests, and quest_state::state.
Referenced by command_quest().
|
static |
Get the state of a quest for a player, not creating if not existing yet.
pq | player to get state for. |
name | quest to get state of. |
Definition at line 585 of file quest.c.
References quest_state::code, quest_state::next, and quest_player::quests.
Referenced by get_or_create_state(), quest_get_player_state(), and quest_was_completed().
|
static |
Loads all of the quests which are found in the given file, any global states for quest loading are passed down into this function, but not back up again.
filename | filename to load quests from. |
Definition at line 172 of file quest.c.
References add_string(), buf, quest_definition::client_code, quest_step_definition::conditions, Settings::datadir, quest_definition::face, find_face(), free_string(), HUGE_BUF, quest_step_definition::is_completion_step, llevDebug, llevError, LOG(), Settings::mapdir, MAX_BUF, quest_condition::maxstep, quest_condition::minstep, quest_condition::next, quest_step_definition::next, quest_definition::next, quest_definition::parent, path_combine_and_normalize(), quest_condition::quest_code, quest_definition::quest_code, quest_create_condition(), quest_create_definition(), quest_create_step(), quest_definition::quest_description, quest_get_by_code(), quest_definition::quest_restart, quest_definition::quest_title, QUESTFILE_NEXTQUEST, QUESTFILE_QUEST, QUESTFILE_QUESTDESC, QUESTFILE_STEP, QUESTFILE_STEPCOND, QUESTFILE_STEPDESC, quests, settings, snprintf, quest_step_definition::step, quest_step_definition::step_description, quest_definition::steps, stringbuffer_append_string(), stringbuffer_finish(), and stringbuffer_new().
Referenced by quest_load_definitions().
|
static |
Dump all defined quests on the logfile. Will call itself recursively.
parent | only quests with a parent of this value will be displayed. Use NULL to display top-level quests. |
level | number of '-' to display before the quest's name. |
Definition at line 1260 of file quest.c.
References level, logfile, MAX_BUF, quest_step_definition::next, quest_definition::next, quest_definition::parent, quest_definition::quest_code, quest_definition::quest_restart, quest_definition::quest_title, quests, and quest_definition::steps.
Referenced by dump_quests().
|
static |
Allocate a quest_condition, will call fatal() if out of memory.
Definition at line 114 of file quest.c.
References fatal(), and OUT_OF_MEMORY.
Referenced by load_quests_from_file().
|
static |
Allocate a quest_definition, will call fatal() if out of memory.
Definition at line 126 of file quest.c.
References fatal(), and OUT_OF_MEMORY.
Referenced by load_quests_from_file().
|
static |
Allocate a quest_step_definition, will call fatal() if out of memory.
Definition at line 103 of file quest.c.
References fatal(), and OUT_OF_MEMORY.
Referenced by load_quests_from_file().
|
static |
Utility function to display a quest list. Will show a header before the list if not empty.
pl | player to display list of quests. |
pq | quests to display. |
showall | if 0, only shows quests in progress and a summary of completed quests, else shows all quests. |
name | either 'You' or the player's name, if pl is a DM asking about another player. |
Definition at line 835 of file quest.c.
References quest_state::code, draw_ext_info_format(), quest_state::is_complete, MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_QUESTS, NDI_UNIQUE, quest_state::next, pl::ob, quest_definition::parent, QC_CAN_RESTART, quest_get(), quest_definition::quest_title, quest_player::quests, quests_loaded, and quest_state::state.
Referenced by quest_list().
void quest_first_player_save | ( | player * | pl | ) |
Ensure the quest state is correctly saved for a player. This function should only be called once, when the player's save directory is created. All other quest functions save the state automatically, but save can only happen when the player directory exists.
pl | who to save quests for. |
Definition at line 1418 of file quest.c.
References get_quest(), quest_write_player_data(), and quest_player::quests.
Referenced by save_player().
|
static |
Find a quest from its code.
code | quest to search. |
Definition at line 447 of file quest.c.
References llevError, LOG(), and quest_get_by_code().
Referenced by get_quest_by_number(), quest_display(), quest_get_player_state(), quest_info(), quest_set_state(), and quest_start().
|
static |
Find a quest from its code. This is called by quest_get and also used in the quest loading code
code | quest to search. |
Definition at line 139 of file quest.c.
References quest_definition::next, quest_definition::quest_code, and quests.
Referenced by command_quest(), load_quests_from_file(), quest_get(), quest_read_player_data(), and quest_send_initial_states().
Get the quest state for a player.
pl | player. |
quest_code | internal quest code. |
Definition at line 1068 of file quest.c.
References get_or_create_quest(), get_state(), QC_CAN_RESTART, quest_get(), quest_definition::quest_restart, and quest_state::state.
Referenced by cfapi_player_quest(), evaluate_quest_conditions(), and update_quests().
|
static |
Get a step for the specified quest.
quest | quest to consider. |
step | step to find. |
Definition at line 428 of file quest.c.
References llevError, LOG(), quest_step_definition::next, quest_definition::quest_code, quest_step_definition::step, and quest_definition::steps.
Referenced by quest_info(), quest_read_player_data(), quest_send_initial_states(), and quest_set_state().
|
static |
Quest command help.
pl | player to display help for. |
Definition at line 925 of file quest.c.
References draw_ext_info(), FLAG_WIZ, MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_QUESTS, NDI_UNIQUE, pl::ob, and QUERY_FLAG.
Referenced by command_quest().
|
static |
Give details about a quest.
pl | player to give quest details to. |
who | player to give quest details of. |
qs | quest_state to give details about |
level | The level of recursion for the quest info that's being provided |
Definition at line 981 of file quest.c.
References quest_state::code, draw_ext_info(), draw_ext_info_format(), FLAG_WIZ, get_or_create_quest(), quest_state::is_complete, MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_QUESTS, NDI_UNIQUE, quest_state::next, quest_step_definition::next, pl::ob, quest_definition::parent, QC_CAN_RESTART, QUERY_FLAG, quest_definition::quest_code, quest_definition::quest_description, quest_get(), quest_get_step(), quest_definition::quest_restart, quest_definition::quest_title, quest_player::quests, quest_state::state, quest_step_definition::step, quest_step_definition::step_description, quest_definition::steps, TAG_END, and TAG_START.
Referenced by command_quest().
Display current and completed player quests.
pl | player to display to. |
who | player to display information for. |
showall | - whether to show all of the quests in full, just summary information for the completed ones |
name | either 'You' or the player's name, if pl is a DM asking about another player. |
Definition at line 908 of file quest.c.
References draw_ext_info_format(), get_or_create_quest(), MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_QUESTS, NDI_UNIQUE, pl::ob, quest_display(), and quest_player::quests.
Referenced by command_quest().
void quest_load_definitions | ( | void | ) |
Load all quest definitions. Can be called multiple times, will be ignored.
Definition at line 410 of file quest.c.
References llevError, llevInfo, load_quests_from_file(), LOG(), and quests_loaded.
Referenced by init_beforeplay().
|
static |
Read quest-data information for a player.
pq | player to read data for. |
Definition at line 473 of file quest.c.
References add_string(), quest_state::code, get_new_quest_state(), quest_state::is_complete, quest_step_definition::is_completion_step, llevDebug, llevError, Settings::localdir, LOG(), MAX_BUF, quest_state::next, quest_player::player_name, Settings::playerdir, quest_definition::quest_code, quest_get_by_code(), quest_get_step(), quest_player::quests, settings, snprintf, quest_state::state, and quest_state::was_completed.
Referenced by get_or_create_quest().
void quest_send_initial_states | ( | player * | pl | ) |
Send the current quest states for the specified player, if the client supports those notifications.
pl | who to send quests for. |
Definition at line 1360 of file quest.c.
References quest_definition::client_code, quest_state::code, esrv_send_face(), quest_definition::face, socket_struct::faces_sent, get_or_create_quest(), quest_step_definition::is_completion_step, quest_state::next, socket_struct::notifications, NS_FACESENT_FACE, Face::number, quest_definition::parent, quest_get_by_code(), quest_get_step(), quest_definition::quest_restart, quest_definition::quest_title, quest_player::quests, Send_With_Handling(), quest_state::sent_to_client, pl::socket, SockList_AddChar(), SockList_AddInt(), SockList_AddLen16Data(), SockList_AddShort(), SockList_AddString(), SockList_Avail(), SockList_Init(), SockList_Reset(), SockList_Term(), quest_state::state, and quest_step_definition::step_description.
Referenced by check_login().
Set the state of a quest for a player.
pl | player to set the state for. |
quest_code | quest internal code. |
state | new state for the quest, must be greater than 0 else forced to 100 and a warning is emitted. |
Definition at line 1124 of file quest.c.
References quest_set_state().
Referenced by cfapi_player_quest().
|
static |
Set the state of a quest for a player.
dm | if NULL then the player is actually playing, else a DM is changing the quest's state manually. |
pl | player to set the state for. |
quest_code | quest internal code. |
state | new state for the quest, must be greater than 0 else forced to 100 and a warning is emitted. |
started | if 1, quest must have been started first or a warning is emitted, else it doesn't matter. |
Definition at line 736 of file quest.c.
References quest_definition::client_code, draw_ext_info(), draw_ext_info_format(), esrv_send_face(), quest_definition::face, socket_struct::faces_sent, get_or_create_quest(), get_or_create_state(), pl::has_directory, quest_state::is_complete, quest_step_definition::is_completion_step, llevDebug, llevError, LOG(), MSG_TYPE_ADMIN_DM, MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_FAILURE, MSG_TYPE_COMMAND_QUESTS, NDI_UNIQUE, socket_struct::notifications, NS_FACESENT_FACE, Face::number, pl::ob, quest_definition::parent, QC_CAN_RESTART, quest_get(), quest_get_step(), quest_definition::quest_restart, quest_definition::quest_title, quest_write_player_data(), Send_With_Handling(), quest_state::sent_to_client, pl::socket, SockList_AddChar(), SockList_AddInt(), SockList_AddLen16Data(), SockList_AddString(), SockList_Init(), SockList_Term(), quest_state::state, quest_step_definition::step_description, update_quests(), and quest_state::was_completed.
Referenced by command_quest(), get_or_create_quest(), quest_set_player_state(), quest_start(), and update_quests().
Start a quest for a player. Will notify the player.
pl | player. |
quest_code | internal quest code. |
state | initial quest state, must be greater than 0 else forced to 100 and warning emitted. |
Definition at line 1088 of file quest.c.
References draw_ext_info_format(), get_or_create_quest(), get_or_create_state(), llevDebug, llevError, LOG(), MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_QUESTS, NDI_UNIQUE, pl::ob, quest_get(), quest_set_state(), quest_definition::quest_title, and quest_state::state.
Referenced by cfapi_player_quest().
Check if a quest was completed once for a player, without taking account the current state.
pl | who to check for. |
quest_code | quest internal code. |
Definition at line 1134 of file quest.c.
References get_or_create_quest(), get_state(), quest_state::state, and quest_state::was_completed.
Referenced by cfapi_player_quest(), and evaluate_quest_conditions().
|
static |
Write quest-data information for a player.
pq | player to write data for. |
Definition at line 548 of file quest.c.
References quest_state::code, draw_ext_info(), Settings::localdir, MAX_BUF, MSG_TYPE_ADMIN, MSG_TYPE_ADMIN_LOADSAVE, NDI_ALL_DMS, NDI_UNIQUE, quest_state::next, of_close(), of_open(), quest_player::player_name, Settings::playerdir, quest_player::quests, settings, snprintf, quest_state::state, and quest_state::was_completed.
Referenced by quest_first_player_save(), and quest_set_state().
|
static |
Look through all of the quests for the given player, and see if any need to be updated.
pl |
Definition at line 698 of file quest.c.
References quest_step_definition::conditions, evaluate_quest_conditions(), quest_step_definition::next, quest_definition::next, quest_definition::quest_code, quest_get_player_state(), quest_set_state(), quests, quest_step_definition::step, and quest_definition::steps.
Referenced by quest_set_state().
|
static |
Player quest state.
Definition at line 62 of file quest.c.
Referenced by free_quest(), get_or_create_quest(), and get_quest().
|
static |
All known quests.
Definition at line 97 of file quest.c.
Referenced by CREResourcesWindow::CREResourcesWindow(), CRERulePanel::CRERulePanel(), CRESubItemQuest::CRESubItemQuest(), free_quest_definitions(), load_quests_from_file(), output_quests(), quest_get_by_code(), readDirectory(), and update_quests().
|
static |
Number of quests loaded. If zero, quests not yet loaded.
Definition at line 96 of file quest.c.
Referenced by free_quest_definitions(), quest_display(), and quest_load_definitions().