--- deliantra/server/common/readable.C 2010/03/26 01:04:44 1.56 +++ deliantra/server/common/readable.C 2012/10/29 23:55:52 1.65 @@ -1,24 +1,24 @@ /* * This file is part of Deliantra, the Roguelike Realtime MMORPG. - * - * Copyright (©) 2005,2006,2007,2008,2009,2010 Marc Alexander Lehmann / Robin Redeker / the Deliantra team + * + * Copyright (©) 2005,2006,2007,2008,2009,2010,2011,2012 Marc Alexander Lehmann / Robin Redeker / the Deliantra team * Copyright (©) 2002 Mark Wedel & Crossfire Development Team * Copyright (©) 1992 Frank Tore Johansen - * + * * Deliantra is free software: you can redistribute it and/or modify it under * the terms of the Affero GNU General Public License as published by the * Free Software Foundation, either version 3 of the License, or (at your * option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the Affero GNU General Public License * and the GNU General Public License along with this program. If not, see * . - * + * * The authors can be reached via e-mail to */ @@ -403,7 +403,7 @@ "cryptic", "cryptical", "dusty", - "hiearchical", + "hierarchical", "grizzled", "gold-guilt", "great", @@ -536,6 +536,9 @@ static titlelist * get_titlelist (int i) { + if (!booklist) + booklist = get_empty_booklist (); + titlelist *tl = booklist; int number = i; @@ -548,7 +551,7 @@ tl->next = get_empty_booklist (); tl = tl->next; - number--; + --number; } return tl; @@ -568,8 +571,10 @@ if (!buf1 || !buf2) return 0; - sprintf (buf, "%s", buf1); - sprintf (sbuf, "%s", buf2); + + strcpy (buf, buf1); + strcpy (sbuf, buf2); + tbuf = strtok (buf, sbuf); while (tbuf) { @@ -598,6 +603,7 @@ while (tbuf && i > 0) { strcat (rbuf, tbuf); + i--; if (i == 1 && maxi > 1) strcat (rbuf, " and "); @@ -605,9 +611,11 @@ strcat (rbuf, ", "); else strcat (rbuf, "."); + tbuf = strtok (NULL, sbuf); } - return (char *) rbuf; + + return rbuf; } /***************************************************************************** @@ -623,90 +631,66 @@ static void init_book_archive () { - FILE *fp; - int comp, nroftitle = 0; - char buf[MAX_BUF], fname[MAX_BUF], *cp; - title *book = NULL; + int nroftitle = 0; titlelist *bl = get_empty_booklist (); - static int did_init_barch; - if (did_init_barch) - return; + object_thawer thawer (settings.localdir, "bookarch"); - did_init_barch = 1; + if (!thawer) + { + LOG (llevDebug, "could not read bookarch file\n"); + return; + } - if (!booklist) - booklist = bl; + while (thawer.kw) + { + if (thawer.kw != KW_title) + if (!thawer.parse_error ("bookarch file")) + break; - sprintf (fname, "%s/bookarch", settings.localdir); - LOG (llevDebug, " Reading bookarch from %s...\n", fname); + title *book = get_empty_book (); /* init new book entry */ + thawer.get (book->name); - if ((fp = open_and_uncompress (fname, 0, &comp)) != NULL) - { - int value, type = 0; - size_t i; + int type = -1; - while (fgets (buf, MAX_BUF, fp) != NULL) + for (;;) { - if (*buf == '#') - continue; - if ((cp = strchr (buf, '\n')) != NULL) - *cp = '\0'; - cp = buf; - while (*cp == ' ') /* Skip blanks */ - cp++; - if (!strncmp (cp, "title", 4)) - { - book = get_empty_book (); /* init new book entry */ - book->name = strchr (cp, ' ') + 1; - type = -1; - nroftitle++; - continue; - } - if (!strncmp (cp, "authour", 4)) - { - book->authour = strchr (cp, ' ') + 1; - } - if (!strncmp (cp, "arch", 4)) - { - book->archname = strchr (cp, ' ') + 1; - } - else if (sscanf (cp, "level %d", &value)) - { - book->level = (uint16) value; - } - else if (sscanf (cp, "type %d", &value)) - { - type = (uint16) value; - } - else if (sscanf (cp, "size %d", &value)) - { - book->size = (uint16) value; - } - else if (sscanf (cp, "index %d", &value)) + thawer.next (); + + switch (thawer.kw) { - book->msg_index = (uint16) value; - } - else if (!strncmp (cp, "end", 3)) - { /* link it */ - bl = get_titlelist (type); - book->next = bl->first_book; - bl->first_book = book; - bl->number++; + case KW_type: thawer.get (type ); break; + case KW_authour: thawer.get (book->authour ); break; + case KW_arch: thawer.get (book->archname ); break; + case KW_level: thawer.get (book->level ); break; + case KW_size: thawer.get (book->size ); break; + case KW_index: thawer.get (book->msg_index); break; + + case KW_end: + /* link it */ + bl = get_titlelist (type); + book->next = bl->first_book; + bl->first_book = book; + bl->number++; + ++nroftitle; + goto book_done; + + default: + delete book; + goto book_done; } } - LOG (llevDebug, "book archives(used/avail): \n"); - for (bl = booklist, i = 0; bl != NULL && i < sizeof (max_titles) / sizeof (*max_titles); bl = bl->next, i++) - { - LOG (llevDebug, " (%d/%d)\n", bl->number, max_titles[i]); - } - close_and_delete (fp, comp); + +book_done: + thawer.next (); } -#ifdef BOOK_MSG_DEBUG + LOG (llevDebug, "book archives(used/avail): \n"); + int i; + for (bl = booklist, i = 0; bl && i < sizeof (max_titles) / sizeof (*max_titles); bl = bl->next, i++) + LOG (llevDebug, " (%d/%d)\n", bl->number, max_titles[i]); + LOG (llevDebug, "init_book_archive() got %d titles.\n", nroftitle); -#endif - LOG (llevDebug, " done.\n"); } /* init_mon_info() - creates the linked list of pointers to @@ -808,8 +792,7 @@ static void new_text_name (object *book, int msgtype) { - int nbr; - char name[MAX_BUF]; + const char *name; if (book->type != BOOK) return; @@ -817,36 +800,29 @@ switch (msgtype) { case 1: /*monster */ - nbr = sizeof (mon_book_name) / sizeof (char *); - assign (name, mon_book_name[rndm (nbr)]); + name = mon_book_name[rndm (array_length (mon_book_name))]; break; case 2: /*artifact */ - nbr = sizeof (art_book_name) / sizeof (char *); - assign (name, art_book_name[rndm (nbr)]); + name = art_book_name[rndm (array_length (art_book_name))]; break; case 3: /*spellpath */ - nbr = sizeof (path_book_name) / sizeof (char *); - assign (name, path_book_name[rndm (nbr)]); + name = path_book_name[rndm (array_length (path_book_name))]; break; case 4: /*alchemy */ - nbr = sizeof (formula_book_name) / sizeof (char *); - assign (name, formula_book_name[rndm (nbr)]); + name = formula_book_name[rndm (array_length (formula_book_name))]; break; case 5: /*gods */ - nbr = sizeof (gods_book_name) / sizeof (char *); - assign (name, gods_book_name[rndm (nbr)]); + name = gods_book_name[rndm (array_length (gods_book_name))]; break; case 6: /*msg file */ default: if (book->weight > 2000) { /* based on weight */ - nbr = sizeof (heavy_book_name) / sizeof (char *); - assign (name, heavy_book_name[rndm (nbr)]); + name = heavy_book_name[rndm (array_length (heavy_book_name))]; } else if (book->weight < 2001) { - nbr = sizeof (light_book_name) / sizeof (char *); - assign (name, light_book_name[rndm (nbr)]); + name = light_book_name[rndm (array_length (light_book_name))]; } break; } @@ -862,8 +838,7 @@ static void add_author (object *op, int msgtype) { - char title[MAX_BUF], name[MAX_BUF]; - int nbr = sizeof (book_author) / sizeof (char *); + const char *name; if (msgtype < 0 || strlen (op->msg) < 5) return; @@ -871,32 +846,26 @@ switch (msgtype) { case 1: /* monster */ - nbr = sizeof (mon_author) / sizeof (char *); - assign (name, mon_author[rndm (nbr)]); + name = mon_author[rndm (array_length (mon_author))]; break; case 2: /* artifacts */ - nbr = sizeof (art_author) / sizeof (char *); - assign (name, art_author[rndm (nbr)]); + name = art_author[rndm (array_length (art_author))]; break; case 3: /* spellpath */ - nbr = sizeof (path_author) / sizeof (char *); - assign (name, path_author[rndm (nbr)]); + name = path_author[rndm (array_length (path_author))]; break; case 4: /* alchemy */ - nbr = sizeof (formula_author) / sizeof (char *); - assign (name, formula_author[rndm (nbr)]); + name = formula_author[rndm (array_length (formula_author))]; break; case 5: /* gods */ - nbr = sizeof (gods_author) / sizeof (char *); - assign (name, gods_author[rndm (nbr)]); + name = gods_author[rndm (array_length (gods_author))]; break; case 6: /* msg file */ default: - assign (name, book_author[rndm (nbr)]); + name = book_author[rndm (array_length (book_author))]; } - sprintf (title, "of %s", name); - op->title = title; + op->title = format ("of %s", name); } /* unique_book() - check to see if the book title/msg is unique. We @@ -988,7 +957,7 @@ if ((strlen (book->msg) > 5) && (t = find_title (book, msgtype))) { /* alter book properties */ - if (object *tmpbook = get_archetype (t->archname)) + if (object *tmpbook = archetype::get (t->archname)) { tmpbook->msg = book->msg; tmpbook->copy_to (book); @@ -1056,18 +1025,10 @@ book->title = old_title; if (rndm (4)) - { - /* Lets give the book a description to individualize it some */ - char new_name[MAX_BUF]; - - snprintf (new_name, MAX_BUF, "%s %s", book_descrpt[rndm (nbr)], old_name); - - book->name = new_name; - } + /* Lets give the book a description to individualize it some */ + book->name = format ("%s %s", book_descrpt[rndm (nbr)], old_name); else - { - book->name = old_name; - } + book->name = old_name; } else if (book->title && strlen (book->msg) > 5) { /* archive if long msg texts */ @@ -1267,7 +1228,7 @@ i = 0; do { - index = rndm (sizeof (art_name_array) / sizeof (arttypename)); + index = rndm (array_length (art_name_array)); type = art_name_array[index].type; al = find_artifactlist (type); i++; @@ -1350,7 +1311,7 @@ tmp = object::create (); add_abilities (tmp, art->item); tmp->type = type; - SET_FLAG (tmp, FLAG_IDENTIFIED); + tmp->set_flag (FLAG_IDENTIFIED); if ((ch = describe_item (tmp, 0)) && strlen (ch) > 1) buf << "\rProperties of this artifact include:\r" << ch << "\n"; @@ -1376,8 +1337,6 @@ { static dynbuf_text buf; buf.clear (); - static char retbuf[BOOK_BUF]; - char tmpbuf[BOOK_BUF]; int path = rndm (NRSPELLPATHS), prayers = rndm (2); uint32 pnum = (path == -1) ? PATH_NULL : spellpathdef[path]; archetype *at; @@ -1597,8 +1556,6 @@ if (enemy && !(god->path_denied & PATH_TURNING)) if ((i = nstrtok (enemy, ",")) > 0) { - char tmpbuf[MAX_BUF]; - buf << "The holy words of " << name << " have the power to slay creatures belonging to the "; @@ -1684,7 +1641,6 @@ int has_effect = 0, tmpvar; char tmpbuf[MAX_BUF]; - sprintf (tmpbuf, "\n"); sprintf (tmpbuf, "It is rarely known fact that the priests of %s\n", name); strcat (tmpbuf, "are mystically transformed. Effects of this include:\n");