//*****************************************************************************
//
// extra_desc.c
//
// Extra descriptions are little embellishments to rooms that give extra
// information about the setting if people examine them. Each edesc has a list
// of keywords that activates it. The extra_desc name is a bit misleading,
// as it also can be (and is) used to hold speech keywords/replies for NPCs.
//
//*****************************************************************************
#include "mud.h"
#include "utils.h"
#include "storage.h"
#include "extra_descs.h"
struct edesc_set_data {
LIST *edescs;
};
struct edesc_data {
EDESC_SET *set;
char *keywords;
BUFFER *desc;
};
//*****************************************************************************
//
// edesc set
//
//*****************************************************************************
EDESC_SET *newEdescSet () {
EDESC_SET *set = malloc(sizeof(EDESC_SET));
set->edescs = newList();
return set;
}
EDESC_DATA *edescRead(STORAGE_SET *set) {
return newEdesc(read_string(set, "keywords"), read_string(set, "desc"));
}
STORAGE_SET *edescStore(EDESC_DATA *data) {
STORAGE_SET *set = new_storage_set();
store_string(set, "keywords", data->keywords);
store_string(set, "desc", bufferString(data->desc));
return set;
}
EDESC_SET *edescSetRead(STORAGE_SET *set) {
EDESC_SET *edescs = newEdescSet();
STORAGE_SET_LIST *list = read_list(set, "list");
deleteList(edescs->edescs);
edescs->edescs = gen_read_list(list, edescRead);
LIST_ITERATOR *list_i = newListIterator(edescs->edescs);
EDESC_DATA *edesc = NULL;
ITERATE_LIST(edesc, list_i)
edesc->set = edescs;
deleteListIterator(list_i);
return edescs;
}
STORAGE_SET *edescSetStore(EDESC_SET *edescs) {
STORAGE_SET *set = new_storage_set();
store_list(set, "list", gen_store_list(edescs->edescs, edescStore));
return set;
}
void edescSetCopyTo(EDESC_SET *from, EDESC_SET *to) {
// delete all of the current entries
deleteListWith(to->edescs, deleteEdesc);
to->edescs = listCopyWith(from->edescs, edescCopy);
}
EDESC_SET *edescSetCopy(EDESC_SET *set) {
EDESC_SET *newset = newEdescSet();
edescSetCopyTo(set, newset);
return newset;
}
EDESC_DATA *edescSetGet (EDESC_SET *set, const char *keyword) {
LIST_ITERATOR *edesc_i = newListIterator(set->edescs);
EDESC_DATA *desc = NULL;
ITERATE_LIST(desc, edesc_i)
if(edescIsKeyword(desc, keyword))
break;
deleteListIterator(edesc_i);
return desc;
}
void edescSetPut (EDESC_SET *set, EDESC_DATA *edesc) {
edesc->set = set;
listQueue(set->edescs, edesc);
}
EDESC_DATA *edescSetGetNum (EDESC_SET *set, int num) {
return listGet(set->edescs, num);
}
void removeEdesc (EDESC_SET *set, EDESC_DATA *edesc) {
if(listRemove(set->edescs, edesc))
edesc->set = NULL;
}
EDESC_DATA *edescSetRemove (EDESC_SET *set, const char *keyword) {
EDESC_DATA *entry = edescSetGet(set, keyword);
if(entry && listRemove(set->edescs, entry))
entry->set = NULL;
return entry;
}
EDESC_DATA *edescSetRemoveNum (EDESC_SET *set, int num) {
EDESC_DATA *entry = listRemoveNum(set->edescs, num);
if(entry)
entry->set = NULL;
return entry;
}
void deleteEdescSet (EDESC_SET *set) {
deleteListWith(set->edescs, deleteEdesc);
free(set);
}
int edescGetSetSize (EDESC_SET *set) {
return listSize(set->edescs);
}
LIST *edescSetGetList (EDESC_SET *set) {
return set->edescs;
}
void edescTagDesc(BUFFER *buf, EDESC_SET *set,
const char *start_tag, const char *end_tag) {
LIST_ITERATOR *list_i = newListIterator(set->edescs);
EDESC_DATA *edesc = NULL;
// go through, and apply colors for each extra desc we have
ITERATE_LIST(edesc, list_i) {
buf_tag_keywords(buf, edesc->keywords, start_tag, end_tag);
} deleteListIterator(list_i);
}
//*****************************************************************************
// a single edesc
//*****************************************************************************
EDESC_DATA *newEdesc(const char *keywords, const char *desc) {
EDESC_DATA *edesc = malloc(sizeof(struct edesc_data));
edesc->set = NULL;
edesc->keywords = strdupsafe(keywords);
edesc->desc = newBuffer(1);
bufferCat(edesc->desc, (desc ? desc : ""));
return edesc;
}
void deleteEdesc(EDESC_DATA *edesc) {
if(edesc->keywords) free(edesc->keywords);
if(edesc->desc) deleteBuffer(edesc->desc);
free(edesc);
}
EDESC_DATA *edescCopy(EDESC_DATA *edesc) {
return newEdesc(edesc->keywords, bufferString(edesc->desc));
}
void edescCopyTo(EDESC_DATA *from, EDESC_DATA *to) {
// copy over the new desc
bufferCopyTo(from->desc, to->desc);
if(to->keywords) free(to->keywords);
to->keywords = strdupsafe(from->keywords);
}
const char *edescGetKeywords(EDESC_DATA *edesc) {
return edesc->keywords;
}
const char *edescSetGetDesc(EDESC_DATA *edesc) {
return bufferString(edesc->desc);
}
BUFFER *edescGetDescBuffer(EDESC_DATA *edesc) {
return edesc->desc;
}
void edescSetKeywords(EDESC_DATA *edesc, const char *keywords) {
if(edesc->keywords) free(edesc->keywords);
edesc->keywords = strdupsafe(keywords);
}
void edescSetDesc(EDESC_DATA *edesc, const char *description) {
bufferClear(edesc->desc);
bufferCat(edesc->desc, (description ? description : ""));
}
EDESC_SET *edescGetSet(EDESC_DATA *edesc) {
return edesc->set;
}
bool edescIsKeyword(EDESC_DATA *edesc, const char *keyword) {
return is_keyword(edesc->keywords, keyword, TRUE);
}