Crossfire Server, Trunk
readable.cpp File Reference
#include "global.h"
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include "book.h"
#include "living.h"
#include "output_file.h"
#include "spells.h"
#include "assets.h"
#include "AssetsManager.h"
+ Include dependency graph for readable.cpp:

Go to the source code of this file.

Data Structures

struct  arttypename
 
struct  title
 
struct  titlelist
 

Macros

#define arraysize(arrayname)   (sizeof(arrayname)/sizeof(*(arrayname)))
 
#define MAX_TITLE_CHECK   20
 
#define MSGTYPE_ALCHEMY   4
 
#define MSGTYPE_ARTIFACT   2
 
#define MSGTYPE_GODS   5
 
#define MSGTYPE_LIB   0
 
#define MSGTYPE_MONSTER   1
 
#define MSGTYPE_MSGFILE   6
 
#define MSGTYPE_SPELLPATH   3
 

Functions

static void add_author (object *op, int msgtype)
 
static void add_book (title *book, int type, const char *fname, int lineno)
 
static void add_book_to_list (const object *book, int msgtype)
 
static StringBufferartifact_describe (const artifact *art, const artifactlist *al, int message, int art_name, int separator)
 
static StringBufferartifact_msg (unsigned int level, size_t booksize)
 
int book_overflow (const char *buf1, const char *buf2, size_t booksize)
 
static void change_book (object *book, int msgtype)
 
static void do_monster (archetype *at)
 
static void do_spellpath_msg (archetype *at)
 
static titlefind_title (const object *book, int msgtype)
 
void free_all_readable (void)
 
static titleget_empty_book (void)
 
static titlelistget_empty_booklist (void)
 
sstring get_message_body (const GeneralMessage *message)
 
const Faceget_message_face (const GeneralMessage *message)
 
sstring get_message_title (const GeneralMessage *message)
 
static objectget_next_mon (const object *tmp)
 
objectget_random_mon (int level)
 
const readable_message_typeget_readable_message_type (object *readable)
 
static titlelistget_titlelist (int i)
 
static StringBuffergod_info_msg (int level, size_t booksize, object *book)
 
static void init_book_archive (void)
 
static void init_mon_info (void)
 
void init_readable (void)
 
static void make_formula_book (object *book, int level)
 
static StringBuffermon_desc (const object *mon)
 
static StringBuffermon_info_msg (int level, size_t booksize, object *book)
 
static StringBuffermsgfile_msg (object *book, size_t booksize)
 
static void new_text_name (object *book, int msgtype)
 
int nstrtok (const char *buf1, const char *buf2)
 
static StringBufferspellpath_msg (int level, size_t booksize, StringBuffer *buf)
 
char * strtoktolin (const char *buf1, const char *buf2, char *retbuf, size_t size)
 
void tailor_readable_ob (object *book, int msg_type)
 
const char * trim (const char *buf)
 
static int unique_book (const object *book, int msgtype)
 
void write_book_archive (void)
 

Variables

static const char *const art_author []
 
static const char *const art_book_name []
 
static const arttypename art_name_array []
 
static const char *const book_author []
 
static const char *const book_descrpt []
 
static titlelistbooklist = NULL
 
static const char *const formula_author []
 
static const char *const formula_book_name []
 
static const char *const gods_author []
 
static const char *const gods_book_name []
 
static const char *const heavy_book_name []
 
static const int last_readable_subtype = arraysize(readable_message_types)
 
static const char *const light_book_name []
 
static const int max_titles [6]
 
static const char *const mon_author []
 
static const char *const mon_book_name []
 
static std::vector< object * > monsters
 
static int need_to_write_bookarchive = 0
 
static const char *const path_author []
 
static const char *const path_book_name []
 
static const readable_message_type readable_message_types []
 
struct {
   size_t   booksize
 
   StringBuffer *   buf
 
   int   did_first_sp
 
   int   done
 
   int   level
 
   uint32_t   pnum
 
