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.6 by root, Wed Sep 13 23:32:04 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.6 2006/09/13 23:32:04 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.
116 * pointers to all (hostile) monster objects */ 110 * pointers to all (hostile) monster objects */
117 111
118static int nrofmon = 0, need_to_write_bookarchive = 0; 112static int nrofmon = 0, need_to_write_bookarchive = 0;
119 113
120 114
121/* this is needed to keep track of status of initialization 115/* this is needed to keep track of status of initialisation
122 * of the message file */ 116 * of the message file */
123static int nrofmsg = 0; 117static int nrofmsg = 0;
124 118
125/* 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
126 * the messages file 120 * the messages file
642 636
643} 637}
644 638
645/***************************************************************************** 639/*****************************************************************************
646 * 640 *
647 * Start of initialization related functions. 641 * Start of initialisation related functions.
648 * 642 *
649 ****************************************************************************/ 643 ****************************************************************************/
650 644
651/* init_msgfile() - if not called before, initialize the info list 645/* init_msgfile() - if not called before, initialise the info list
652 * 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
653*/ 647*/
654 648
655static void 649static void
656init_msgfile (void) 650init_msgfile (void)
663 if (did_init_msgfile) 657 if (did_init_msgfile)
664 return; 658 return;
665 did_init_msgfile = 1; 659 did_init_msgfile = 1;
666 660
667 sprintf (fname, "%s/messages", settings.datadir); 661 sprintf (fname, "%s/messages", settings.datadir);
668 LOG (llevDebug, "Reading messages from %s...", fname); 662 LOG (llevDebug, "Reading messages from %s...\n", fname);
669 663
670 if ((fp = open_and_uncompress (fname, 0, &comp)) != NULL) 664 if ((fp = open_and_uncompress (fname, 0, &comp)) != NULL)
671 { 665 {
672 linked_char *tmp = NULL; 666 linked_char *tmp = NULL;
673 667
683 if (!strncmp (cp, "ENDMSG", 6)) 677 if (!strncmp (cp, "ENDMSG", 6))
684 { 678 {
685 if (strlen (msgbuf) > BOOK_BUF) 679 if (strlen (msgbuf) > BOOK_BUF)
686 { 680 {
687 LOG (llevDebug, "Warning: this string exceeded max book buf size:"); 681 LOG (llevDebug, "Warning: this string exceeded max book buf size:");
688 LOG (llevDebug, " %s", msgbuf); 682 LOG (llevDebug, " %s\n", msgbuf);
689 } 683 }
690 tmp->name = msgbuf; 684 tmp->name = msgbuf;
691 tmp->next = first_msg; 685 tmp->next = first_msg;
692 first_msg = tmp; 686 first_msg = tmp;
693 nrofmsg++; 687 nrofmsg++;
708 } 702 }
709 close_and_delete (fp, comp); 703 close_and_delete (fp, comp);
710 } 704 }
711 705
712#ifdef BOOK_MSG_DEBUG 706#ifdef BOOK_MSG_DEBUG
713 LOG (llevDebug, "\ninit_info_listfile() got %d messages.\n", nrofmsg); 707 LOG (llevDebug, "init_info_listfile() got %d messages.\n", nrofmsg);
714#endif 708#endif
715 LOG (llevDebug, "done.\n"); 709 LOG (llevDebug, "done.\n");
716} 710}
717 711
718 712
719/* init_book_archive() - if not called before, initialize the info list 713/* init_book_archive() - if not called before, initialise the info list
720 * 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
721 * created and updated across multiple runs of the program. 715 * created and updated across multiple runs of the program.
722 */ 716 */
723 717
724static void 718static void
794 book->next = bl->first_book; 788 book->next = bl->first_book;
795 bl->first_book = book; 789 bl->first_book = book;
796 bl->number++; 790 bl->number++;
797 } 791 }
798 } 792 }
799 LOG (llevDebug, " book archives(used/avail): "); 793 LOG (llevDebug, "book archives(used/avail): \n");
800 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++)
801 { 795 {
802 LOG (llevDebug, "(%d/%d)", bl->number, max_titles[i]); 796 LOG (llevDebug, " (%d/%d)\n", bl->number, max_titles[i]);
803 } 797 }
804 LOG (llevDebug, "\n");
805 close_and_delete (fp, comp); 798 close_and_delete (fp, comp);
806 } 799 }
807 800
808#ifdef BOOK_MSG_DEBUG 801#ifdef BOOK_MSG_DEBUG
809 LOG (llevDebug, "\n init_book_archive() got %d titles.\n", nroftitle); 802 LOG (llevDebug, "init_book_archive() got %d titles.\n", nroftitle);
810#endif 803#endif
811 LOG (llevDebug, " done.\n"); 804 LOG (llevDebug, " done.\n");
812} 805}
813 806
814/* init_mon_info() - creates the linked list of pointers to 807/* init_mon_info() - creates the linked list of pointers to
821 archetype *at; 814 archetype *at;
822 static int did_init_mon_info = 0; 815 static int did_init_mon_info = 0;
823 816
824 if (did_init_mon_info) 817 if (did_init_mon_info)
825 return; 818 return;
819
826 did_init_mon_info = 1; 820 did_init_mon_info = 1;
827 821
828 822
829 for (at = first_archetype; at != NULL; at = at->next) 823 for (at = first_archetype; at != NULL; at = at->next)
830 { 824 {
831 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)))
832 { 826 {
833 objectlink *mon = (objectlink *) malloc (sizeof (objectlink)); 827 objectlink *mon = new objectlink;
834 828
835 mon->ob = &at->clone; 829 mon->ob = &at->clone;
836 mon->id = nrofmon;
837 mon->next = first_mon_info; 830 mon->next = first_mon_info;
838 first_mon_info = mon; 831 first_mon_info = mon;
839 nrofmon++; 832 nrofmon++;
840 } 833 }
841 } 834 }
835
842 LOG (llevDebug, "init_mon_info() got %d monsters\n", nrofmon); 836 LOG (llevDebug, "init_mon_info() got %d monsters\n", nrofmon);
843} 837}
844 838
845 839
846/* init_readable() - initialize linked lists utilized by 840/* init_readable() - initialise linked lists utilized by
847 * message functions in tailor_readable_ob() 841 * message functions in tailor_readable_ob()
848 * 842 *
849 * This is the function called by the main routine to initialize 843 * This is the function called by the main routine to initialise
850 * all the readable information. 844 * all the readable information.
851 */ 845 */
852 846
853void 847void
854init_readable (void) 848init_readable (void)
855{ 849{
856 static int did_this; 850 static int did_this;
857 851
858 if (did_this) 852 if (did_this)
859 return; 853 return;
854
860 did_this = 1; 855 did_this = 1;
861 856
862 LOG (llevDebug, "Initializing reading data..."); 857 LOG (llevDebug, "Initialising reading data...\n");
863 init_msgfile (); 858 init_msgfile ();
864 init_book_archive (); 859 init_book_archive ();
865 init_mon_info (); 860 init_mon_info ();
866 LOG (llevDebug, " Done\n"); 861 LOG (llevDebug, " Done\n");
867 862
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