Hiya all, I'm in the process of making a brew skill which allows a player to brew together a number of ingredients and make a potion from them. They type something like: brew water turnip foxweed dandylion The command creates a potion correctly, but if a player quaffs the potion the mud crashes. Any ideas why? The code follows. If I stat the potion it all seems fine, says its type potion, spell level 10 and has armor spell with other 2 unused. ########################## # Array of legal potions # ########################## struct potion_list { int items_needed[4]; char *potion_alias; char *potion_short; char *potion_long; int potion_values[4]; } potions[] = { {{ 24, 25, 26, 27}, /* Armor Potion */ "brown potion", "a brown potion", "A brown potion lies here.", { 10, 1, -1, -1}}, {{ -1, -1, -1, 1}, /* Empty Potion */ "empty potion", "an empty potion", "An empty potion lies here.", {1, -1, -1, -1}} }; ############# # Brew code # ############# int items_match(int item_numbers[3], int pos) { if ((item_numbers[0] == potions[pos].items_needed[0]) && (item_numbers[1] == potions[pos].items_needed[1]) && (item_numbers[2] == potions[pos].items_needed[2]) && (item_numbers[3] == potions[pos].items_needed[3])) return(1); return(0); } ACMD(do_brew) { char arg0[MAX_INPUT_LENGTH]; char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; char arg3[MAX_INPUT_LENGTH]; struct char_data *person = NULL; struct obj_data *item0 = NULL; struct obj_data *item1 = NULL; struct obj_data *item2 = NULL; struct obj_data *item3 = NULL; struct obj_data *potion = read_object( 23, REAL); int item_numbers[4] = { -1, -1, -1, -1}; int temp1, temp2, temp3; if (!*argument) { send_to_char("You mix nothing together, and to no ones amazement, create nothing!\r\n", ch); return; } argument = one_argument(argument, arg0); argument = one_argument(argument, arg1); argument = one_argument(argument, arg2); argument = one_argument(argument, arg3); if (*arg0) { if (!generic_find(arg0, FIND_OBJ_INV, ch, &person, &item0)) { sprintf(buf, "You don't seem to have %s %s.\r\n", AN(arg0), arg0); send_to_char(buf, ch); return; } item_numbers[0] = GET_OBJ_RNUM(item0); extract_obj(item0); } if (*arg1) { if (!generic_find(arg1, FIND_OBJ_INV, ch, &person, &item1)) { sprintf(buf, "You don't seem to have %s %s.\r\n", AN(arg1), arg1); send_to_char(buf, ch); return; } item_numbers[1] = GET_OBJ_RNUM(item1); extract_obj(item1); } if (*arg2) { if (!generic_find(arg2, FIND_OBJ_INV, ch, &person, &item2)) { sprintf(buf, "You don't seem to have %s %s.\r\n", AN(arg2), arg2); send_to_char(buf, ch); return; } item_numbers[2] = GET_OBJ_RNUM(item2); extract_obj(item2); } if (*arg3) { if (!generic_find(arg3, FIND_OBJ_INV, ch, &person, &item3)) { sprintf(buf, "You don't seem to have %s %s.\r\n", AN(arg3), arg3); send_to_char(buf, ch); return; } item_numbers[3] = GET_OBJ_RNUM(item3); extract_obj(item3); } if ((item0 == NULL) || (item1 == NULL)) { send_to_char("Every potion needs at least two ingredients!\r\n", ch); return; } for (temp3 = 0; temp3 < 3; temp3 ++) for (temp1 = 0; temp1 < 3; temp1 ++) if (item_numbers[temp1] > item_numbers[temp1 + 1]) { temp2 = item_numbers[temp1]; item_numbers[temp1] = item_numbers[temp1 + 1]; item_numbers[temp1 + 1] = temp2; } temp1 = 0; while (potions[temp1].items_needed[0] != -1) { if (items_match(item_numbers, temp1)) { obj_to_char(potion, ch); potion->name = potions[temp1].potion_alias; potion->short_description = potions[temp1].potion_short; potion->description = potions[temp1].potion_long; for (temp2 = 0; temp2 < 3; temp2 ++) GET_OBJ_VAL(potion, temp2) = potions[temp1].potion_values[temp2]; sprintf(buf, "You mix the ingredients and create %s.\r\n", potion->short_description); send_to_char(buf, ch); act("$n mixes some ingredients and creates $p.", TRUE, ch, 0, potion, TO_ROOM); return; } temp1 ++; } send_to_char("You mix the ingredients, but create nothing but a mess.\r\n", ch); act("$n mixes some ingredients, but creates nothing but a mess.", TRUE, ch, 0, 0, TO_ROOM); return; } ############################## # Some items used by command # ############################## #23 clear potion~ a clear potion~ A clear potion lies here.~ ~ 10 0 ml 1 -1 -1 -1 1 0 0 #24 flask salt water~ @c12a flask of salt water@c00~ A flask of @c12salt water@c00 lies here.~ ~ 12 0 ml 0 0 0 0 1 0 0 #25 foxweed~ @c09some foxweed@c00~ Some @c09foxweed@c00 lies here.~ ~ 12 0 ml 0 0 0 0 1 0 0 #26 turnip~ @c02a green turnip@c00~ A @c02green turnip@c00 lies here.~ ~ 12 0 ml 0 0 0 0 1 0 0 #27 dandylion~ @c11some dandylion@c00~ Some @c11dandylion@c00 lies here.~ ~ 12 0 ml 0 0 0 0 1 0 0 +-----------------------------------------------------------+ | Ensure that you have read the CircleMUD Mailing List FAQ: | | http://cspo.queensu.ca/~fletcher/Circle/list_faq.html | +-----------------------------------------------------------+
This archive was generated by hypermail 2b30 : 12/18/00 PST