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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines