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