   int   prayers
 
sp_params
 
static const uint32_t spellpathdef [NRSPELLPATHS]
 

Detailed Description

This file contains code relevant to the BOOKS hack – designed to allow randomly occuring messages in non-magical texts.

Todo:
replace message type with defines/enums & such things.

Definition in file readable.cpp.

Macro Definition Documentation

◆ arraysize

#define arraysize (   arrayname)    (sizeof(arrayname)/sizeof(*(arrayname)))

Returns the element size of an array.

Parameters
arraynamethe array's name
Returns
the number of elements

Definition at line 98 of file readable.cpp.

◆ MAX_TITLE_CHECK

#define MAX_TITLE_CHECK   20

How many times to try to generate a unique name for a book.

Definition at line 76 of file readable.cpp.

◆ MSGTYPE_ALCHEMY

#define MSGTYPE_ALCHEMY   4

Alchemy-related information.

Definition at line 87 of file readable.cpp.

◆ MSGTYPE_ARTIFACT

#define MSGTYPE_ARTIFACT   2

Artifact-related information.

Definition at line 83 of file readable.cpp.

◆ MSGTYPE_GODS

#define MSGTYPE_GODS   5

God-related information.

Definition at line 89 of file readable.cpp.

◆ MSGTYPE_LIB

#define MSGTYPE_LIB   0

Message from the lib/messages file.

Definition at line 79 of file readable.cpp.

◆ MSGTYPE_MONSTER

#define MSGTYPE_MONSTER   1

Monster-related information.

Definition at line 81 of file readable.cpp.

◆ MSGTYPE_MSGFILE

#define MSGTYPE_MSGFILE   6

Message from the lib/messages file.

Definition at line 91 of file readable.cpp.

◆ MSGTYPE_SPELLPATH

#define MSGTYPE_SPELLPATH   3

Spellpath-related information.

Definition at line 85 of file readable.cpp.

Function Documentation

◆ add_author()

static void add_author ( object op,
int  msgtype 
)
static

A lot like new_text_name() above, but instead chooses an author and sets op->title to that value

Parameters
opbook to alter.
msgtypeinformation we want.

Definition at line 1023 of file readable.cpp.

References add_string(), arraysize, art_author, book_author, formula_author, gods_author, MAX_BUF, mon_author, MSGTYPE_ALCHEMY, MSGTYPE_ARTIFACT, MSGTYPE_GODS, MSGTYPE_MONSTER, MSGTYPE_MSGFILE, MSGTYPE_SPELLPATH, give::name, give::op, path_author, and RANDOM.

Referenced by change_book(), and make_formula_book().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ add_book()

static void add_book ( title book,
int  type,
const char *  fname,
int  lineno 
)
static

Appends a book to the booklist.

Parameters
bookthe book to add
typethe book type
fnamethe file name; for error messages
linenothe line number; for error messages

Definition at line 860 of file readable.cpp.

References titlelist::first_book, get_titlelist(), llevInfo, LOG(), title::next, titlelist::number, and is_valid_types_gen::type.

Referenced by init_book_archive().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ add_book_to_list()

static void add_book_to_list ( const object book,
int  msgtype 
)
static

Adds a book to the list of existing books.

Parameters
bookbook to add.
msgtypewhat information the book contains.

Definition at line 1095 of file readable.cpp.

References add_string(), object::arch, titlelist::first_book, get_empty_book(), get_titlelist(), object::level, llevDebug, llevError, LOG(), object::msg, object::name, archetype::name, need_to_write_bookarchive, titlelist::number, strtoint(), Floor::t, and object::title.

Referenced by change_book().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ artifact_describe()

static StringBuffer* artifact_describe ( const artifact art,
const artifactlist al,
int  message,
int  art_name,
int  separator 
)
static

Describe an artifact.

Parameters
artartifact to describe.
allist art is part of.
messageif non zero, and the artifact has a suitable message, add it to the description.
art_nameindex in art_name_array the artifact is in.
separatorif non zero, a separator is inserted at the start of the description.
Returns
newly allocated StringBuffer* containing the description.
Todo:
check archetype when loading archetypes, not here

Definition at line 1400 of file readable.cpp.

References add_abilities(), artifact::allowed, archininventory::arch, art_name_array, BOOK_BUF, artifact::chance, describe_item(), find_archetype_by_object_name(), FLAG_IDENTIFIED, commongive::inv, artifact::item, llevError, LOG(), diamondslots::message, object::msg, give::name, object::name, object_free_drop_inventory(), object_new(), RANDOM, SET_FLAG, stringbuffer_append_printf(), stringbuffer_append_string(), stringbuffer_append_stringbuffer(), stringbuffer_finish(), stringbuffer_length(), stringbuffer_new(), Ice::tmp, artifactlist::total_chance, try_find_archetype(), artifactlist::type, object::type, and object::value.

Referenced by artifact_msg().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ artifact_msg()

static StringBuffer* artifact_msg ( unsigned int  level,
size_t  booksize 
)
static

Generate a message detailing the properties of 1-6 artifacts drawn sequentially from the artifact list.

Parameters
levellevel of the book.
booksizemaximum length of the book.
Returns
new StringBuffer containing the dsecription.

Definition at line 1483 of file readable.cpp.

References arraysize, art_name_array, artifact_describe(), booksize, find_artifactlist(), npc_dialog::index, artifact::item, artifactlist::items, level, diamondslots::message, object::msg, RANDOM, stringbuffer_append_printf(), stringbuffer_append_string(), stringbuffer_append_stringbuffer(), stringbuffer_delete(), stringbuffer_length(), stringbuffer_new(), is_valid_types_gen::type, and arttypename::type.

Referenced by tailor_readable_ob().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ book_overflow()

int book_overflow ( const char *  buf1,
const char *  buf2,
size_t  booksize 
)

Checks if buf1 and buf2 can be combined.

Parameters
buf1
buf2buffer we plan on combining.
booksizemaximum book size.
Returns
0 if buffers can be combined, 1 else.

Definition at line 719 of file readable.cpp.

References BOOK_BUF, booksize, and buf_overflow().

Referenced by write_note().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ change_book()

static void change_book ( object book,
int  msgtype 
)
static

Give a new, fancier name to generated objects of type BOOK and SPELLBOOK. Aug 96 I changed this so we will attempt to create consistent authour/title and message content for BOOKs. Also, we will alter books that match archive entries to the archival levels and architypes. -b.t.

Parameters
bookbook to alter. Should be of type BOOK.
msgtypewhat information the book contains.

Definition at line 1137 of file readable.cpp.

References add_author(), add_book_to_list(), add_string(), arraysize, BOOK, book_descrpt, create_archetype(), find_title(), free_string(), get_titlelist(), object::level, llevDebug, llevError, LOG(), MAX_BUF, MAX_TITLE_CHECK, max_titles, object::msg, object::name, new_text_name(), titlelist::number, object_copy(), object_free_drop_inventory(), object_get_value(), object_set_msg(), object_set_value(), RANDOM, sstring, Floor::t, object::title, object::type, and unique_book().

Referenced by tailor_readable_ob().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ do_monster()

static void do_monster ( archetype at)
static

Definition at line 874 of file readable.cpp.

References archetype::clone, FLAG_CHANGING, FLAG_MONSTER, FLAG_UNAGGRESSIVE, archetype::head, MONSTER_EXCLUDE_FROM_READABLE_KEY, monsters, object_get_value(), and QUERY_FLAG.

Referenced by init_mon_info().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ do_spellpath_msg()

static void do_spellpath_msg ( archetype at)
static

Callback to write spells in messages

Definition at line 1568 of file readable.cpp.

References archetype::clone, living::grace, object::level, object::name, object::path_attuned, living::sp, sp_params, SPELL, object::stats, stringbuffer_append_string(), stringbuffer_length(), and object::type.

Referenced by spellpath_msg().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ find_title()

static title* find_title ( const object book,
int  msgtype 
)
static

Search the titlelist (based on msgtype) to see if book matches something already there. IF so, return that title.

Parameters
bookbook we're searching.
msgtypemessage type.
Returns
title if found, NULL if no match.

Definition at line 935 of file readable.cpp.

References titlelist::first_book, get_titlelist(), npc_dialog::index, llevDebug, LOG(), object::msg, strtoint(), and Floor::t.

Referenced by change_book().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ free_all_readable()

void free_all_readable ( void  )

Free all readable-related information.

Definition at line 1974 of file readable.cpp.

References title::archname, title::authour, booklist, titlelist::first_book, free_string(), llevDebug, LOG(), title::name, title::next, and titlelist::next.

Referenced by cleanup().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ get_empty_book()

static title* get_empty_book ( void  )
static

Creates a title.

Returns
new title.
Note
if memory allocation failes, calls fatal().

Definition at line 593 of file readable.cpp.

References fatal(), OUT_OF_MEMORY, and Floor::t.

Referenced by add_book_to_list(), and init_book_archive().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ get_empty_booklist()

static titlelist* get_empty_booklist ( void  )
static

Creates a titlelist.

Returns
new titlelist.
Note
if memory allocation failes, calls fatal().

Definition at line 576 of file readable.cpp.

References fatal(), and OUT_OF_MEMORY.

Referenced by get_titlelist(), and init_book_archive().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ get_message_body()

sstring get_message_body ( const GeneralMessage message)

Get a message's body.

Parameters
messagemessage, must not be NULL.
Returns
body.

Definition at line 2077 of file readable.cpp.

References diamondslots::message.

Referenced by knowledge_message_detail().

+ Here is the caller graph for this function:

◆ get_message_face()

const Face* get_message_face ( const GeneralMessage message)

Get a message's face.

Parameters
messagemessage, must not be NULL.
Returns
face, NULL if not defined.

Definition at line 2086 of file readable.cpp.

References diamondslots::message.

Referenced by knowledge_message_face().

+ Here is the caller graph for this function:

◆ get_message_title()

sstring get_message_title ( const GeneralMessage message)

Get a message's title.

Parameters
messagemessage, must not be NULL.
Returns
title.

Definition at line 2068 of file readable.cpp.

References diamondslots::message.

Referenced by knowledge_message_summary().

+ Here is the caller graph for this function:

◆ get_next_mon()

static object* get_next_mon ( const object tmp)
static

This function returns the next monster after 'tmp' in the monster list.

Parameters
tmpmonster.
Returns
next monster, or if no match is found, it returns NULL.
Note
list is considered circular, asking for the next of the last element will return the first one.

Definition at line 1320 of file readable.cpp.

References monsters, and Ice::tmp.

Referenced by mon_info_msg().

+ Here is the caller graph for this function:

◆ get_random_mon()

object* get_random_mon ( int  level)

Returns a random monster selected from linked list of all monsters in the current game. Changed 971225 to be greater than equal to level passed. Also made choosing by level more random.

Parameters
levelif non-zero, then only monsters greater than that level will be returned.
Returns
random monster, or NULL if failure.

Definition at line 1269 of file readable.cpp.

References llevError, LOG(), monsters, guildjoin::ob, and RANDOM.

Referenced by alchemy_failure_effect(), and mon_info_msg().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ get_readable_message_type()

const readable_message_type* get_readable_message_type ( object readable)

Get the readable type for an object (hopefully book).

Parameters
readableobject for which we want the readable type.
Returns
type of the book. Will never be NULL.

Definition at line 2055 of file readable.cpp.

References last_readable_subtype, readable_message_types, and object::subtype.

Referenced by apply_sign(), book_type_apply(), and spellbook_type_apply().

+ Here is the caller graph for this function:

◆ get_titlelist()

static titlelist* get_titlelist ( int  i)
static

Gets the ith titlelist.

Will create items if they don't exist.

Parameters
iindex to get.
Returns
pointer to the title list referenced by i. Will never be NULL.

Definition at line 611 of file readable.cpp.

References arraysize, booklist, get_empty_booklist(), llevInfo, LOG(), max_titles, and titlelist::next.

Referenced by add_book(), add_book_to_list(), change_book(), find_title(), unique_book(), and write_book_archive().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ god_info_msg()

static StringBuffer* god_info_msg ( int  level,
size_t  booksize,
object book 
)
static

Generate a message detailing the properties of a random god. Used by the book hack. b.t.

Parameters
levelnumber of elements to give.
booksizedesired length of the book.
bookbook we're writing the information to, for knowledge management.
Returns
StringBuffer with the information that the caller is responsible for cleaning, NULL if information overflows the booksize.

Definition at line 1822 of file readable.cpp.

References BOOK_BUF, booksize, buf, describe_god(), get_rand_god(), GOD_BLESSED, GOD_ENEMY, GOD_HOLYWORD, GOD_IMMUNITIES, GOD_PATHS, GOD_RESISTANCES, GOD_SACRED, llevError, LOG(), object::name, object_set_value(), RANDOM, stringbuffer_delete(), stringbuffer_length(), and stringbuffer_new().

Referenced by tailor_readable_ob().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ init_book_archive()

static void init_book_archive ( void  )
static

If not called before, initialize the info list.

This reads in the bookarch file into memory. bookarch is the file created and updated across multiple runs of the program.

Definition at line 738 of file readable.cpp.

References add_book(), add_string(), title::archname, arraysize, title::authour, booklist, buf, get_empty_book(), get_empty_booklist(), title::level, llevDebug, llevInfo, Settings::localdir, LOG(), MAX_BUF, max_titles, title::msg_index, title::name, titlelist::next, titlelist::number, settings, title::size, is_valid_types_gen::type, and autojail::value.

Referenced by init_readable().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ init_mon_info()

static void init_mon_info ( void  )
static

Creates the linked list of pointers to monster archetype objects if not called previously.

Definition at line 886 of file readable.cpp.

References archetypes_for_each(), do_monster(), llevDebug, LOG(), and monsters.

Referenced by init_readable().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ init_readable()

void init_readable ( void  )

Initialize linked lists utilized by message functions in tailor_readable_ob()

This is the function called by the main routine to initialize all the readable information.

Definition at line 904 of file readable.cpp.

References init_book_archive(), init_mon_info(), llevDebug, and LOG().

Referenced by generate_map(), init_beforeplay(), ResourcesManager::load(), and main().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ make_formula_book()

static void make_formula_book ( object book,
int  level 
)
static

Generate a message detailing the properties of a randomly selected alchemical formula.

Parameters
bookbook we write to.
levellevel for formulaes and such.

knowledge marker

Todo:
this would be better in knowledge.c, except this file is in server, not common...

Definition at line 1642 of file readable.cpp.

References add_author(), recipe::arch_name, recipe::arch_names, arraysize, recipe::cauldron, recipe::chance, archetype::clone, disinfect::count, recipe::diff, find_archetype(), formula_book_name, free_string(), get_formulalist(), recipe::index, recipe::ingred, recipe::is_combination, recipelist::items, llevError, LOG(), MAX_BUF, MSGTYPE_ALCHEMY, give::name, object::name, new_text_name(), recipe::next, give::next, object_set_msg(), object_set_value(), query_name(), RANDOM, recipe_get_difficulty_string(), recipe::skill, stringbuffer_append_printf(), stringbuffer_append_string(), stringbuffer_finish(), stringbuffer_finish_shared(), stringbuffer_new(), guild_entry::text, recipe::title, object::title, and recipelist::total_chance.

Referenced by tailor_readable_ob().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mon_desc()

static StringBuffer* mon_desc ( const object mon)
static

Returns a description of the monster. This really needs to be redone, as describe_item really gives a pretty internal description.

Parameters
monmonster to describe.
Returns
new StringBuffer containing the description.

Definition at line 1298 of file readable.cpp.

References describe_item(), object::lore, mon, object::name, stringbuffer_append_printf(), and stringbuffer_new().

Referenced by mon_info_msg().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mon_info_msg()

static StringBuffer* mon_info_msg ( int  level,
size_t  booksize,
object book 
)
static

Generate a message detailing the properties of randomly monster(s), and add relevant knowledge markers.

Parameters
levelbook level.
booksizesize (in characters) of the book we want.
bookbook in which we will put the information.
Returns
StringBuffer containing the information.

Definition at line 1343 of file readable.cpp.

References booksize, free_string(), get_next_mon(), get_random_mon(), mon, mon_desc(), object_set_value(), sstring, stringbuffer_append_printf(), stringbuffer_append_string(), stringbuffer_append_stringbuffer(), stringbuffer_delete(), stringbuffer_finish_shared(), stringbuffer_length(), stringbuffer_new(), and Ice::tmp.

Referenced by tailor_readable_ob().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ msgfile_msg()

static StringBuffer* msgfile_msg ( object book,
size_t  booksize 
)
static

Generate a message drawn randomly from lib/messages.

Parameters
bookbook to fill.
booksizelength of the book we want.
Returns
message to put into book, newly allocated StringBuffer the caller should free.

knowledge marker

Todo:
this would be better in knowledge.c, except this file is in server, not common...

Definition at line 1773 of file readable.cpp.

References booksize, animate::event, find_archetype(), FREE_AND_COPY, getManager(), HUGE_BUF, llevDebug, LOG(), AssetsManager::messages(), navar-midane_pickup::msg, object::name, object_create_arch(), object_insert_in_ob(), object_set_value(), Messages::random(), stringbuffer_append_string(), and stringbuffer_new().

Referenced by tailor_readable_ob().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ new_text_name()

static void new_text_name ( object book,
int  msgtype 
)
static

Only for objects of type BOOK. SPELLBOOK stuff is handled directly in change_book_name(). Names are based on text msgtype

This sets book book->name based on msgtype given. What name is given is based on various criteria

Parameters
bookbook we want to alter.
msgtypewhat information we want in the book.

Definition at line 974 of file readable.cpp.

References add_string(), arraysize, art_book_name, BOOK, formula_book_name, free_string(), gods_book_name, heavy_book_name, light_book_name, mon_book_name, MSGTYPE_ALCHEMY, MSGTYPE_ARTIFACT, MSGTYPE_GODS, MSGTYPE_MONSTER, MSGTYPE_MSGFILE, MSGTYPE_SPELLPATH, give::name, object::name, path_book_name, RANDOM, object::type, and object::weight.

Referenced by change_book(), and make_formula_book().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ nstrtok()

int nstrtok ( const char *  buf1,
const char *  buf2 
)

Simple routine to return the number of list items in buf1 as separated by the value of buf2

Parameters
buf1items we want to split.
buf2what to split by.
Returns
number of elements.

Definition at line 642 of file readable.cpp.

References buf, MAX_BUF, and strlcpy().

Referenced by describe_god(), and strtoktolin().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ spellpath_msg()

static StringBuffer* spellpath_msg ( int  level,
size_t  booksize,
StringBuffer buf 
)
static

Generate a message detailing the member incantations/prayers (and some of their properties) belonging to a random spellpath.

Parameters
levellevel of the book.
booksizemaximumlength of the book.
bufwhere to store the message. If not NULL, it is supposed to contain the message header.
Returns
buf, newly allocated StringBuffer if buf is NULL.

Definition at line 1602 of file readable.cpp.

References archetypes_for_each(), booksize, buf, do_spellpath_msg(), level, NRSPELLPATHS, python_init::path, RANDOM, sp_params, spellpathdef, spellpathnames, stringbuffer_append_printf(), stringbuffer_append_string(), stringbuffer_delete(), and stringbuffer_new().

Referenced by tailor_readable_ob().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ strtoktolin()

char* strtoktolin ( const char *  buf1,
const char *  buf2,
char *  retbuf,
size_t  size 
)

Takes a string in buf1 and separates it into a list of strings delimited by buf2. Then returns a comma separated string w/ decent punctuation.

Parameters
buf1buffer to split.
buf2what to split buf1 by.
retbufwhere to write the resulting string.
sizelength of retbuf.
Returns
retbuf.

Definition at line 684 of file readable.cpp.

References buf, MAX_BUF, nstrtok(), strlcpy(), and trim().

Referenced by describe_god().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ tailor_readable_ob()

void tailor_readable_ob ( object book,
int  msg_type 
)

The main routine. This chooses a random message to put in given readable object (type==BOOK) which will be referred hereafter as a 'book'. We use the book level to de- termine the value of the information we will insert. Higher values mean the book will (generally) have better/more info. See individual cases as to how this will be utilized. "Book" name/content length are based on the weight of the document. If the value of msg_type is negative, we will randomly choose the kind of message to generate. -b.t. thoma.nosp@m.s@as.nosp@m.tro.p.nosp@m.su.e.nosp@m.du

Parameters
bookthe object we are creating into. Must be a book, can have a level.
msg_typeif it is a positive value, we use that to determine the message type - otherwise a random value is used.

Definition at line 1892 of file readable.cpp.

References arraysize, artifact_msg(), BOOK, BOOK_BUF, BOOKSIZE, change_book(), god_info_msg(), make_face_from_files::int, object::level, make_formula_book(), max_titles, diamondslots::message, mon_info_msg(), msgfile_msg(), MSGTYPE_ALCHEMY, MSGTYPE_ARTIFACT, MSGTYPE_GODS, MSGTYPE_LIB, MSGTYPE_MONSTER, MSGTYPE_SPELLPATH, object_set_msg(), RANDOM, spellpath_msg(), stringbuffer_append_string(), stringbuffer_finish(), and object::type.

Referenced by fix_generated_item().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ trim()

const char* trim ( const char *  buf)

Return buf without its leading spaces.

Parameters
bufwhat to trim.
Returns
trimmed buf.

Definition at line 661 of file readable.cpp.

References buf.

Referenced by inja::Lexer::scan_body(), and strtoktolin().

+ Here is the caller graph for this function:

◆ unique_book()

static int unique_book ( const object book,
int  msgtype 
)
static

Check to see if the book title/msg is unique. We go through the entire list of possibilities each time. If we find a match, then unique_book returns true (because inst unique).

Parameters
bookbook we're searching.
msgtypetype of information contained.
Returns

Definition at line 1071 of file readable.cpp.

References title::authour, booklist, get_titlelist(), title::name, object::name, title::next, and object::title.

Referenced by change_book().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ write_book_archive()

void write_book_archive ( void  )

Write out the updated book archive to bookarch file.

Definition at line 2005 of file readable.cpp.

References title::archname, title::authour, titlelist::first_book, get_titlelist(), npc_dialog::index, title::level, llevDebug, llevError, Settings::localdir, LOG(), MAX_BUF, title::msg_index, title::name, need_to_write_bookarchive, title::next, titlelist::next, of_close(), of_open(), SAVE_MODE, settings, and title::size.

Referenced by cleanup(), and do_specials().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

Variable Documentation

◆ art_author

const char* const art_author[]
static
Initial value:
= {
"ancient things",
"artifacts",
"equipment",
"Havlor",
"hoards",
"items",
"lost artifacts",
"the ancients",
"treasures",
"useful things"
}

Used by artifact texts

Definition at line 245 of file readable.cpp.

Referenced by add_author().

◆ art_book_name

const char* const art_book_name[]
static
Initial value:
= {
"assemblage",
"collection",
"file",
"files",
"guide",
"handbook",
"index",
"inventory",
"list",
"listing",
"omnibus",
"record",
"record book",
"trove"
}

Book titles for artifact information.

Definition at line 227 of file readable.cpp.

Referenced by new_text_name().

◆ art_name_array

const arttypename art_name_array[]
static
Initial value:
= {
{ "Helmet", HELMET },
{ "Amulet", AMULET },
{ "Shield", SHIELD },
{ "Bracers", BRACERS },
{ "Boots", BOOTS },
{ "Cloak", CLOAK },
{ "Gloves", GLOVES },
{ "Gridle", GIRDLE },
{ "Ring", RING },
{ "Horn", ROD },
{ "Missile Weapon", BOW },
{ "Missile", ARROW },
{ "Hand Weapon", WEAPON },
{ "Artifact", SKILL },
{ "Food", FOOD },
{ "Body Armour", ARMOUR }
}

Artiface/item information.

if it isnt listed here, then art_attr_msg() will never generate a message for this type of artifact. -b.t.

Definition at line 207 of file readable.cpp.

Referenced by artifact_describe(), and artifact_msg().

◆ book_author

const char* const book_author[]
static

Used by 'generic' books.

Definition at line 411 of file readable.cpp.

Referenced by add_author().

◆ book_descrpt

const char* const book_descrpt[]
static
Initial value:
= {
"ancient",
"cryptic",
"cryptical",
"dusty",
"hierarchical",
"grizzled",
"gold-gilt",
"great",
"lost",
"magnificent",
"musty",
"mythical",
"mystical",
"rustic",
"stained",
"silvered",
"transcendental",
"weathered"
}

Book descriptions.

Definition at line 458 of file readable.cpp.

Referenced by change_book().

◆ booklist

titlelist* booklist = NULL
static

Buffer of books read in from the bookarch file. It's element size does not exceed arraysize(max_titles).

Definition at line 139 of file readable.cpp.

Referenced by free_all_readable(), get_titlelist(), init_book_archive(), and unique_book().

◆ booksize

size_t booksize

◆ buf

Definition at line 1565 of file readable.cpp.

Referenced by account_add_player_cmd(), account_char_load_from_file(), account_login_cmd(), account_new_cmd(), account_password(), account_play_cmd(), accounts_load(), add_abilities(), add_capacity(), add_me_cmd(), add_required_parameter(), adjust_sign_msg(), animate_weapon(), nlohmann::detail::dtoa_impl::append_exponent(), apply_anim_suffix(), apply_changes_to_player(), apply_check_race_restrictions(), apply_cmd(), apply_race_and_class(), ask_smooth_cmd(), assets_pack(), attack_message(), attempt_steal(), basic_emote(), can_pay(), cast_consecrate(), cf_get_maps_directory(), cf_log(), cf_object_get_string_property(), cf_random_map_set_variable(), cfapi_get_hooks(), cfapi_map_set_map_property(), cfapi_object_get_property(), cfapi_object_split(), cfapi_player_message(), cfapi_set_random_map_variable(), cfpython_globalEventListener(), check_loaded_object(), check_login(), check_path(), checkbanned(), checkdm(), choose_cult_monster(), command_addexp(), command_banish(), command_bowmode(), command_cointoss(), command_loadplugin(), command_loadtest(), command_me(), command_party(), command_players(), command_possess(), command_rename_item(), command_statistics(), command_title(), common_ob_describe(), compute_face_name(), convert_newline(), copy_file(), cost_approx_str(), cost_string_from_value(), costStringFromValue(), create_items_path(), create_overlay_pathname(), create_pathname(), create_player_cmd(), create_singularity(), create_template_pathname(), Crossfire_Object_Say(), decode_name_password(), delete_character(), describe_attacktype(), describe_god(), describe_item(), describe_monster(), describe_resistance(), describe_spellpath_attenuation(), display_motd(), do_pack(), do_tell(), doWrite(), dragon_ability_gain(), dragon_eat_flesh(), draw_ext_info_format(), draw_one_high_score(), dump_alchemy(), dump_alchemy_costs(), eat_common(), enter_exit(), enter_random_map(), esrv_draw_look(), esrv_send_inventory(), esrv_update_stats(), eventListener(), events_execute_global_event(), examine(), examine_cmd(), fill_json(), fill_reverse_maps(), food_type_apply(), forbid_play(), nlohmann::detail::dtoa_impl::format_buffer(), generate_monster(), generate_name(), generate_random_map(), getPluginProperty(), globalEventListener(), god_enchants_weapon(), god_examines_item(), god_info_msg(), gravestone_text(), nlohmann::detail::dtoa_impl::grisu2(), nlohmann::detail::dtoa_impl::grisu2_round(), hiscore_load(), hiscore_save(), infect_object(), init_attackmess(), init_book_archive(), init_experience(), init_formulae(), init_regions(), init_renderer_env(), init_server(), init_startup(), init_stats(), initPlugins(), inscribe_scroll_cmd(), key_change_class(), key_confirm_quit(), kill_object(), kill_player(), kill_player_not_permadeath(), kill_player_permadeath(), knowledge_add_probe_monster(), knowledge_alchemy_can_use_item(), knowledge_alchemy_detail(), knowledge_alchemy_summary(), knowledge_god_add(), knowledge_god_detail(), knowledge_god_face(), knowledge_god_summary(), knowledge_item_can_be_used_alchemy(), knowledge_message_detail(), knowledge_message_summary(), knowledge_monster_detail(), knowledge_monster_summary(), knowledge_process_incremental(), knowledge_show(), lamp_type_describe(), legacy_ob_describe(), ArtifactLoader::load(), FacesetLoader::load(), MessageLoader::load(), PngLoader::load(), FaceLoader::load(), QuestLoader::load(), TreasureLoader::load(), ResourcesManager::load(), load_map_header(), load_materials(), load_object_from_reader(), load_races(), load_settings(), load_table_float(), load_table_int(), FaceLoader::loadAnimationBlock(), TreasureLoader::loadTreasure(), LOG(), look_at_cmd(), main(), make_path_to_file(), metaserver2_init(), monster_find_enemy(), monster_format_say(), monster_npc_say(), move_cmd(), new_connection(), new_player_cmd(), npcSay(), nstrtok(), numb_ingred(), ob_describe(), pack_artifacts(), pack_formulae(), party_form(), party_join(), party_leave(), perceive_self(), pets_summon_golem(), pick_up_object(), place_exits(), place_special_exit(), player_get_title(), player_lvl_adj(), power_crystal_describe(), pray(), print_los(), put_score(), python_command_function(), query_base_name(), query_name(), query_short_name(), query_weight(), quest_write_condition(), read_ignore_list(), read_map_log(), read_type(), ready_map_name(), real_money_value(), remove_directory(), replace_unprintable_chars(), reply_cmd(), request_info_cmd(), resurrect_player(), ring_desc(), send_arch_info(), send_delayed_buffers(), send_file(), send_new_char_info(), send_news(), send_plugin_custom_message(), send_rules(), set_exception(), set_random_map_variable(), set_title(), set_up_cmd(), set_variable(), shop_inventory_type_apply(), spellbook_type_describe(), spellpath_msg(), ss_dump_statistics(), ss_dump_table(), START_TEST(), stringbuffer_append_int64(), stringbuffer_append_multiline_block(), strip_endline(), strtoint(), strtoktolin(), tailor_god_spell(), time_format_time(), trim(), verify_player(), version_cmd(), ArtifactWriter::write(), TreasureWriter::write(), MessageWriter::write(), FaceWriter::write(), FormulaeWriter::write(), ArchetypeWriter::write(), QuestWriter::write(), AnimationWriter::write(), FacesetWriter::write(), ModifiedAssetsManager< Animations >::write(), write_attribute_file(), write_attribute_index(), write_map_log(), write_map_parameters_to_string(), write_note(), write_rune(), Write_To_Socket(), write_type_file(), write_type_index(), writeItem(), Utils::writeLinkedChar(), writeRecipe(), Utils::writeStringArray(), and yy_scan_bytes().

◆ did_first_sp

int did_first_sp

Definition at line 1561 of file readable.cpp.

◆ done

int done

Definition at line 1566 of file readable.cpp.

Referenced by cost_string_from_value(), and CREMainWindow::onReportQuests().

◆ formula_author

const char* const formula_author[]
static
Initial value:
= {
"Albertus Magnus",
"alchemy",
"balms",
"creation",
"dusts",
"magical manufacture",
"making",
"philosophical items",
"potions",
"powders",
"the cauldron",
"the lamp black",
"transmutation",
"waters"
}

This isn't used except for empty books.

Definition at line 356 of file readable.cpp.

Referenced by add_author().

◆ formula_book_name

const char* const formula_book_name[]
static
Initial value:
= {
"cookbook",
"formulary",
"lab book",
"lab notes",
"recipe book",
"experiment record",
"work plan",
"design notes",
"research notes",
"crafting manual"
}

Alchemy (formula) information.

Definition at line 342 of file readable.cpp.

Referenced by make_formula_book(), and new_text_name().

◆ gods_author

const char* const gods_author[]
static
Initial value:
= {
"cults",
"dieties",
"joy",
"lasting curse",
"madness",
"religions",
"rituals",
"the dead",
"the gods",
"the heirophant",
"the poor priest",
"the priestess",
"pain",
"white",
"worship"
}

Used by gods texts.

Definition at line 321 of file readable.cpp.

Referenced by add_author().

◆ gods_book_name

const char* const gods_book_name[]
static
Initial value:
= {
"devotional",
"devout notes",
"divine text",
"divine work",
"holy book",
"holy record",
"hymnal",
"illuminated text",
"moral text",
"pious pamphlet",
"sacred guide",
"testament",
"transcript",
}

God book information.

Definition at line 304 of file readable.cpp.

Referenced by new_text_name().

◆ heavy_book_name

const char* const heavy_book_name[]
static
Initial value:
= {
"catalog",
"compendium",
"dissertation",
"guide",
"manual",
"opus",
"tome",
"treatise",
"volume",
"work"
}

Name for big books.

Definition at line 397 of file readable.cpp.

Referenced by new_text_name().

◆ last_readable_subtype

const int last_readable_subtype = arraysize(readable_message_types)
static

Number of elements in readable_message_types.

Definition at line 549 of file readable.cpp.

Referenced by get_readable_message_type().

◆ level

◆ light_book_name

const char* const light_book_name[]
static
Initial value:
= {
"calendar",
"datebook",
"diary",
"essay",
"guidebook",
"handbook",
"ledger",
"notes",
"notebook",
"octavo",
"opuscule",
"pamphlet",
"practicum",
"script",
"transcript"
}

Generic book information Used by msg file and 'generic' books.

Definition at line 378 of file readable.cpp.

Referenced by new_text_name().

◆ max_titles

◆ mon_author

const char* const mon_author[]
static
Initial value:
= {
"beasts",
"beings",
"creatures",
"dezidens",
"dwellers",
"evil nature",
"Inioda",
"life",
"monsters",
"nature",
"new life",
"residents",
"the spawn",
"the living",
"the wilds",
"things"
}

Used by monster beastuary texts.

Definition at line 282 of file readable.cpp.

Referenced by add_author().

◆ mon_book_name

const char* const mon_book_name[]
static
Initial value:
= {
"beastuary",
"catalog",
"compilation",
"collection",
"encyclopedia",
"field notes",
"guide",
"handbook",
"list",
"manual",
"notes",
"omnibus",
"record",
"reference",
"register",
"traveller's guide",
"volume"
}

Monster book information.

Definition at line 261 of file readable.cpp.

Referenced by new_text_name().

◆ monsters

std::vector<object *> monsters
static

Information on monsters.

Definition at line 142 of file readable.cpp.

Referenced by do_monster(), get_next_mon(), get_random_mon(), init_mon_info(), and CREMainWindow::onReportPlayer().

◆ need_to_write_bookarchive

int need_to_write_bookarchive = 0
static

If set then we have information to save.

Definition at line 144 of file readable.cpp.

Referenced by add_book_to_list(), and write_book_archive().

◆ path_author

const char* const path_author[]
static
Initial value:
= {
"aether",
"arcana",
"astral byways",
"connections",
"the Grey Council",
"deep pathways",
"knowledge",
"magic",
"mystic ways",
"pathways",
"power",
"spells",
"transforms",
"the mystic veil",
"unknown spells"
}

Used by spellpath texts.

Definition at line 183 of file readable.cpp.

Referenced by add_author().

◆ path_book_name

const char* const path_book_name[]
static
Initial value:
= {
"codex",
"compendium",
"documentary",
"exposition",
"tables",
"treatise"
}

Book names for path information.

Definition at line 173 of file readable.cpp.

Referenced by new_text_name().

◆ pnum

uint32_t pnum

Definition at line 1562 of file readable.cpp.

◆ prayers

int prayers

Definition at line 1560 of file readable.cpp.

◆ readable_message_types

const readable_message_type readable_message_types[]
static

Each line of this array is a readable subtype. Be careful to keep the order. If you add readable subtype, add them at the bottom of the list. Never delete a subtype because index is used as subtype parameter in arch files!

Definition at line 485 of file readable.cpp.

Referenced by get_readable_message_type().

◆ sp_params

struct { ... } sp_params
Todo:
remove when C++ & lambdas

Referenced by do_spellpath_msg(), and spellpath_msg().

◆ spellpathdef

PATH_TURNING
#define PATH_TURNING
Definition: spells.h:29
formula_book_name
static const char *const formula_book_name[]
Definition: readable.cpp:342
path_book_name
static const char *const path_book_name[]
Definition: readable.cpp:173
mon_author
static const char *const mon_author[]
Definition: readable.cpp:282
BOW
@ BOW
Definition: object.h:123
BRACERS
@ BRACERS
Definition: object.h:222
PATH_LIGHT
#define PATH_LIGHT
Definition: spells.h:32
PATH_RESTORE
#define PATH_RESTORE
Definition: spells.h:21
PATH_INFO
#define PATH_INFO
Definition: spells.h:26
arraysize
#define arraysize(arrayname)
Definition: readable.cpp:98
book_author
static const char *const book_author[]
Definition: readable.cpp:411
PATH_ELEC
#define PATH_ELEC
Definition: spells.h:16
GLOVES
@ GLOVES
Definition: object.h:218
GIRDLE
@ GIRDLE
Definition: object.h:228
PATH_FIRE
#define PATH_FIRE
Definition: spells.h:14
mon_book_name
static const char *const mon_book_name[]
Definition: readable.cpp:261
path_author
static const char *const path_author[]
Definition: readable.cpp:183
PATH_SELF
#define PATH_SELF
Definition: spells.h:18
gods_book_name
static const char *const gods_book_name[]
Definition: readable.cpp:304
ARMOUR
@ ARMOUR
Definition: object.h:125
WEAPON
@ WEAPON
Definition: object.h:124
AMULET
@ AMULET
Definition: object.h:144
gods_author
static const char *const gods_author[]
Definition: readable.cpp:321
SKILL
@ SKILL
Definition: object.h:148
PATH_ABJURE
#define PATH_ABJURE
Definition: spells.h:20
PATH_MISSILE
#define PATH_MISSILE
Definition: spells.h:17
CLOAK
@ CLOAK
Definition: object.h:209
HELMET
@ HELMET
Definition: object.h:141
PATH_WOUNDING
#define PATH_WOUNDING
Definition: spells.h:30
PATH_CREATE
#define PATH_CREATE
Definition: spells.h:24
PATH_DETONATE
#define PATH_DETONATE
Definition: spells.h:22
ROD
@ ROD
Definition: object.h:114
PATH_SUMMON
#define PATH_SUMMON
Definition: spells.h:19
PATH_TRANSFER
#define PATH_TRANSFER
Definition: spells.h:28
PATH_FROST
#define PATH_FROST
Definition: spells.h:15
ARROW
@ ARROW
Definition: object.h:122
RING
@ RING
Definition: object.h:190
PATH_TRANSMUTE
#define PATH_TRANSMUTE
Definition: spells.h:27
PATH_DEATH
#define PATH_DEATH
Definition: spells.h:31
art_book_name
static const char *const art_book_name[]
Definition: readable.cpp:227
PATH_TELE
#define PATH_TELE
Definition: spells.h:25
PATH_PROT
#define PATH_PROT
Definition: spells.h:13
PATH_MIND
#define PATH_MIND
Definition: spells.h:23
heavy_book_name
static const char *const heavy_book_name[]
Definition: readable.cpp:397
formula_author
static const char *const formula_author[]
Definition: readable.cpp:356
art_author
static const char *const art_author[]
Definition: readable.cpp:245
FOOD
@ FOOD
Definition: object.h:117
light_book_name
static const char *const light_book_name[]
Definition: readable.cpp:378
BOOTS
@ BOOTS
Definition: object.h:217
SHIELD
@ SHIELD
Definition: object.h:140