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.7 by root, Wed Sep 13 23:39:27 2006 UTC vs.
Revision 1.17 by pippijn, Sat Jan 6 14:42:29 2007 UTC

1/* 1/*
2 CrossFire, A Multiplayer game for X-windows 2 CrossFire, A Multiplayer game for X-windows
3 3
4 Copyright (C) 2005, 2006, 2007 Marc Lehmann & Crossfire+ Development Team
4 Copyright (C) 2002 Mark Wedel & Crossfire Development Team 5 Copyright (C) 2002 Mark Wedel & Crossfire Development Team
5 Copyright (C) 1992 Frank Tore Johansen 6 Copyright (C) 1992 Frank Tore Johansen
6 7
7 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
8 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
16 17
17 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
18 along with this program; if not, write to the Free Software 19 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 21
21 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>
22*/ 23*/
23 24
24 25
25/* This file contains code relevant to the BOOKS hack -- designed 26/* This file contains code relevant to the BOOKS hack -- designed
26 * to allow randomly occuring messages in non-magical texts. 27 * to allow randomly occuring messages in non-magical texts.
110 * pointers to all (hostile) monster objects */ 111 * pointers to all (hostile) monster objects */
111 112
112static int nrofmon = 0, need_to_write_bookarchive = 0; 113static int nrofmon = 0, need_to_write_bookarchive = 0;
113 114
114 115
115/* this is needed to keep track of status of initialization 116/* this is needed to keep track of status of initialisation
116 * of the message file */ 117 * of the message file */
117static int nrofmsg = 0; 118static int nrofmsg = 0;
118 119
119/* 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
120 * the messages file 121 * the messages file
636 637
637} 638}
638 639
639/***************************************************************************** 640/*****************************************************************************
640 * 641 *
641 * Start of initialization related functions. 642 * Start of initialisation related functions.
642 * 643 *
643 ****************************************************************************/ 644 ****************************************************************************/
644 645
645/* init_msgfile() - if not called before, initialize the info list 646/* init_msgfile() - if not called before, initialise the info list
646 * 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
647*/ 648*/
648 649
649static void 650static void
650init_msgfile (void) 651init_msgfile (void)
657 if (did_init_msgfile) 658 if (did_init_msgfile)
658 return; 659 return;
659 did_init_msgfile = 1; 660 did_init_msgfile = 1;
660 661
661 sprintf (fname, "%s/messages", settings.datadir); 662 sprintf (fname, "%s/messages", settings.datadir);
662 LOG (llevDebug, "Reading messages from %s...", fname); 663 LOG (llevDebug, "Reading messages from %s...\n", fname);
663 664
664 if ((fp = open_and_uncompress (fname, 0, &comp)) != NULL) 665 if ((fp = open_and_uncompress (fname, 0, &comp)) != NULL)
665 { 666 {
666 linked_char *tmp = NULL; 667 linked_char *tmp = NULL;
667 668
677 if (!strncmp (cp, "ENDMSG", 6)) 678 if (!strncmp (cp, "ENDMSG", 6))
678 { 679 {
679 if (strlen (msgbuf) > BOOK_BUF) 680 if (strlen (msgbuf) > BOOK_BUF)
680 { 681 {
681 LOG (llevDebug, "Warning: this string exceeded max book buf size:"); 682 LOG (llevDebug, "Warning: this string exceeded max book buf size:");
682 LOG (llevDebug, " %s", msgbuf); 683 LOG (llevDebug, " %s\n", msgbuf);
683 } 684 }
684 tmp->name = msgbuf; 685 tmp->name = msgbuf;
685 tmp->next = first_msg; 686 tmp->next = first_msg;
686 first_msg = tmp; 687 first_msg = tmp;
687 nrofmsg++; 688 nrofmsg++;
702 } 703 }
703 close_and_delete (fp, comp); 704 close_and_delete (fp, comp);
704 } 705 }
705 706
706#ifdef BOOK_MSG_DEBUG 707#ifdef BOOK_MSG_DEBUG
707 LOG (llevDebug, "\ninit_info_listfile() got %d messages.\n", nrofmsg); 708 LOG (llevDebug, "init_info_listfile() got %d messages.\n", nrofmsg);
708#endif 709#endif
709 LOG (llevDebug, "done.\n"); 710 LOG (llevDebug, "done.\n");
710} 711}
711 712
712 713
713/* init_book_archive() - if not called before, initialize the info list 714/* init_book_archive() - if not called before, initialise the info list
714 * 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
715 * created and updated across multiple runs of the program. 716 * created and updated across multiple runs of the program.
716 */ 717 */
717 718
718static void 719static void
788 book->next = bl->first_book; 789 book->next = bl->first_book;
789 bl->first_book = book; 790 bl->first_book = book;
790 bl->number++; 791 bl->number++;
791 } 792 }
792 } 793 }
793 LOG (llevDebug, " book archives(used/avail): "); 794 LOG (llevDebug, "book archives(used/avail): \n");
794 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++)
795 { 796 {
796 LOG (llevDebug, "(%d/%d)", bl->number, max_titles[i]); 797 LOG (llevDebug, " (%d/%d)\n", bl->number, max_titles[i]);
797 } 798 }
798 LOG (llevDebug, "\n");
799 close_and_delete (fp, comp); 799 close_and_delete (fp, comp);
800 } 800 }
801 801
802#ifdef BOOK_MSG_DEBUG 802#ifdef BOOK_MSG_DEBUG
803 LOG (llevDebug, "\n init_book_archive() got %d titles.\n", nroftitle); 803 LOG (llevDebug, "init_book_archive() got %d titles.\n", nroftitle);
804#endif 804#endif
805 LOG (llevDebug, " done.\n"); 805 LOG (llevDebug, " done.\n");
806} 806}
807 807
808/* init_mon_info() - creates the linked list of pointers to 808/* init_mon_info() - creates the linked list of pointers to
815 archetype *at; 815 archetype *at;
816 static int did_init_mon_info = 0; 816 static int did_init_mon_info = 0;
817 817
818 if (did_init_mon_info) 818 if (did_init_mon_info)
819 return; 819 return;
820
820 did_init_mon_info = 1; 821 did_init_mon_info = 1;
821 822
822 823
823 for (at = first_archetype; at != NULL; at = at->next) 824 for (at = first_archetype; at != NULL; at = at->next)
824 { 825 {
825 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)))
826 { 827 {
827 objectlink *mon = (objectlink *) malloc (sizeof (objectlink)); 828 objectlink *mon = new objectlink;
828 829
829 mon->ob = &at->clone; 830 mon->ob = &at->clone;
830 mon->id = nrofmon;
831 mon->next = first_mon_info; 831 mon->next = first_mon_info;
832 first_mon_info = mon; 832 first_mon_info = mon;
833 nrofmon++; 833 nrofmon++;
834 } 834 }
835 } 835 }
836
836 LOG (llevDebug, "init_mon_info() got %d monsters\n", nrofmon); 837 LOG (llevDebug, "init_mon_info() got %d monsters\n", nrofmon);
837} 838}
838 839
839 840
840/* init_readable() - initialize linked lists utilized by 841/* init_readable() - initialise linked lists utilized by
841 * message functions in tailor_readable_ob() 842 * message functions in tailor_readable_ob()
842 * 843 *
843 * This is the function called by the main routine to initialize 844 * This is the function called by the main routine to initialise
844 * all the readable information. 845 * all the readable information.
845 */ 846 */
846 847
847void 848void
848init_readable (void) 849init_readable (void)
849{ 850{
850 static int did_this; 851 static int did_this;
851 852
852 if (did_this) 853 if (did_this)
853 return; 854 return;
855
854 did_this = 1; 856 did_this = 1;
855 857
856 LOG (llevDebug, "Initializing reading data..."); 858 LOG (llevDebug, "Initialising reading data...\n");
857 init_msgfile (); 859 init_msgfile ();
858 init_book_archive (); 860 init_book_archive ();
859 init_mon_info (); 861 init_mon_info ();
860 LOG (llevDebug, " Done\n"); 862 LOG (llevDebug, " Done\n");
861 863
1097 1099
1098 /* alter book properties */ 1100 /* alter book properties */
1099 if ((tmpbook = get_archetype (t->archname)) != NULL) 1101 if ((tmpbook = get_archetype (t->archname)) != NULL)
1100 { 1102 {
1101 tmpbook->msg = book->msg; 1103 tmpbook->msg = book->msg;
1102 copy_object (tmpbook, book); 1104 tmpbook->copy_to (book);
1103 free_object (tmpbook); 1105 tmpbook->destroy ();
1104 } 1106 }
1105 1107
1106 book->title = t->authour; 1108 book->title = t->authour;
1107 book->name = t->name; 1109 book->name = t->name;
1108 book->level = t->level; 1110 book->level = t->level;
1465 * level is kinda high */ 1467 * level is kinda high */
1466 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))
1467 strcat (buf, art->item->msg); 1469 strcat (buf, art->item->msg);
1468 1470
1469 /* properties of the artifact */ 1471 /* properties of the artifact */
1470 tmp = get_object (); 1472 tmp = object::create ();
1471 add_abilities (tmp, art->item); 1473 add_abilities (tmp, art->item);
1472 tmp->type = type; 1474 tmp->type = type;
1473 SET_FLAG (tmp, FLAG_IDENTIFIED); 1475 SET_FLAG (tmp, FLAG_IDENTIFIED);
1474 if ((ch = describe_item (tmp, NULL)) != NULL && strlen (ch) > 1) 1476 if ((ch = describe_item (tmp, NULL)) != NULL && strlen (ch) > 1)
1475 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);
1476 free_object (tmp); 1478 tmp->destroy ();
1477 /* add the buf if it will fit */ 1479 /* add the buf if it will fit */
1478 if (!book_overflow (retbuf, buf, booksize)) 1480 if (!book_overflow (retbuf, buf, booksize))
1479 strcat (retbuf, buf); 1481 strcat (retbuf, buf);
1480 else 1482 else
1481 break; 1483 break;
1611 archetype *at; 1613 archetype *at;
1612 1614
1613 /* preamble */ 1615 /* preamble */
1614 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");
1615 1617
1616 if ((at = find_archetype (op_name)) != (archetype *) NULL) 1618 if ((at = archetype::find (op_name)) != (archetype *) NULL)
1617 op_name = at->clone.name; 1619 op_name = at->clone.name;
1618 else 1620 else
1619 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);
1620 1622
1621 /* item name */ 1623 /* item name */
1650 if (formula->ingred != NULL) 1652 if (formula->ingred != NULL)
1651 { 1653 {
1652 linked_char *next; 1654 linked_char *next;
1653 archetype *at; 1655 archetype *at;
1654 1656
1655 at = find_archetype (formula->cauldron); 1657 at = archetype::find (formula->cauldron);
1656 1658
1657 sprintf (retbuf + strlen (retbuf), 1659 sprintf (retbuf + strlen (retbuf),
1658 " 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");
1659 1661
1660 for (next = formula->ingred; next != NULL; next = next->next) 1662 for (next = formula->ingred; next != NULL; next = next->next)
1978 strcpy (msgbuf, msgfile_msg (level, book_buf_size)); 1980 strcpy (msgbuf, msgfile_msg (level, book_buf_size));
1979 break; 1981 break;
1980 } 1982 }
1981 1983
1982 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
1983 if (strlen (msgbuf) > 1) 1986 if (strlen (msgbuf) > 1)
1984 { 1987 {
1985 book->msg = msgbuf; 1988 book->msg = msgbuf;
1986 /* 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 */
1987 change_book (book, msg_type); 1990 change_book (book, msg_type);
2016 delete title1; 2019 delete title1;
2017 } 2020 }
2018 2021
2019 delete tlist; 2022 delete tlist;
2020 } 2023 }
2024
2021 for (lmsg = first_msg; lmsg; lmsg = nextmsg) 2025 for (lmsg = first_msg; lmsg; lmsg = nextmsg)
2022 { 2026 {
2023 nextmsg = lmsg->next; 2027 nextmsg = lmsg->next;
2024 delete lmsg; 2028 delete lmsg;
2025 } 2029 }
2030
2026 for (monlink = first_mon_info; monlink; monlink = nextmon) 2031 for (monlink = first_mon_info; monlink; monlink = nextmon)
2027 { 2032 {
2028 nextmon = monlink->next; 2033 nextmon = monlink->next;
2029 free (monlink); 2034 delete monlink;
2030 } 2035 }
2031} 2036}
2032 2037
2033 2038
2034/***************************************************************************** 2039/*****************************************************************************

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines