From: Franco <awe@mt.arias.net>
Subject: Potion Brewing Code

Ok, due to overwhelming responses, I'm posting the mix code here. Just
give me credit.

Make sure whatever file you put this in, it contains this:

extern char *spells[];

Now, what you've all been waiting for...

void make_potion(struct char_data *ch, int potion, struct obj_data *container)
{
        struct obj_data *final_potion;
        int can_make = FALSE, mana, dam;

        /* Modify this list to suit which spells you
           want to be able to mix. */
        switch (potion) {
        case SPELL_SHIELD:
        case SPELL_CURE_BLIND:
        case SPELL_CURE_LIGHT:
        case SPELL_CURE_CRITIC:
        case SPELL_DETECT_MAGIC:
        case SPELL_DETECT_INVIS:
        case SPELL_DETECT_POISON:
        case SPELL_REMOVE_POISON:
        case SPELL_REMOVE_CURSE:
        case SPELL_STRENGTH:
        case SPELL_WORD_OF_RECALL:
        case SPELL_SENSE_LIFE:
        case SPELL_WATERWALK:
        case SPELL_FLY:
        case SPELL_HASTE:
        case SPELL_INFRAVISION:
        case SPELL_ENLARGE:
        case SPELL_REGENERATION:
        case SPELL_HEAL:
                can_make = TRUE;
                break;
        default:
                break;
        }
        if (can_make == FALSE) {
                send_to_char("You that spell cannot be mixed into a potion.\r\n", ch);
                return;
        }
        else if (number(1, 3) == 3) {
                send_to_char("As you begin mixing the potion, it violently explodes!\r\n",ch);
                act("$n begins to mix a potion, and it suddenly explodes!", FALSE, ch, 0,0, TO_ROOM);
                extract_obj(container);
                dam = number(5, 50);
                GET_HIT(ch) -= dam;
                update_pos(ch);
                return;
        }
        /* requires x3 mana to mix a potion than the spell */
        mana = mag_manacost(ch, potion) * 3;

        if (GET_MANA(ch) - mana > 0) {
                GET_MANA(ch) -= mana;
                sprintf(buf, "You create a potion labeled '%s'.\r\n", spells[potion]);
                send_to_char(buf, ch);
                act("$n creates a potion!", FALSE, ch, 0, 0, TO_ROOM);
                extract_obj(container);
        }
        else {
                send_to_char("You don't have enough mana for mixing that potion!\r\n", ch);
                return;
        }
        
        final_potion = create_obj();

    final_potion->item_number = NOTHING;
        final_potion->in_room = NOWHERE;
        final_potion->name = str_dup("potion");

        sprintf(buf2, "A potion labeled '%s' lies here.", spells[potion]);
        final_potion->description = str_dup(buf2);

        sprintf(buf2, "A potion labeled '%s'", spells[potion]);
        final_potion->short_description = str_dup(buf2);

        GET_OBJ_TYPE(final_potion) = ITEM_POTION;
        GET_OBJ_WEAR(final_potion) = ITEM_WEAR_TAKE;
        GET_OBJ_EXTRA(final_potion) = ITEM_NORENT;
        GET_OBJ_VAL(final_potion, 0) = GET_LEVEL(ch);
        GET_OBJ_VAL(final_potion, 1) = potion;
        GET_OBJ_VAL(final_potion, 2) = -1;
        GET_OBJ_VAL(final_potion, 3) = -1;
        GET_OBJ_WEIGHT(final_potion) = 1;
        GET_OBJ_RENT(final_potion) = 0;
        
        obj_to_char(final_potion, ch);
}

ACMD(do_brew)
{
        struct obj_data *container;
        struct obj_data *obj, *next_obj;
        char bottle_name[MAX_STRING_LENGTH];
        char spell_name[MAX_STRING_LENGTH];
        int potion, found = FALSE;

        two_arguments(argument, bottle_name, spell_name);

        if ((GET_CLASS(ch) == CLASS_WARRIOR || GET_CLASS(ch) == CLASS_THIEF) && GET_LEVEL(ch) < LVL_IMMORT) {
                send_to_char("You have no idea how to mix potions!\r\n", ch);
                return;
        }
        if (!*bottle_name || !*spell_name) {
                send_to_char("What do you wish to mix in where?\r\n", ch);
                return;
        }

        for (obj = ch->carrying; obj; obj = next_obj) {
                next_obj = obj->next_content;
                if (obj == NULL)
                        return;
                else if (!(container = get_obj_in_list_vis(ch, bottle_name, ch->carrying)))
                        continue;
                else
                        found = TRUE;
        }
        if (found != FALSE && (GET_OBJ_TYPE(container) != ITEM_CONTAINER &&
                GET_OBJ_TYPE(container) != ITEM_DRINKCON)) {
                send_to_char("That item is not a container!\r\n", ch);
                return;
        }
        if (found == FALSE) {
                sprintf(buf, "You don't have %s in your inventory!\r\n", bottle_name);
                send_to_char(buf, ch);
                return;
        }

        potion = find_skill_num(spell_name);

        if ((potion < 1) || (potion > MAX_SPELLS)) {
                send_to_char("Mix what spell?!?\r\n", ch);
                return;
        }
        if (GET_LEVEL(ch) < spell_info[potion].min_level[(int) GET_CLASS(ch)]) {
                 send_to_char("You do not know how to make that potion!\r\n", ch);
                return;
        }
        if (GET_SKILL(ch, potion) == 0) {
                 send_to_char("You are unfamiliar with potion brewing.\r\n", ch);
                return;
        }
        make_potion(ch, potion, container);
}
