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.5 by root, Sun Sep 10 16:00:23 2006 UTC vs.
Revision 1.17 by pippijn, Sat Jan 6 14:42:29 2007 UTC

1
2/*
3 * static char *rcsid_readable_c =
4 * "$Id: readable.C,v 1.5 2006/09/10 16:00:23 root Exp $";
5 */
6
7/* 1/*
8 CrossFire, A Multiplayer game for X-windows 2 CrossFire, A Multiplayer game for X-windows
9 3
4 Copyright (C) 2005, 2006, 2007 Marc Lehmann & Crossfire+ Development Team
10 Copyright (C) 2002 Mark Wedel & Crossfire Development Team 5 Copyright (C) 2002 Mark Wedel & Crossfire Development Team
11 Copyright (C) 1992 Frank Tore Johansen 6 Copyright (C) 1992 Frank Tore Johansen
12 7
13 This program is free software; you can redistribute it and/or modify 8 This program is free software; you can redistribute it and/or modify
14 it under the terms of the GNU General Public License as published by 9 it under the terms of the GNU General Public License as published by
22 17
23 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
24 along with this program; if not, write to the Free Software 19 along with this program; if not, write to the Free Software
25 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26 21
27 The authors can be reached via e-mail at crossfire-devel@real-time.com 22 The authors can be reached via e-mail at <crossfire@schmorp.de>
28*/ 23*/
29 24
30 25
31/* This file contains code relevant to the BOOKS hack -- designed 26/* This file contains code relevant to the BOOKS hack -- designed
32 * to allow randomly occuring messages in non-magical texts. 27 * to allow randomly occuring messages in non-magical texts.
80/* Moved these structures from struct.h to this file in 0.94.3 - they 75/* Moved these structures from struct.h to this file in 0.94.3 - they
81 * are not needed anyplace else, so why have them globally declared? 76 * are not needed anyplace else, so why have them globally declared?
82 */ 77 */
83 78
84/* 'title' and 'titlelist' are used by the readable code */ 79/* 'title' and 'titlelist' are used by the readable code */
85typedef struct titlestruct:zero_initialised 80struct title : zero_initialised
86{ 81{
87 shstr name; /* the name of the book */ 82 shstr name; /* the name of the book */
88 shstr authour; /* the name of the book authour */ 83 shstr authour; /* the name of the book authour */
89 shstr archname; /* the archetype name of the book */ 84 shstr archname; /* the archetype name of the book */
90 int level; /* level of difficulty of this message */ 85 int level; /* level of difficulty of this message */
91 int size; /* size of the book message */ 86 int size; /* size of the book message */
92 int msg_index; /* an index value derived from book message */ 87 int msg_index; /* an index value derived from book message */
93 struct titlestruct *next; 88 title *next;
94} title; 89};
95 90
96typedef struct titleliststruct:zero_initialised 91struct titlelist : zero_initialised
97{ 92{
98 int number; /* number of items in the list */ 93 int number; /* number of items in the list */
99 struct titlestruct *first_book; /* pointer to first book in this list */ 94 title *first_book; /* pointer to first book in this list */
100 struct titleliststruct *next; /* pointer to next book list */ 95 titlelist *next; /* pointer to next book list */
101} titlelist; 96};
102 97
103/* special structure, used only by art_name_array[] */ 98/* special structure, used only by art_name_array[] */
104 99struct arttypename
105typedef struct namebytype
106{ 100{
107 const char *name; /* generic name to call artifacts of this type */ 101 const char *name; /* generic name to call artifacts of this type */
108 int type; /* matching type */ 102 int type; /* matching type */
109} 103};
110arttypename;
111
112 104
113/* booklist is the buffer of books read in from the bookarch file */ 105/* booklist is the buffer of books read in from the bookarch file */
114static titlelist *booklist = NULL; 106static titlelist *booklist = NULL;
115 107
116static objectlink *first_mon_info = NULL; 108static objectlink *first_mon_info = NULL;
119 * pointers to all (hostile) monster objects */ 111 * pointers to all (hostile) monster objects */
120 112
121static int nrofmon = 0, need_to_write_bookarchive = 0; 113static int nrofmon = 0, need_to_write_bookarchive = 0;
122 114
123 115
124/* this is needed to keep track of status of initialization 116/* this is needed to keep track of status of initialisation
125 * of the message file */ 117 * of the message file */
126static int nrofmsg = 0; 118static int nrofmsg = 0;
127 119
128/* first_msg is the started of the linked list of messages as read from 120/* first_msg is the started of the linked list of messages as read from
129 * the messages file 121 * the messages file
565 557
566 while (tl && number) 558 while (tl && number)
567 { 559 {
568 if (!tl->next) 560 if (!tl->next)
569 tl->next = get_empty_booklist (); 561 tl->next = get_empty_booklist ();
562
570 tl = tl->next; 563 tl = tl->next;
571 number--; 564 number--;
572 } 565 }
573 566
574 return tl; 567 return tl;
644 637
645} 638}
646 639
647/***************************************************************************** 640/*****************************************************************************
648 * 641 *
649 * Start of initialization related functions. 642 * Start of initialisation related functions.
650 * 643 *
651 ****************************************************************************/ 644 ****************************************************************************/
652 645
653/* init_msgfile() - if not called before, initialize the info list 646/* init_msgfile() - if not called before, initialise the info list
654 * reads the messages file into the list pointed to by first_msg 647 * reads the messages file into the list pointed to by first_msg
655*/ 648*/
656 649
657static void 650static void
658init_msgfile (void) 651init_msgfile (void)
665 if (did_init_msgfile) 658 if (did_init_msgfile)
666 return; 659 return;
667 did_init_msgfile = 1; 660 did_init_msgfile = 1;
668 661
669 sprintf (fname, "%s/messages", settings.datadir); 662 sprintf (fname, "%s/messages", settings.datadir);
670 LOG (llevDebug, "Reading messages from %s...", fname); 663 LOG (llevDebug, "Reading messages from %s...\n", fname);
671 664
672 if ((fp = open_and_uncompress (fname, 0, &comp)) != NULL) 665 if ((fp = open_and_uncompress (fname, 0, &comp)) != NULL)
673 { 666 {
674 linked_char *tmp = NULL; 667 linked_char *tmp = NULL;
675 668
685 if (!strncmp (cp, "ENDMSG", 6)) 678 if (!strncmp (cp, "ENDMSG", 6))
686 { 679 {
687 if (strlen (msgbuf) > BOOK_BUF) 680 if (strlen (msgbuf) > BOOK_BUF)
688 { 681 {
689 LOG (llevDebug, "Warning: this string exceeded max book buf size:"); 682 LOG (llevDebug, "Warning: this string exceeded max book buf size:");
690 LOG (llevDebug, " %s", msgbuf); 683 LOG (llevDebug, " %s\n", msgbuf);
691 } 684 }
692 tmp->name = msgbuf; 685 tmp->name = msgbuf;
693 tmp->next = first_msg; 686 tmp->next = first_msg;
694 first_msg = tmp; 687 first_msg = tmp;
695 nrofmsg++; 688 nrofmsg++;
710 } 703 }
711 close_and_delete (fp, comp); 704 close_and_delete (fp, comp);
712 } 705 }
713 706
714#ifdef BOOK_MSG_DEBUG 707#ifdef BOOK_MSG_DEBUG
715 LOG (llevDebug, "\ninit_info_listfile() got %d messages.\n", nrofmsg); 708 LOG (llevDebug, "init_info_listfile() got %d messages.\n", nrofmsg);
716#endif 709#endif
717 LOG (llevDebug, "done.\n"); 710 LOG (llevDebug, "done.\n");
718} 711}
719 712
720 713
721/* init_book_archive() - if not called before, initialize the info list 714/* init_book_archive() - if not called before, initialise the info list
722 * This reads in the bookarch file into memory. bookarch is the file 715 * This reads in the bookarch file into memory. bookarch is the file
723 * created and updated across multiple runs of the program. 716 * created and updated across multiple runs of the program.
724 */ 717 */
725 718
726static void 719static void
733 titlelist *bl = get_empty_booklist (); 726 titlelist *bl = get_empty_booklist ();
734 static int did_init_barch; 727 static int did_init_barch;
735 728
736 if (did_init_barch) 729 if (did_init_barch)
737 return; 730 return;
731
738 did_init_barch = 1; 732 did_init_barch = 1;
739 733
740 if (!booklist) 734 if (!booklist)
741 booklist = bl; 735 booklist = bl;
742 736
795 book->next = bl->first_book; 789 book->next = bl->first_book;
796 bl->first_book = book; 790 bl->first_book = book;
797 bl->number++; 791 bl->number++;
798 } 792 }
799 } 793 }
800 LOG (llevDebug, " book archives(used/avail): "); 794 LOG (llevDebug, "book archives(used/avail): \n");
801 for (bl = booklist, i = 0; bl != NULL && i < sizeof (max_titles) / sizeof (*max_titles); bl = bl->next, i++) 795 for (bl = booklist, i = 0; bl != NULL && i < sizeof (max_titles) / sizeof (*max_titles); bl = bl->next, i++)
802 { 796 {
803 LOG (llevDebug, "(%d/%d)", bl->number, max_titles[i]); 797 LOG (llevDebug, " (%d/%d)\n", bl->number, max_titles[i]);
804 } 798 }
805 LOG (llevDebug, "\n");
806 close_and_delete (fp, comp); 799 close_and_delete (fp, comp);
807 } 800 }
808 801
809#ifdef BOOK_MSG_DEBUG 802#ifdef BOOK_MSG_DEBUG
810 LOG (llevDebug, "\n init_book_archive() got %d titles.\n", nroftitle); 803 LOG (llevDebug, "init_book_archive() got %d titles.\n", nroftitle);
811#endif 804#endif
812 LOG (llevDebug, " done.\n"); 805 LOG (llevDebug, " done.\n");
813} 806}
814 807
815/* init_mon_info() - creates the linked list of pointers to 808/* init_mon_info() - creates the linked list of pointers to
822 archetype *at; 815 archetype *at;
823 static int did_init_mon_info = 0; 816 static int did_init_mon_info = 0;
824 817
825 if (did_init_mon_info) 818 if (did_init_mon_info)
826 return; 819 return;
820
827 did_init_mon_info = 1; 821 did_init_mon_info = 1;
828 822
829 823
830 for (at = first_archetype; at != NULL; at = at->next) 824 for (at = first_archetype; at != NULL; at = at->next)
831 { 825 {
832 if (QUERY_FLAG (&at->clone, FLAG_MONSTER) && (!QUERY_FLAG (&at->clone, FLAG_CHANGING) || QUERY_FLAG (&at->clone, FLAG_UNAGGRESSIVE))) 826 if (QUERY_FLAG (&at->clone, FLAG_MONSTER) && (!QUERY_FLAG (&at->clone, FLAG_CHANGING) || QUERY_FLAG (&at->clone, FLAG_UNAGGRESSIVE)))
833 { 827 {
834 objectlink *mon = (objectlink *) malloc (sizeof (objectlink)); 828 objectlink *mon = new objectlink;
835 829
836 mon->ob = &at->clone; 830 mon->ob = &at->clone;
837 mon->id = nrofmon;
838 mon->next = first_mon_info; 831 mon->next = first_mon_info;
839 first_mon_info = mon; 832 first_mon_info = mon;
840 nrofmon++; 833 nrofmon++;
841 } 834 }
842 } 835 }
836
843 LOG (llevDebug, "init_mon_info() got %d monsters\n", nrofmon); 837 LOG (llevDebug, "init_mon_info() got %d monsters\n", nrofmon);
844} 838}
845 839
846 840
847/* init_readable() - initialize linked lists utilized by 841/* init_readable() - initialise linked lists utilized by
848 * message functions in tailor_readable_ob() 842 * message functions in tailor_readable_ob()
849 * 843 *
850 * This is the function called by the main routine to initialize 844 * This is the function called by the main routine to initialise
851 * all the readable information. 845 * all the readable information.
852 */ 846 */
853 847
854void 848void
855init_readable (void) 849init_readable (void)
856{ 850{
857 static int did_this; 851 static int did_this;
858 852
859 if (did_this) 853 if (did_this)
860 return; 854 return;
855
861 did_this = 1; 856 did_this = 1;
862 857
863 LOG (llevDebug, "Initializing reading data..."); 858 LOG (llevDebug, "Initialising reading data...\n");
864 init_msgfile (); 859 init_msgfile ();
865 init_book_archive (); 860 init_book_archive ();
866 init_mon_info (); 861 init_mon_info ();
867 LOG (llevDebug, " Done\n"); 862 LOG (llevDebug, " Done\n");
868 863
891 if (msgtype < 0) 886 if (msgtype < 0)
892 return (title *) NULL; 887 return (title *) NULL;
893 888
894 if (tl) 889 if (tl)
895 t = tl->first_book; 890 t = tl->first_book;
891
896 while (t) 892 while (t)
897 if (t->size == length && t->msg_index == index) 893 if (t->size == length && t->msg_index == index)
898 break; 894 break;
899 else 895 else
900 t = t->next; 896 t = t->next;
1103 1099
1104 /* alter book properties */ 1100 /* alter book properties */
1105 if ((tmpbook = get_archetype (t->archname)) != NULL) 1101 if ((tmpbook = get_archetype (t->archname)) != NULL)
1106 { 1102 {
1107 tmpbook->msg = book->msg; 1103 tmpbook->msg = book->msg;
1108 copy_object (tmpbook, book); 1104 tmpbook->copy_to (book);
1109 free_object (tmpbook); 1105 tmpbook->destroy ();
1110 } 1106 }
1111 1107
1112 book->title = t->authour; 1108 book->title = t->authour;
1113 book->name = t->name; 1109 book->name = t->name;
1114 book->level = t->level; 1110 book->level = t->level;
1471 * level is kinda high */ 1467 * level is kinda high */
1472 if (art->item->msg && (RANDOM () % 4 + 1) < level && !((strlen (art->item->msg) + strlen (buf)) > BOOK_BUF)) 1468 if (art->item->msg && (RANDOM () % 4 + 1) < level && !((strlen (art->item->msg) + strlen (buf)) > BOOK_BUF))
1473 strcat (buf, art->item->msg); 1469 strcat (buf, art->item->msg);
1474 1470
1475 /* properties of the artifact */ 1471 /* properties of the artifact */
1476 tmp = get_object (); 1472 tmp = object::create ();
1477 add_abilities (tmp, art->item); 1473 add_abilities (tmp, art->item);
1478 tmp->type = type; 1474 tmp->type = type;
1479 SET_FLAG (tmp, FLAG_IDENTIFIED); 1475 SET_FLAG (tmp, FLAG_IDENTIFIED);
1480 if ((ch = describe_item (tmp, NULL)) != NULL && strlen (ch) > 1) 1476 if ((ch = describe_item (tmp, NULL)) != NULL && strlen (ch) > 1)
1481 sprintf (buf, "%s Properties of this artifact include: \n %s \n", buf, ch); 1477 sprintf (buf, "%s Properties of this artifact include: \n %s \n", buf, ch);
1482 free_object (tmp); 1478 tmp->destroy ();
1483 /* add the buf if it will fit */ 1479 /* add the buf if it will fit */
1484 if (!book_overflow (retbuf, buf, booksize)) 1480 if (!book_overflow (retbuf, buf, booksize))
1485 strcat (retbuf, buf); 1481 strcat (retbuf, buf);
1486 else 1482 else
1487 break; 1483 break;
1617 archetype *at; 1613 archetype *at;
1618 1614
1619 /* preamble */ 1615 /* preamble */
1620 sprintf (retbuf, "Herein is described a project using %s: \n", formula->skill ? &formula->skill : "an unknown skill"); 1616 sprintf (retbuf, "Herein is described a project using %s: \n", formula->skill ? &formula->skill : "an unknown skill");
1621 1617
1622 if ((at = find_archetype (op_name)) != (archetype *) NULL) 1618 if ((at = archetype::find (op_name)) != (archetype *) NULL)
1623 op_name = at->clone.name; 1619 op_name = at->clone.name;
1624 else 1620 else
1625 LOG (llevError, "formula_msg() can't find arch %s for formula.\n", op_name); 1621 LOG (llevError, "formula_msg() can't find arch %s for formula.\n", op_name);
1626 1622
1627 /* item name */ 1623 /* item name */
1656 if (formula->ingred != NULL) 1652 if (formula->ingred != NULL)
1657 { 1653 {
1658 linked_char *next; 1654 linked_char *next;
1659 archetype *at; 1655 archetype *at;
1660 1656
1661 at = find_archetype (formula->cauldron); 1657 at = archetype::find (formula->cauldron);
1662 1658
1663 sprintf (retbuf + strlen (retbuf), 1659 sprintf (retbuf + strlen (retbuf),
1664 " may be made at %s using the following ingredients:\n", at ? query_name (&at->clone) : "an unknown place"); 1660 " may be made at %s using the following ingredients:\n", at ? query_name (&at->clone) : "an unknown place");
1665 1661
1666 for (next = formula->ingred; next != NULL; next = next->next) 1662 for (next = formula->ingred; next != NULL; next = next->next)
1984 strcpy (msgbuf, msgfile_msg (level, book_buf_size)); 1980 strcpy (msgbuf, msgfile_msg (level, book_buf_size));
1985 break; 1981 break;
1986 } 1982 }
1987 1983
1988 strcat (msgbuf, "\n"); /* safety -- we get ugly map saves/crashes w/o this */ 1984 strcat (msgbuf, "\n"); /* safety -- we get ugly map saves/crashes w/o this */
1985
1989 if (strlen (msgbuf) > 1) 1986 if (strlen (msgbuf) > 1)
1990 { 1987 {
1991 book->msg = msgbuf; 1988 book->msg = msgbuf;
1992 /* lets give the "book" a new name, which may be a compound word */ 1989 /* lets give the "book" a new name, which may be a compound word */
1993 change_book (book, msg_type); 1990 change_book (book, msg_type);
2022 delete title1; 2019 delete title1;
2023 } 2020 }
2024 2021
2025 delete tlist; 2022 delete tlist;
2026 } 2023 }
2024
2027 for (lmsg = first_msg; lmsg; lmsg = nextmsg) 2025 for (lmsg = first_msg; lmsg; lmsg = nextmsg)
2028 { 2026 {
2029 nextmsg = lmsg->next; 2027 nextmsg = lmsg->next;
2030 delete lmsg; 2028 delete lmsg;
2031 } 2029 }
2030
2032 for (monlink = first_mon_info; monlink; monlink = nextmon) 2031 for (monlink = first_mon_info; monlink; monlink = nextmon)
2033 { 2032 {
2034 nextmon = monlink->next; 2033 nextmon = monlink->next;
2035 free (monlink); 2034 delete monlink;
2036 } 2035 }
2037} 2036}
2038 2037
2039 2038
2040/***************************************************************************** 2039/*****************************************************************************

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines