1 | /* |
1 | /* |
2 | * CrossFire, A Multiplayer game |
2 | * This file is part of Crossfire TRT, the Multiplayer Online Role Playing Game. |
3 | * |
3 | * |
4 | * Copyright (C) 2005, 2006, 2007 Marc Lehmann & Crossfire+ Development Team |
4 | * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team |
5 | * Copyright (C) 2002 Mark Wedel & Crossfire Development Team |
5 | * Copyright (©) 2002,2007 Mark Wedel & Crossfire Development Team |
6 | * Copyright (C) 1992 Frank Tore Johansen |
6 | * Copyright (©) 1992,2007 Frank Tore Johansen |
7 | * |
7 | * |
8 | * This program is free software; you can redistribute it and/or modify |
8 | * Crossfire TRT is free software; you can redistribute it and/or modify it |
9 | * it under the terms of the GNU General Public License as published by |
9 | * under the terms of the GNU General Public License as published by the Free |
10 | * the Free Software Foundation; either version 2 of the License, or |
10 | * Software Foundation; either version 2 of the License, or (at your option) |
11 | * (at your option) any later version. |
11 | * any later version. |
12 | * |
12 | * |
13 | * This program is distributed in the hope that it will be useful, |
13 | * This program is distributed in the hope that it will be useful, but |
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 | * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY |
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
15 | * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
16 | * GNU General Public License for more details. |
16 | * for more details. |
17 | * |
17 | * |
18 | * 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 along |
19 | * along with this program; if not, write to the Free Software |
19 | * with Crossfire TRT; if not, write to the Free Software Foundation, Inc. 51 |
20 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
20 | * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
21 | * |
21 | * |
22 | * The authors can be reached via e-mail at <crossfire@schmorp.de> |
22 | * The authors can be reached via e-mail to <crossfire@schmorp.de> |
23 | */ |
23 | */ |
24 | |
|
|
25 | |
24 | |
26 | /* This file contains code relevant to the BOOKS hack -- designed |
25 | /* This file contains code relevant to the BOOKS hack -- designed |
27 | * to allow randomly occuring messages in non-magical texts. |
26 | * to allow randomly occuring messages in non-magical texts. |
28 | */ |
27 | */ |
29 | |
28 | |
… | |
… | |
436 | * Be careful to keep the order. If you add readable subtype, add them |
435 | * Be careful to keep the order. If you add readable subtype, add them |
437 | * at the bottom of the list. Never delete a subtype because index is used as |
436 | * at the bottom of the list. Never delete a subtype because index is used as |
438 | * subtype paramater in arch files! |
437 | * subtype paramater in arch files! |
439 | */ |
438 | */ |
440 | static readable_message_type readable_message_types[] = { |
439 | static readable_message_type readable_message_types[] = { |
441 | /*subtype 0 */ {0, 0}, |
440 | /*subtype 0 */ {0, 0, ""}, |
442 | /* book messages subtypes */ |
441 | /* book messages subtypes */ |
443 | /*subtype 1 */ {MSG_TYPE_BOOK, MSG_TYPE_BOOK_CLASP_1}, |
442 | /*subtype 1 */ {MSG_TYPE_BOOK, MSG_TYPE_BOOK_CLASP_1, "readable-book-clasp-1"}, |
444 | {MSG_TYPE_BOOK, MSG_TYPE_BOOK_CLASP_2}, |
443 | {MSG_TYPE_BOOK, MSG_TYPE_BOOK_CLASP_2, "readable-book-clasp-2"}, |
445 | {MSG_TYPE_BOOK, MSG_TYPE_BOOK_ELEGANT_1}, |
444 | {MSG_TYPE_BOOK, MSG_TYPE_BOOK_ELEGANT_1, "readable-book-elegant-1"}, |
446 | {MSG_TYPE_BOOK, MSG_TYPE_BOOK_ELEGANT_2}, |
445 | {MSG_TYPE_BOOK, MSG_TYPE_BOOK_ELEGANT_2, "readable-book-elegant-2"}, |
447 | {MSG_TYPE_BOOK, MSG_TYPE_BOOK_QUARTO_1}, |
446 | {MSG_TYPE_BOOK, MSG_TYPE_BOOK_QUARTO_1, "readable-book-quarto-1"}, |
448 | {MSG_TYPE_BOOK, MSG_TYPE_BOOK_QUARTO_2}, |
447 | {MSG_TYPE_BOOK, MSG_TYPE_BOOK_QUARTO_2, "readable-book-quarto-2"}, |
449 | {MSG_TYPE_BOOK, MSG_TYPE_BOOK_SPELL_EVOKER}, |
448 | {MSG_TYPE_BOOK, MSG_TYPE_BOOK_SPELL_EVOKER, "readable-book-spell-evocation"}, |
450 | {MSG_TYPE_BOOK, MSG_TYPE_BOOK_SPELL_PRAYER}, |
449 | {MSG_TYPE_BOOK, MSG_TYPE_BOOK_SPELL_PRAYER, "readable-book-spell-praying"}, |
451 | {MSG_TYPE_BOOK, MSG_TYPE_BOOK_SPELL_PYRO}, |
450 | {MSG_TYPE_BOOK, MSG_TYPE_BOOK_SPELL_PYRO, "readable-book-spell-pyromancy"}, |
452 | /*subtype 10 */ {MSG_TYPE_BOOK, MSG_TYPE_BOOK_SPELL_SORCERER}, |
451 | /*subtype 10 */ {MSG_TYPE_BOOK, MSG_TYPE_BOOK_SPELL_SORCERER, "readable-book-spell-sorcery"}, |
453 | {MSG_TYPE_BOOK, MSG_TYPE_BOOK_SPELL_SUMMONER}, |
452 | {MSG_TYPE_BOOK, MSG_TYPE_BOOK_SPELL_SUMMONER, "readable-book-spell-summoning"}, |
454 | /* card messages subtypes */ |
453 | /* card messages subtypes */ |
455 | {MSG_TYPE_CARD, MSG_TYPE_CARD_SIMPLE_1}, |
454 | {MSG_TYPE_CARD, MSG_TYPE_CARD_SIMPLE_1, "readable-card-simple-1"}, |
456 | {MSG_TYPE_CARD, MSG_TYPE_CARD_SIMPLE_2}, |
455 | {MSG_TYPE_CARD, MSG_TYPE_CARD_SIMPLE_2, "readable-card-simple-2"}, |
457 | {MSG_TYPE_CARD, MSG_TYPE_CARD_SIMPLE_3}, |
456 | {MSG_TYPE_CARD, MSG_TYPE_CARD_SIMPLE_3, "readable-card-simple-3"}, |
458 | {MSG_TYPE_CARD, MSG_TYPE_CARD_ELEGANT_1}, |
457 | {MSG_TYPE_CARD, MSG_TYPE_CARD_ELEGANT_1, "readable-card-elegant-1"}, |
459 | {MSG_TYPE_CARD, MSG_TYPE_CARD_ELEGANT_2}, |
458 | {MSG_TYPE_CARD, MSG_TYPE_CARD_ELEGANT_2, "readable-card-elegant-2"}, |
460 | {MSG_TYPE_CARD, MSG_TYPE_CARD_ELEGANT_3}, |
459 | {MSG_TYPE_CARD, MSG_TYPE_CARD_ELEGANT_3, "readable-card-elegant-3"}, |
461 | {MSG_TYPE_CARD, MSG_TYPE_CARD_STRANGE_1}, |
460 | {MSG_TYPE_CARD, MSG_TYPE_CARD_STRANGE_1, "readable-card-strange-1"}, |
462 | {MSG_TYPE_CARD, MSG_TYPE_CARD_STRANGE_2}, |
461 | {MSG_TYPE_CARD, MSG_TYPE_CARD_STRANGE_2, "readable-card-strange-2"}, |
463 | /*subtype 20 */ {MSG_TYPE_CARD, MSG_TYPE_CARD_STRANGE_3}, |
462 | /*subtype 20 */ {MSG_TYPE_CARD, MSG_TYPE_CARD_STRANGE_3, "readable-card-strange-3"}, |
464 | {MSG_TYPE_CARD, MSG_TYPE_CARD_MONEY_1}, |
463 | {MSG_TYPE_CARD, MSG_TYPE_CARD_MONEY_1, "readable-card-money-1"}, |
465 | {MSG_TYPE_CARD, MSG_TYPE_CARD_MONEY_2}, |
464 | {MSG_TYPE_CARD, MSG_TYPE_CARD_MONEY_2, "readable-card-money-2"}, |
466 | {MSG_TYPE_CARD, MSG_TYPE_CARD_MONEY_3}, |
465 | {MSG_TYPE_CARD, MSG_TYPE_CARD_MONEY_3, "readable-card-money-3"}, |
467 | |
466 | |
468 | /* Paper messages subtypes */ |
467 | /* Paper messages subtypes */ |
469 | {MSG_TYPE_PAPER, MSG_TYPE_PAPER_NOTE_1}, |
468 | {MSG_TYPE_PAPER, MSG_TYPE_PAPER_NOTE_1, "readable-paper-note-1"}, |
470 | {MSG_TYPE_PAPER, MSG_TYPE_PAPER_NOTE_2}, |
469 | {MSG_TYPE_PAPER, MSG_TYPE_PAPER_NOTE_2, "readable-paper-note-2"}, |
471 | {MSG_TYPE_PAPER, MSG_TYPE_PAPER_NOTE_3}, |
470 | {MSG_TYPE_PAPER, MSG_TYPE_PAPER_NOTE_3, "readable-paper-note-3"}, |
472 | {MSG_TYPE_PAPER, MSG_TYPE_PAPER_LETTER_OLD_1}, |
471 | {MSG_TYPE_PAPER, MSG_TYPE_PAPER_LETTER_OLD_1, "readable-paper-letter-old-1"}, |
473 | {MSG_TYPE_PAPER, MSG_TYPE_PAPER_LETTER_OLD_2}, |
472 | {MSG_TYPE_PAPER, MSG_TYPE_PAPER_LETTER_OLD_2, "readable-paper-letter-old-2"}, |
474 | {MSG_TYPE_PAPER, MSG_TYPE_PAPER_LETTER_NEW_1}, |
473 | {MSG_TYPE_PAPER, MSG_TYPE_PAPER_LETTER_NEW_1, "readable-paper-letter-new-1"}, |
475 | /*subtype 30 */ {MSG_TYPE_PAPER, MSG_TYPE_PAPER_LETTER_NEW_2}, |
474 | /*subtype 30 */ {MSG_TYPE_PAPER, MSG_TYPE_PAPER_LETTER_NEW_2, "readable-paper-letter-new-2"}, |
476 | {MSG_TYPE_PAPER, MSG_TYPE_PAPER_ENVELOPE_1}, |
475 | {MSG_TYPE_PAPER, MSG_TYPE_PAPER_ENVELOPE_1, "readable-paper-envelope-1"}, |
477 | {MSG_TYPE_PAPER, MSG_TYPE_PAPER_ENVELOPE_2}, |
476 | {MSG_TYPE_PAPER, MSG_TYPE_PAPER_ENVELOPE_2, "readable-paper-envelope-2"}, |
478 | {MSG_TYPE_PAPER, MSG_TYPE_PAPER_SCROLL_OLD_1}, |
477 | {MSG_TYPE_PAPER, MSG_TYPE_PAPER_SCROLL_OLD_1, "readable-paper-scroll-old-1"}, |
479 | {MSG_TYPE_PAPER, MSG_TYPE_PAPER_SCROLL_OLD_2}, |
478 | {MSG_TYPE_PAPER, MSG_TYPE_PAPER_SCROLL_OLD_2, "readable-paper-scroll-old-2"}, |
480 | {MSG_TYPE_PAPER, MSG_TYPE_PAPER_SCROLL_NEW_1}, |
479 | {MSG_TYPE_PAPER, MSG_TYPE_PAPER_SCROLL_NEW_1, "readable-paper-scroll-new-1"}, |
481 | {MSG_TYPE_PAPER, MSG_TYPE_PAPER_SCROLL_NEW_2}, |
480 | {MSG_TYPE_PAPER, MSG_TYPE_PAPER_SCROLL_NEW_2, "readable-paper-scroll-new-2"}, |
482 | {MSG_TYPE_PAPER, MSG_TYPE_PAPER_SCROLL_MAGIC}, |
481 | {MSG_TYPE_PAPER, MSG_TYPE_PAPER_SCROLL_MAGIC, "readable-paper-scroll-magic"}, |
483 | |
482 | |
484 | /* road signs messages subtypes */ |
483 | /* road signs messages subtypes */ |
485 | {MSG_TYPE_SIGN, MSG_TYPE_SIGN_BASIC}, |
484 | {MSG_TYPE_SIGN, MSG_TYPE_SIGN_BASIC, "readable-sign-basic"}, |
486 | {MSG_TYPE_SIGN, MSG_TYPE_SIGN_DIR_LEFT}, |
485 | {MSG_TYPE_SIGN, MSG_TYPE_SIGN_DIR_LEFT, "readable-sign-dir-left"}, |
487 | /*subtype 40 */ {MSG_TYPE_SIGN, MSG_TYPE_SIGN_DIR_RIGHT}, |
486 | /*subtype 40 */ {MSG_TYPE_SIGN, MSG_TYPE_SIGN_DIR_RIGHT, "readable-sign-dir-right"}, |
488 | {MSG_TYPE_SIGN, MSG_TYPE_SIGN_DIR_BOTH}, |
487 | {MSG_TYPE_SIGN, MSG_TYPE_SIGN_DIR_BOTH, "readable-sign-dir-both"}, |
489 | |
488 | |
490 | /* stones and monument messages */ |
489 | /* stones and monument messages */ |
491 | {MSG_TYPE_MONUMENT, MSG_TYPE_MONUMENT_STONE_1}, |
490 | {MSG_TYPE_MONUMENT, MSG_TYPE_MONUMENT_STONE_1, "readable-monument-stone-1"}, |
492 | {MSG_TYPE_MONUMENT, MSG_TYPE_MONUMENT_STONE_2}, |
491 | {MSG_TYPE_MONUMENT, MSG_TYPE_MONUMENT_STONE_2, "readable-monument-stone-2"}, |
493 | {MSG_TYPE_MONUMENT, MSG_TYPE_MONUMENT_STONE_3}, |
492 | {MSG_TYPE_MONUMENT, MSG_TYPE_MONUMENT_STONE_3, "readable-monument-stone-3"}, |
494 | {MSG_TYPE_MONUMENT, MSG_TYPE_MONUMENT_STATUE_1}, |
493 | {MSG_TYPE_MONUMENT, MSG_TYPE_MONUMENT_STATUE_1, "readable-monument-statue-1"}, |
495 | {MSG_TYPE_MONUMENT, MSG_TYPE_MONUMENT_STATUE_2}, |
494 | {MSG_TYPE_MONUMENT, MSG_TYPE_MONUMENT_STATUE_2, "readable-monument-statue-2"}, |
496 | {MSG_TYPE_MONUMENT, MSG_TYPE_MONUMENT_STATUE_3}, |
495 | {MSG_TYPE_MONUMENT, MSG_TYPE_MONUMENT_STATUE_3, "readable-monument-statue-3"}, |
497 | {MSG_TYPE_MONUMENT, MSG_TYPE_MONUMENT_GRAVESTONE_1}, |
496 | {MSG_TYPE_MONUMENT, MSG_TYPE_MONUMENT_GRAVESTONE_1, "readable-monument-gravestone-1"}, |
498 | {MSG_TYPE_MONUMENT, MSG_TYPE_MONUMENT_GRAVESTONE_2}, |
497 | {MSG_TYPE_MONUMENT, MSG_TYPE_MONUMENT_GRAVESTONE_2, "readable-monument-gravestone-2"}, |
499 | /*subtype 50 */ {MSG_TYPE_MONUMENT, MSG_TYPE_MONUMENT_GRAVESTONE_3}, |
498 | /*subtype 50 */ {MSG_TYPE_MONUMENT, MSG_TYPE_MONUMENT_GRAVESTONE_3, "readable-monument-gravestone-3"}, |
500 | {MSG_TYPE_MONUMENT, MSG_TYPE_MONUMENT_WALL_1}, |
499 | {MSG_TYPE_MONUMENT, MSG_TYPE_MONUMENT_WALL_1, "readable-monument-wall-1"}, |
501 | {MSG_TYPE_MONUMENT, MSG_TYPE_MONUMENT_WALL_2}, |
500 | {MSG_TYPE_MONUMENT, MSG_TYPE_MONUMENT_WALL_2, "readable-monument-wall-2"}, |
502 | {MSG_TYPE_MONUMENT, MSG_TYPE_MONUMENT_WALL_3} |
501 | {MSG_TYPE_MONUMENT, MSG_TYPE_MONUMENT_WALL_3, "readable-monument-wall-3"} |
503 | }; |
502 | }; |
504 | int last_readable_subtype = sizeof (readable_message_types) / sizeof (readable_message_type); |
503 | int last_readable_subtype = sizeof (readable_message_types) / sizeof (readable_message_type); |
505 | |
504 | |
506 | static int max_titles[6] = { |
505 | static int max_titles[6] = { |
507 | ((sizeof (light_book_name) / sizeof (char *)) + (sizeof (heavy_book_name) / sizeof (char *))) * (sizeof (book_author) / sizeof (char *)), |
506 | ((sizeof (light_book_name) / sizeof (char *)) + (sizeof (heavy_book_name) / sizeof (char *))) * (sizeof (book_author) / sizeof (char *)), |
… | |
… | |
749 | if (did_init_mon_info) |
748 | if (did_init_mon_info) |
750 | return; |
749 | return; |
751 | |
750 | |
752 | did_init_mon_info = 1; |
751 | did_init_mon_info = 1; |
753 | |
752 | |
754 | |
753 | for_all_archetypes (at) |
755 | for (at = first_archetype; at != NULL; at = at->next) |
|
|
756 | { |
754 | { |
757 | if (QUERY_FLAG (&at->clone, FLAG_MONSTER) && (!QUERY_FLAG (&at->clone, FLAG_CHANGING) || QUERY_FLAG (&at->clone, FLAG_UNAGGRESSIVE))) |
755 | if (QUERY_FLAG (at, FLAG_MONSTER) && (!QUERY_FLAG (at, FLAG_CHANGING) || QUERY_FLAG (at, FLAG_UNAGGRESSIVE))) |
758 | { |
756 | { |
759 | objectlink *mon = new objectlink; |
757 | objectlink *mon = new objectlink; |
760 | |
758 | |
761 | mon->ob = &at->clone; |
759 | mon->ob = at; |
762 | mon->next = first_mon_info; |
760 | mon->next = first_mon_info; |
763 | first_mon_info = mon; |
761 | first_mon_info = mon; |
764 | nrofmon++; |
762 | nrofmon++; |
765 | } |
763 | } |
766 | } |
764 | } |
… | |
… | |
970 | t = get_empty_book (); |
968 | t = get_empty_book (); |
971 | t->name = book->name; |
969 | t->name = book->name; |
972 | t->authour = book->title; |
970 | t->authour = book->title; |
973 | t->size = strlen (book->msg); |
971 | t->size = strlen (book->msg); |
974 | t->msg_index = strtoint (book->msg); |
972 | t->msg_index = strtoint (book->msg); |
975 | t->archname = book->arch->name; |
973 | t->archname = book->arch->archname; |
976 | t->level = book->level; |
974 | t->level = book->level; |
977 | |
975 | |
978 | t->next = tl->first_book; |
976 | t->next = tl->first_book; |
979 | tl->first_book = t; |
977 | tl->first_book = t; |
980 | tl->number++; |
978 | tl->number++; |
… | |
… | |
1443 | if (path == -1) |
1441 | if (path == -1) |
1444 | strcat (retbuf, "having no known spell path.\n"); |
1442 | strcat (retbuf, "having no known spell path.\n"); |
1445 | else |
1443 | else |
1446 | sprintf (retbuf, "%sbelonging to the path of %s:\n", retbuf, spellpathnames[path]); |
1444 | sprintf (retbuf, "%sbelonging to the path of %s:\n", retbuf, spellpathnames[path]); |
1447 | |
1445 | |
1448 | for (at = first_archetype; at != NULL; at = at->next) |
1446 | for_all_archetypes (at) |
1449 | { |
1447 | { |
1450 | /* Determine if this is an appropriate spell. Must |
1448 | /* Determine if this is an appropriate spell. Must |
1451 | * be of matching path, must be of appropriate type (prayer |
1449 | * be of matching path, must be of appropriate type (prayer |
1452 | * or not), and must be within the valid level range. |
1450 | * or not), and must be within the valid level range. |
1453 | */ |
1451 | */ |
1454 | if (at->clone.type == SPELL && at->clone.path_attuned & pnum && |
1452 | if (at->type == SPELL && at->path_attuned & pnum && |
1455 | ((at->clone.stats.grace && prayers) || (at->clone.stats.sp && !prayers)) && (at->clone.level < (level * 8))) |
1453 | ((at->stats.grace && prayers) || (at->stats.sp && !prayers)) && (at->level < (level * 8))) |
1456 | { |
1454 | { |
1457 | assign (tmpbuf, at->clone.name); |
1455 | assign (tmpbuf, at->object::name); |
1458 | |
1456 | |
1459 | if (book_overflow (retbuf, tmpbuf, booksize)) |
1457 | if (book_overflow (retbuf, tmpbuf, booksize)) |
1460 | break; |
1458 | break; |
1461 | else |
1459 | else |
1462 | { |
1460 | { |
… | |
… | |
1536 | |
1534 | |
1537 | /* preamble */ |
1535 | /* preamble */ |
1538 | sprintf (retbuf, "Herein is described a project using %s: \n", formula->skill ? &formula->skill : "an unknown skill"); |
1536 | sprintf (retbuf, "Herein is described a project using %s: \n", formula->skill ? &formula->skill : "an unknown skill"); |
1539 | |
1537 | |
1540 | if ((at = archetype::find (op_name)) != (archetype *) NULL) |
1538 | if ((at = archetype::find (op_name)) != (archetype *) NULL) |
1541 | op_name = at->clone.name; |
1539 | op_name = at->object::name; |
1542 | else |
1540 | else |
1543 | LOG (llevError, "formula_msg() can't find arch %s for formula.\n", op_name); |
1541 | LOG (llevError, "formula_msg() can't find arch %s for formula.\n", op_name); |
1544 | |
1542 | |
1545 | /* item name */ |
1543 | /* item name */ |
1546 | if (strcmp (formula->title, "NONE")) |
1544 | if (strcmp (formula->title, "NONE")) |
… | |
… | |
1556 | } |
1554 | } |
1557 | else |
1555 | else |
1558 | { |
1556 | { |
1559 | sprintf (retbuf, "%sThe %s", retbuf, op_name); |
1557 | sprintf (retbuf, "%sThe %s", retbuf, op_name); |
1560 | sprintf (title, "%s: %s", formula_book_name[RANDOM () % (sizeof (formula_book_name) / sizeof (char *))], op_name); |
1558 | sprintf (title, "%s: %s", formula_book_name[RANDOM () % (sizeof (formula_book_name) / sizeof (char *))], op_name); |
1561 | if (at->clone.title) |
1559 | if (at->title) |
1562 | { |
1560 | { |
1563 | strcat (retbuf, " "); |
1561 | strcat (retbuf, " "); |
1564 | strcat (retbuf, at->clone.title); |
1562 | strcat (retbuf, at->title); |
1565 | strcat (title, " "); |
1563 | strcat (title, " "); |
1566 | strcat (title, at->clone.title); |
1564 | strcat (title, at->title); |
1567 | } |
1565 | } |
1568 | } |
1566 | } |
1569 | /* Lets name the book something meaningful ! */ |
1567 | /* Lets name the book something meaningful ! */ |
1570 | book->name = title; |
1568 | book->name = title; |
1571 | book->title = NULL; |
1569 | book->title = NULL; |
… | |
… | |
1577 | archetype *at; |
1575 | archetype *at; |
1578 | |
1576 | |
1579 | at = archetype::find (formula->cauldron); |
1577 | at = archetype::find (formula->cauldron); |
1580 | |
1578 | |
1581 | sprintf (retbuf + strlen (retbuf), |
1579 | sprintf (retbuf + strlen (retbuf), |
1582 | " may be made at %s using the following ingredients:\n", at ? query_name (&at->clone) : "an unknown place"); |
1580 | " may be made at %s using the following ingredients:\n", at ? query_name (at) : "an unknown place"); |
1583 | |
1581 | |
1584 | for (next = formula->ingred; next != NULL; next = next->next) |
1582 | for (next = formula->ingred; next != NULL; next = next->next) |
1585 | { |
1583 | { |
1586 | strcat (retbuf, next->name); |
1584 | strcat (retbuf, next->name); |
1587 | strcat (retbuf, "\n"); |
1585 | strcat (retbuf, "\n"); |