Crossfire Server, Trunk
R21670
|
#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 |
Typedefs | |
typedef int(* | knowledge_add_item) (struct knowledge_player *current, const char *item, const struct knowledge_type *type, player *pl) |
typedef void(* | knowledge_attempt) (player *pl, const struct 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 const Face *(* | knowledge_face) (sstring code) |
typedef int(* | knowledge_is_valid_item) (const char *code) |
typedef struct knowledge_item | knowledge_item |
typedef struct knowledge_player | knowledge_player |
typedef void(* | knowledge_summary) (const char *code, StringBuffer *buf) |
typedef struct knowledge_type | knowledge_type |
Variables | |
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.c.
typedef int(* knowledge_add_item) (struct knowledge_player *current, const char *item, const struct knowledge_type *type, player *pl) |
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. |
pl | who we're adding the information for. |
Definition at line 100 of file knowledge.c.
typedef void(* knowledge_attempt) (player *pl, const struct 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 126 of file knowledge.c.
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 110 of file knowledge.c.
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 83 of file knowledge.c.
Get the face for a knowledge item.
code | knowledge internal code. |
Definition at line 117 of file knowledge.c.
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 90 of file knowledge.c.
typedef struct knowledge_item knowledge_item |
One known item for a player.
typedef struct knowledge_player knowledge_player |
Information about a player.
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 76 of file knowledge.c.
typedef struct knowledge_type knowledge_type |
One item type that may be known to the player.
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 1229 of file knowledge.c.
References command_help(), obj::contr, knowledge_display(), knowledge_do_attempt(), knowledge_do_display(), knowledge_show(), llevError, LOG(), and obj::name.
void free_knowledge | ( | void | ) |
Free all knowledge data.
Definition at line 1296 of file knowledge.c.
References free_knowledge_player(), knowledge_global, and knowledge_player::next.
Referenced by cleanup().
|
static |
Free all knowledge items for a player.
kp | what to free. |
Definition at line 1268 of file knowledge.c.
References free_string(), knowledge_item::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 1287 of file knowledge.c.
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. |
pl | who we're adding the information to. |
Use malloc instead of calloc here. We're setting all relevant values, anyway.
Definition at line 564 of file knowledge.c.
References add_string(), knowledge_item::handler, knowledge_item::item, knowledge_player::item_allocated, knowledge_player::item_count, knowledge_player::items, and knowledge_known().
Referenced by knowledge_god_add(), and knowledge_monster_add().
|
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 344 of file knowledge.c.
References apply_by_living_below(), obj::arch, obj::below, recipestruct::cauldron, command_take(), obj::container, obj::count, draw_ext_info(), draw_ext_info_format(), examine(), FLAG_INV_LOCKED, FLAG_STARTEQUIP, recipestruct::ingred, recipestruct::ingred_count, obj::inv, knowledge_item::item, knowledge_alchemy_get_recipe(), llevError, LOG(), obj::map, MAX_BUF, MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_INFO, linked_char::name, knowledge_type::name, archt::name, NDI_UNIQUE, linked_char::next, obj::nrof, pl::ob, object_was_destroyed, put_object_in_sack(), QUERY_FLAG, safe_strncpy, snprintf, obj::speed_left, knowledge_type::use_alchemy, obj::x, and obj::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 294 of file knowledge.c.
References recipestruct::arch_name, recipestruct::arch_names, archt::clone, find_archetype(), recipestruct::ingred, knowledge_alchemy_get_recipe(), linked_char::name, knowledge_type::name, obj::name, linked_char::next, knowledge_player::next, RANDOM, stringbuffer_append_printf(), stringbuffer_append_string(), stringbuffer_new(), recipestruct::title, and obj::title.
|
static |
Give the full description of the alchemy recpie.
value | recipe internal value. |
buf | where to store the detail. |
Definition at line 237 of file knowledge.c.
References recipestruct::arch_name, recipestruct::arch_names, recipestruct::cauldron, archt::clone, find_archetype(), recipestruct::ingred, knowledge_alchemy_get_recipe(), MAX_BUF, linked_char::name, knowledge_type::name, obj::name, linked_char::next, knowledge_player::next, query_name(), RANDOM, snprintf, stringbuffer_append_printf(), recipestruct::title, and obj::title.
Try to get a face for an alchemy recipe.
code | alchemy code. |
Definition at line 500 of file knowledge.c.
References recipestruct::arch_name, recipestruct::arch_names, arch_to_object(), blank_face, archt::clone, knowledge_type::face, obj::face, find_archetype(), FREE_OBJ_FREE_INVENTORY, FREE_OBJ_NO_DESTROY_CALLBACK, give_artifact_abilities(), artifactstruct::item, knowledge_alchemy_get_recipe(), llevError, locate_recipe_artifact(), LOG(), object_free(), object_give_identified_properties(), and recipestruct::title.
|
static |
Get a recipe from the internal code.
value | code to get value for. |
Definition at line 169 of file knowledge.c.
References get_formulalist(), recipestruct::index, recipeliststruct::items, recipestruct::next, and recipestruct::title.
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 207 of file knowledge.c.
References recipestruct::arch_name, recipestruct::arch_names, archt::clone, find_archetype(), knowledge_alchemy_get_recipe(), obj::name, RANDOM, stringbuffer_append_printf(), recipestruct::title, and obj::title.
|
static |
Check if an alchemy recipe is still ok.
item | what to check for |
Definition at line 282 of file knowledge.c.
References knowledge_alchemy_get_recipe().
|
static |
Display all a player's knowledge.
pl | who to display knowledge of. |
params | additionnal parameters. |
Definition at line 1149 of file knowledge.c.
References draw_ext_info(), draw_ext_info_format(), knowledge_do_display(), MSG_TYPE_CLIENT_NOTICE, MSG_TYPE_MISC, knowledge_type::name, NDI_UNIQUE, 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 1205 of file knowledge.c.
References knowledge_type::attempt_alchemy, obj::contr, draw_ext_info(), knowledge_item::handler, knowledge_player::item_count, knowledge_player::items, knowledge_get_or_create(), MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_INFO, and NDI_UNIQUE.
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 1084 of file knowledge.c.
References obj::contr, knowledge_type::detail, draw_ext_info(), draw_ext_info_format(), knowledge_item::handler, knowledge_item::item, knowledge_player::item_count, knowledge_player::items, knowledge_get_or_create(), MSG_TYPE_CLIENT_NOTICE, MSG_TYPE_MISC, knowledge_type::name, NDI_UNIQUE, stringbuffer_finish(), stringbuffer_new(), knowledge_type::summary, 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 883 of file knowledge.c.
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 1439 of file knowledge.c.
References knowledge_global, knowledge_write_player_data(), obj::name, knowledge_player::next, pl::ob, 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 984 of file knowledge.c.
References add_refcount(), fatal(), knowledge_global, knowledge_read_player_data(), obj::name, knowledge_player::next, socket_struct::notifications, pl::ob, OUT_OF_MEMORY, knowledge_player::player_name, knowledge_player::sent_up_to, and pl::socket.
Referenced by knowledge_do_attempt(), knowledge_do_display(), knowledge_give(), knowledge_item_can_be_used_alchemy(), knowledge_player_knows(), knowledge_send_known(), knowledge_show(), and knowledge_show_monster_detail().
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 1012 of file knowledge.c.
References knowledge_type::add, draw_ext_info(), fatal(), pl::has_directory, knowledge_player::items, knowledge_find(), knowledge_get_or_create(), knowledge_write_player_data(), llevError, LOG(), MSG_TYPE_CLIENT_NOTICE, MSG_TYPE_MISC, obj::name, NDI_UNIQUE, pl::ob, OUT_OF_MEMORY, strdup(), knowledge_type::type, and knowledge_type::validate.
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. |
pl | who we're adding the information to. |
Definition at line 744 of file knowledge.c.
References free_string(), knowledge_item::handler, knowledge_item::item, knowledge_player::item_count, knowledge_player::items, knowledge_add(), llevError, LOG(), strdup_local, stringbuffer_append_printf(), stringbuffer_finish_shared(), and stringbuffer_new().
|
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 692 of file knowledge.c.
References archt::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 790 of file knowledge.c.
References archt::clone, obj::face, find_archetype(), MAX_BUF, snprintf, and tolower.
|
static |
God information summary.
item | knowledge item. |
buf | where to put the information. |
Definition at line 676 of file knowledge.c.
References strdup_local, and stringbuffer_append_printf().
|
static |
Check if a god knowledge item is still valid.
item | monster to check |
Definition at line 721 of file knowledge.c.
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 1350 of file knowledge.c.
References obj::contr, 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, knowledge_type::name, obj::name, NDI_UNIQUE, PLAYER, snprintf, stringbuffer_append_string(), stringbuffer_finish(), obj::title, obj::type, 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 545 of file knowledge.c.
References knowledge_item::handler, knowledge_item::item, knowledge_player::item_count, knowledge_player::items, and knowledge_type::type.
Referenced by knowledge_add(), knowledge_player_knows(), and knowledge_show_monster_detail().
|
static |
Give the full description of a message.
value | message internal value. |
buf | where to store the detail. |
Definition at line 834 of file knowledge.c.
References get_message_body(), get_message_from_identifier(), and stringbuffer_append_printf().
Get the face for a message.
code | message's code. |
Definition at line 858 of file knowledge.c.
References get_message_face(), and get_message_from_identifier().
|
static |
Give the title of a message.
value | message internal value. |
buf | where to put the information. |
Definition at line 818 of file knowledge.c.
References get_message_from_identifier(), get_message_title(), and stringbuffer_append_printf().
|
static |
Check if a message is still valid.
item | what to check for |
Definition at line 849 of file knowledge.c.
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. |
pl | who we're adding the information to. |
Definition at line 639 of file knowledge.c.
References knowledge_add(), and strdup_local.
|
static |
Describe in detail a monster.
item | knowledge item for the monster (archetype name). |
buf | where to put the description. |
Definition at line 609 of file knowledge.c.
References archt::clone, describe_item(), find_archetype(), obj::name, and stringbuffer_append_printf().
Referenced by knowledge_show_monster_detail().
Get the face for a monster.
code | monster's code. |
Definition at line 661 of file knowledge.c.
References blank_face, archt::clone, obj::face, and find_archetype().
|
static |
Monster information summary.
item | knowledge item. |
buf | where to put the information. |
Definition at line 595 of file knowledge.c.
References archt::clone, find_archetype(), obj::name, and stringbuffer_append_printf().
|
static |
Check if a monster knowledge item is still valid.
item | monster to check |
Definition at line 624 of file knowledge.c.
References archt::clone, try_find_archetype(), and obj::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 1314 of file knowledge.c.
References knowledge_find(), knowledge_get_or_create(), knowledge_known(), llevError, LOG(), MAX_BUF, strlcpy(), and knowledge_type::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 1455 of file knowledge.c.
References esrv_send_face(), knowledge_type::face, socket_struct::faces_sent, find_face(), first_player, free_knowledge_player(), knowledge_item::handler, knowledge_item::item, knowledge_player::item_count, knowledge_type::item_face, knowledge_player::items, knowledge_global, MIN, obj::name, pl::next, knowledge_player::next, NS_FACESENT_FACE, Face::number, pl::ob, knowledge_player::player_name, Send_With_Handling(), knowledge_player::sent_up_to, pl::socket, SockList_AddInt(), SockList_AddLen16Data(), SockList_AddString(), SockList_Avail(), SockList_Init(), SockList_Reset(), SockList_Term(), stringbuffer_finish(), stringbuffer_new(), knowledge_type::summary, and knowledge_type::type.
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 1072 of file knowledge.c.
References knowledge_give(), and object_get_value().
Referenced by 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 929 of file knowledge.c.
References add_string(), knowledge_item::handler, knowledge_item::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, snprintf, knowledge_type::type, and knowledge_type::validate.
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 1390 of file knowledge.c.
References knowledge_type::attempt_alchemy, esrv_send_face(), knowledge_type::face, socket_struct::faces_sent, find_face(), knowledge_type::name, NS_FACESENT_FACE, Face::number, Send_With_Handling(), SockList_AddPrintf(), SockList_AddString(), SockList_Init(), SockList_Term(), 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 1419 of file knowledge.c.
References knowledge_get_or_create(), socket_struct::notifications, knowledge_player::sent_up_to, and pl::socket.
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 1179 of file knowledge.c.
References obj::contr, knowledge_type::detail, draw_ext_info(), knowledge_item::handler, knowledge_item::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, stringbuffer_finish(), and stringbuffer_new().
Referenced by command_knowledge().
void knowledge_show_monster_detail | ( | object * | op, |
const char * | name | ||
) |
Display the details of a monster if the player knows them.
op | player asking for details. |
name | monster's archetype name. |
Definition at line 1544 of file knowledge.c.
References obj::contr, draw_ext_info(), knowledge_get_or_create(), knowledge_known(), knowledge_monster_detail(), MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_EXAMINE, NDI_UNIQUE, stringbuffer_finish(), and stringbuffer_new().
Referenced by examine_monster().
|
static |
Store all knowledge data for a player to disk.
kp | player data to store. |
Definition at line 898 of file knowledge.c.
References draw_ext_info(), knowledge_item::handler, knowledge_item::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, settings, snprintf, and knowledge_type::type.
Referenced by knowledge_first_player_save(), and knowledge_give().
|
static |
All known loaded knowledge for a player.
Definition at line 161 of file knowledge.c.
Referenced by free_knowledge(), knowledge_first_player_save(), knowledge_get_or_create(), and knowledge_process_incremental().
|
static |
All handled knowledge items.
Definition at line 869 of file knowledge.c.