ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/readable.C
(Generate patch)

Comparing deliantra/server/common/readable.C (file contents):
Revision 1.24 by root, Thu May 24 03:33:28 2007 UTC vs.
Revision 1.28 by root, Sun Jun 24 04:09:28 2007 UTC

1/* 1/*
2 * CrossFire, A Multiplayer game 2 * This file is part of Crossfire TRT, the Multiplayer Online Role Playing Game.
3 * 3 *
4 * Copyright (C) 2005, 2006, 2007 Marc Lehmann & Crossfire+ Development Team 4 * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team
5 * Copyright (C) 2002 Mark Wedel & Crossfire Development Team 5 * Copyright (©) 2002,2007 Mark Wedel & Crossfire Development Team
6 * Copyright (C) 1992 Frank Tore Johansen 6 * Copyright (©) 1992,2007 Frank Tore Johansen
7 * 7 *
8 * This program is free software; you can redistribute it and/or modify 8 * Crossfire TRT is free software; you can redistribute it and/or modify it
9 * it under the terms of the GNU General Public License as published by 9 * under the terms of the GNU General Public License as published by the Free
10 * the Free Software Foundation; either version 2 of the License, or 10 * Software Foundation; either version 2 of the License, or (at your option)
11 * (at your option) any later version. 11 * any later version.
12 * 12 *
13 * This program is distributed in the hope that it will be useful, 13 * This program is distributed in the hope that it will be useful, but
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 * GNU General Public License for more details. 16 * for more details.
17 * 17 *
18 * You should have received a copy of the GNU General Public License 18 * You should have received a copy of the GNU General Public License along
19 * along with this program; if not, write to the Free Software 19 * with Crossfire TRT; if not, write to the Free Software Foundation, Inc. 51
20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 20 * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 * 21 *
22 * The authors can be reached via e-mail at <crossfire@schmorp.de> 22 * The authors can be reached via e-mail to <crossfire@schmorp.de>
23 */ 23 */
24
25 24
26/* This file contains code relevant to the BOOKS hack -- designed 25/* This file contains code relevant to the BOOKS hack -- designed
27 * to allow randomly occuring messages in non-magical texts. 26 * to allow randomly occuring messages in non-magical texts.
28 */ 27 */
29 28
436 * Be careful to keep the order. If you add readable subtype, add them 435 * Be careful to keep the order. If you add readable subtype, add them
437 * at the bottom of the list. Never delete a subtype because index is used as 436 * at the bottom of the list. Never delete a subtype because index is used as
438 * subtype paramater in arch files! 437 * subtype paramater in arch files!
439 */ 438 */
440static readable_message_type readable_message_types[] = { 439static readable_message_type readable_message_types[] = {
441 /*subtype 0 */ {0, 0}, 440 /*subtype 0 */ {0, 0, ""},
442 /* book messages subtypes */ 441 /* book messages subtypes */
443 /*subtype 1 */ {MSG_TYPE_BOOK, MSG_TYPE_BOOK_CLASP_1}, 442 /*subtype 1 */ {MSG_TYPE_BOOK, MSG_TYPE_BOOK_CLASP_1, "readable-book-clasp-1"},
444 {MSG_TYPE_BOOK, MSG_TYPE_BOOK_CLASP_2}, 443 {MSG_TYPE_BOOK, MSG_TYPE_BOOK_CLASP_2, "readable-book-clasp-2"},
445 {MSG_TYPE_BOOK, MSG_TYPE_BOOK_ELEGANT_1}, 444 {MSG_TYPE_BOOK, MSG_TYPE_BOOK_ELEGANT_1, "readable-book-elegant-1"},
446 {MSG_TYPE_BOOK, MSG_TYPE_BOOK_ELEGANT_2}, 445 {MSG_TYPE_BOOK, MSG_TYPE_BOOK_ELEGANT_2, "readable-book-elegant-2"},
447 {MSG_TYPE_BOOK, MSG_TYPE_BOOK_QUARTO_1}, 446 {MSG_TYPE_BOOK, MSG_TYPE_BOOK_QUARTO_1, "readable-book-quarto-1"},
448 {MSG_TYPE_BOOK, MSG_TYPE_BOOK_QUARTO_2}, 447 {MSG_TYPE_BOOK, MSG_TYPE_BOOK_QUARTO_2, "readable-book-quarto-2"},
449 {MSG_TYPE_BOOK, MSG_TYPE_BOOK_SPELL_EVOKER}, 448 {MSG_TYPE_BOOK, MSG_TYPE_BOOK_SPELL_EVOKER, "readable-book-spell-evocation"},
450 {MSG_TYPE_BOOK, MSG_TYPE_BOOK_SPELL_PRAYER}, 449 {MSG_TYPE_BOOK, MSG_TYPE_BOOK_SPELL_PRAYER, "readable-book-spell-praying"},
451 {MSG_TYPE_BOOK, MSG_TYPE_BOOK_SPELL_PYRO}, 450 {MSG_TYPE_BOOK, MSG_TYPE_BOOK_SPELL_PYRO, "readable-book-spell-pyromancy"},
452 /*subtype 10 */ {MSG_TYPE_BOOK, MSG_TYPE_BOOK_SPELL_SORCERER}, 451 /*subtype 10 */ {MSG_TYPE_BOOK, MSG_TYPE_BOOK_SPELL_SORCERER, "readable-book-spell-sorcery"},
453 {MSG_TYPE_BOOK, MSG_TYPE_BOOK_SPELL_SUMMONER}, 452 {MSG_TYPE_BOOK, MSG_TYPE_BOOK_SPELL_SUMMONER, "readable-book-spell-summoning"},
454 /* card messages subtypes */ 453 /* card messages subtypes */
455 {MSG_TYPE_CARD, MSG_TYPE_CARD_SIMPLE_1}, 454 {MSG_TYPE_CARD, MSG_TYPE_CARD_SIMPLE_1, "readable-card-simple-1"},
456 {MSG_TYPE_CARD, MSG_TYPE_CARD_SIMPLE_2}, 455 {MSG_TYPE_CARD, MSG_TYPE_CARD_SIMPLE_2, "readable-card-simple-2"},
457 {MSG_TYPE_CARD, MSG_TYPE_CARD_SIMPLE_3}, 456 {MSG_TYPE_CARD, MSG_TYPE_CARD_SIMPLE_3, "readable-card-simple-3"},
458 {MSG_TYPE_CARD, MSG_TYPE_CARD_ELEGANT_1}, 457 {MSG_TYPE_CARD, MSG_TYPE_CARD_ELEGANT_1, "readable-card-elegant-1"},
459 {MSG_TYPE_CARD, MSG_TYPE_CARD_ELEGANT_2}, 458 {MSG_TYPE_CARD, MSG_TYPE_CARD_ELEGANT_2, "readable-card-elegant-2"},
460 {MSG_TYPE_CARD, MSG_TYPE_CARD_ELEGANT_3}, 459 {MSG_TYPE_CARD, MSG_TYPE_CARD_ELEGANT_3, "readable-card-elegant-3"},
461 {MSG_TYPE_CARD, MSG_TYPE_CARD_STRANGE_1}, 460 {MSG_TYPE_CARD, MSG_TYPE_CARD_STRANGE_1, "readable-card-strange-1"},
462 {MSG_TYPE_CARD, MSG_TYPE_CARD_STRANGE_2}, 461 {MSG_TYPE_CARD, MSG_TYPE_CARD_STRANGE_2, "readable-card-strange-2"},
463 /*subtype 20 */ {MSG_TYPE_CARD, MSG_TYPE_CARD_STRANGE_3}, 462 /*subtype 20 */ {MSG_TYPE_CARD, MSG_TYPE_CARD_STRANGE_3, "readable-card-strange-3"},
464 {MSG_TYPE_CARD, MSG_TYPE_CARD_MONEY_1}, 463 {MSG_TYPE_CARD, MSG_TYPE_CARD_MONEY_1, "readable-card-money-1"},
465 {MSG_TYPE_CARD, MSG_TYPE_CARD_MONEY_2}, 464 {MSG_TYPE_CARD, MSG_TYPE_CARD_MONEY_2, "readable-card-money-2"},
466 {MSG_TYPE_CARD, MSG_TYPE_CARD_MONEY_3}, 465 {MSG_TYPE_CARD, MSG_TYPE_CARD_MONEY_3, "readable-card-money-3"},
467 466
468 /* Paper messages subtypes */ 467 /* Paper messages subtypes */
469 {MSG_TYPE_PAPER, MSG_TYPE_PAPER_NOTE_1}, 468 {MSG_TYPE_PAPER, MSG_TYPE_PAPER_NOTE_1, "readable-paper-note-1"},
470 {MSG_TYPE_PAPER, MSG_TYPE_PAPER_NOTE_2}, 469 {MSG_TYPE_PAPER, MSG_TYPE_PAPER_NOTE_2, "readable-paper-note-2"},
471 {MSG_TYPE_PAPER, MSG_TYPE_PAPER_NOTE_3}, 470 {MSG_TYPE_PAPER, MSG_TYPE_PAPER_NOTE_3, "readable-paper-note-3"},
472 {MSG_TYPE_PAPER, MSG_TYPE_PAPER_LETTER_OLD_1}, 471 {MSG_TYPE_PAPER, MSG_TYPE_PAPER_LETTER_OLD_1, "readable-paper-letter-old-1"},
473 {MSG_TYPE_PAPER, MSG_TYPE_PAPER_LETTER_OLD_2}, 472 {MSG_TYPE_PAPER, MSG_TYPE_PAPER_LETTER_OLD_2, "readable-paper-letter-old-2"},
474 {MSG_TYPE_PAPER, MSG_TYPE_PAPER_LETTER_NEW_1}, 473 {MSG_TYPE_PAPER, MSG_TYPE_PAPER_LETTER_NEW_1, "readable-paper-letter-new-1"},
475 /*subtype 30 */ {MSG_TYPE_PAPER, MSG_TYPE_PAPER_LETTER_NEW_2}, 474 /*subtype 30 */ {MSG_TYPE_PAPER, MSG_TYPE_PAPER_LETTER_NEW_2, "readable-paper-letter-new-2"},
476 {MSG_TYPE_PAPER, MSG_TYPE_PAPER_ENVELOPE_1}, 475 {MSG_TYPE_PAPER, MSG_TYPE_PAPER_ENVELOPE_1, "readable-paper-envelope-1"},
477 {MSG_TYPE_PAPER, MSG_TYPE_PAPER_ENVELOPE_2}, 476 {MSG_TYPE_PAPER, MSG_TYPE_PAPER_ENVELOPE_2, "readable-paper-envelope-2"},
478 {MSG_TYPE_PAPER, MSG_TYPE_PAPER_SCROLL_OLD_1}, 477 {MSG_TYPE_PAPER, MSG_TYPE_PAPER_SCROLL_OLD_1, "readable-paper-scroll-old-1"},
479 {MSG_TYPE_PAPER, MSG_TYPE_PAPER_SCROLL_OLD_2}, 478 {MSG_TYPE_PAPER, MSG_TYPE_PAPER_SCROLL_OLD_2, "readable-paper-scroll-old-2"},
480 {MSG_TYPE_PAPER, MSG_TYPE_PAPER_SCROLL_NEW_1}, 479 {MSG_TYPE_PAPER, MSG_TYPE_PAPER_SCROLL_NEW_1, "readable-paper-scroll-new-1"},
481 {MSG_TYPE_PAPER, MSG_TYPE_PAPER_SCROLL_NEW_2}, 480 {MSG_TYPE_PAPER, MSG_TYPE_PAPER_SCROLL_NEW_2, "readable-paper-scroll-new-2"},
482 {MSG_TYPE_PAPER, MSG_TYPE_PAPER_SCROLL_MAGIC}, 481 {MSG_TYPE_PAPER, MSG_TYPE_PAPER_SCROLL_MAGIC, "readable-paper-scroll-magic"},
483 482
484 /* road signs messages subtypes */ 483 /* road signs messages subtypes */
485 {MSG_TYPE_SIGN, MSG_TYPE_SIGN_BASIC}, 484 {MSG_TYPE_SIGN, MSG_TYPE_SIGN_BASIC, "readable-sign-basic"},
486 {MSG_TYPE_SIGN, MSG_TYPE_SIGN_DIR_LEFT}, 485 {MSG_TYPE_SIGN, MSG_TYPE_SIGN_DIR_LEFT, "readable-sign-dir-left"},
487 /*subtype 40 */ {MSG_TYPE_SIGN, MSG_TYPE_SIGN_DIR_RIGHT}, 486 /*subtype 40 */ {MSG_TYPE_SIGN, MSG_TYPE_SIGN_DIR_RIGHT, "readable-sign-dir-right"},
488 {MSG_TYPE_SIGN, MSG_TYPE_SIGN_DIR_BOTH}, 487 {MSG_TYPE_SIGN, MSG_TYPE_SIGN_DIR_BOTH, "readable-sign-dir-both"},
489 488
490 /* stones and monument messages */ 489 /* stones and monument messages */
491 {MSG_TYPE_MONUMENT, MSG_TYPE_MONUMENT_STONE_1}, 490 {MSG_TYPE_MONUMENT, MSG_TYPE_MONUMENT_STONE_1, "readable-monument-stone-1"},
492 {MSG_TYPE_MONUMENT, MSG_TYPE_MONUMENT_STONE_2}, 491 {MSG_TYPE_MONUMENT, MSG_TYPE_MONUMENT_STONE_2, "readable-monument-stone-2"},
493 {MSG_TYPE_MONUMENT, MSG_TYPE_MONUMENT_STONE_3}, 492 {MSG_TYPE_MONUMENT, MSG_TYPE_MONUMENT_STONE_3, "readable-monument-stone-3"},
494 {MSG_TYPE_MONUMENT, MSG_TYPE_MONUMENT_STATUE_1}, 493 {MSG_TYPE_MONUMENT, MSG_TYPE_MONUMENT_STATUE_1, "readable-monument-statue-1"},
495 {MSG_TYPE_MONUMENT, MSG_TYPE_MONUMENT_STATUE_2}, 494 {MSG_TYPE_MONUMENT, MSG_TYPE_MONUMENT_STATUE_2, "readable-monument-statue-2"},
496 {MSG_TYPE_MONUMENT, MSG_TYPE_MONUMENT_STATUE_3}, 495 {MSG_TYPE_MONUMENT, MSG_TYPE_MONUMENT_STATUE_3, "readable-monument-statue-3"},
497 {MSG_TYPE_MONUMENT, MSG_TYPE_MONUMENT_GRAVESTONE_1}, 496 {MSG_TYPE_MONUMENT, MSG_TYPE_MONUMENT_GRAVESTONE_1, "readable-monument-gravestone-1"},
498 {MSG_TYPE_MONUMENT, MSG_TYPE_MONUMENT_GRAVESTONE_2}, 497 {MSG_TYPE_MONUMENT, MSG_TYPE_MONUMENT_GRAVESTONE_2, "readable-monument-gravestone-2"},
499 /*subtype 50 */ {MSG_TYPE_MONUMENT, MSG_TYPE_MONUMENT_GRAVESTONE_3}, 498 /*subtype 50 */ {MSG_TYPE_MONUMENT, MSG_TYPE_MONUMENT_GRAVESTONE_3, "readable-monument-gravestone-3"},
500 {MSG_TYPE_MONUMENT, MSG_TYPE_MONUMENT_WALL_1}, 499 {MSG_TYPE_MONUMENT, MSG_TYPE_MONUMENT_WALL_1, "readable-monument-wall-1"},
501 {MSG_TYPE_MONUMENT, MSG_TYPE_MONUMENT_WALL_2}, 500 {MSG_TYPE_MONUMENT, MSG_TYPE_MONUMENT_WALL_2, "readable-monument-wall-2"},
502 {MSG_TYPE_MONUMENT, MSG_TYPE_MONUMENT_WALL_3} 501 {MSG_TYPE_MONUMENT, MSG_TYPE_MONUMENT_WALL_3, "readable-monument-wall-3"}
503}; 502};
504int last_readable_subtype = sizeof (readable_message_types) / sizeof (readable_message_type); 503int last_readable_subtype = sizeof (readable_message_types) / sizeof (readable_message_type);
505 504
506static int max_titles[6] = { 505static int max_titles[6] = {
507 ((sizeof (light_book_name) / sizeof (char *)) + (sizeof (heavy_book_name) / sizeof (char *))) * (sizeof (book_author) / sizeof (char *)), 506 ((sizeof (light_book_name) / sizeof (char *)) + (sizeof (heavy_book_name) / sizeof (char *))) * (sizeof (book_author) / sizeof (char *)),
749 if (did_init_mon_info) 748 if (did_init_mon_info)
750 return; 749 return;
751 750
752 did_init_mon_info = 1; 751 did_init_mon_info = 1;
753 752
754 753 for_all_archetypes (at)
755 for (at = first_archetype; at != NULL; at = at->next)
756 { 754 {
757 if (QUERY_FLAG (&at->clone, FLAG_MONSTER) && (!QUERY_FLAG (&at->clone, FLAG_CHANGING) || QUERY_FLAG (&at->clone, FLAG_UNAGGRESSIVE))) 755 if (QUERY_FLAG (at, FLAG_MONSTER) && (!QUERY_FLAG (at, FLAG_CHANGING) || QUERY_FLAG (at, FLAG_UNAGGRESSIVE)))
758 { 756 {
759 objectlink *mon = new objectlink; 757 objectlink *mon = new objectlink;
760 758
761 mon->ob = &at->clone; 759 mon->ob = at;
762 mon->next = first_mon_info; 760 mon->next = first_mon_info;
763 first_mon_info = mon; 761 first_mon_info = mon;
764 nrofmon++; 762 nrofmon++;
765 } 763 }
766 } 764 }
970 t = get_empty_book (); 968 t = get_empty_book ();
971 t->name = book->name; 969 t->name = book->name;
972 t->authour = book->title; 970 t->authour = book->title;
973 t->size = strlen (book->msg); 971 t->size = strlen (book->msg);
974 t->msg_index = strtoint (book->msg); 972 t->msg_index = strtoint (book->msg);
975 t->archname = book->arch->name; 973 t->archname = book->arch->archname;
976 t->level = book->level; 974 t->level = book->level;
977 975
978 t->next = tl->first_book; 976 t->next = tl->first_book;
979 tl->first_book = t; 977 tl->first_book = t;
980 tl->number++; 978 tl->number++;
1443 if (path == -1) 1441 if (path == -1)
1444 strcat (retbuf, "having no known spell path.\n"); 1442 strcat (retbuf, "having no known spell path.\n");
1445 else 1443 else
1446 sprintf (retbuf, "%sbelonging to the path of %s:\n", retbuf, spellpathnames[path]); 1444 sprintf (retbuf, "%sbelonging to the path of %s:\n", retbuf, spellpathnames[path]);
1447 1445
1448 for (at = first_archetype; at != NULL; at = at->next) 1446 for_all_archetypes (at)
1449 { 1447 {
1450 /* Determine if this is an appropriate spell. Must 1448 /* Determine if this is an appropriate spell. Must
1451 * be of matching path, must be of appropriate type (prayer 1449 * be of matching path, must be of appropriate type (prayer
1452 * or not), and must be within the valid level range. 1450 * or not), and must be within the valid level range.
1453 */ 1451 */
1454 if (at->clone.type == SPELL && at->clone.path_attuned & pnum && 1452 if (at->type == SPELL && at->path_attuned & pnum &&
1455 ((at->clone.stats.grace && prayers) || (at->clone.stats.sp && !prayers)) && (at->clone.level < (level * 8))) 1453 ((at->stats.grace && prayers) || (at->stats.sp && !prayers)) && (at->level < (level * 8)))
1456 { 1454 {
1457 assign (tmpbuf, at->clone.name); 1455 assign (tmpbuf, at->object::name);
1458 1456
1459 if (book_overflow (retbuf, tmpbuf, booksize)) 1457 if (book_overflow (retbuf, tmpbuf, booksize))
1460 break; 1458 break;
1461 else 1459 else
1462 { 1460 {
1536 1534
1537 /* preamble */ 1535 /* preamble */
1538 sprintf (retbuf, "Herein is described a project using %s: \n", formula->skill ? &formula->skill : "an unknown skill"); 1536 sprintf (retbuf, "Herein is described a project using %s: \n", formula->skill ? &formula->skill : "an unknown skill");
1539 1537
1540 if ((at = archetype::find (op_name)) != (archetype *) NULL) 1538 if ((at = archetype::find (op_name)) != (archetype *) NULL)
1541 op_name = at->clone.name; 1539 op_name = at->object::name;
1542 else 1540 else
1543 LOG (llevError, "formula_msg() can't find arch %s for formula.\n", op_name); 1541 LOG (llevError, "formula_msg() can't find arch %s for formula.\n", op_name);
1544 1542
1545 /* item name */ 1543 /* item name */
1546 if (strcmp (formula->title, "NONE")) 1544 if (strcmp (formula->title, "NONE"))
1556 } 1554 }
1557 else 1555 else
1558 { 1556 {
1559 sprintf (retbuf, "%sThe %s", retbuf, op_name); 1557 sprintf (retbuf, "%sThe %s", retbuf, op_name);
1560 sprintf (title, "%s: %s", formula_book_name[RANDOM () % (sizeof (formula_book_name) / sizeof (char *))], op_name); 1558 sprintf (title, "%s: %s", formula_book_name[RANDOM () % (sizeof (formula_book_name) / sizeof (char *))], op_name);
1561 if (at->clone.title) 1559 if (at->title)
1562 { 1560 {
1563 strcat (retbuf, " "); 1561 strcat (retbuf, " ");
1564 strcat (retbuf, at->clone.title); 1562 strcat (retbuf, at->title);
1565 strcat (title, " "); 1563 strcat (title, " ");
1566 strcat (title, at->clone.title); 1564 strcat (title, at->title);
1567 } 1565 }
1568 } 1566 }
1569 /* Lets name the book something meaningful ! */ 1567 /* Lets name the book something meaningful ! */
1570 book->name = title; 1568 book->name = title;
1571 book->title = NULL; 1569 book->title = NULL;
1577 archetype *at; 1575 archetype *at;
1578 1576
1579 at = archetype::find (formula->cauldron); 1577 at = archetype::find (formula->cauldron);
1580 1578
1581 sprintf (retbuf + strlen (retbuf), 1579 sprintf (retbuf + strlen (retbuf),
1582 " may be made at %s using the following ingredients:\n", at ? query_name (&at->clone) : "an unknown place"); 1580 " may be made at %s using the following ingredients:\n", at ? query_name (at) : "an unknown place");
1583 1581
1584 for (next = formula->ingred; next != NULL; next = next->next) 1582 for (next = formula->ingred; next != NULL; next = next->next)
1585 { 1583 {
1586 strcat (retbuf, next->name); 1584 strcat (retbuf, next->name);
1587 strcat (retbuf, "\n"); 1585 strcat (retbuf, "\n");

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines