Crossfire Server, Trunk
|
#include "global.h"
#include <assert.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include "sproto.h"
#include "output_file.h"
Go to the source code of this file.
Data Structures | |
struct | knowledge_item |
struct | knowledge_player |
struct | knowledge_type |
Macros | |
#define | TAG_END "[/color]" |
#define | TAG_START "[color=#ff6611]" |
Typedefs | |
typedef int(* | knowledge_add_item) (knowledge_player *current, const char *item, const knowledge_type *type) |
typedef void(* | knowledge_attempt) (player *pl, const knowledge_item *item) |
typedef StringBuffer *(* | knowledge_can_use_alchemy) (sstring code, const char *item, StringBuffer *buf, int index) |
typedef void(* | knowledge_detail) (const char *code, StringBuffer *buf) |
typedef int(* | knowledge_is_valid_item) (const char *code) |
typedef void(* | knowledge_summary) (const char *code, StringBuffer *buf) |
Variables | |
const typedef Face *(* | knowledge_face )(sstring code) |
static knowledge_player * | knowledge_global = NULL |
static const knowledge_type | knowledges [] |
Handling of player knowledge of various things.
Right now, the following items are considered:
Knowledge is specific for a player, and organized in 'items'. One item is a specific formulae or monster, whatever is coded.
Note that some things are done through functions in readable.c, especially item marking.
Knowledge is persistent and without errors. Maybe that could be changed in the future?
Only use non static functions when using this file.
Loading is done on a per-demand basis, writing at each change.
Knowledge is stored in a "player.knowledge" file in the player's directory.
Knowledge relies on key/values. Key is "knowledge_marker", value is specific to the item class considered and must have a left-side part, delimited by a double dot, specifying a type.
The value should be enough to determine a unique formulae or monster etc.
A type is linked to various functions for displaying, checking the key value.
During loading, obsolete items (eg formula changed) are discarded.
If the client has notifications support of at least 2, then knowledge information is sent as needed, incrementally as to not freeze the server.
Definition in file knowledge.cpp.
#define TAG_END "[/color]" |
Definition at line 70 of file knowledge.cpp.
#define TAG_START "[color=#ff6611]" |
Definition at line 69 of file knowledge.cpp.
typedef int(* knowledge_add_item) (knowledge_player *current, const char *item, const knowledge_type *type) |
Add knowledge information to the player's knowledge.
current | where to add the information to. |
item | what to add, format specific to the type. |
type | pointer of the handler type. |
Definition at line 103 of file knowledge.cpp.
typedef void(* knowledge_attempt) (player *pl, const knowledge_item *item) |
Attempt an alchemy based on the specified knowledge.
pl | who attempts the recipe. |
item | item to attempt, must not be NULL. |
Definition at line 129 of file knowledge.cpp.
typedef StringBuffer*(* knowledge_can_use_alchemy) (sstring code, const char *item, StringBuffer *buf, int index) |
Check if an item can be used for a recipe, and fill the return buffer if it's the case.
code | knowledge internal code. |
item | item's name, including title if there is one. |
buf | where to put the results. If NULL a new one can be allocated. |
index | the knowledge index for this item. |
Definition at line 113 of file knowledge.cpp.
typedef void(* knowledge_detail) (const char *code, StringBuffer *buf) |
Function to fill the StringBuffer with a detailed description of an item.
code | knowledge internal code. |
buf | where to write the description, must not be NULL. |
Definition at line 87 of file knowledge.cpp.
typedef int(* knowledge_is_valid_item) (const char *code) |
Function to check if the specified item is valid.
code | knowledge internal code. |
Definition at line 94 of file knowledge.cpp.
typedef void(* knowledge_summary) (const char *code, StringBuffer *buf) |
Function to fill the StringBuffer with the short description of an item.
code | knowledge internal code. |
buf | where to write the summary, must not be NULL. |
Definition at line 80 of file knowledge.cpp.
void command_knowledge | ( | object * | pl, |
const char * | params | ||
) |
Handle the 'knowledge' for a player.
pl | who is using the command. |
params | additional parameters. |
Definition at line 1213 of file knowledge.cpp.
References command_help(), knowledge_display(), knowledge_do_attempt(), knowledge_do_display(), knowledge_show(), llevError, LOG(), roll-o-matic::params, and altar_valkyrie::pl.
Referenced by commands_init().
void free_knowledge | ( | void | ) |
Free all knowledge data.
Definition at line 1280 of file knowledge.cpp.
References free_knowledge_player(), knowledge_global, give::next, and knowledge_player::next.
Referenced by cleanup().
|
static |
Free all knowledge items for a player.
kp | what to free. |
Definition at line 1252 of file knowledge.cpp.
References free_string(), say::item, knowledge_player::item_allocated, knowledge_player::item_count, and knowledge_player::items.
Referenced by free_knowledge_player().
|
static |
Totally free a knowledge structure, and its items.
kp | structure to free, becomes invalid. |
Definition at line 1271 of file knowledge.cpp.
References free_knowledge_items(), free_string(), and knowledge_player::player_name.
Referenced by free_knowledge(), and knowledge_process_incremental().
|
static |
Add a knowledge item to a player's store if not found yet.
current | where to look for the knowledge. |
item | internal value of the item to give, considered atomic. |
kt | how to handle the knowledge type. |
Use malloc instead of calloc here. We're setting all relevant values, anyway.
Definition at line 550 of file knowledge.cpp.
References add_string(), bigchest::check, replace::current, and knowledge_known().
Referenced by knowledge_god_add(), and knowledge_monster_add().
Display monster details, then add to a player's knowledge if not already.
op | player asking for details. |
mon | monster |
Definition at line 1528 of file knowledge.cpp.
References buf, describe_item(), draw_ext_info(), mon, MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_EXAMINE, object::name, NDI_UNIQUE, give::op, rotate-tower::result, stringbuffer_append_printf(), stringbuffer_finish(), and stringbuffer_new().
Referenced by examine_monster().
|
static |
Attempt an alchemy recipe through the knowledge system.
pl | who is attempting the recipe. |
item | knowledge item, should be of type recipe. |
Definition at line 353 of file knowledge.cpp.
References apply_by_living_below(), object::arch, object::below, recipe::cauldron, command_take(), disinfect::count, object::count, draw_ext_info(), draw_ext_info_format(), env, examine(), FLAG_INV_LOCKED, FLAG_STARTEQUIP, npc_dialog::index, recipe::ingred, recipe::ingred_count, commongive::inv, object::inv, knowledge_alchemy_get_recipe(), llevError, LOG(), disinfect::map, MAX_BUF, MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_INFO, give::name, linked_char::name, archetype::name, NDI_UNIQUE, linked_char::next, object::nrof, object_was_destroyed, altar_valkyrie::pl, put_object_in_sack(), QUERY_FLAG, safe_strncpy, CFweardisguise::tag, use_alchemy(), diamondslots::x, and diamondslots::y.
|
static |
Check if an item can be used for a recipe, and fill the return buffer if it's the case.
code | recipe internal code. |
item | item's name, including title if there is one. |
buf | where to put the results. If NULL a new one can be allocated. |
index | the knowledge index for this item. |
Definition at line 300 of file knowledge.cpp.
References archininventory::arch, recipe::arch_name, recipe::arch_names, buf, npc_dialog::index, recipe::ingred, knowledge_alchemy_get_recipe(), give::name, give::next, RANDOM, stringbuffer_append_printf(), stringbuffer_append_string(), stringbuffer_new(), recipe::title, and try_find_archetype().
|
static |
Give the full description of the alchemy recpie.
value | recipe internal value. |
buf | where to store the detail. |
Definition at line 240 of file knowledge.cpp.
References archininventory::arch, recipe::arch_name, recipe::arch_names, buf, recipe::cauldron, recipe::diff, recipe::ingred, knowledge_alchemy_get_recipe(), MAX_BUF, give::name, give::next, query_name(), RANDOM, recipe_get_difficulty_string(), recipe::skill, stringbuffer_append_printf(), recipe::title, try_find_archetype(), and autojail::value.
Try to get a face for an alchemy recipe.
code | alchemy code. |
Definition at line 514 of file knowledge.cpp.
References knowledge_alchemy_get_recipe(), llevError, LOG(), and recipe_get_face().
|
static |
Get a recipe from the internal code.
value | code to get value for. |
Definition at line 172 of file knowledge.cpp.
References disinfect::count, get_formulalist(), recipe::index, npc_dialog::index, recipelist::items, recipe::next, recipe::title, and autojail::value.
Referenced by knowledge_alchemy_attempt(), knowledge_alchemy_can_use_item(), knowledge_alchemy_detail(), knowledge_alchemy_face(), knowledge_alchemy_summary(), and knowledge_alchemy_validate().
|
static |
Give the title of the alchemy recpie.
value | recipe internal value. |
buf | where to put the information. |
Definition at line 210 of file knowledge.cpp.
References archininventory::arch, recipe::arch_name, recipe::arch_names, buf, knowledge_alchemy_get_recipe(), RANDOM, stringbuffer_append_printf(), recipe::title, try_find_archetype(), and autojail::value.
|
static |
Check if an alchemy recipe is still ok.
item | what to check for |
Definition at line 288 of file knowledge.cpp.
References knowledge_alchemy_get_recipe().
|
static |
Display all a player's knowledge.
pl | who to display knowledge of. |
params | additionnal parameters. |
Definition at line 1133 of file knowledge.cpp.
References draw_ext_info(), draw_ext_info_format(), knowledge_do_display(), knowledges, MSG_TYPE_CLIENT_NOTICE, MSG_TYPE_MISC, give::name, NDI_UNIQUE, roll-o-matic::params, altar_valkyrie::pl, is_valid_types_gen::type, and knowledge_type::type.
Referenced by command_knowledge().
|
static |
Player attempts something on a knowledge, get item and try it.
pl | who is trying. |
params | command parameters. |
Definition at line 1189 of file knowledge.cpp.
References disinfect::count, draw_ext_info(), say::item, knowledge_player::item_count, knowledge_player::items, knowledge_get_or_create(), MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_INFO, NDI_UNIQUE, roll-o-matic::params, and altar_valkyrie::pl.
Referenced by command_knowledge().
|
static |
Actually display knowledge list.
pl | who to display to. |
show_only | if not NULL, only display this knowledge type. |
search | if not NULL, only display items having the summary or detail contain the string. Must be either NULL or a non empty string. |
Definition at line 1068 of file knowledge.cpp.
References draw_ext_info(), draw_ext_info_format(), hall_of_fame::header, say::item, knowledge_player::item_count, knowledge_player::items, knowledge_get_or_create(), MSG_TYPE_CLIENT_NOTICE, MSG_TYPE_MISC, knowledge_type::name, NDI_UNIQUE, altar_valkyrie::pl, stringbuffer_finish(), stringbuffer_new(), and knowledge_type::type.
Referenced by command_knowledge(), and knowledge_display().
|
static |
Find a knowledge handler from its type.
type | internal type name. |
Definition at line 867 of file knowledge.cpp.
References knowledges, and is_valid_types_gen::type.
Referenced by knowledge_give(), knowledge_player_knows(), and knowledge_read_player_data().
void knowledge_first_player_save | ( | player * | pl | ) |
Ensure the knowledge state is correctly saved for the player. This function should only be called once, when the player's save directory is created. All other knowledge functions save the state automatically, but save can only happen when the player directory exists.
pl | who to save the state for. |
Definition at line 1423 of file knowledge.cpp.
References knowledge_global, knowledge_write_player_data(), knowledge_player::next, altar_valkyrie::pl, and knowledge_player::player_name.
Referenced by save_player().
|
static |
Find or create the knowledge store for a player. Will load data if required. fatal() will be called if memory failure.
pl | who to find data for. |
Definition at line 968 of file knowledge.cpp.
References add_refcount(), fatal(), knowledge_global, knowledge_read_player_data(), knowledge_player::next, OUT_OF_MEMORY, altar_valkyrie::pl, knowledge_player::player_name, and knowledge_player::sent_up_to.
Referenced by knowledge_do_attempt(), knowledge_do_display(), knowledge_give(), knowledge_item_can_be_used_alchemy(), knowledge_player_knows(), knowledge_send_known(), and knowledge_show().
Give a knowledge item from its code.
pl | who to give the knowldge to. |
marker | knowledge's code. |
book | optional item containing the knowledge code. |
Definition at line 996 of file knowledge.cpp.
References replace::current, draw_ext_info_format(), fatal(), knowledge_find(), knowledge_get_or_create(), knowledge_write_player_data(), llevError, LOG(), MSG_TYPE_CLIENT_NOTICE, MSG_TYPE_MISC, object::name, NDI_UNIQUE, OUT_OF_MEMORY, altar_valkyrie::pl, TAG_END, TAG_START, and is_valid_types_gen::type.
Referenced by cfapi_player_knowledge(), and knowledge_read().
|
static |
Add god information to the player's knowledge, handling the multiple monster case.
current | where to add the information to. |
item | god to add, a dot separating the exact knowledge. |
type | pointer of the monster type. |
Definition at line 728 of file knowledge.cpp.
References buf, bigchest::check, replace::current, free_string(), knowledge_add(), llevError, LOG(), rotate-tower::result, strdup_local, stringbuffer_append_printf(), stringbuffer_finish_shared(), stringbuffer_new(), and is_valid_types_gen::type.
|
static |
Describe in detail a god.
item | knowledge item for the god (object name and what is known). |
buf | where to put the description. |
Definition at line 677 of file knowledge.cpp.
References buf, archetype::clone, describe_god(), find_archetype_by_object_name(), llevError, LOG(), and strdup_local.
Get the face for a god.
code | god's code. |
Definition at line 774 of file knowledge.cpp.
References buf, archetype::clone, object::face, MAX_BUF, tolower, and try_find_archetype().
|
static |
God information summary.
item | knowledge item. |
buf | where to put the information. |
Definition at line 661 of file knowledge.cpp.
References buf, strdup_local, and stringbuffer_append_printf().
|
static |
Check if a god knowledge item is still valid.
item | monster to check |
Definition at line 706 of file knowledge.cpp.
References find_archetype_by_object_name(), llevError, LOG(), and strdup_local.
Displays known alchemy recipes an item can be used in.
op | who to display recipes for. |
item | what to check formulae for. |
Definition at line 1334 of file knowledge.cpp.
References buf, draw_ext_info(), knowledge_item::handler, knowledge_item::item, knowledge_player::item_count, knowledge_player::items, knowledge_get_or_create(), MAX_BUF, MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_EXAMINE, give::name, NDI_UNIQUE, give::op, PLAYER, rotate-tower::result, stringbuffer_append_string(), stringbuffer_finish(), and knowledge_type::use_alchemy.
Referenced by examine().
|
static |
Check whether a player already knows a knowledge item or not.
current | player to check. |
item | what to check for. |
kt | the knowledge type for item. |
Definition at line 532 of file knowledge.cpp.
References replace::current, and knowledge_type::type.
Referenced by knowledge_add(), and knowledge_player_knows().
|
static |
Give the full description of a message.
value | message internal value. |
buf | where to store the detail. |
Definition at line 818 of file knowledge.cpp.
References buf, get_message_body(), get_message_from_identifier(), navar-midane_pickup::msg, stringbuffer_append_printf(), and autojail::value.
Get the face for a message.
code | message's code. |
Definition at line 842 of file knowledge.cpp.
References get_message_face(), get_message_from_identifier(), and navar-midane_pickup::msg.
|
static |
Give the title of a message.
value | message internal value. |
buf | where to put the information. |
Definition at line 802 of file knowledge.cpp.
References buf, get_message_from_identifier(), get_message_title(), navar-midane_pickup::msg, stringbuffer_append_printf(), and autojail::value.
|
static |
Check if a message is still valid.
item | what to check for |
Definition at line 833 of file knowledge.cpp.
References get_message_from_identifier().
|
static |
Add monster information to the player's knowledge, handling the multiple monster case.
current | where to add the information to. |
item | monster to add, can be separated by dots for multiple ones. |
type | pointer of the monster type. |
Definition at line 624 of file knowledge.cpp.
References replace::current, knowledge_add(), strdup_local, and is_valid_types_gen::type.
|
static |
Describe in detail a monster.
item | knowledge item for the monster (archetype name). |
buf | where to put the description. |
Definition at line 595 of file knowledge.cpp.
References buf, archetype::clone, describe_item(), object::name, stringbuffer_append_printf(), and try_find_archetype().
Get the face for a monster.
code | monster's code. |
Definition at line 646 of file knowledge.cpp.
References blank_face, archetype::clone, object::face, and try_find_archetype().
|
static |
Monster information summary.
item | knowledge item. |
buf | where to put the information. |
Definition at line 581 of file knowledge.cpp.
References buf, archetype::clone, object::name, stringbuffer_append_printf(), and try_find_archetype().
|
static |
Check if a monster knowledge item is still valid.
item | monster to check |
Definition at line 610 of file knowledge.cpp.
References archetype::clone, archetype::head, MONSTER_EXCLUDE_FROM_READABLE_KEY, object_get_value(), try_find_archetype(), and object::type.
int knowledge_player_knows | ( | const player * | pl, |
const char * | knowledge | ||
) |
Determines whether a player knows a specific knowledge or not.
pl | who to check knowledge for. |
knowledge | what to check for, in format "type:(type specific value)". |
Definition at line 1298 of file knowledge.cpp.
References replace::current, giveknowledge::knowledge, knowledge_find(), knowledge_get_or_create(), knowledge_known(), llevError, LOG(), MAX_BUF, altar_valkyrie::pl, strlcpy(), and is_valid_types_gen::type.
Referenced by cfapi_player_knowledge().
void knowledge_process_incremental | ( | void | ) |
Incrementally send knowledge information to players, and remove information for players who left.
Definition at line 1439 of file knowledge.cpp.
References buf, esrv_send_face(), first_player, free_knowledge_player(), say::item, knowledge_player::item_count, knowledge_player::items, knowledge_global, MIN, knowledge_player::next, NS_FACESENT_FACE, Face::number, altar_valkyrie::pl, knowledge_player::player_name, Send_With_Handling(), knowledge_player::sent_up_to, SockList_AddInt(), SockList_AddLen16Data(), SockList_AddString(), SockList_Avail(), SockList_Init(), SockList_Reset(), SockList_Term(), ST_PLAYING, stringbuffer_finish(), stringbuffer_new(), and try_find_face().
Referenced by do_specials().
Player is reading a book, give knowledge if needed, warn player, and such.
pl | who is reading. |
book | what is read. |
Definition at line 1056 of file knowledge.cpp.
References knowledge_give(), object_get_value(), altar_valkyrie::pl, and sstring.
Referenced by apply_sign(), and book_type_apply().
|
static |
Read all knowledge data for a player from disk, discarding invalid data.
kp | player structure to load data into. |
Definition at line 913 of file knowledge.cpp.
References add_string(), mad_mage_user::file, say::item, knowledge_player::item_allocated, knowledge_player::item_count, knowledge_player::items, knowledge_find(), llevDebug, llevError, Settings::localdir, LOG(), MAX_BUF, knowledge_player::player_name, Settings::playerdir, settings, and is_valid_types_gen::type.
Referenced by knowledge_get_or_create().
void knowledge_send_info | ( | socket_struct * | ns | ) |
Send the reply_info for 'knowledge_info'.
ns | socket to send information to. |
Definition at line 1374 of file knowledge.cpp.
References knowledge_type::attempt_alchemy, esrv_send_face(), socket_struct::faces_sent, knowledges, give::name, NS_FACESENT_FACE, Face::number, Send_With_Handling(), SockList_AddPrintf(), SockList_AddString(), SockList_Init(), SockList_Term(), try_find_face(), is_valid_types_gen::type, and knowledge_type::type.
Referenced by request_info_cmd().
void knowledge_send_known | ( | player * | pl | ) |
Send initial known knowledge to player, if requested.
pl | who to send knowledge for. |
Definition at line 1403 of file knowledge.cpp.
References knowledge_get_or_create(), altar_valkyrie::pl, and knowledge_player::sent_up_to.
Referenced by check_login().
|
static |
Show the details of a knowledge item.
pl | who is asking for details. |
params | additional parameters, should contain the knowledge item number. |
Definition at line 1163 of file knowledge.cpp.
References buf, disinfect::count, draw_ext_info(), say::item, knowledge_player::item_count, knowledge_player::items, knowledge_get_or_create(), MSG_TYPE_CLIENT_NOTICE, MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_INFO, MSG_TYPE_MISC, NDI_UNIQUE, roll-o-matic::params, altar_valkyrie::pl, stringbuffer_finish(), and stringbuffer_new().
Referenced by command_knowledge().
|
static |
Store all knowledge data for a player to disk.
kp | player data to store. |
Definition at line 882 of file knowledge.cpp.
References draw_ext_info(), mad_mage_user::file, say::item, knowledge_player::item_count, knowledge_player::items, Settings::localdir, MAX_BUF, MSG_TYPE_ADMIN, MSG_TYPE_ADMIN_LOADSAVE, NDI_ALL_DMS, NDI_UNIQUE, of_close(), of_open(), knowledge_player::player_name, Settings::playerdir, and settings.
Referenced by knowledge_first_player_save(), and knowledge_give().
Get the face for a knowledge item.
code | knowledge internal code. |
Definition at line 120 of file knowledge.cpp.
|
static |
All known loaded knowledge for a player.
Definition at line 164 of file knowledge.cpp.
Referenced by free_knowledge(), knowledge_first_player_save(), knowledge_get_or_create(), and knowledge_process_incremental().
|
static |
All handled knowledge items.
Definition at line 853 of file knowledge.cpp.
Referenced by knowledge_display(), knowledge_find(), and knowledge_send_info().